Docker Stack Deploy has a known limitation where it doesn’t automatically read .env files like docker compose up does. Environment variables must be handled differently when deploying to a Swarm.
Method 1: Using docker-compose config (Recommended)
This method processes your .env file and creates a fully resolved configuration.
1
Initialize Docker Swarm
docker swarm init
For multi-node clusters, join worker nodes:
# On manager node, get join tokendocker swarm join-token worker# On worker nodes, run the displayed commanddocker swarm join --token SWMTKN-... <manager-ip>:2377
Substitutes all variables in your docker-compose.yml
Pipes the processed configuration to docker stack deploy
4
Verify deployment
# Check stack servicesdocker stack services vega-stack# Check service logsdocker service logs vega-stack_vega-ai# List all running tasksdocker stack ps vega-stack
Method 3: Using Docker Secrets (Recommended for Production)
Docker Secrets provide a secure way to manage sensitive data. Vega AI supports reading environment variables from files using the _FILE suffix pattern.
SQLite doesn’t support concurrent writes from multiple replicas. Use replicas: 1 with placement constraints for high availability through automatic failover.
# List all stacksdocker stack ls# List services in stackdocker stack services vega-stack# List tasks in stackdocker stack ps vega-stack# Show only running tasksdocker stack ps --filter "desired-state=running" vega-stack
# Follow logs in real-timedocker service logs -f vega-stack_vega-ai# View last 100 linesdocker service logs --tail 100 vega-stack_vega-ai# View logs with timestampsdocker service logs --timestamps vega-stack_vega-ai
# Update stack with new configurationdocker-compose config | docker stack deploy -c - vega-stack# The deployment configuration controls update behavior:# - parallelism: 1 (update one task at a time)# - delay: 10s (wait between updates)# - order: stop-first (stop old task before starting new)
# Rollback to previous versiondocker service rollback vega-stack_vega-ai# Or manually update to specific versiondocker service update --image ghcr.io/benidevo/vega-ai:v1.0.0 vega-stack_vega-ai
# Create new secret versionecho "new-api-key" | docker secret create gemini_api_key_v2 -# Update service to use new secretdocker service update \ --secret-rm gemini_api_key \ --secret-add source=gemini_api_key_v2,target=gemini_api_key \ vega-stack_vega-ai# Remove old secretdocker secret rm gemini_api_key
# Find which node is running the serviceNODE=$(docker service ps vega-stack_vega-ai --format '{{.Node}}' | head -1)# Create backup (run on the node)docker run --rm \ -v vega-stack_vega-data:/data \ -v $(pwd)/backups:/backup \ alpine \ cp /data/vega.db /backup/vega-$(date +%Y%m%d).db