Exalate App for Azure DevOps can be installed on the server using Docker.
You need to install Docker. Check the docker documentation for more details.
Steps to Install Exalate for Azure DevOps on Docker
Check the release notes for the latest version.
1. Create a docker-compose.
Create a directory that would hold the docker-compose file:
cd ~ mkdir exalate-azurenode
Create a docker-compose.yml file in it:
version: '2' services: database: restart: unless-stopped image: postgres:12.9 volumes: - ./persist/db:/var/lib/postgresql/data - ./createdb.sh:/docker-entrypoint-initdb.d/init-user-db.sh environment: # adapt the default passwords - DB_NAME=azurenode - DB_USER=idalko - DB_PASS=idalko - POSTGRES_PASSWORD=changeme networks: - database azurenode: restart: unless-stopped # use the latest version https://hub.docker.com/r/idalko/azurenode image: idalko/azurenode:5.3.3 depends_on: - database #wait for postgres to be started, not for ready volumes: - ./persist/home:/opt/azurenode/data environment: # Add your enviroment settings here, check documentation for details - AZURENODE_PG_HOST=database - AZURENODE_PG_DB=azurenode?gssEncMode=disable - AZURENODE_PG_USER=idalko - AZURENODE_PG_PWD=idalko - AZURENODE_PORT=9002 # Use following variables to link the node with jwilder/nginx proxy # Replace exalate_for_azurenode.example.com with the appropriate FQDN - LETSENCRYPT_HOST=francis-ado.exalate.biz - VIRTUAL_HOST=francis-ado.exalate.biz - VIRTUAL_PORT=9002 networks: - database - proxy networks: database: driver: bridge default: driver: bridge proxy: external: name: proxy
Below you can find the environment variables used for the app container. All of them are optional, and in the given example, we've overridden AZURENODE_PG_DB, AZURENODE_PG_USER, and AZURENODE_PG_PWD just to show how to pass different credentials to the Exalate application.
|Variable name||Default value||Example||Description|
|AZURENODE_PG_HOST||AZURENODE_PG_HOST=database||AZURENODE_PG_HOST=db.acme.com||tells the exalate application where is the postgres database to connect to hosted|
|AZURENODE_PG_DB||AZURENODE_PG_DB=azurenode||AZURENODE_PG_DB=exalate||tells the exalate application what is the postgres database name for the exalate application|
|AZURENODE_PG_USER||AZURENODE_PG_USER=idalko||AZURENODE_PG_USER=exalate||tells the exalate application what is the postgres database user name for the exalate application to perform queries with|
|AZURENODE_PG_PWD||AZURENODE_PG_PWD=idalko||AZURENODE_PG_PWD=secret||tells the exalate application what is the postgres database user's password for the exalate application to perform queries with|
tells what which is the port to start the exalate application on. Note that this is the port within the exalateazurenode_azurenode_1 container, thus if this variable is changed (for example to 80), the
should also be changed to
|AZURENODE_SMTP_HOST_NAME||AZURENODE_SMTP_HOST_NAME=mail.server.com||AZURENODE_SMTP_HOST_NAME=smtp.gmail.com||is used to send email notifications about errors blocking synchronization|
|AZURENODE_SMTP_PORT||AZURENODE_SMTP_PORT=465||AZURENODE_SMTP_PORT=587||is used to send email notifications about errors blocking synchronization|
|AZURENODE_SMTP_FROM||AZURENODE_SMTP_FROMfirstname.lastname@example.org||AZURENODE_SMTP_FROMemail@example.com||is used to send email notifications about errors blocking synchronization|
|AZURENODE_SMTP_USER||AZURENODE_SMTP_USER=admin||AZURENODE_SMTP_USER=my.name||is used to send email notifications about errors blocking synchronization|
|AZURENODE_SMTP_PASS||AZURENODE_SMTP_PASS=1234567||AZURENODE_SMTP_PASS=secret||is used to send email notifications about errors blocking synchronization|
|AZURENODE_SMTP_TLS||AZURENODE_SMTP_TLS=true||AZURENODE_SMTP_TLS=true||is used to send email notifications about errors blocking synchronization. Can be set to false, but then the AZURENODE_SMTP_PORT should be set to the port, that accepts non-SSL and non-TLS connections|
Connecting to Postgres 10 or Higher
For unencrypted connections from Exalate to a Postgres version 10 or higher, you need to disable
gssEncMode with the following setting:
# exalate is the name of the database on the postgres instance # AZURENODE_PG_DB=exalate?gssEncMode=disable
create createdb.sh (referenced from docker-compose.yml):
Ensure that the volumes are included in your backup strategy:
Start the Application.
About the URL of the Exalate Node
The exalate node needs to be reachable by
- the Azure DevOps instance.
- Exalate will configure webhooks on the ADO project, which is used to notify Exalate whenever a web item is modified
- Exalate needs to be reachable for the OAuth protocol to set up a trust relationship between the ADO instance and the Exalate node
- the ADO users
- The sync panel and the Exalate console are web properties that need to be reachable by the users.
Register the Node in the Mapper
The node needs to be registered in the exalate mapper. The Exalate mapper is a kind of DNS service, maps instances to nodes
This is required to be able to install the ADO extension on the organization site. Whenever deploying the extension, the extension will request the mapper where the node serving the ADO organization is located.
Please raise a ticket on the support portal providing
- URL of the ADO organization
- URL of the Exalate node which has been deployed on-premise
How to Manage the Application on Docker
Run Queries to the Application's Database
You can find all tables using PSQLs \dt+ command:
All the Postgres SQL queries are permitted
To exit the application's DB:
Inspect the Application's Filesystem
Remove the Application
Remove the Application Data
Danger zone - do this only if you wish to lose all the synchronization information, including the current synchronizations enqueued to be performed and synchronization status.
Be sure that the remote side (you exalate issues with) knows that you're stopping synchronization and are ready to handle synchronization errors.
Problems during the installation of the Exalate server for Azure DevOps
If you have problems during the installation of the Exalate app for Azure DevOps you can find logs describing possible problems inside
The name for the file is generated randomly and automatically by the OS, but you can find the file by the creation date.
Problems while running the Exalate server for Azure DevOps
Logs will be generated under the directory:
Refer to these logs to get more information about possible problems and communicate with our support if you need any assistance.