homeos/docker-compose.yml

74 lines
1.9 KiB
YAML

# HomeOS — dev stack (dev = prod parity, R8). All app-family services share one image.
# mosquitto / mqtt-listener (Phase 3) and discovery sidecar (Phase 4) are added in their phases.
x-app-image: &app-image
image: homeos-app:dev
build:
context: .
dockerfile: docker/app/Dockerfile
args:
HOST_UID: ${HOST_UID:-1000}
HOST_GID: ${HOST_GID:-1000}
# Laravel reads its own .env from the mounted volume (correct phpdotenv interpolation).
# Compose still reads root .env for ${...} substitution in this file (ports, uid, db creds).
volumes:
- .:/var/www/html
- ./docker/nginx/default.conf:/etc/nginx/sites-available/default:ro
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
restart: unless-stopped
services:
app:
<<: *app-image
ports:
- "${APP_PORT:-80}:80"
- "${VITE_PORT:-5173}:5173"
horizon:
<<: *app-image
command: ["php", "artisan", "horizon"]
ports: []
scheduler:
<<: *app-image
command: ["php", "artisan", "schedule:work"]
ports: []
reverb:
<<: *app-image
command: ["php", "artisan", "reverb:start", "--host=0.0.0.0", "--port=8080"]
ports:
- "${REVERB_HOST_PORT:-6001}:8080"
db:
image: timescale/timescaledb:latest-pg17
environment:
POSTGRES_DB: ${DB_DATABASE:-homeos}
POSTGRES_USER: ${DB_USERNAME:-homeos}
POSTGRES_PASSWORD: ${DB_PASSWORD:-homeos}
volumes:
- db-data:/var/lib/postgresql/data
ports:
- "127.0.0.1:${DB_HOST_PORT:-5432}:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME:-homeos} -d ${DB_DATABASE:-homeos}"]
interval: 5s
timeout: 5s
retries: 10
restart: unless-stopped
redis:
image: redis:7-alpine
command: ["redis-server", "--appendonly", "yes"]
volumes:
- redis-data:/data
restart: unless-stopped
volumes:
db-data:
redis-data: