super-productivity/docker-compose.yaml
Johannes Millan add56d818c fix(infra): close db-startup race in supersync e2e stack
pg_isready -U supersync without -d returned OK as soon as postgres
accepted connections to the default database, but during first-run
initdb the server briefly bounced while POSTGRES_DB was created.
supersync's prisma db push then race-failed with P1001.

- Healthcheck now runs psql -d supersync_db -c 'SELECT 1' so it only
  passes once the app's db is queryable.
- Dockerfile.test entrypoint retries prisma db push up to 15x before
  giving up — defense in depth if anything else ever races.
2026-04-29 16:17:56 +02:00

104 lines
2.9 KiB
YAML

services:
# PostgreSQL database for SuperSync
db:
image: postgres:15-alpine
restart: always
environment:
POSTGRES_USER: supersync
POSTGRES_PASSWORD: superpassword
POSTGRES_DB: supersync_db
ports:
- '55432:5432'
volumes:
- db_data:/var/lib/postgresql/data
# Gate on supersync_db existing AND accepting queries from the app user.
# Plain `pg_isready -U supersync` returns OK as soon as postgres accepts
# connections to the default `postgres` database — but during first-run
# initdb the server briefly bounces while POSTGRES_DB is created, so
# supersync's `prisma db push` race-fails with P1001. Querying
# supersync_db directly closes that window.
healthcheck:
test:
[
'CMD-SHELL',
'pg_isready -U supersync -d supersync_db && psql -U supersync -d supersync_db -c "SELECT 1" > /dev/null 2>&1',
]
interval: 3s
timeout: 5s
retries: 20
start_period: 10s
# SuperSync server for E2E testing
# Start with: docker compose up -d supersync
# Required for @supersync e2e tests
supersync:
build:
context: .
dockerfile: packages/super-sync-server/Dockerfile.test
env_file: .env
ports:
- '1900:1900'
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
depends_on:
db:
condition: service_healthy
environment:
- NODE_ENV=development
- PORT=1900
- TEST_MODE=true
- TEST_MODE_CONFIRM=yes-i-understand-the-risks
- JWT_SECRET=e2e-test-secret-minimum-32-chars-long-for-security
- CORS_ORIGINS=*
- DATA_DIR=/data
# Prisma connection string
- DATABASE_URL=postgresql://supersync:superpassword@db:5432/supersync_db
healthcheck:
test:
[
'CMD',
'wget',
'--quiet',
'--tries=1',
'--spider',
'http://127.0.0.1:1900/health',
]
interval: 5s
timeout: 5s
retries: 3
start_period: 10s
# Super Productivity app
app:
image: johannesjo/super-productivity:latest
ports:
- '8080:80'
environment:
# Pre-configured defaults for easier setup
WEBDAV_BASE_URL: ${WEBDAV_BASE_URL:-http://localhost:2345/}
WEBDAV_USERNAME: ${WEBDAV_USERNAME:-admin}
WEBDAV_SYNC_FOLDER_PATH: ${WEBDAV_SYNC_FOLDER_PATH:-/}
SYNC_INTERVAL: ${SYNC_INTERVAL:-15}
IS_COMPRESSION_ENABLED: ${IS_COMPRESSION_ENABLED:-true}
IS_ENCRYPTION_ENABLED: ${IS_ENCRYPTION_ENABLED:-false}
# WebDAV sync server
webdav:
image: hacdias/webdav:v5
ports:
- '2345:2345'
volumes:
- ./webdav.yaml:/etc/webdav/config.yaml:ro
- webdav_data:/data
healthcheck:
test: ['CMD', 'wget', '--quiet', '--tries=1', '--spider', 'http://localhost:2345/']
interval: 10s
timeout: 5s
retries: 3
start_period: 10s
volumes:
db_data:
webdav_data: