services: # PostgreSQL Database db: image: postgres:15-alpine container_name: aatys_db restart: unless-stopped environment: POSTGRES_USER: ${DB_USER:-postgres} POSTGRES_PASSWORD: ${DB_PASSWORD:-postgres} POSTGRES_DB: ${DB_NAME:-aatys} volumes: - postgres_data:/var/lib/postgresql/data - ./database/schema.sql:/docker-entrypoint-initdb.d/01-schema.sql - ./database/migrations/001_multi_tenant.sql:/docker-entrypoint-initdb.d/02-multi-tenant.sql - ./database/migrations/002_apartments.sql:/docker-entrypoint-initdb.d/03-apartments.sql - ./database/migrations/002_push_notifications.sql:/docker-entrypoint-initdb.d/04-push-notifications.sql - ./database/seed.sql:/docker-entrypoint-initdb.d/05-seed.sql ports: - "5432:5432" networks: - aatys_network healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 # Backend API backend: build: context: ./backend dockerfile: Dockerfile container_name: aatys_backend restart: unless-stopped environment: - NODE_ENV=production - DB_HOST=db - DB_PORT=5432 - DB_USER=${DB_USER:-postgres} - DB_PASSWORD=${DB_PASSWORD:-postgres} - DB_NAME=${DB_NAME:-aatys} - JWT_SECRET=${JWT_SECRET:-your_jwt_secret_here} - JWT_EXPIRES_IN=${JWT_EXPIRES_IN:-7d} - GEMINI_API_KEY=${GEMINI_API_KEY} - STORAGE_TYPE=${STORAGE_TYPE:-local} - R2_ACCOUNT_ID=${R2_ACCOUNT_ID} - R2_ACCESS_KEY_ID=${R2_ACCESS_KEY_ID} - R2_SECRET_ACCESS_KEY=${R2_SECRET_ACCESS_KEY} - R2_BUCKET_NAME=${R2_BUCKET_NAME} - R2_PUBLIC_URL=${R2_PUBLIC_URL} - VAPID_PUBLIC_KEY=${VAPID_PUBLIC_KEY} - VAPID_PRIVATE_KEY=${VAPID_PRIVATE_KEY} - FRONTEND_URL=http://localhost:8888 - PORT=3000 volumes: - uploads_data:/app/uploads ports: - "3000:3000" depends_on: db: condition: service_healthy networks: - aatys_network # Frontend frontend: build: context: ./frontend dockerfile: Dockerfile args: - VITE_API_URL=/api - NGINX_CONFIG=nginx.conf container_name: aatys_frontend restart: unless-stopped ports: - "8888:80" depends_on: - backend networks: - aatys_network # pgAdmin - PostgreSQL Database Manager pgadmin: image: dpage/pgadmin4:latest container_name: aatys_pgadmin restart: unless-stopped environment: PGADMIN_DEFAULT_EMAIL: admin@example.com PGADMIN_DEFAULT_PASSWORD: admin123 ports: - "5050:80" networks: - aatys_network depends_on: - db volumes: postgres_data: uploads_data: networks: aatys_network: driver: bridge