version: '3.8' services: postgres: image: pgvector/pgvector:pg16@sha256:00ba258a66dac104fd5171074a0084462a64a1369d8513f3d0a634e2f24d15bc container_name: elektrine_db shm_size: ${POSTGRES_SHM_SIZE:-512m} command: [ "postgres", "-c", "shared_preload_libraries=pg_stat_statements", "-c", "pg_stat_statements.max=10000", "-c", "pg_stat_statements.track=all" ] environment: POSTGRES_USER: elektrine POSTGRES_PASSWORD: ${DB_PASSWORD:?set DB_PASSWORD} POSTGRES_DB: elektrine_prod volumes: - postgres_data:/var/lib/postgresql/data - ./initdb:/docker-entrypoint-initdb.d:ro networks: - elektrine_network restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U elektrine -d elektrine_prod"] interval: 10s timeout: 5s retries: 5 app: image: ${ELEKTRINE_IMAGE:-elektrine:local} build: context: ../.. dockerfile: deploy/docker/Dockerfile args: RELEASE_NAME: ${RELEASE_NAME:-elektrine} ELEKTRINE_RELEASE_MODULES: ${ELEKTRINE_RELEASE_MODULES:-chat,social,nerve,atomine} PRIMARY_DOMAIN: ${PRIMARY_DOMAIN:-localhost} EMAIL_DOMAIN: ${EMAIL_DOMAIN:-${PRIMARY_DOMAIN:-localhost}} SUPPORTED_DOMAINS: ${SUPPORTED_DOMAINS:-${PRIMARY_DOMAIN:-localhost}} PROFILE_BASE_DOMAINS: ${PROFILE_BASE_DOMAINS:-${PRIMARY_DOMAIN:-localhost}} container_name: elektrine_app depends_on: postgres: condition: service_healthy env_file: - ../../.env.production environment: DATABASE_URL: ecto://elektrine:${DB_PASSWORD:?set DB_PASSWORD}@postgres/elektrine_prod PHX_HOST: ${PHX_HOST:-localhost} PHX_SERVER: "true" PORT: ${PORT:-8080} PHX_HTTP_IP: ${DOCKER_PHX_HTTP_IP:-0.0.0.0} TRUSTED_PROXY_CIDRS: ${TRUSTED_PROXY_CIDRS:-172.30.0.0/24} CADDY_ASK_TRUSTED_CIDRS: ${CADDY_ASK_TRUSTED_CIDRS:-${TRUSTED_PROXY_CIDRS:-172.30.0.0/24}} MIX_ENV: prod ELEKTRINE_ENABLED_MODULES: ${ELEKTRINE_ENABLED_MODULES:-chat,social,nerve,atomine} ACME_HOME: ${ACME_HOME:-/data/acme.sh} ACME_SH_BIN: ${ACME_SH_BIN:-/data/acme.sh/acme.sh} ACME_WILDCARD_RENEWAL_ENABLED: ${ACME_WILDCARD_RENEWAL_ENABLED:-false} ELEKTRINE_API_BASE: ${ELEKTRINE_API_BASE:-http://app:8080} CADDY_TLS_MOUNT_DIR: ${CADDY_TLS_MOUNT_DIR:-/opt/elektrine/certs} RELOAD_CMD: ${ACME_RELOAD_CMD:-true} ports: - "${APP_HTTP_BIND:-127.0.0.1:8080:8080}" volumes: - app_data:/data - uploads:/data/uploads - ${CADDY_TLS_MOUNT_DIR:-/opt/elektrine/certs}:/opt/elektrine/certs networks: elektrine_network: caddy_proxy_network: aliases: - app_proxy healthcheck: test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:$${PORT:-8080}/health >/dev/null || curl -g -fsS http://[::1]:$${PORT:-8080}/health >/dev/null || exit 1"] interval: 10s timeout: 5s retries: 12 start_period: 30s restart: unless-stopped security_opt: - no-new-privileges:true volumes: postgres_data: uploads: app_data: networks: elektrine_network: driver: bridge caddy_proxy_network: driver: bridge ipam: config: - subnet: ${CADDY_PROXY_DOCKER_SUBNET:-172.30.0.0/24}