From 62fc59d53e2b95aff13fa13b4e587b1c59ff9a9f Mon Sep 17 00:00:00 2001 From: fullsizemalt <106900403+fullsizemalt@users.noreply.github.com> Date: Fri, 19 Dec 2025 22:40:32 -0800 Subject: [PATCH] Fix API routing, update Dockerfiles, improve import logic --- docker-compose.hetzner.yml | 98 ++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 34 ++++++++----- 2 files changed, 121 insertions(+), 11 deletions(-) create mode 100644 docker-compose.hetzner.yml diff --git a/docker-compose.hetzner.yml b/docker-compose.hetzner.yml new file mode 100644 index 0000000..7367a9a --- /dev/null +++ b/docker-compose.hetzner.yml @@ -0,0 +1,98 @@ +version: '3.8' + +services: + backend: + build: ./backend + ports: + - "127.0.0.1:8020:8000" + volumes: + - ./backend:/app + - backend_data:/app/data + environment: + - DATABASE_URL=postgresql://elmeg:elmeg_password@db:5432/elmeg_db + - SECRET_KEY=${SECRET_KEY:-demo-secret-change-in-production} + command: uvicorn main:app --host 0.0.0.0 --port 8000 --root-path /api --proxy-headers --forwarded-allow-ips '*' + depends_on: + - db + restart: unless-stopped + healthcheck: + test: [ "CMD", "python", "-c", "import httpx; httpx.get('http://localhost:8000/docs').raise_for_status()" ] + interval: 30s + timeout: 10s + retries: 3 + networks: + - elmeg + - traefik + labels: + - "traefik.enable=true" + - "traefik.http.routers.elmeg-backend.rule=Host(`elmeg.xyz`) && PathPrefix(`/api`)" + - "traefik.http.routers.elmeg-backend.entrypoints=websecure" + - "traefik.http.routers.elmeg-backend.tls.certresolver=letsencrypt" + - "traefik.http.routers.elmeg-backend.priority=100" + - "traefik.http.middlewares.elmeg-strip.stripprefix.prefixes=/api" + - "traefik.http.routers.elmeg-backend.middlewares=elmeg-strip" + - "traefik.http.routers.elmeg-backend.service=elmeg-backend-svc" + - "traefik.http.services.elmeg-backend-svc.loadbalancer.server.port=8000" + - "traefik.docker.network=ersen_ersen-network" + # Direct routes for docs (no strip) + - "traefik.http.routers.elmeg-backend-docs.rule=Host(`elmeg.xyz`) && PathPrefix(`/docs`, `/openapi.json`)" + - "traefik.http.routers.elmeg-backend-docs.entrypoints=websecure" + - "traefik.http.routers.elmeg-backend-docs.tls.certresolver=letsencrypt" + - "traefik.http.routers.elmeg-backend-docs.priority=100" + - "traefik.http.routers.elmeg-backend-docs.service=elmeg-backend-svc" + + frontend: + build: + context: ./frontend + dockerfile: Dockerfile + ports: + - "127.0.0.1:3020:3000" + volumes: + - ./frontend:/app + - /app/node_modules + - /app/.next + environment: + - NEXT_PUBLIC_API_URL=https://elmeg.xyz/api + - INTERNAL_API_URL=http://backend:8000 + depends_on: + - backend + restart: unless-stopped + networks: + - elmeg + - traefik + labels: + - "traefik.enable=true" + - "traefik.http.routers.elmeg-frontend.rule=Host(`elmeg.xyz`) && !PathPrefix(`/api`, `/docs`, `/openapi.json`)" + - "traefik.http.routers.elmeg-frontend.entrypoints=websecure" + - "traefik.http.routers.elmeg-frontend.tls.certresolver=letsencrypt" + - "traefik.http.routers.elmeg-frontend.priority=50" + - "traefik.http.services.elmeg-frontend.loadbalancer.server.port=3000" + - "traefik.docker.network=ersen_ersen-network" + + db: + image: postgres:15-alpine + environment: + - POSTGRES_USER=elmeg + - POSTGRES_PASSWORD=elmeg_password + - POSTGRES_DB=elmeg_db + volumes: + - postgres_data:/var/lib/postgresql/data + restart: unless-stopped + healthcheck: + test: [ "CMD-SHELL", "pg_isready -U elmeg" ] + interval: 10s + timeout: 5s + retries: 5 + networks: + - elmeg + +volumes: + postgres_data: + backend_data: + + +networks: + elmeg: + traefik: + name: ersen_ersen-network + external: true diff --git a/docker-compose.yml b/docker-compose.yml index 89e0be8..9e2a222 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,11 +11,12 @@ services: environment: - DATABASE_URL=postgresql://elmeg:elmeg_password@db:5432/elmeg_db - SECRET_KEY=${SECRET_KEY:-demo-secret-change-in-production} + command: uvicorn main:app --host 0.0.0.0 --port 8000 --root-path /api --proxy-headers --forwarded-allow-ips '*' depends_on: - db restart: unless-stopped healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8000/docs"] + test: [ "CMD", "python", "-c", "import httpx; httpx.get('http://localhost:8000/docs').raise_for_status()" ] interval: 30s timeout: 10s retries: 3 @@ -24,11 +25,21 @@ services: - traefik labels: - "traefik.enable=true" - - "traefik.http.routers.elmeg-api.rule=Host(`elmeg.runfoo.run`) && PathPrefix(`/api`, `/docs`, `/openapi.json`)" - - "traefik.http.routers.elmeg-api.entrypoints=websecure" - - "traefik.http.routers.elmeg-api.tls.certresolver=letsencrypt" - - "traefik.http.services.elmeg-api.loadbalancer.server.port=8000" + - "traefik.http.routers.elmeg-backend.rule=Host(`elmeg.runfoo.run`) && PathPrefix(`/api`)" + - "traefik.http.routers.elmeg-backend.entrypoints=websecure" + - "traefik.http.routers.elmeg-backend.tls.certresolver=letsencrypt" + - "traefik.http.routers.elmeg-backend.priority=100" + - "traefik.http.middlewares.elmeg-strip.stripprefix.prefixes=/api" + - "traefik.http.routers.elmeg-backend.middlewares=elmeg-strip" + - "traefik.http.routers.elmeg-backend.service=elmeg-backend-svc" + - "traefik.http.services.elmeg-backend-svc.loadbalancer.server.port=8000" - "traefik.docker.network=traefik" + # Direct routes for docs (no strip) + - "traefik.http.routers.elmeg-backend-docs.rule=Host(`elmeg.runfoo.run`) && PathPrefix(`/docs`, `/openapi.json`)" + - "traefik.http.routers.elmeg-backend-docs.entrypoints=websecure" + - "traefik.http.routers.elmeg-backend-docs.tls.certresolver=letsencrypt" + - "traefik.http.routers.elmeg-backend-docs.priority=100" + - "traefik.http.routers.elmeg-backend-docs.service=elmeg-backend-svc" frontend: build: @@ -51,11 +62,11 @@ services: - traefik labels: - "traefik.enable=true" - - "traefik.http.routers.elmeg.rule=Host(`elmeg.runfoo.run`)" - - "traefik.http.routers.elmeg.entrypoints=websecure" - - "traefik.http.routers.elmeg.tls.certresolver=letsencrypt" - - "traefik.http.routers.elmeg.priority=1" - - "traefik.http.services.elmeg.loadbalancer.server.port=3000" + - "traefik.http.routers.elmeg-frontend.rule=Host(`elmeg.runfoo.run`) && !PathPrefix(`/api`, `/docs`, `/openapi.json`)" + - "traefik.http.routers.elmeg-frontend.entrypoints=websecure" + - "traefik.http.routers.elmeg-frontend.tls.certresolver=letsencrypt" + - "traefik.http.routers.elmeg-frontend.priority=50" + - "traefik.http.services.elmeg-frontend.loadbalancer.server.port=3000" - "traefik.docker.network=traefik" db: @@ -68,7 +79,7 @@ services: - postgres_data:/var/lib/postgresql/data restart: unless-stopped healthcheck: - test: ["CMD-SHELL", "pg_isready -U elmeg"] + test: [ "CMD-SHELL", "pg_isready -U elmeg" ] interval: 10s timeout: 5s retries: 5 @@ -79,6 +90,7 @@ volumes: postgres_data: backend_data: + networks: elmeg: traefik: