services: traefik: image: traefik:v2.11 container_name: netgescon_traefik restart: unless-stopped command: - --providers.docker=true - --providers.docker.exposedbydefault=false - --entrypoints.web.address=:80 - --entrypoints.websecure.address=:443 - --certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL} - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json - --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - netgescon_letsencrypt:/letsencrypt networks: - netgescon_edge prod_app: image: netgescon/app:${NETGESCON_VERSION:-latest} build: context: .. dockerfile: docker/Dockerfile.prod container_name: netgescon_prod_app restart: unless-stopped environment: APP_KEY: ${APP_KEY} APP_ENV: production APP_DEBUG: "false" APP_URL: https://${APP_DOMAIN} APP_FORCE_HTTPS: "true" SESSION_SECURE_COOKIE: "true" NETGESCON_SITE_MODE: app NETGESCON_SITE_LABEL: ${PROD_SITE_LABEL:-NetGescon APP} NETGESCON_MAINTENANCE_RENDER: ${NETGESCON_MAINTENANCE_RENDER:-errors::503} NETGESCON_MAINTENANCE_RETRY: ${NETGESCON_MAINTENANCE_RETRY:-60} NETGESCON_MAINTENANCE_REFRESH: ${NETGESCON_MAINTENANCE_REFRESH:-15} NETGESCON_MAINTENANCE_TITLE: ${PROD_MAINTENANCE_TITLE:-Aggiornamento APP in corso} NETGESCON_MAINTENANCE_MESSAGE: ${PROD_MAINTENANCE_MESSAGE:-Stiamo distribuendo una nuova versione dell'ambiente applicativo.} NETGESCON_MAINTENANCE_DETAIL: ${PROD_MAINTENANCE_DETAIL:-Durante questa finestra tecnica i nuovi accessi restano sospesi e il servizio si riapre automaticamente.} NETGESCON_MAINTENANCE_SUPPORT_EMAIL: ${MAINTENANCE_SUPPORT_EMAIL:-supporto@netgescon.it} NETGESCON_MAINTENANCE_SUPPORT_URL: ${MAINTENANCE_SUPPORT_URL:-} NETGESCON_UPDATE_EXECUTOR: ${PROD_UPDATE_EXECUTOR:-local} NETGESCON_PREUPDATE_BACKUP_ENABLED: ${PROD_PREUPDATE_BACKUP_ENABLED:-false} NETGESCON_PREUPDATE_BACKUP_VISIBLE: ${PROD_PREUPDATE_BACKUP_VISIBLE:-true} NETGESCON_PREUPDATE_DRIVE_ENABLED: ${PROD_PREUPDATE_DRIVE_ENABLED:-false} NETGESCON_PREUPDATE_REQUIRE_DRIVE: ${PROD_PREUPDATE_REQUIRE_DRIVE:-false} DB_CONNECTION: ${PROD_DB_CONNECTION:-pgsql} DB_HOST: ${PROD_DB_HOST:-prod_pgsql} DB_PORT: ${PROD_DB_PORT:-5432} DB_DATABASE: ${PROD_DB_DATABASE:-netgescon_prod} DB_USERNAME: ${PROD_DB_USERNAME:-netgescon_prod} DB_PASSWORD: ${PROD_DB_PASSWORD} RUN_MIGRATIONS: ${PROD_RUN_MIGRATIONS:-true} MIGRATIONS_STRICT: "false" RUN_FILAMENT_ASSETS: "false" FIX_PERMISSIONS: "true" WAIT_FOR_DB: "true" DISABLE_SCHEMA_LOAD: "true" MYSQL_SSL_VERIFY_SERVER_CERT: "FALSE" MAIL_MAILER: smtp MAIL_HOST: smtp.gmail.com MAIL_PORT: 587 MAIL_ENCRYPTION: tls MAIL_USERNAME: netgescon@gmail.com MAIL_PASSWORD: ${MAIL_PASSWORD:-pecd izll jlno vros} MAIL_FROM_ADDRESS: michele@netgescon.it MAIL_FROM_NAME: NetGescon QUEUE_CONNECTION: sync volumes: - prod_storage:/var/www/storage - prod_cache:/var/www/bootstrap/cache - prod_public:/var/www/public - ${LEGACY_ARCHIVES_PATH:-/mnt/gescon-archives/gescon}:/mnt/gescon-archives/gescon:ro depends_on: - prod_pgsql - prod_redis networks: - netgescon_edge prod_nginx: image: nginx:alpine container_name: netgescon_prod_nginx restart: unless-stopped volumes: - prod_public:/var/www/public:ro - ./nginx/prod.conf:/etc/nginx/conf.d/default.conf:ro depends_on: - prod_app labels: - "traefik.enable=true" - "traefik.http.routers.netgescon-prod.rule=Host(`${APP_DOMAIN}`)" - "traefik.http.routers.netgescon-prod.entrypoints=websecure" - "traefik.http.routers.netgescon-prod.tls=true" - "traefik.http.routers.netgescon-prod.tls.certresolver=letsencrypt" - "traefik.http.services.netgescon-prod.loadbalancer.server.port=80" - "traefik.http.routers.netgescon-prod-http.rule=Host(`${APP_DOMAIN}`)" - "traefik.http.routers.netgescon-prod-http.entrypoints=web" - "traefik.http.routers.netgescon-prod-http.middlewares=netgescon-https-redirect" - "traefik.http.middlewares.netgescon-https-redirect.redirectscheme.scheme=https" networks: - netgescon_edge prod_pgsql: image: postgres:16-alpine container_name: netgescon_prod_pgsql restart: unless-stopped environment: POSTGRES_DB: ${PROD_DB_DATABASE:-netgescon_prod} POSTGRES_USER: ${PROD_DB_USERNAME:-netgescon_prod} POSTGRES_PASSWORD: ${PROD_DB_PASSWORD} volumes: - prod_pgsql:/var/lib/postgresql/data networks: - netgescon_edge prod_db: image: mysql:8.0 container_name: netgescon_prod_db restart: unless-stopped command: --log-bin-trust-function-creators=1 environment: MYSQL_DATABASE: ${PROD_DB_DATABASE} MYSQL_USER: ${PROD_DB_USERNAME} MYSQL_PASSWORD: ${PROD_DB_PASSWORD} MYSQL_ROOT_PASSWORD: ${PROD_DB_ROOT_PASSWORD} volumes: - prod_db:/var/lib/mysql - ./mysql/init.sql:/docker-entrypoint-initdb.d/01-init.sql:ro networks: - netgescon_edge prod_redis: image: redis:alpine container_name: netgescon_prod_redis restart: unless-stopped volumes: - prod_redis:/data networks: - netgescon_edge demo_app: image: netgescon/app:${NETGESCON_VERSION:-latest} container_name: netgescon_demo_app restart: unless-stopped environment: APP_KEY: ${APP_KEY} APP_ENV: production APP_DEBUG: "false" APP_URL: https://${DEMO_DOMAIN} APP_FORCE_HTTPS: "true" SESSION_SECURE_COOKIE: "true" NETGESCON_SITE_MODE: demo NETGESCON_SITE_LABEL: ${DEMO_SITE_LABEL:-NetGescon DEMO} NETGESCON_MAINTENANCE_RENDER: ${NETGESCON_MAINTENANCE_RENDER:-errors::503} NETGESCON_MAINTENANCE_RETRY: ${NETGESCON_MAINTENANCE_RETRY:-60} NETGESCON_MAINTENANCE_REFRESH: ${NETGESCON_MAINTENANCE_REFRESH:-15} NETGESCON_MAINTENANCE_TITLE: ${DEMO_MAINTENANCE_TITLE:-Aggiornamento DEMO in corso} NETGESCON_MAINTENANCE_MESSAGE: ${DEMO_MAINTENANCE_MESSAGE:-L'ambiente demo viene aggiornato in modo controllato prima della prossima distribuzione.} NETGESCON_MAINTENANCE_DETAIL: ${DEMO_MAINTENANCE_DETAIL:-Il blocco e temporaneo e viene rimosso automaticamente a fine aggiornamento.} NETGESCON_MAINTENANCE_SUPPORT_EMAIL: ${MAINTENANCE_SUPPORT_EMAIL:-supporto@netgescon.it} NETGESCON_MAINTENANCE_SUPPORT_URL: ${MAINTENANCE_SUPPORT_URL:-} NETGESCON_UPDATE_EXECUTOR: ${DEMO_UPDATE_EXECUTOR:-local} NETGESCON_PREUPDATE_BACKUP_ENABLED: ${DEMO_PREUPDATE_BACKUP_ENABLED:-false} NETGESCON_PREUPDATE_BACKUP_VISIBLE: ${DEMO_PREUPDATE_BACKUP_VISIBLE:-true} NETGESCON_PREUPDATE_DRIVE_ENABLED: ${DEMO_PREUPDATE_DRIVE_ENABLED:-false} NETGESCON_PREUPDATE_REQUIRE_DRIVE: ${DEMO_PREUPDATE_REQUIRE_DRIVE:-false} DB_CONNECTION: mysql DB_HOST: demo_db DB_PORT: 3306 DB_DATABASE: ${DEMO_DB_DATABASE} DB_USERNAME: ${DEMO_DB_USERNAME} DB_PASSWORD: ${DEMO_DB_PASSWORD} RUN_MIGRATIONS: ${DEMO_RUN_MIGRATIONS:-true} MIGRATIONS_STRICT: "false" RUN_FILAMENT_ASSETS: "false" FIX_PERMISSIONS: "true" WAIT_FOR_DB: "true" RUN_SEEDERS: demo SEEDERS_STRICT: "false" DISABLE_SCHEMA_LOAD: "true" MYSQL_SSL_VERIFY_SERVER_CERT: "FALSE" MAIL_MAILER: smtp MAIL_HOST: smtp.gmail.com MAIL_PORT: 587 MAIL_ENCRYPTION: tls MAIL_USERNAME: netgescon@gmail.com MAIL_PASSWORD: ${MAIL_PASSWORD:-pecd izll jlno vros} MAIL_FROM_ADDRESS: michele@netgescon.it MAIL_FROM_NAME: NetGescon QUEUE_CONNECTION: sync volumes: - demo_storage:/var/www/storage - demo_cache:/var/www/bootstrap/cache - demo_public:/var/www/public - ${LEGACY_ARCHIVES_PATH:-/mnt/gescon-archives/gescon}:/mnt/gescon-archives/gescon:ro depends_on: - demo_db - demo_redis networks: - netgescon_edge demo_nginx: image: nginx:alpine container_name: netgescon_demo_nginx restart: unless-stopped volumes: - ${DEMO_PUBLIC_PATH:-/srv/netgescon/demo/public}:/var/www/public:ro - ./nginx/demo.conf:/etc/nginx/conf.d/default.conf:ro depends_on: - demo_app labels: - "traefik.enable=true" - "traefik.http.routers.netgescon-demo.rule=Host(`${DEMO_DOMAIN}`)" - "traefik.http.routers.netgescon-demo.entrypoints=websecure" - "traefik.http.routers.netgescon-demo.tls=true" - "traefik.http.routers.netgescon-demo.tls.certresolver=letsencrypt" - "traefik.http.services.netgescon-demo.loadbalancer.server.port=80" - "traefik.http.routers.netgescon-demo-http.rule=Host(`${DEMO_DOMAIN}`)" - "traefik.http.routers.netgescon-demo-http.entrypoints=web" - "traefik.http.routers.netgescon-demo-http.middlewares=netgescon-https-redirect" networks: - netgescon_edge demo_db: image: mysql:8.0 container_name: netgescon_demo_db restart: unless-stopped command: --log-bin-trust-function-creators=1 environment: MYSQL_DATABASE: ${DEMO_DB_DATABASE} MYSQL_USER: ${DEMO_DB_USERNAME} MYSQL_PASSWORD: ${DEMO_DB_PASSWORD} MYSQL_ROOT_PASSWORD: ${DEMO_DB_ROOT_PASSWORD} volumes: - demo_db:/var/lib/mysql - ./mysql/init.sql:/docker-entrypoint-initdb.d/01-init.sql:ro networks: - netgescon_edge demo_redis: image: redis:alpine container_name: netgescon_demo_redis restart: unless-stopped volumes: - demo_redis:/data networks: - netgescon_edge presentation_www: image: nginx:alpine container_name: netgescon_www restart: unless-stopped volumes: - ./www:/usr/share/nginx/html:ro labels: - "traefik.enable=true" - "traefik.http.routers.netgescon-www.rule=Host(`${WWW_DOMAIN}`)" - "traefik.http.routers.netgescon-www.entrypoints=websecure" - "traefik.http.routers.netgescon-www.tls=true" - "traefik.http.routers.netgescon-www.tls.certresolver=letsencrypt" - "traefik.http.services.netgescon-www.loadbalancer.server.port=80" - "traefik.http.routers.netgescon-www-http.rule=Host(`${WWW_DOMAIN}`)" - "traefik.http.routers.netgescon-www-http.entrypoints=web" - "traefik.http.routers.netgescon-www-http.middlewares=netgescon-https-redirect" networks: - netgescon_edge volumes: netgescon_letsencrypt: prod_pgsql: prod_db: prod_storage: prod_cache: prod_public: prod_redis: demo_db: demo_storage: demo_cache: demo_public: demo_redis: networks: netgescon_edge: driver: bridge