Configuration
All configuration is supplied through environment variables. The server resolves them at startup through four independent config interfaces; the agent reads two variables directly. Defaults are shown in the tables below.
Server
Section titled “Server”| Env var | Default | Meaning |
|---|---|---|
VERTX_SERVER_PORT |
8080 |
HTTP/WebSocket listen port (bound to 127.0.0.1). |
VERTX_ALIASES_DIR |
./aliases |
Directory of deploy alias *.yml files. |
VERTX_RECIPES_DIR |
./recipes |
Directory of recipe *.yml files. |
Dashboard
Section titled “Dashboard”| Env var | Default | Meaning |
|---|---|---|
DASHBOARD_PATH |
/deploy/dashboard |
Dashboard base path. |
DASHBOARD_REFRESH_MS |
2000 |
SSE push interval (ms). |
SERVER_LOG_FILE |
/var/log/deploy-server-1/current |
Server log file tailed on the dashboard’s Log screen; set it blank to disable that screen. |
Redmine / GitLab / Telegram / queue
Section titled “Redmine / GitLab / Telegram / queue”| Env var | Default | Meaning |
|---|---|---|
REDMINE_URL |
"" |
Redmine base URL. |
REDMINE_API_ACCESS_KEY |
"" |
Redmine API key (secret). |
REDMINE_STATUS_ACCEPT_ID |
1 |
Status id: accepted. |
REDMINE_STATUS_PROCESSING_ID |
2 |
Status id: in progress. |
REDMINE_STATUS_DONE_ID |
3 |
Status id: done. |
REDMINE_STATUS_FAILED_ID |
6 |
Status id: failed. |
REDMINE_CONNECT_TIMEOUT |
120 |
Connect timeout (s). |
REDMINE_READ_TIMEOUT |
120 |
Read timeout (s). |
REDMINE_CALLBACK_URI |
"" |
HTTP URI matched for the Redmine webhook. |
ISSUE_VALIDATION_SCRIPT |
"" |
Path to a JS file validating each issue (Nashorn). |
STATUS_PAGE_PATH |
/deploy/status |
Status endpoint path prefix. |
QUEUE_DIR |
./queue |
Durable spool root (redmine/, telegram/ and deploy-review/ subdirs). |
GITLAB_URL |
"" |
GitLab base URL. |
GITLAB_API_KEY |
"" |
GitLab API key (secret). |
TELEGRAM_ENABLED |
false |
Enable Telegram notifications. |
TELEGRAM_CHAT_ID |
0 |
Target Telegram chat id. |
TELEGRAM_TOKEN |
"" |
Telegram bot token (secret). |
TELEGRAM_URL |
https://api.telegram.org/bot |
Telegram Bot API base URL (override for a proxy or a mock). |
Deploy review webhook
Section titled “Deploy review webhook”An outbound POST sent at deploy start so an external service can analyse the release while it
is being rolled out. Disabled by default; when enabled, DEPLOY_REVIEW_URL must be set or the
server fails fast at startup.
| Env var | Default | Meaning |
|---|---|---|
DEPLOY_REVIEW_ENABLED |
false |
Enable the deploy-start webhook. |
DEPLOY_REVIEW_URL |
"" |
Endpoint the notification is posted to. |
DEPLOY_REVIEW_TOKEN |
"" |
Bearer token sent in Authorization (secret). |
DEPLOY_REVIEW_TIMEOUT_MS |
20000 |
Connect/read timeout (ms). |
The request body carries the identity from the alias
diff: block plus both versions:
{ "project": "payneteasy/paynet", "app": "ams2-paynet-proc", "instance": "AMS-2", "old_version": "3.36.16-117", "new_version": "3.36.16-118", "deployed_at": "2026-08-11T15:07:39Z"}Delivery goes through a durable spool (QUEUE_DIR/deploy-review), so it survives a restart and is
retried with backoff; it is at-least-once, which is safe because the receiver dedupes by
version. 4xx answers (bad token, bad version format) are dead-lettered immediately instead of
being retried. The notification is only sent for aliases whose diff: block is enabled and carries
project and instance — the plain ?command=run path never reads the old version, so it sends
nothing.
The agent reads exactly two variables, both required — the process throws on startup if either is missing or blank:
| Env var | Meaning |
|---|---|
SERVER_BASE_URL |
WebSocket base URL; AGENT_ID is appended, so it should end with /. |
AGENT_ID |
Agent identity (the last path segment the server keys on). |
AGENT_POLICY_FILE |
What a deploy plan may do on this host. Default ./etc/policy.yml; with no such file the agent refuses plans and runs only the older commands. |