Skip to content

Conversation

@elavol
Copy link

@elavol elavol commented Jan 5, 2026

This fix issue Swetrix/swetrix#460, by using nginx to proxy request then forward to either API or FE. It help Swetrix can be deploy on single domain with API is on /api/ instead of separate domain

Summary by CodeRabbit

Release Notes

  • Chores
    • Updated application routing infrastructure to use a dedicated reverse proxy for improved service communication.
    • Consolidated service port configurations and routing logic for streamlined deployment architecture.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Jan 5, 2026

📝 Walkthrough

Walkthrough

The changes introduce an nginx reverse proxy service in the Docker Compose configuration to centralize traffic routing. Direct port mappings for swetrix and swetrix-api are removed, and the nginx service handles port 80, forwarding requests to backend services via updated proxy configurations that consolidate previous routing logic into a single server block.

Changes

Cohort / File(s) Summary
Docker Compose Configuration
compose.yaml
Added nginx-proxy service using nginx:1.29.4-alpine with port mapping 80:80; removed direct ports 80:3000 (swetrix) and 8080:5005 (swetrix-api); updated swetrix API_URL from ${API_URL} to /api
Nginx Proxy Configuration
nginx/config
Consolidated dual server blocks into single block on port 80; /api/ location now proxies to swetrix-api:5005; / location proxies to swetrix:3000; added HTTP/1.1 proxy headers to both locations

Sequence Diagram

sequenceDiagram
    participant Client
    participant nginx as nginx-proxy<br/>(port 80)
    participant api as swetrix-api<br/>(port 5005)
    participant app as swetrix<br/>(port 3000)

    Client->>nginx: HTTP request (port 80)
    
    rect rgb(200, 220, 240)
        Note over nginx: Route Decision
        alt /api/* path
            nginx->>api: proxy_pass to :5005<br/>(HTTP/1.1)
            api-->>nginx: response
        else / path (app)
            nginx->>app: proxy_pass to :3000<br/>(HTTP/1.1)
            app-->>nginx: response
        end
    end
    
    nginx-->>Client: HTTP response
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 A proxy bunny hops into place,
Nginx guards the gateway's space,
Routing requests left and right,
Through /api and root's delight,
One port channels all the grace!

Pre-merge checks

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: implementing nginx to proxy requests to both the API and Web UI services, which aligns with the changeset's core modification.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Fix all issues with AI Agents 🤖
In @nginx/config:
- Around line 6-12: The /api/ location block is missing several proxy headers
and operational directives; inside the location /api/ block add proxy_set_header
X-Forwarded-Proto $scheme and proxy_set_header Upgrade $http_upgrade along with
proxy_set_header Connection $connection_upgrade (and ensure you add the
top-level map $http_upgrade -> $connection_upgrade if WebSocket support is
required), and also add client_max_body_size with an appropriate limit plus
timeout directives proxy_connect_timeout, proxy_send_timeout, and
proxy_read_timeout to make the proxy resilient.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
nginx/config (1)

14-20: Add missing proxy headers and consider operational directives.

The root location has the same gaps as the /api/ location:

Major concerns:

  • X-Forwarded-Proto header missing (critical for HTTPS setups)
  • Connection and Upgrade headers missing (required if the frontend uses WebSockets for real-time updates)

Recommended improvements:

  • Add client_max_body_size directive
  • Add timeout configurations for better reliability
🔎 Proposed enhancements
  location / {
    proxy_pass http://swetrix:3000;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+   proxy_set_header X-Forwarded-Proto $scheme;
+   proxy_set_header X-Forwarded-Host $host;
+   
+   # WebSocket support (if needed)
+   proxy_set_header Upgrade $http_upgrade;
+   proxy_set_header Connection $connection_upgrade;
+   
+   # Operational settings
+   client_max_body_size 10M;
+   proxy_connect_timeout 60s;
+   proxy_send_timeout 60s;
+   proxy_read_timeout 60s;
  }
🧹 Nitpick comments (2)
compose.yaml (2)

117-119: Replace deprecated links with depends_on.

The links directive is deprecated in Docker Compose v2+. Use depends_on instead for service dependencies, which provides the same networking functionality with clearer semantics.

🔎 Proposed refactor
  nginx-proxy:
    image: nginx:1.29.4-alpine
    restart: always
-   links:
-     - "swetrix-api"
-     - "swetrix"
+   depends_on:
+     swetrix:
+       condition: service_healthy
+     swetrix-api:
+       condition: service_healthy
    ports:
      - "80:80"

114-123: Consider adding a health check for the nginx-proxy service.

Adding a health check improves service orchestration and enables better monitoring of the reverse proxy.

🔎 Proposed enhancement
  nginx-proxy:
    image: nginx:1.29.4-alpine
    restart: always
    links:
      - "swetrix-api"
      - "swetrix"
    ports:
      - "80:80"
    volumes:
      - ./nginx/config:/etc/nginx/conf.d/default.conf
+   healthcheck:
+     test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:80/ || exit 1"]
+     interval: 30s
+     timeout: 10s
+     retries: 3
+     start_period: 10s
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1b3c8db and f9af660.

📒 Files selected for processing (2)
  • compose.yaml
  • nginx/config
🔇 Additional comments (3)
nginx/config (1)

2-3: LGTM! Standard listen configuration.

The IPv4 and IPv6 listen directives on port 80 are correctly configured for the single-domain architecture.

compose.yaml (2)

9-9: LGTM! API_URL correctly configured for single-domain setup.

The hardcoded /api value aligns with the nginx routing configuration that proxies /api/ requests to the backend API service.


115-115: No action required. The image version nginx:1.29.4-alpine is valid—nginx 1.29.4 (mainline) was released on December 9, 2025. If using a mainline release in production is a concern, consider pinning to the latest stable version (1.28.1 as of January 2026) instead, but the current version specification itself is not invalid.

Comment on lines +6 to 12
location /api/ {
proxy_pass http://swetrix-api:5005/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Add missing proxy headers and consider operational directives.

The /api/ location is missing several important proxy headers and operational configurations:

Major concerns:

  • X-Forwarded-Proto header is missing, which is critical for HTTPS awareness if SSL termination is added in the future (e.g., behind a load balancer or when adding TLS)
  • Connection and Upgrade headers are missing, which are required for WebSocket support—verify whether the API uses WebSockets for real-time features

Recommended improvements:

  • Add client_max_body_size directive to control upload limits (prevents large payload attacks)
  • Add timeout configurations (proxy_connect_timeout, proxy_send_timeout, proxy_read_timeout) for better resilience
🔎 Proposed enhancements
  location /api/ {
    proxy_pass http://swetrix-api:5005/;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+   proxy_set_header X-Forwarded-Proto $scheme;
+   proxy_set_header X-Forwarded-Host $host;
+   
+   # WebSocket support (if needed)
+   proxy_set_header Upgrade $http_upgrade;
+   proxy_set_header Connection $connection_upgrade;
+   
+   # Operational settings
+   client_max_body_size 10M;
+   proxy_connect_timeout 60s;
+   proxy_send_timeout 60s;
+   proxy_read_timeout 60s;
  }

If WebSocket support is needed, also add this map directive at the top level (outside server block):

map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}
🤖 Prompt for AI Agents
In @nginx/config around lines 6-12, The /api/ location block is missing several
proxy headers and operational directives; inside the location /api/ block add
proxy_set_header X-Forwarded-Proto $scheme and proxy_set_header Upgrade
$http_upgrade along with proxy_set_header Connection $connection_upgrade (and
ensure you add the top-level map $http_upgrade -> $connection_upgrade if
WebSocket support is required), and also add client_max_body_size with an
appropriate limit plus timeout directives proxy_connect_timeout,
proxy_send_timeout, and proxy_read_timeout to make the proxy resilient.

@Blaumaus
Copy link
Member

Blaumaus commented Jan 5, 2026

wow that look fantastic! thanks for the PR, will be merged before the v5 release soon!

@Blaumaus Blaumaus self-assigned this Jan 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants