services: portal: image: lilremark/twentycrmclientportal:${PORTAL_VERSION:-2.1.1} init: true restart: unless-stopped stop_grace_period: 30s env_file: ${PORTAL_ENV_FILE:-.env} environment: DATABASE_URL: postgres://portal:${POSTGRES_PASSWORD:-portal}@postgres:5432/portal HOSTNAME: 0.0.0.0 PORT: 3000 depends_on: postgres: condition: service_healthy ports: - "0.0.0.0:${PORTAL_PORT:-3005}:3000" volumes: - portal_uploads:/app/data/uploads networks: - frontend - backend security_opt: - no-new-privileges:true cap_drop: - ALL healthcheck: test: [ "CMD", "wget", "--quiet", "--tries=1", "--spider", "http://127.0.0.1:3000/health/ready", ] interval: 30s timeout: 5s start_period: 20s retries: 3 postgres: image: postgres:17-alpine restart: unless-stopped stop_grace_period: 30s environment: POSTGRES_DB: portal POSTGRES_USER: portal POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-portal} volumes: - portal_postgres:/var/lib/postgresql/data networks: - backend healthcheck: test: ["CMD-SHELL", "pg_isready -U portal -d portal"] interval: 5s timeout: 5s retries: 10 networks: frontend: backend: internal: true volumes: portal_postgres: portal_uploads: