This document explains how to install proPilot on a machine.
Please read the instructions carefully, and follow the steps in the defined order.
Prior to installing proPilot, make sure to satisfy the requirements described in the dedicated document. All elements must be installed and preconfigured before proceeding to the installation of proPilot
Containerized deployment
The recommended way to deploy proPilot is to use the containerized approach.
But as explained in the requirements document, proPilot supports multiple options to handle SSO, so the identity server is not part of the installation file hereafter. To install Keycloak or any other Identity server solution, refer to the installation guide of your vendor.
-
Create a directory on the target host (
/opt/dfakto/proPilot,C:\Program Files\dFakto\proPilot, …) -
Create a file named
docker-compose.ymlwith the following content as a base.
services:
propilot-db:
image: docker.io/library/mariadb:11.8.2
container_name: propilot-db
restart: always
environment:
MARIADB_ROOT_PASSWORD: 'rootPassHere'
MARIADB_DATABASE: 'propilot_global'
MARIADB_USER: 'propilot'
MARIADB_PASSWORD: 'propilotUserDBPassHere'
volumes:
- mariadb_data:/var/lib/mysql
- ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d:ro
command:
- --sql-mode=ANSI_QUOTES
- --lower_case_table_names=1
healthcheck:
test:
[
"CMD",
"healthcheck.sh",
"--connect",
"--innodb_initialized"
]
interval: 10s
timeout: 5s
retries: 5
propilot-api:
image: quay.io/dfakto_org/propilot:${PROPILOT_API_VERSION}
container_name: propilot-api
environment:
AppSettings__connectionString: "Server=propilot-db;Port=3306;Database=propilot_global;User Id=propilot;Password=propilotUserDBPassHere"
AppSettings__allowedOrigin: "http://front-end-separate-domain-if-necessary:4200"
AppSettings__applicationName: "proPilot"
AppSettings__publicUri: "https://www.your-company.com"
AppSettings__applicationLanguage: "en"
AppSettings__availableLanguages: "en,fr,nl"
AppFolders__TreeNodeCodeFileBasePath: "/data/propilot/nodes"
AppFolders__TempFolder: "/data/propilot/temp"
AppFolders__PrivateKeysPath: "/data/propilot/keypath"
AppFolders__globalLicenseFolderPath: "/data/propilot/license"
DFAKTO_PROPILOT_HTTP_PORTS: 8080
Logging__LogLevel__Default: Information
# First WriteTo: Console
Serilog__WriteTo__0__Name: Console
Serilog__WriteTo__0__Args__outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff} {Level}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
Serilog__WriteTo__0__Args__theme: "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console"
# Second WriteTo: File
Serilog__WriteTo__1__Name: File
Serilog__WriteTo__1__Args__path: "/var/log/propilot/propilot.txt"
Serilog__WriteTo__1__Args__rollOnFileSizeLimit: "true"
Serilog__WriteTo__1__Args__fileSizeLimitBytes: "10000000"
Serilog__WriteTo__1__Args__retainedFileCountLimit: "10"
Serilog__WriteTo__1__Args__formatter: "Serilog.Formatting.Json.JsonFormatter, Serilog"
identityServer__Host:
identityServer__clientId:
identityServer__ValidAudience:
# -- set the 2 variables only if you use the master mode
#identityServer__keycloakHost: https://accounts.your-keycloak.com
#identityServer__keycloakSecret: the-secret-configured-in-keycloak
identityServer__FirstAdminEmail: your-proPilot-admin-email@your-company.com
identityServer__UserIdInIdentityServerClaim: "sub"
identityServer__UserNameClaim: "preferred_username"
identityServer__DisplayNameClaims: "given_name, family_name"
Sentry__Dsn: ""
#Sentry__Dsn: https://yourPublicKey@o0.ingest.sentry.io/yourProjectId
#Sentry__Environment: development
Smtp__SmtpDeliveryMethod: SpecifiedPickupDirectory
Smtp__From: "noreply@yourCompany.com"
Smtp__Host: null
Smtp__Port: null
Smtp__UserName: null
Smtp__Password: null
Smtp__SenderDisplayName: "No Reply"
Smtp__AdminMail: "admin@yourCompany.com"
Smtp__AddReplyToAdminInAllEmails: false
Smtp__ErrorMailRecipient: ""
depends_on:
propilot-db:
condition: service_healthy
restart: always
volumes:
- propilot_data:/data/propilot
- propilot_logs:/var/log/propilot
propilot-ui:
image: quay.io/dfakto_org/propilot-ui:${PROPILOT_UI_VERSION}
container_name: propilot-ui
environment:
NG_APP_USE_EXTERNAL_API: "false"
NG_APP_PROPILOT_API_URL: http://propilot-api:8080
NG_APP_APPLICATION_AVAILABLE_LANGUAGES: "en,fr"
HTTP_PORT: 80
ports:
- "4200:80"
restart: unless-stopped
volumes:
mariadb_data:
propilot_data:
propilot_logs:
Adaptations
adapt the docker-compose file to suit your needs.
You should at least search for “your-” in the above example, and replace the default values with valid values.
For instance, you may want to configure Keycloak (or other identity server).
Here are the main elements to adapt
Database
The following keys must be set with highly secured passwords.
-
MARIADB_ROOT_PASSWORD
-
MARIADB_PASSWORD
Logging
The application writes valuable information about the execution flow. It can be sent to various output channels like the console or log files. ProPilot uses Serilog to write the application traces.
-
MinimumLevel: Indicate the level of log we want to store. From low to high, these are
Verbose,Debug,Information,Warning,ErrorandFatal -
rollOnfileSizeLimit: Indicate if we want to create a new log file when the current one reaches its size limit
-
fileSizeLimitByte: Indicate the size limit of a log file. Once this size is reached, a new file will be created if the rollOnfileSizeLimit is set to true
-
retainedFileCountLimit: Indicate how much file we should have, we start overriding the first log file.
-
option : formatter: The formatter decides the format of the logs (text, json, …)
For more details about the configuration:
https://github.com/serilog/serilog-settings-configuration
Main application settings
-
AppSettings__connectionString
-
AppSettings__allowedOrigin
Configure this key if proPilot front-end is deployed on a separate domain (compared to the API). -
AppSettings__applicationName
If you want to customize the application name in your company. -
AppSettings__publicUri
Sample: https://www.your-company.com
Will be used to create clickable links from external documents like Excel exports. Add the port if required (e.g. http://localhost:4200) -
AppSettings__applicationLanguage
Default language of the application. Chose one of the supported value: en, fr, nl -
AppSettings__availableLanguages
If you want to restrict the available languages in the language selector.
e.g. “en,fr” will remove the “nl” option from the language selector. -
AppFolders__globalLicenseFolderPath
Specify the folder where the license files will be located.
If you leave this parameter empty, a default accessible location under the temp folder is used
☝️ note that the temp folder is not volatile or temporary, it is currently used as a standard folder.
Identity server (OIDC)
Here are the keys to configure if you want to use an OIDC server for your SSO:
-
identityServer__Host
SSO server address -
identityServer__keycloakHost
(Master mode only) -
identityServer__keycloakSecret
(Master mode only) -
identityServer__FirstAdminEmail
use the email of a user that exists in your SSO. It will be the first admin in proPilot (for your first connections, tests, and in-app configurations) -
identityServer__UserIdInIdentityServerClaim
Claim containing the id of the user in the OIDC. Usually “sub” -
identityServer__UserNameClaim
Claim containing the unique username that will be displayed in proPilot.
You can use the same claim as the UserIdInIdentityServerClaim if you don’t have any specific human-readable identification for your users. -
identityServer__DisplayNameClaims
You can supply a single claim, or a comma-separated list of claims to build the display name (e.g. the first name and family name). If you don’t have any particular display name, you can reuse the UsernameClaim.
SMTP
-
SMTP configuration (can be “
Network" or “SpecifiedPickupDirectory“)-
if
SpecifiedPickupDirectoryis chosen, you must configure the Smtp__PickupDirectoryLocation (and leave the other field to null: host, port, username, password) -
if
Networkis chosen, you must leave the Smtp__PickupDirectoryLocation to null, and configure the other fields (host, port, username, password).
-
-
Smtp__From
Adress used by the application (sender) to send emails.
usually noreply@yourCompany.com -
Smtp__SenderDisplayName
To customize the sender display name -
Smtp__AdminMail
Email address of the application administrator (if you want the end user to be able to contact the administrator) -
Smtp__AddReplyToAdminInAllEmails
If you set it to true, the ReplyTo parameter of the emails will be set to the Smtp__AdminMail value.
In other words, users will be able to reply to the emails sent by the application, and the replies will be routed to the administrator (Smtp__AdminMail) -
Smtp__ErrorMailRecipient
Application errors will be sent to this email address (in addition to being reported in log files).
Test the back-end
-
Make sure that the application is started
-
The following url should work (replace localhost by your domain name if necessary):
http://localhost/api/info -
The page is not html formatted but it must contain the back-end version of proPilot (e.g.
ProPilot API VX.X.X)