services: mysql: image: mysql:8.0 container_name: nova-mysql command: > --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --innodb-buffer-pool-size=512M --sql-mode=NO_ENGINE_SUBSTITUTION environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} volumes: - /opt/nova-data/mysql:/var/lib/mysql restart: unless-stopped healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 5 n8n: image: docker.n8n.io/n8nio/n8n:latest container_name: nova-n8n ports: - "127.0.0.1:5678:5678" environment: - WEBHOOK_URL=https://n8n.parinaam.in/ - GENERIC_TIMEZONE=Asia/Kolkata # Add these three lines: - N8N_HOST=n8n.parinaam.in - N8N_PORT=5678 - N8N_PROTOCOL=https volumes: - /opt/nova-data/n8n:/home/node/.n8n restart: unless-stopped postgres: image: postgres:16-alpine container_name: nova-postgres environment: POSTGRES_PASSWORD: ${PG_PASSWORD} POSTGRES_INITDB_ARGS: "--encoding=UTF8" volumes: - /opt/nova-data/postgres:/var/lib/postgresql/data - /opt/nova-data/stack/pg-init:/docker-entrypoint-initdb.d restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine container_name: nova-redis command: redis-server --requirepass ${REDIS_PASSWORD} --maxmemory 256mb --maxmemory-policy allkeys-lru volumes: - /opt/nova-data/redis:/data restart: unless-stopped tuleap: image: tuleap/tuleap-community-edition:latest container_name: nova-tuleap hostname: ${TULEAP_FQDN} ports: - "127.0.0.1:8081:80" - "127.0.0.1:8083:443" - "0.0.0.0:2223:22" environment: TULEAP_FQDN: ${TULEAP_FQDN} TULEAP_SYS_DBHOST: mysql DB_ADMIN_USER: root DB_ADMIN_PASSWORD: ${MYSQL_ROOT_PASSWORD} TULEAP_SYS_DBPASSWD: ${TULEAP_DB_PASS} TULEAP_FPM_SESSION_MODE: redis TULEAP_REDIS_SERVER: redis TULEAP_REDIS_PASSWORD: ${REDIS_PASSWORD} SITE_ADMINISTRATOR_PASSWORD: ${TULEAP_SITE_ADMIN_PASS} volumes: - /opt/nova-data/tuleap:/data depends_on: mysql: { condition: service_healthy } redis: { condition: service_started } restart: unless-stopped elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.17.18 container_name: nova-elasticsearch command: > bash -c "if ! bin/elasticsearch-plugin list | grep -q ingest-attachment; then bin/elasticsearch-plugin install --batch ingest-attachment; fi; /usr/local/bin/docker-entrypoint.sh elasticsearch" environment: discovery.type: single-node ES_JAVA_OPTS: "-Xms1g -Xmx1g" xpack.security.enabled: "false" ulimits: memlock: { soft: -1, hard: -1 } nofile: { soft: 65536, hard: 65536 } volumes: - /opt/nova-data/zammad-es:/usr/share/elasticsearch/data restart: unless-stopped healthcheck: test: ["CMD-SHELL", "curl -sf http://localhost:9200/_cluster/health | grep -q 'green\\|yellow'"] interval: 20s timeout: 10s retries: 15 zammad-init: image: ghcr.io/zammad/zammad:latest container_name: nova-zammad-init command: ["zammad-init"] environment: &zammad-env ZAMMAD_DB_ADAPTER: postgresql POSTGRESQL_HOST: postgres POSTGRESQL_DB: zammad POSTGRESQL_USER: postgres POSTGRESQL_PASS: ${PG_PASSWORD} REDIS_URL: redis://:${REDIS_PASSWORD}@redis:6379 ELASTICSEARCH_HOST: elasticsearch ELASTICSEARCH_PORT: 9200 SECRET_KEY_BASE: ${ZAMMAD_SECRET} RAILS_SERVE_STATIC_FILES: "true" HTTP_TYPE: "https" # NEW: Passing the domain directly to Zammad FQDN: ${ZAMMAD_FQDN} depends_on: postgres: { condition: service_healthy } redis: { condition: service_started } elasticsearch: { condition: service_healthy } volumes: - /opt/nova-data/zammad:/opt/zammad/storage zammad-railsserver: image: ghcr.io/zammad/zammad:latest container_name: nova-zammad command: ["zammad-railsserver"] ports: - "127.0.0.1:8080:3000" environment: *zammad-env depends_on: zammad-init: { condition: service_completed_successfully } volumes: - /opt/nova-data/zammad:/opt/zammad/storage restart: unless-stopped zammad-websocket: image: ghcr.io/zammad/zammad:latest container_name: nova-zammad-websocket command: ["zammad-websocket"] ports: - "127.0.0.1:6042:6042" environment: *zammad-env depends_on: zammad-init: { condition: service_completed_successfully } volumes: - /opt/nova-data/zammad:/opt/zammad/storage restart: unless-stopped zammad-scheduler: image: ghcr.io/zammad/zammad:latest container_name: nova-zammad-scheduler command: ["zammad-scheduler"] environment: *zammad-env depends_on: zammad-init: { condition: service_completed_successfully } volumes: - /opt/nova-data/zammad:/opt/zammad/storage restart: unless-stopped gitea: image: gitea/gitea:latest container_name: nova-gitea ports: - "127.0.0.1:3000:3000" - "0.0.0.0:2222:22" environment: # NEW: Passing domain routing explicitly ROOT_URL: https://${GITEA_DOMAIN}/ DOMAIN: ${GITEA_DOMAIN} GITEA__database__DB_TYPE: postgres GITEA__database__HOST: postgres:5432 GITEA__database__NAME: gitea GITEA__database__USER: postgres GITEA__database__PASSWD: ${PG_PASSWORD} volumes: - /opt/nova-data/gitea:/data depends_on: postgres: { condition: service_healthy } restart: unless-stopped bookstack: image: lscr.io/linuxserver/bookstack:latest container_name: nova-bookstack ports: - "127.0.0.1:8082:80" environment: PUID: 1000 PGID: 1000 DB_HOST: mysql DB_PORT: 3306 DB_DATABASE: bookstack DB_USERNAME: bookstack DB_PASSWORD: ${BOOKSTACK_DB_PASS} APP_URL: ${BOOKSTACK_APP_URL} APP_KEY: ${BOOKSTACK_APP_KEY} volumes: - /opt/nova-data/bookstack:/config depends_on: mysql: { condition: service_healthy } restart: unless-stopped