Pre-built images are automatically published to GitHub Container Registry (GHCR) via CI/CD.
docker pull ghcr.io/opendataensemble/synkronus:latestlatest- Latest stable release from main branchv1.0.0- Specific version tagsdevelop- Development branch (pre-release)feature-xyz- Feature branches (pre-release)
docker run -d `
--name synkronus `
-p 8080:8080 `
-e DB_CONNECTION="postgres://user:password@host:5432/synkronus" `
-e JWT_SECRET="your-secret-key" `
-e APP_BUNDLE_PATH="/app/data/app-bundles" `
-v synkronus-bundles:/app/data/app-bundles `
ghcr.io/opendataensemble/synkronus:latestFor production, we recommend:
- Clean Linux server (Ubuntu 22.04 LTS or similar)
- Docker & Docker Compose installed
- Cloudflared tunnel for secure external access (no port forwarding needed)
- PostgreSQL (dockerized or local install)
- Nginx as reverse proxy (included in docker-compose)
-
Copy the example configuration:
cp docker-compose.example.yml docker-compose.yml cp nginx.conf nginx.conf # Already configured -
Update secrets in docker-compose.yml:
- Change
CHANGE_THIS_PASSWORDfor PostgreSQL - Generate JWT secret:
openssl rand -base64 32 - Set admin password
- Change
-
Start the stack:
docker-compose up -d
-
Verify it's running:
curl http://localhost/health
For secure external access without exposing ports:
-
Install cloudflared:
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb sudo dpkg -i cloudflared-linux-amd64.deb
-
Create tunnel:
cloudflared tunnel login cloudflared tunnel create synkronus cloudflared tunnel route dns synkronus your-domain.com
-
Configure tunnel (create
~/.cloudflared/config.yml):tunnel: <tunnel-id> credentials-file: /root/.cloudflared/<tunnel-id>.json ingress: - hostname: your-domain.com service: http://localhost:80 - service: http_status:404
-
Run tunnel:
cloudflared tunnel run synkronus
Only needed if you're developing Synkronus or need a custom build.
# From the synkronus directory
docker build -t synkronus:local .docker run -d `
--name synkronus `
-p 8080:8080 `
-e DB_CONNECTION="postgres://user:password@host:5432/synkronus" `
-e JWT_SECRET="your-secret-key" `
-e APP_BUNDLE_PATH="/app/data/app-bundles" `
-v synkronus-bundles:/app/data/app-bundles `
synkronus:localFor publishing to registries:
# Setup buildx (one-time)
docker buildx create --name multiplatform --use
# Build for multiple platforms
docker buildx build `
--platform linux/amd64,linux/arm64 `
-t ghcr.io/opendataensemble/synkronus:custom `
--push `
.# Copy example and customize
cp docker-compose.example.yml docker-compose.yml
# Edit docker-compose.yml with your settings
# Start everything (includes PostgreSQL and Nginx)
docker-compose up -d
# View logs
docker-compose logs -f synkronus
# View all logs
docker-compose logs -f
# Stop
docker-compose down
# Stop and remove volumes (clean slate)
docker-compose down -v| Variable | Required | Description |
|---|---|---|
DB_CONNECTION |
✅ | PostgreSQL connection string |
JWT_SECRET |
✅ | Secret for JWT tokens (min 32 chars) |
APP_BUNDLE_PATH |
Path for app bundles (default: /app/data/app-bundles) |
You MUST mount a volume to persist app bundles:
-v your-volume-name:/app/data/app-bundles
Without this, uploaded app bundles will be lost when the container restarts.
Test if the service is running:
# Via nginx (recommended)
curl http://localhost/health
# Direct to Synkronus (if port exposed)
curl http://localhost:8080/healthdocker logs -f synkronus# Using OpenSSL (Git Bash on Windows)
openssl rand -base64 32
# Or use PowerShell
[Convert]::ToBase64String((1..32 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 }))The docker-compose setup includes:
┌─────────────────────────────────────────┐
│ Cloudflared Tunnel │
│ (Optional - for external │
│ access via Cloudflare) │
└──────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Nginx Reverse Proxy │
│ (Port 80/443) │
└──────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Synkronus Container │
│ (Port 8080 - internal) │
└──────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ PostgreSQL Database │
│ (Port 5432 - internal) │
└─────────────────────────────────────────┘
See DEPLOYMENT.md for:
- Detailed production deployment guide
- Troubleshooting guide
- Security best practices
- Backup and restore procedures
- Performance tuning