Self-host and operate

Railway deployment

A complete deployment uses up to six services. Provision only the connector infrastructure you need.

Service matrix

ServiceSourceTarget portPersistent volume
PostgresRailway templateManagedManaged
RedisRailway templateManagedManaged
Evolutionevoapicloud/evolution-api:v2.3.78080/evolution/instances
Telegram bridgeRepo root; /apps/telegram-bridge/Dockerfile8095None
PocketBaseRoot services/pocketbase8090/pb_data
WebRepo root; apps/web/DockerfileRailway assignedNone

Postgres is needed for WhatsApp or Telegram. Redis and Evolution are WhatsApp-only. The bridge is Telegram-only. A PostgreSQL-connector-only deployment needs PocketBase and web.

Volumes and ports

Attach /evolution/instances to Evolution and /pb_data to PocketBase. The images do not declare Docker volumes because Railway requires volumes configured in service settings.

Pin internal ports:

pocketbase:       PORT=8090
evolution:        SERVER_PORT=8080
telegram-bridge:  TELEGRAM_BRIDGE_PORT=8095
web:              Railway-assigned public PORT

Environment wiring

Use Railway references such as ${{Service.VAR}} for shared secrets and database URLs. This keeps rotated values synchronized.

  • Match PocketBase administrator credentials between PocketBase and web.
  • Point NUXT_POCKETBASE_URL to pocketbase.railway.internal:8090.
  • Point NUXT_EVOLUTION_URL to the Evolution private host on 8080.
  • Give NUXT_EVOLUTION_DATABASE_URL a dedicated read-only credential, not the Postgres owner URL.
  • Point NUXT_TELEGRAM_URL to the bridge private host on 8095.
  • Set NUXT_PUBLIC_APP_URL to the public web origin.
  • Set NUXT_WEBHOOK_URL to the public Evolution webhook URL.

Keep the Telegram bridge and web app at one replica. Multiple bridge processes compete for sessions; multiple web replicas run duplicate in-process alert sweeps.

First-run checks

  1. Confirm PocketBase logs include superuser ready.
  2. Confirm migrations apply from the image without a manual schema step.
  3. Open the web domain and create an account.
  4. Check each private service health endpoint from its consumer.
  5. Create one connection and call a read-only status tool.
  6. Confirm connector URLs use the correct public origin.
View source