201 lines
5.2 KiB
YAML
201 lines
5.2 KiB
YAML
|
|
# Host UK Production Docker Compose
|
||
|
|
# Deployed to de.host.uk.com and de2.host.uk.com via Coolify
|
||
|
|
#
|
||
|
|
# Container topology per app server:
|
||
|
|
# app - PHP 8.3-FPM (all Laravel modules)
|
||
|
|
# web - Nginx (static files + FastCGI proxy)
|
||
|
|
# horizon - Laravel Horizon (queue worker)
|
||
|
|
# scheduler - Laravel scheduler
|
||
|
|
# mcp - Go MCP server
|
||
|
|
# redis - Redis 7 (local cache + sessions)
|
||
|
|
# galera - MariaDB 11 (Galera cluster node)
|
||
|
|
|
||
|
|
services:
|
||
|
|
app:
|
||
|
|
image: ${REGISTRY:-gitea.snider.dev}/host-uk/app:${TAG:-latest}
|
||
|
|
restart: unless-stopped
|
||
|
|
volumes:
|
||
|
|
- app-storage:/app/storage
|
||
|
|
environment:
|
||
|
|
- APP_ENV=production
|
||
|
|
- APP_DEBUG=false
|
||
|
|
- APP_URL=${APP_URL:-https://host.uk.com}
|
||
|
|
- DB_HOST=galera
|
||
|
|
- DB_PORT=3306
|
||
|
|
- DB_DATABASE=${DB_DATABASE:-hostuk}
|
||
|
|
- DB_USERNAME=${DB_USERNAME:-hostuk}
|
||
|
|
- DB_PASSWORD=${DB_PASSWORD}
|
||
|
|
- REDIS_HOST=redis
|
||
|
|
- REDIS_PORT=6379
|
||
|
|
- CACHE_DRIVER=redis
|
||
|
|
- SESSION_DRIVER=redis
|
||
|
|
- QUEUE_CONNECTION=redis
|
||
|
|
depends_on:
|
||
|
|
redis:
|
||
|
|
condition: service_healthy
|
||
|
|
galera:
|
||
|
|
condition: service_healthy
|
||
|
|
healthcheck:
|
||
|
|
test: ["CMD-SHELL", "php-fpm-healthcheck || exit 1"]
|
||
|
|
interval: 30s
|
||
|
|
timeout: 3s
|
||
|
|
start_period: 10s
|
||
|
|
retries: 3
|
||
|
|
networks:
|
||
|
|
- app-net
|
||
|
|
|
||
|
|
web:
|
||
|
|
image: ${REGISTRY:-gitea.snider.dev}/host-uk/web:${TAG:-latest}
|
||
|
|
restart: unless-stopped
|
||
|
|
ports:
|
||
|
|
- "${WEB_PORT:-80}:80"
|
||
|
|
volumes:
|
||
|
|
- app-storage:/app/storage:ro
|
||
|
|
depends_on:
|
||
|
|
app:
|
||
|
|
condition: service_healthy
|
||
|
|
healthcheck:
|
||
|
|
test: ["CMD", "wget", "-qO-", "http://localhost/health"]
|
||
|
|
interval: 30s
|
||
|
|
timeout: 3s
|
||
|
|
start_period: 5s
|
||
|
|
retries: 3
|
||
|
|
networks:
|
||
|
|
- app-net
|
||
|
|
|
||
|
|
horizon:
|
||
|
|
image: ${REGISTRY:-gitea.snider.dev}/host-uk/app:${TAG:-latest}
|
||
|
|
restart: unless-stopped
|
||
|
|
command: php artisan horizon
|
||
|
|
volumes:
|
||
|
|
- app-storage:/app/storage
|
||
|
|
environment:
|
||
|
|
- APP_ENV=production
|
||
|
|
- DB_HOST=galera
|
||
|
|
- DB_PORT=3306
|
||
|
|
- DB_DATABASE=${DB_DATABASE:-hostuk}
|
||
|
|
- DB_USERNAME=${DB_USERNAME:-hostuk}
|
||
|
|
- DB_PASSWORD=${DB_PASSWORD}
|
||
|
|
- REDIS_HOST=redis
|
||
|
|
- REDIS_PORT=6379
|
||
|
|
depends_on:
|
||
|
|
app:
|
||
|
|
condition: service_healthy
|
||
|
|
healthcheck:
|
||
|
|
test: ["CMD-SHELL", "php artisan horizon:status | grep -q running"]
|
||
|
|
interval: 60s
|
||
|
|
timeout: 5s
|
||
|
|
start_period: 30s
|
||
|
|
retries: 3
|
||
|
|
networks:
|
||
|
|
- app-net
|
||
|
|
|
||
|
|
scheduler:
|
||
|
|
image: ${REGISTRY:-gitea.snider.dev}/host-uk/app:${TAG:-latest}
|
||
|
|
restart: unless-stopped
|
||
|
|
command: php artisan schedule:work
|
||
|
|
volumes:
|
||
|
|
- app-storage:/app/storage
|
||
|
|
environment:
|
||
|
|
- APP_ENV=production
|
||
|
|
- DB_HOST=galera
|
||
|
|
- DB_PORT=3306
|
||
|
|
- DB_DATABASE=${DB_DATABASE:-hostuk}
|
||
|
|
- DB_USERNAME=${DB_USERNAME:-hostuk}
|
||
|
|
- DB_PASSWORD=${DB_PASSWORD}
|
||
|
|
- REDIS_HOST=redis
|
||
|
|
- REDIS_PORT=6379
|
||
|
|
depends_on:
|
||
|
|
app:
|
||
|
|
condition: service_healthy
|
||
|
|
networks:
|
||
|
|
- app-net
|
||
|
|
|
||
|
|
mcp:
|
||
|
|
image: ${REGISTRY:-gitea.snider.dev}/host-uk/core:${TAG:-latest}
|
||
|
|
restart: unless-stopped
|
||
|
|
command: core mcp serve
|
||
|
|
ports:
|
||
|
|
- "${MCP_PORT:-9001}:9000"
|
||
|
|
environment:
|
||
|
|
- MCP_ADDR=:9000
|
||
|
|
healthcheck:
|
||
|
|
test: ["CMD-SHELL", "nc -z localhost 9000 || exit 1"]
|
||
|
|
interval: 30s
|
||
|
|
timeout: 3s
|
||
|
|
retries: 3
|
||
|
|
networks:
|
||
|
|
- app-net
|
||
|
|
|
||
|
|
redis:
|
||
|
|
image: redis:7-alpine
|
||
|
|
restart: unless-stopped
|
||
|
|
command: >
|
||
|
|
redis-server
|
||
|
|
--maxmemory 512mb
|
||
|
|
--maxmemory-policy allkeys-lru
|
||
|
|
--appendonly yes
|
||
|
|
--appendfsync everysec
|
||
|
|
volumes:
|
||
|
|
- redis-data:/data
|
||
|
|
healthcheck:
|
||
|
|
test: ["CMD", "redis-cli", "ping"]
|
||
|
|
interval: 10s
|
||
|
|
timeout: 3s
|
||
|
|
retries: 5
|
||
|
|
networks:
|
||
|
|
- app-net
|
||
|
|
|
||
|
|
galera:
|
||
|
|
image: mariadb:11
|
||
|
|
restart: unless-stopped
|
||
|
|
environment:
|
||
|
|
- MARIADB_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
|
||
|
|
- MARIADB_DATABASE=${DB_DATABASE:-hostuk}
|
||
|
|
- MARIADB_USER=${DB_USERNAME:-hostuk}
|
||
|
|
- MARIADB_PASSWORD=${DB_PASSWORD}
|
||
|
|
- WSREP_CLUSTER_NAME=hostuk-galera
|
||
|
|
- WSREP_CLUSTER_ADDRESS=${GALERA_CLUSTER_ADDRESS:-gcomm://}
|
||
|
|
- WSREP_NODE_ADDRESS=${GALERA_NODE_ADDRESS}
|
||
|
|
- WSREP_NODE_NAME=${GALERA_NODE_NAME}
|
||
|
|
- WSREP_SST_METHOD=mariabackup
|
||
|
|
command: >
|
||
|
|
--wsrep-on=ON
|
||
|
|
--wsrep-provider=/usr/lib/galera/libgalera_smm.so
|
||
|
|
--wsrep-cluster-name=hostuk-galera
|
||
|
|
--wsrep-cluster-address=${GALERA_CLUSTER_ADDRESS:-gcomm://}
|
||
|
|
--wsrep-node-address=${GALERA_NODE_ADDRESS}
|
||
|
|
--wsrep-node-name=${GALERA_NODE_NAME}
|
||
|
|
--wsrep-sst-method=mariabackup
|
||
|
|
--binlog-format=ROW
|
||
|
|
--default-storage-engine=InnoDB
|
||
|
|
--innodb-autoinc-lock-mode=2
|
||
|
|
--innodb-buffer-pool-size=1G
|
||
|
|
--innodb-log-file-size=256M
|
||
|
|
--character-set-server=utf8mb4
|
||
|
|
--collation-server=utf8mb4_unicode_ci
|
||
|
|
volumes:
|
||
|
|
- galera-data:/var/lib/mysql
|
||
|
|
ports:
|
||
|
|
- "${GALERA_PORT:-3306}:3306"
|
||
|
|
- "4567:4567"
|
||
|
|
- "4568:4568"
|
||
|
|
- "4444:4444"
|
||
|
|
healthcheck:
|
||
|
|
test: ["CMD-SHELL", "mariadb -u root -p${DB_ROOT_PASSWORD} -e 'SHOW STATUS LIKE \"wsrep_ready\"' | grep -q ON"]
|
||
|
|
interval: 30s
|
||
|
|
timeout: 10s
|
||
|
|
start_period: 60s
|
||
|
|
retries: 5
|
||
|
|
networks:
|
||
|
|
- app-net
|
||
|
|
|
||
|
|
volumes:
|
||
|
|
app-storage:
|
||
|
|
redis-data:
|
||
|
|
galera-data:
|
||
|
|
|
||
|
|
networks:
|
||
|
|
app-net:
|
||
|
|
driver: bridge
|