services: db: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - pgdata:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 5s timeout: 5s retries: 5 networks: - internal minio: image: minio/minio:latest restart: unless-stopped command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${S3_ACCESS_KEY_ID:-minioadmin} MINIO_ROOT_PASSWORD: ${S3_SECRET_ACCESS_KEY:-minioadmin} ports: - "127.0.0.1:9001:9001" - "127.0.0.1:9000:9000" volumes: - minio_data:/data healthcheck: test: ["CMD", "mc", "ready", "local"] interval: 5s timeout: 5s retries: 5 networks: - internal redis: image: redis:7-alpine restart: unless-stopped volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 5 networks: - internal core: image: ghcr.io/vladosuscocosus/odi-core:${IMAGE_TAG:-latest} build: context: . dockerfile: docker/Dockerfile.core restart: unless-stopped ports: - "127.0.0.1:3000:3000" environment: POSTGRES_HOST: db POSTGRES_PORT: 5432 NODE_ENV: ${NODE_ENV} POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID} GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET} GOOGLE_REDIRECT_URI: ${GOOGLE_REDIRECT_URI} FRONTEND_URL: ${FRONTEND_URL} SITE_URL: ${SITE_URL:-https://odinvestor.net} SESSION_MAX_AGE: ${SESSION_MAX_AGE:-2592000} DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} REDIS_URL: redis://redis:6379 EXCHANGE_ENCRYPTION_KEY: ${EXCHANGE_ENCRYPTION_KEY} ADMIN_EMAIL: ${ADMIN_EMAIL} MAILGUN_API_KEY: ${MAILGUN_API_KEY} MAILGUN_DOMAIN: ${MAILGUN_DOMAIN} MAILGUN_FROM: ${MAILGUN_FROM} S3_ENDPOINT: http://minio:9000 S3_REGION: ${S3_REGION:-eu-central-1} S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:-minioadmin} S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:-minioadmin} S3_BUCKET: ${S3_BUCKET:-blog-images} S3_PUBLIC_URL: ${S3_PUBLIC_URL} MARKET_URL: http://market:3002 depends_on: db: condition: service_healthy redis: condition: service_healthy minio: condition: service_healthy networks: - internal analytics: image: ghcr.io/vladosuscocosus/odi-analytics:${IMAGE_TAG:-latest} build: context: . dockerfile: docker/Dockerfile.analytics restart: unless-stopped ports: - "127.0.0.1:3001:3001" environment: POSTGRES_HOST: db POSTGRES_PORT: 5432 POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} FRONTEND_URL: ${FRONTEND_URL} SITE_URL: ${SITE_URL:-https://odinvestor.net} depends_on: db: condition: service_healthy networks: - internal market: image: ghcr.io/vladosuscocosus/odi-market:${IMAGE_TAG:-latest} build: context: . dockerfile: docker/Dockerfile.market restart: unless-stopped ports: - "127.0.0.1:3002:3002" environment: POSTGRES_HOST: db POSTGRES_PORT: 5432 POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} FRONTEND_URL: ${FRONTEND_URL} SITE_URL: ${SITE_URL:-https://odinvestor.net} REDIS_URL: redis://redis:6379 depends_on: db: condition: service_healthy redis: condition: service_healthy networks: - internal reminder: image: ghcr.io/vladosuscocosus/odi-reminder:${IMAGE_TAG:-latest} build: context: . dockerfile: docker/Dockerfile.reminder restart: unless-stopped environment: POSTGRES_HOST: db POSTGRES_PORT: 5432 NODE_ENV: ${NODE_ENV} POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} FRONTEND_URL: ${FRONTEND_URL} MAILGUN_API_KEY: ${MAILGUN_API_KEY} MAILGUN_DOMAIN: ${MAILGUN_DOMAIN} MAILGUN_FROM: ${MAILGUN_FROM} depends_on: db: condition: service_healthy networks: - internal blog: image: ghcr.io/vladosuscocosus/odi-blog:${IMAGE_TAG:-latest} build: context: . dockerfile: docker/Dockerfile.blog restart: unless-stopped ports: - "127.0.0.1:3003:3003" environment: POSTGRES_HOST: db POSTGRES_PORT: 5432 POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} BLOG_POSTGRES_DB: ${BLOG_POSTGRES_DB:-blog} S3_ENDPOINT: http://minio:9000 S3_REGION: ${S3_REGION:-eu-central-1} S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:-minioadmin} S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:-minioadmin} S3_BUCKET: ${S3_BUCKET:-blog-images} S3_PUBLIC_URL: ${S3_PUBLIC_URL} OG_SERVICE_URL: http://og:3004 FRONTEND_URL: ${FRONTEND_URL:-https://odinvestor.net} depends_on: db: condition: service_healthy minio: condition: service_healthy networks: - internal og: image: ghcr.io/vladosuscocosus/odi-og:${IMAGE_TAG:-latest} build: context: . dockerfile: docker/Dockerfile.og restart: unless-stopped environment: S3_ENDPOINT: http://minio:9000 S3_REGION: ${S3_REGION:-eu-central-1} S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:-minioadmin} S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:-minioadmin} S3_BUCKET: ${S3_BUCKET:-blog-images} depends_on: minio: condition: service_healthy networks: - internal site: image: ghcr.io/vladosuscocosus/odi-site:${IMAGE_TAG:-latest} build: context: . dockerfile: docker/Dockerfile.site restart: unless-stopped ports: - "127.0.0.1:3005:3005" environment: POSTGRES_HOST: db POSTGRES_PORT: 5432 POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} SITE_URL: ${SITE_URL:-https://odinvestor.net} DASHBOARD_URL: ${DASHBOARD_URL:-https://dashboard.odinvestor.net} BLOG_URL: ${BLOG_URL:-https://blog.odinvestor.net} FRONTEND_URL: ${FRONTEND_URL:-https://dashboard.odinvestor.net} CORE_URL: ${CORE_URL:-https://core.odinvestor.net} MARKET_URL: ${MARKET_URL:-https://market.odinvestor.net} ANALYTICS_URL: ${ANALYTICS_URL:-https://analytics.odinvestor.net} depends_on: db: condition: service_healthy networks: - internal frontend: image: ghcr.io/vladosuscocosus/odi-frontend:${IMAGE_TAG:-latest} build: context: . dockerfile: docker/Dockerfile.frontend args: VITE_API_URL: ${VITE_API_URL} VITE_ANALYTICS_URL: ${VITE_ANALYTICS_URL} VITE_MARKET_URL: ${VITE_MARKET_URL} VITE_BLOG_URL: ${VITE_BLOG_URL:-https://blog.odinvestor.net} VITE_S3_PUBLIC_URL: ${S3_PUBLIC_URL} restart: unless-stopped ports: - "127.0.0.1:8080:8080" networks: - internal volumes: pgdata: minio_data: redis_data: networks: internal: