# docker-compose.yml version: '3.8' services: # PostgreSQL Database postgres: image: postgres:15 container_name: asset_mgmt_db environment: POSTGRES_DB: asset_management POSTGRES_USER: directus POSTGRES_PASSWORD: directus123 volumes: - postgres_data:/var/lib/postgresql/data - ./schema/init.sql:/docker-entrypoint-initdb.d/init.sql ports: - '5432:5432' networks: - asset_network healthcheck: test: ['CMD-SHELL', 'pg_isready -U directus'] interval: 30s timeout: 10s retries: 3 # Redis for caching and sessions redis: image: redis:7-alpine container_name: asset_mgmt_redis volumes: - redis_data:/data ports: - '6379:6379' networks: - asset_network healthcheck: test: ['CMD', 'redis-cli', 'ping'] interval: 30s timeout: 10s retries: 3 # Directus Backend directus: image: directus/directus:11.5.1 container_name: asset_mgmt_backend ports: - '8055:8055' volumes: - directus_uploads:/directus/uploads - directus_extensions:/directus/extensions depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: KEY: 'asset-mgmt-random-key-change-in-production' SECRET: 'asset-mgmt-random-secret-change-in-production' # Database DB_CLIENT: 'pg' DB_HOST: 'postgres' DB_PORT: '5432' DB_DATABASE: 'asset_management' DB_USER: 'directus' DB_PASSWORD: 'directus123' # Cache & Session CACHE_ENABLED: 'true' CACHE_STORE: 'redis' REDIS: 'redis://redis:6379' SESSION_STORE: 'redis' SESSION_REDIS: 'redis://redis:6379' # CORS CORS_ENABLED: 'true' CORS_ORIGIN: 'http://localhost:3000,http://localhost:5173' # Admin ADMIN_EMAIL: 'admin@assetmanagement.com' ADMIN_PASSWORD: 'AssetAdmin2024!' # Email (configure for production) EMAIL_FROM: 'noreply@assetmanagement.com' EMAIL_TRANSPORT: 'smtp' EMAIL_SMTP_HOST: 'smtp.gmail.com' EMAIL_SMTP_PORT: '587' EMAIL_SMTP_USER: '' EMAIL_SMTP_PASSWORD: '' # Rate Limiting RATE_LIMITER_ENABLED: 'true' RATE_LIMITER_STORE: 'redis' RATE_LIMITER_REDIS: 'redis://redis:6379' networks: - asset_network healthcheck: test: ['CMD', 'curl', '-f', 'http://localhost:8055/server/health'] interval: 30s timeout: 10s retries: 3 # Custom Node API node_api: build: context: ./node_api dockerfile: Dockerfile container_name: asset_mgmt_node_api ports: - '3001:3001' depends_on: postgres: condition: service_healthy directus: condition: service_healthy networks: - asset_network environment: NODE_ENV: production PORT: 3001 DB_HOST: postgres DB_PORT: 5432 DB_NAME: asset_management DB_USER: directus DB_PASSWORD: directus123 DIRECTUS_URL: http://directus:8055 CORS_ORIGIN: http://localhost:3000,http://localhost:5173 RATE_LIMIT_WINDOW_MS: 900000 RATE_LIMIT_MAX_REQUESTS: 100 healthcheck: test: ['CMD', 'curl', '-f', 'http://localhost:3001/health'] interval: 30s timeout: 10s retries: 3 # Frontend (Vue 3 + Vuetify) - Will be built later frontend: build: context: ./frontend dockerfile: Dockerfile target: production container_name: asset_mgmt_frontend ports: - '3000:80' depends_on: directus: condition: service_healthy node_api: condition: service_healthy networks: - asset_network environment: - NODE_ENV=production volumes: postgres_data: driver: local redis_data: driver: local directus_uploads: driver: local directus_extensions: driver: local networks: asset_network: driver: bridge