This guide explains how to run VanDaemon using Docker and Docker Compose.
- Docker Engine 20.10+ or Docker Desktop
- Docker Compose v2.0+ (included with Docker Desktop)
From the solution root directory, run:
docker compose upThis will:
- Build the API container (.NET 10 backend)
- Build the Web container (Blazor WebAssembly frontend with nginx)
- Start both containers with proper networking
- Expose the API on port 5000 and the Web UI on port 8080
Access the application:
- Web UI: http://localhost:8080
- API: http://localhost:5000
- API Health: http://localhost:5000/health
docker compose up -d# All services
docker compose logs -f
# Specific service
docker compose logs -f api
docker compose logs -f webdocker compose stopdocker compose downdocker compose down -v# Rebuild all images
docker compose build
# Rebuild specific service
docker compose build api
docker compose build web
# Rebuild and start
docker compose up --buildCopy .env.example to .env and customize:
cp .env.example .envKey variables:
ASPNETCORE_ENVIRONMENT: Development, ProductionAPI_PORT: External port for API (default: 5000)WEB_PORT: External port for Web UI (default: 8080)DEFAULT_SENSOR_PLUGIN: Simulated, Modbus, I2C, VictronDEFAULT_CONTROL_PLUGIN: Simulated, Modbus, I2C, Victron
To change ports, edit docker-compose.yml:
services:
api:
ports:
- "YOUR_PORT:80" # Change 5000 to your desired port
web:
ports:
- "YOUR_PORT:80" # Change 8080 to your desired portDocker volumes are used for data persistence:
api-data: Stores JSON data files (tanks.json, controls.json, settings.json, alerts.json)api-logs: Stores application logs
# Create backup directory
mkdir -p backups
# Backup api-data volume
docker run --rm -v vandaemon_api-data:/data -v $(pwd)/backups:/backup alpine tar czf /backup/api-data-backup.tar.gz -C /data .
# Backup api-logs volume
docker run --rm -v vandaemon_api-logs:/logs -v $(pwd)/backups:/backup alpine tar czf /backup/api-logs-backup.tar.gz -C /logs .# Restore api-data volume
docker run --rm -v vandaemon_api-data:/data -v $(pwd)/backups:/backup alpine tar xzf /backup/api-data-backup.tar.gz -C /data
# Restore api-logs volume
docker run --rm -v vandaemon_api-logs:/logs -v $(pwd)/backups:/backup alpine tar xzf /backup/api-logs-backup.tar.gz -C /logs- Base Image: mcr.microsoft.com/dotnet/aspnet:10.0
- Build: Multi-stage build with SDK:10.0
- Port: 80 (mapped to 5000 on host)
- Health Check: HTTP GET /health every 30s
- Volumes:
/app/data- JSON data storage/app/logs- Application logs
- Base Image: nginx:alpine
- Build: .NET SDK 10.0 for Blazor build, nginx for serving
- Port: 80 (mapped to 8080 on host)
- Dependencies: Waits for API health check before starting
- Environment: API_BASE_URL configured to connect to API container
- Both containers run on the
vandaemonbridge network - Containers can communicate using service names (e.g.,
http://api:80) - Only exposed ports are accessible from host
docker compose psdocker inspect vandaemon-api --format='{{.State.Health.Status}}'# API container
docker compose exec api /bin/bash
# Web container
docker compose exec web /bin/shdocker compose statsPort already in use:
# Check what's using the port
netstat -ano | findstr :5000 # Windows
lsof -i :5000 # Linux/Mac
# Change port in docker-compose.yml or stop the conflicting serviceBuild fails with "No space left on device":
# Clean up Docker system
docker system prune -a --volumesAPI container not healthy:
# Check logs
docker compose logs api
# Verify health endpoint manually
docker compose exec api curl http://localhost:80/healthWeb can't connect to API:
# Verify network connectivity
docker compose exec web ping api
# Check API_BASE_URL environment variable
docker compose exec web env | grep API_BASE_URLFor production deployments:
-
Use environment-specific compose file:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
-
Set proper environment variables:
- Set
ASPNETCORE_ENVIRONMENT=Production - Configure production plugin settings
- Set appropriate log levels
- Set
-
Use a reverse proxy (nginx, Traefik, Caddy) for:
- HTTPS/TLS termination
- Load balancing
- Rate limiting
- Security headers
-
Configure volume backups:
- Schedule regular backups of
api-datavolume - Implement log rotation for
api-logsvolume
- Schedule regular backups of
-
Monitor containers:
- Use
docker compose logsor external logging (ELK, Loki) - Monitor health endpoints
- Set up alerts for container failures
- Use
For development with hot reload, mount source code as volumes:
services:
api:
volumes:
- ./src:/src
- api-data:/app/data
environment:
- ASPNETCORE_ENVIRONMENT=Development- Enable remote debugging in API container
- Expose debug port (5001)
- Attach debugger from IDE (Visual Studio, VS Code)
See .vscode/launch.json for debug configuration examples.