Settings are read from .env in the working directory (and ../.env) or from the process environment. Invalid values are rejected: the panel refuses to start and names the wrong variable.
| Variable |
Default |
Description |
APP_SECRET |
required |
Secret of at least 32 characters. Signs JWTs and is part of password hashes, API tokens and node SSH credential encryption, so do not change it on a running panel |
APP_HOST |
127.0.0.1 |
Address the panel and metrics listen on. Expose the panel through a reverse proxy with HTTPS; 0.0.0.0 is only needed inside a container |
APP_PORT |
3000 |
Panel and API port |
PANEL_DOMAIN |
localhost:3000 |
Panel domain |
SUB_PUBLIC_DOMAIN |
localhost:3000/api/sub |
Public subscription address |
FRONT_END_DOMAIN |
* |
Allowed CORS origins |
JWT_AUTH_LIFETIME |
12 |
Administrator session lifetime, hours |
SHORT_UUID_LENGTH |
16 |
Subscription short UUID length, 16 to 64 |
| Variable |
Default |
Description |
DB_DRIVER |
sqlite |
sqlite or postgres. When unset and DATABASE_URL starts with postgres://, PostgreSQL is used |
DATABASE_URL |
gowave.db |
SQLite file path or PostgreSQL DSN |
DB_MAX_CONNECTIONS |
20 |
PostgreSQL pool size, 1 to 500. Each connection is a separate PostgreSQL process of a few MB; 20 is enough even under benchmark load |
| Variable |
Default |
Description |
METRICS_PORT |
3001 |
Prometheus metrics port |
METRICS_USER, METRICS_PASS |
not set |
Basic auth for /metrics |
| Variable |
Default |
Description |
SERVICE_CLEAN_USAGE_HISTORY |
false |
Clean usage history |
SERVICE_DISABLE_USER_USAGE_RECORDS |
false |
Do not record per-user traffic statistics |
SERVICE_DISABLE_SRH_RECORDS |
false |
Do not record subscription request history |
USER_USAGE_IGNORE_BELOW_BYTES |
0 |
Ignore traffic below this value |
EXPORT_TO_STREAM_ENABLED |
false |
Export events to a stream |
| Variable |
Description |
WEBHOOK_ENABLED |
true to enable |
WEBHOOK_URL |
One or more comma-separated http:// or https:// URLs |
WEBHOOK_SECRET_HEADER |
At least 32 Latin letters and digits; required when webhooks are enabled |
| Variable |
Description |
IS_TELEGRAM_NOTIFICATIONS_ENABLED |
true to enable |
TELEGRAM_BOT_TOKEN |
Bot token; required when notifications are enabled |
TELEGRAM_BOT_API_ROOT |
Custom Bot API server (default https://api.telegram.org) |
TELEGRAM_BOT_PROXY |
Proxy for Telegram requests |
TELEGRAM_NOTIFY_USERS |
Chat for user events: chatId or chatId:threadId |
TELEGRAM_NOTIFY_NODES |
Chat for node events |
TELEGRAM_NOTIFY_SERVICE |
Chat for service events and errors |
TELEGRAM_NOTIFY_CRM |
Chat for CRM events |
TELEGRAM_NOTIFY_TBLOCKER |
Chat for Torrent Blocker |
A chat set to change_me counts as not configured. The “View user” button in Torrent Blocker reports points to PANEL_DOMAIN with PANEL_BASE_PATH and is omitted for local domains. A failed login sends only the length of the typed password to Telegram, never the password itself.
Notification settings of the old panel are copied during migration. On an existing GoWave install, use the installer menu item “Copy Telegram and webhook notifications from the old panel”.
Lists are JSON number arrays such as [60, 80, 95] and only apply when their flag is on:
| Flag |
List |
BANDWIDTH_USAGE_NOTIFICATIONS_ENABLED |
BANDWIDTH_USAGE_NOTIFICATIONS_THRESHOLD: percent of the traffic limit |
NOT_CONNECTED_USERS_NOTIFICATIONS_ENABLED |
NOT_CONNECTED_USERS_NOTIFICATIONS_AFTER_HOURS: hours without connecting |
EXPIRATION_NOTIFICATIONS_ENABLED |
EXPIRATION_NOTIFICATIONS: when to warn about subscription expiry |
For the compose installation only:
| Variable |
Description |
GOWAVE_IMAGE |
Panel image, default ghcr.io/aaasazan/gowave:latest |
GOWAVE_COMPOSE_DIR |
Directory with docker-compose.yml; shown in the update hint |
POSTGRES_USER, POSTGRES_DB |
Default gowave |
POSTGRES_PASSWORD |
Required |
POSTGRES_PORT |
PostgreSQL port on 127.0.0.1, default 5432 |