version: "3.8" services: db: image: postgres:17-alpine environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: posse_party # Performance tuning for 8GB RAM systems POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=en_US.UTF-8" command: > postgres -c shared_buffers=2GB -c effective_cache_size=6GB -c work_mem=16MB -c maintenance_work_mem=512MB -c random_page_cost=1.1 -c effective_io_concurrency=200 -c wal_buffers=16MB -c min_wal_size=1GB -c max_wal_size=4GB -c max_connections=100 -c log_min_duration_statement=1000 healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 volumes: - db_data:/var/lib/postgresql/data networks: - posseparty-network deploy: # Allow to run on any node (not just NAS) restart_policy: condition: on-failure migrate: image: ghcr.io/searlsco/posse_party:latest environment: DATABASE_URL: postgres://postgres:${POSTGRES_PASSWORD}@db:5432/posse_party RAILS_ENV: production SECRET_KEY_BASE: ${SECRET_KEY_BASE} command: ["./script/release"] networks: - posseparty-network deploy: placement: constraints: - node.labels.type == nas restart_policy: condition: on-failure delay: 10s max_attempts: 10 web: image: ghcr.io/searlsco/posse_party:latest environment: DATABASE_URL: postgres://postgres:${POSTGRES_PASSWORD}@db:5432/posse_party RAILS_ENV: production APP_HOST: ${APP_HOST:-posseparty.bendtstudio.com} SECRET_KEY_BASE: ${SECRET_KEY_BASE} FORCE_SSL: "false" command: ["./script/server"] networks: - posseparty-network - dokploy-network deploy: placement: constraints: - node.labels.type == nas restart_policy: condition: on-failure delay: 30s max_attempts: 10 labels: - traefik.enable=true - traefik.http.routers.posseparty.rule=Host(`${APP_HOST:-posseparty.bendtstudio.com}`) - traefik.http.routers.posseparty.entrypoints=web - traefik.http.services.posseparty.loadbalancer.server.port=3000 - traefik.http.routers.posseparty.middlewares=redirect-to-https@file - traefik.http.routers.posseparty-secure.rule=Host(`${APP_HOST:-posseparty.bendtstudio.com}`) - traefik.http.routers.posseparty-secure.entrypoints=websecure - traefik.http.routers.posseparty-secure.tls.certresolver=letsencrypt worker: image: ghcr.io/searlsco/posse_party:latest environment: DATABASE_URL: postgres://postgres:${POSTGRES_PASSWORD}@db:5432/posse_party RAILS_ENV: production APP_HOST: ${APP_HOST:-posseparty.bendtstudio.com} SECRET_KEY_BASE: ${SECRET_KEY_BASE} command: ["./script/worker"] networks: - posseparty-network deploy: placement: constraints: - node.labels.type == nas restart_policy: condition: on-failure delay: 30s max_attempts: 10 volumes: db_data: networks: posseparty-network: driver: overlay dokploy-network: external: true