Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

how to setup multiple fastapi instances -micro services #1840

Unanswered
sivajik34 asked this question in Questions
Discussion options

First Check

  • I added a very descriptive title here.
  • I used the GitHub search to find a similar question and didn't find it.
  • I searched in the documentation/README.
  • I already searched in Google "How to do X" and didn't find any information.
  • I already read and followed all the tutorial in the docs/README and didn't find an answer.

Commit to Help

  • I commit to help with one of those options 👆

Example Code

services:
 # --------------------
 # Databases
 # --------------------
 user-db:
 image: postgres:17
 restart: always
 env_file: .env
 environment:
 POSTGRES_USER: ${USER_DB_USER}
 POSTGRES_PASSWORD: ${USER_DB_PASSWORD}
 POSTGRES_DB: ${USER_DB}
 volumes:
 - user-db-data:/var/lib/postgresql/data
 healthcheck:
 test: ["CMD-SHELL", "pg_isready -U ${USER_DB_USER} -d ${USER_DB}"]
 interval: 10s
 timeout: 5s
 retries: 5
 product-db:
 image: postgres:17
 restart: always
 env_file: .env
 environment:
 POSTGRES_USER: ${PRODUCT_DB_USER}
 POSTGRES_PASSWORD: ${PRODUCT_DB_PASSWORD}
 POSTGRES_DB: ${PRODUCT_DB}
 volumes:
 - product-db-data:/var/lib/postgresql/data
 healthcheck:
 test: ["CMD-SHELL", "pg_isready -U ${PRODUCT_DB_USER} -d ${PRODUCT_DB}"]
 interval: 10s
 timeout: 5s
 retries: 5
 order-db:
 image: postgres:17
 restart: always
 env_file: .env
 environment:
 POSTGRES_USER: ${ORDER_DB_USER}
 POSTGRES_PASSWORD: ${ORDER_DB_PASSWORD}
 POSTGRES_DB: ${ORDER_DB}
 volumes:
 - order-db-data:/var/lib/postgresql/data
 healthcheck:
 test: ["CMD-SHELL", "pg_isready -U ${ORDER_DB_USER} -d ${ORDER_DB}"]
 interval: 10s
 timeout: 5s
 retries: 5
 # --------------------
 # Prestart Jobs
 # --------------------
 prestart-user:
 image: '${DOCKER_IMAGE_USER_SERVICE?Variable not set}:${TAG-latest}'
 build:
 context: ./services/user-service
 networks:
 - traefik-public
 - default
 depends_on:
 user-db:
 condition: service_healthy
 command: bash scripts/prestart.sh
 env_file:
 - .env
 environment:
 - DOMAIN=${DOMAIN}
 - FRONTEND_HOST=${FRONTEND_HOST?Variable not set}
 - ENVIRONMENT=${ENVIRONMENT}
 - BACKEND_CORS_ORIGINS=${BACKEND_CORS_ORIGINS}
 - SECRET_KEY=${SECRET_KEY?Variable not set}
 - FIRST_SUPERUSER=${FIRST_SUPERUSER?Variable not set}
 - FIRST_SUPERUSER_PASSWORD=${FIRST_SUPERUSER_PASSWORD?Variable not set}
 - SMTP_HOST=${SMTP_HOST}
 - SMTP_USER=${SMTP_USER}
 - SMTP_PASSWORD=${SMTP_PASSWORD}
 - EMAILS_FROM_EMAIL=${EMAILS_FROM_EMAIL}
 - POSTGRES_SERVER=${USER_DB_SERVER}
 - POSTGRES_USER=${USER_DB_USER}
 - POSTGRES_PASSWORD=${USER_DB_PASSWORD}
 - POSTGRES_DB=${USER_DB}
 - DATABASE_URL=postgresql://${USER_DB_USER}:${USER_DB_PASSWORD}@${USER_DB_SERVER}:5432/${USER_DB}
 - SENTRY_DSN=${SENTRY_DSN}
 prestart-product:
 image: '${DOCKER_IMAGE_PRODUCT_SERVICE?Variable not set}:${TAG-latest}'
 build:
 context: ./services/product-service
 
 networks:
 - traefik-public
 - default
 depends_on:
 product-db:
 condition: service_healthy
 command: bash scripts/prestart.sh
 env_file:
 - .env
 environment:
 - DOMAIN=${DOMAIN}
 - FRONTEND_HOST=${FRONTEND_HOST?Variable not set}
 - ENVIRONMENT=${ENVIRONMENT}
 - BACKEND_CORS_ORIGINS=${BACKEND_CORS_ORIGINS}
 - SECRET_KEY=${SECRET_KEY?Variable not set}
 - FIRST_SUPERUSER=${FIRST_SUPERUSER?Variable not set}
 - FIRST_SUPERUSER_PASSWORD=${FIRST_SUPERUSER_PASSWORD?Variable not set}
 - SMTP_HOST=${SMTP_HOST}
 - SMTP_USER=${SMTP_USER}
 - SMTP_PASSWORD=${SMTP_PASSWORD}
 - EMAILS_FROM_EMAIL=${EMAILS_FROM_EMAIL}
 - POSTGRES_SERVER=${PRODUCT_DB_SERVER}
 - POSTGRES_USER=${PRODUCT_DB_USER}
 - POSTGRES_PASSWORD=${PRODUCT_DB_PASSWORD}
 - POSTGRES_DB=${PRODUCT_DB}
 - DATABASE_URL=postgresql://${PRODUCT_DB_USER}:${PRODUCT_DB_PASSWORD}@${PRODUCT_DB_SERVER}:5432/${PRODUCT_DB}
 - SENTRY_DSN=${SENTRY_DSN}
 prestart-order:
 image: '${DOCKER_IMAGE_ORDER_SERVICE?Variable not set}:${TAG-latest}'
 build:
 context: ./services/order-service
 networks:
 - traefik-public
 - default
 depends_on:
 order-db:
 condition: service_healthy
 command: bash scripts/prestart.sh
 env_file:
 - .env
 environment:
 - DOMAIN=${DOMAIN}
 - FRONTEND_HOST=${FRONTEND_HOST?Variable not set}
 - ENVIRONMENT=${ENVIRONMENT}
 - BACKEND_CORS_ORIGINS=${BACKEND_CORS_ORIGINS}
 - SECRET_KEY=${SECRET_KEY?Variable not set}
 - FIRST_SUPERUSER=${FIRST_SUPERUSER?Variable not set}
 - FIRST_SUPERUSER_PASSWORD=${FIRST_SUPERUSER_PASSWORD?Variable not set}
 - SMTP_HOST=${SMTP_HOST}
 - SMTP_USER=${SMTP_USER}
 - SMTP_PASSWORD=${SMTP_PASSWORD}
 - EMAILS_FROM_EMAIL=${EMAILS_FROM_EMAIL}
 - POSTGRES_SERVER=${ORDER_DB_SERVER}
 - POSTGRES_USER=${ORDER_DB_USER}
 - POSTGRES_PASSWORD=${ORDER_DB_PASSWORD}
 - POSTGRES_DB=${ORDER_DB}
 - DATABASE_URL=postgresql://${ORDER_DB_USER}:${ORDER_DB_PASSWORD}@${ORDER_DB_SERVER}:5432/${ORDER_DB}
 - SENTRY_DSN=${SENTRY_DSN} 
 # --------------------
 # Microservices
 # --------------------
 user-service:
 build: ./services/user-service
 restart: always
 networks:
 - traefik-public
 - default
 depends_on:
 user-db:
 condition: service_healthy
 restart: true
 prestart-user:
 condition: service_completed_successfully
 env_file:
 - .env
 healthcheck:
 test: ["CMD", "curl", "-f", "http://localhost:8001/users/utils/health-check/"]
 interval: 10s
 timeout: 5s
 retries: 5 
 environment:
 - DOMAIN=${DOMAIN}
 - FRONTEND_HOST=${FRONTEND_HOST?Variable not set}
 - ENVIRONMENT=${ENVIRONMENT}
 - BACKEND_CORS_ORIGINS=${BACKEND_CORS_ORIGINS}
 - SECRET_KEY=${SECRET_KEY?Variable not set}
 - FIRST_SUPERUSER=${FIRST_SUPERUSER?Variable not set}
 - FIRST_SUPERUSER_PASSWORD=${FIRST_SUPERUSER_PASSWORD?Variable not set}
 - SMTP_HOST=${SMTP_HOST}
 - SMTP_USER=${SMTP_USER}
 - SMTP_PASSWORD=${SMTP_PASSWORD}
 - EMAILS_FROM_EMAIL=${EMAILS_FROM_EMAIL}
 - POSTGRES_SERVER=${USER_DB_SERVER}
 - POSTGRES_USER=${USER_DB_USER}
 - POSTGRES_PASSWORD=${USER_DB_PASSWORD}
 - POSTGRES_DB=${USER_DB}
 - DATABASE_URL=postgresql://${USER_DB_USER}:${USER_DB_PASSWORD}@${USER_DB_SERVER}:5432/${USER_DB}
 - SENTRY_DSN=${SENTRY_DSN}
 - DATABASE_URL=postgresql://user_admin:user_pass@user-db:5432/user_db
 labels:
 - traefik.enable=true
 - traefik.docker.network=traefik-public
 - traefik.constraint-label=traefik-public
 # Service port
 - traefik.http.services.user-service.loadbalancer.server.port=8000
 # HTTP Router
 - traefik.http.routers.user-service-http.rule= PathPrefix('/users')
 - traefik.http.routers.user-service-http.entrypoints=http
 
 # HTTPS Router
 - traefik.http.routers.user-service-https.rule= PathPrefix('/users')
 - traefik.http.routers.user-service-https.entrypoints=https
 - traefik.http.routers.user-service-https.tls=true
 - traefik.http.routers.user-service-https.tls.certresolver=le
 - traefik.http.routers.user-service-http.middlewares=https-redirect
 product-service:
 build: ./services/product-service
 restart: always
 networks:
 - traefik-public
 - default
 depends_on:
 product-db:
 condition: service_healthy
 restart: true
 prestart-product:
 condition: service_completed_successfully
 env_file:
 - .env
 healthcheck:
 test: ["CMD", "curl", "-f", "http://localhost:8002/products/utils/health-check/"]
 interval: 10s
 timeout: 5s
 retries: 5
 environment:
 - DOMAIN=${DOMAIN}
 - FRONTEND_HOST=${FRONTEND_HOST?Variable not set}
 - ENVIRONMENT=${ENVIRONMENT}
 - BACKEND_CORS_ORIGINS=${BACKEND_CORS_ORIGINS}
 - SECRET_KEY=${SECRET_KEY?Variable not set}
 - FIRST_SUPERUSER=${FIRST_SUPERUSER?Variable not set}
 - FIRST_SUPERUSER_PASSWORD=${FIRST_SUPERUSER_PASSWORD?Variable not set}
 - SMTP_HOST=${SMTP_HOST}
 - SMTP_USER=${SMTP_USER}
 - SMTP_PASSWORD=${SMTP_PASSWORD}
 - EMAILS_FROM_EMAIL=${EMAILS_FROM_EMAIL}
 - POSTGRES_SERVER=${PRODUCT_DB_SERVER}
 - POSTGRES_USER=${PRODUCT_DB_USER}
 - POSTGRES_PASSWORD=${PRODUCT_DB_PASSWORD}
 - POSTGRES_DB=${PRODUCT_DB}
 - DATABASE_URL=postgresql://${PRODUCT_DB_USER}:${PRODUCT_DB_PASSWORD}@${PRODUCT_DB_SERVER}:5432/${PRODUCT_DB}
 - SENTRY_DSN=${SENTRY_DSN}
 - DATABASE_URL=postgresql://product_admin:product_pass@product-db:5432/product_db
 labels:
 - traefik.enable=true
 - traefik.docker.network=traefik-public
 - traefik.constraint-label=traefik-public
 # Service port
 - traefik.http.services.product-service.loadbalancer.server.port=8000
 # HTTP Router
 - traefik.http.routers.product-service-http.rule= PathPrefix(`/products`)
 - traefik.http.routers.product-service-http.entrypoints=http
 - traefik.http.routers.product-service-http.middlewares=https-redirect
 # HTTPS Router
 - traefik.http.routers.product-service-https.rule=PathPrefix(`/products`)
 - traefik.http.routers.product-service-https.entrypoints=https
 - traefik.http.routers.product-service-https.tls=true
 - traefik.http.routers.product-service-https.tls.certresolver=le
 order-service:
 build: ./services/order-service
 restart: always
 networks:
 - traefik-public
 - default
 depends_on:
 order-db:
 condition: service_healthy
 restart: true
 prestart-order:
 condition: service_completed_successfully
 env_file:
 - .env
 healthcheck:
 test: ["CMD", "curl", "-f", "http://localhost:8003/orders/utils/health-check/"]
 interval: 10s
 timeout: 5s
 retries: 5
 environment:
 - DOMAIN=${DOMAIN}
 - FRONTEND_HOST=${FRONTEND_HOST?Variable not set}
 - ENVIRONMENT=${ENVIRONMENT}
 - BACKEND_CORS_ORIGINS=${BACKEND_CORS_ORIGINS}
 - SECRET_KEY=${SECRET_KEY?Variable not set}
 - FIRST_SUPERUSER=${FIRST_SUPERUSER?Variable not set}
 - FIRST_SUPERUSER_PASSWORD=${FIRST_SUPERUSER_PASSWORD?Variable not set}
 - SMTP_HOST=${SMTP_HOST}
 - SMTP_USER=${SMTP_USER}
 - SMTP_PASSWORD=${SMTP_PASSWORD}
 - EMAILS_FROM_EMAIL=${EMAILS_FROM_EMAIL}
 - POSTGRES_SERVER=${ORDER_DB_SERVER}
 - POSTGRES_USER=${ORDER_DB_USER}
 - POSTGRES_PASSWORD=${ORDER_DB_PASSWORD}
 - POSTGRES_DB=${ORDER_DB}
 - DATABASE_URL=postgresql://${ORDER_DB_USER}:${ORDER_DB_PASSWORD}@${ORDER_DB_SERVER}:5432/${ORDER_DB}
 - SENTRY_DSN=${SENTRY_DSN}
 - DATABASE_URL=postgresql://order_admin:order_pass@order-db:5432/order_db
 labels:
 - traefik.enable=true
 - traefik.docker.network=traefik-public
 - traefik.constraint-label=traefik-public
 # Service port
 - traefik.http.services.order-service.loadbalancer.server.port=8000
 # HTTP Router
 - traefik.http.routers.order-service-http.rule=PathPrefix(`/orders`)
 - traefik.http.routers.order-service-http.entrypoints=http
 - traefik.http.routers.order-service-http.middlewares=https-redirect
 # HTTPS Router
 - traefik.http.routers.order-service-https.rule= PathPrefix(`/orders`)
 - traefik.http.routers.order-service-https.entrypoints=https
 - traefik.http.routers.order-service-https.tls=true
 - traefik.http.routers.order-service-https.tls.certresolver=le
 
 adminer:
 image: adminer
 restart: always
 networks:
 - traefik-public
 - default
 depends_on:
 - user-db
 environment:
 - ADMINER_DESIGN=pepa-linha-dark
 labels:
 - traefik.enable=true
 - traefik.docker.network=traefik-public
 - traefik.constraint-label=traefik-public
 - traefik.http.routers.${STACK_NAME?Variable not set}-adminer-http.rule=Host(`adminer.${DOMAIN?Variable not set}`)
 - traefik.http.routers.${STACK_NAME?Variable not set}-adminer-http.entrypoints=http
 - traefik.http.routers.${STACK_NAME?Variable not set}-adminer-http.middlewares=https-redirect
 - traefik.http.routers.${STACK_NAME?Variable not set}-adminer-https.rule=Host(`adminer.${DOMAIN?Variable not set}`)
 - traefik.http.routers.${STACK_NAME?Variable not set}-adminer-https.entrypoints=https
 - traefik.http.routers.${STACK_NAME?Variable not set}-adminer-https.tls=true
 - traefik.http.routers.${STACK_NAME?Variable not set}-adminer-https.tls.certresolver=le
 - traefik.http.services.${STACK_NAME?Variable not set}-adminer.loadbalancer.server.port=8080 
 # --------------------
 # Frontend
 # --------------------
 frontend:
 build:
 context: ./frontend
 args:
 - VITE_API_URL=https://api.${DOMAIN}
 - NODE_ENV=production
 restart: always
 networks:
 - traefik-public
 - default
 labels:
 - traefik.enable=true
 - traefik.docker.network=traefik-public
 - traefik.constraint-label=traefik-public
 # Service port
 - traefik.http.services.frontend.loadbalancer.server.port=80
 # HTTP Router
 - traefik.http.routers.frontend-http.rule=Host(`dashboard.${DOMAIN}`)
 - traefik.http.routers.frontend-http.entrypoints=http
 - traefik.http.routers.frontend-http.middlewares=https-redirect
 # HTTPS Router
 - traefik.http.routers.frontend-https.rule=Host(`dashboard.${DOMAIN}`)
 - traefik.http.routers.frontend-https.entrypoints=https
 - traefik.http.routers.frontend-https.tls=true
 - traefik.http.routers.frontend-https.tls.certresolver=le
 
# --------------------
# Volumes & Networks
# --------------------
volumes:
 user-db-data:
 product-db-data:
 order-db-data:
 
networks:
 traefik-public:
 external: true

Description

https://github.com/sivajik34/FastCart
I'm trying to add micro services user_service order_service product_service and getting port issues.
below 3 are working
http://localhost:8001/users/docs#/
http://localhost:8002/products/docs#/
http://localhost:8003/orders/docs#/
but from frontend it is not working http://localhost:8000/users/users/me net::ERR_CONNECTION_REFUSED
it seems I'm not able to configure api gateway.
can you help me on this

Operating System

Windows

Operating System Details

windows

Python Version

python 3.12

Additional Context

No response

You must be logged in to vote

Replies: 0 comments

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
1 participant

AltStyle によって変換されたページ (->オリジナル) /