Skip to content

Conversation

@luckylinux
Copy link
Contributor

@luckylinux luckylinux commented Jan 15, 2026

As Discussed in #1403 (comment)

Just added a Picture showing the Traffic Flow with Reverse Proxy and Authentik SSO.

GraphQL TLS Termination is implemented (Reverse Proxy works).

Authentik SSO Authentication ONLY works with WebUI. GraphQL SSO Authentication needs to be documented and tested and will likely require a means to disable the internal Token Authentication you currently use @jokob-sk (to avoid double Authentication).

Summary by CodeRabbit

  • Documentation
    • Added comprehensive guide for Caddy and Authentik Outpost proxy single sign-on setup, including environment configurations, deployment instructions, and troubleshooting
    • Added reverse proxy flow architecture diagram

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

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 15, 2026

📝 Walkthrough

Walkthrough

The PR adds comprehensive documentation and a visual diagram for Caddy and Authentik Outpost reverse proxy integration. It includes setup prerequisites, environment file schemas, service configurations, firewall considerations, and deployment instructions with troubleshooting guidance.

Changes

Cohort / File(s) Summary
Reverse Proxy Documentation and Diagrams
docs/REVERSE_PROXY.md, docs/img/REVERSE_PROXY/reverse_proxy_flow.drawio
Added new guide covering Caddy + Authentik Outpost SSO integration with environment schemas (.env, .env.caddy, .env.server, .env.outpost.proxy), Compose/Quadlet configurations, firewall setup, NGINX/Caddy configuration examples, and login flow with troubleshooting. Includes architecture diagram visualizing proxy flow with TLS termination, authentication checks, and component interactions. Note: Documentation contains apparent duplication of content sections.

Possibly related issues

Poem

🐰 Through Caddy's gate and Authentik's shield,
A proxy dance on the network field!
SSO flows like a warren so deep,
With firewalls guarding the secrets we keep!
Documentation hops to make setup neat,
A reverse proxy tale, utterly sweet! 🔐

🚥 Pre-merge checks | ✅ 3
✅ 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 summarizes the main change: adding documentation for Caddy and Authentik SSO integration.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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
Contributor

@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: 8

🤖 Fix all issues with AI agents
In `@docs/REVERSE_PROXY.md`:
- Around line 1336-1341: The reverse proxy target uses the bind address
"0.0.0.0" which is invalid as a connection target; update the "reverse_proxy
http://0.0.0.0:20211" entry to use a loopback address such as "127.0.0.1" or
"localhost" and, if un-commenting the IPv6 example, replace "[::1]" with the
proper loopback "[::1]" (ensure the IPv6 example remains commented or matches
the same loopback convention) so the reverse_proxy directive points to a valid
local service endpoint.
- Around line 1085-1088: The Network setting uses a personal container name
("Network=container:supermicro-ikvm-pve031-caddy") which is
environment-specific; remove this line or replace it with the correct Caddy
container reference for the pod (e.g., "Network=container:caddy") — or simply
delete the Network line if the pod/service already sets "Network=host" so
networking is defined at the pod level.
- Around line 823-828: The documented default for GRAPHQL_PORT in
REVERSE_PROXY.md is incorrect (shows GRAPHQL_PORT:-20212) and conflicts with the
.env.server example and the actual internal GraphQL server which uses 20219;
update the default value to 20219 in the env example so GRAPHQL_PORT,
BACKEND_API_URL and any references to the internal GraphQL service consistently
use 20219 (ensure the variable assignment syntax stays ${GRAPHQL_PORT:-20219}
and adjust any explanatory text if present).
- Around line 746-750: Replace the local development image reference "image:
localhost/netalertx-dev:dev-20260109-232454" with the official/public image or a
generic placeholder; for example use the official registry reference (e.g.,
ghcr.io/netalertx/netalertx:latest) or a clear placeholder like
"your-registry/netalertx:tag" so users can pull the image; update the
single-line image value in the compose example accordingly.
- Around line 948-950: Quadlet configuration currently references a local dev
image (Image=localhost/netalertx-dev:dev-20260109-232454) and uses Pull=missing;
replace the local image reference with the official published image name (e.g.,
Image=ghcr.io/netalertx/netalertx:latest or your release tag) and set Pull to a
value that ensures the official image is fetched (e.g., Pull=always or
Pull=if-not-present per your deployment policy) so the quadlet uses the official
build instead of the local dev image.
- Around line 1359-1364: Update the reverse_proxy targets to point to the
internal GraphQL host on the correct port 20219: replace the incorrect IPv6
target "reverse_proxy http://[::1]:6000" with "reverse_proxy http://[::1]:20219"
and verify the IPv4 proxy line "reverse_proxy http://0.0.0.0:20219" is the
intended GraphQL endpoint (or change it to the correct host like
http://127.0.0.1:20219 if required).
- Around line 1015-1027: The Quadlet has inconsistent GraphQL port and hostname:
update the Environment entries so GRAPHQL_PORT matches the internal port used by
the Caddy proxy (change GRAPHQL_PORT value to 20219 to match Caddyfile proxying)
and normalize BACKEND_API_URL hostname to netalertx.MYDOMAIN.TLD (replace
netalertx-fedora.MYDOMAIN.TLD with netalertx.MYDOMAIN.TLD) so examples and
configuration are consistent; verify the Caddyfile proxy target and any other
occurrences of GRAPHQL_PORT and BACKEND_API_URL to keep them synchronized.
- Around line 567-573: Replace the incorrect hostname occurrences
"authentik.MYDOMAIN.TLD" with the correct "netalertx.MYDOMAIN.TLD" in the
reverse proxy flow lines describing Web GUI, GraphQL and Authentik Outpost (the
three bullets referencing ports 80/443/20212/9443), ensuring the flow text and
examples consistently use netalertx.MYDOMAIN.TLD to match the Introduction.
🧹 Nitpick comments (2)
docs/REVERSE_PROXY.md (2)

710-712: pull: missing is Podman-specific syntax.

Docker Compose uses pull_policy: missing instead of pull: missing. Since the documentation mentions both Docker Compose and Podman, consider noting this difference or using the Docker Compose syntax with a comment about Podman.

📝 Suggested fix
     network_mode: host
     image: docker.io/library/caddy:latest
-    pull: missing
+    # Docker Compose syntax: pull_policy: missing
+    # Podman Compose syntax: pull: missing
+    pull_policy: missing

584-650: Add language specifiers to fenced code blocks.

Multiple code blocks lack language specifiers, which affects syntax highlighting. Based on static analysis hints:

  • Lines 584, 591, 613: Use ```text or ```passwd for passwd/group file contents
  • Lines 668, 686, 697: Use ```bash or ```ini for environment files
  • Lines 704, 874, 888, 933, 1052: Use ```yaml for Compose/Quadlet configs (or ```ini for Quadlet)
  • Line 1153: Use ```nginx for NGINX configuration
  • Line 1279: Use ```caddyfile or ```text for Caddyfile
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f2d5e32 and dc1cdfc.

⛔ Files ignored due to path filters (10)
  • docs/img/REVERSE_PROXY/authentik-application-setup-01.png is excluded by !**/*.png
  • docs/img/REVERSE_PROXY/authentik-login.png is excluded by !**/*.png
  • docs/img/REVERSE_PROXY/authentik-outpost-setup-01.png is excluded by !**/*.png
  • docs/img/REVERSE_PROXY/authentik-outpost-setup-02.png is excluded by !**/*.png
  • docs/img/REVERSE_PROXY/authentik-provider-setup-01.png is excluded by !**/*.png
  • docs/img/REVERSE_PROXY/authentik-provider-setup-02.png is excluded by !**/*.png
  • docs/img/REVERSE_PROXY/authentik-sidebar.png is excluded by !**/*.png
  • docs/img/REVERSE_PROXY/fedora-firewall.png is excluded by !**/*.png
  • docs/img/REVERSE_PROXY/reverse_proxy_flow.png is excluded by !**/*.png
  • docs/img/REVERSE_PROXY/reverse_proxy_flow.svg is excluded by !**/*.svg
📒 Files selected for processing (2)
  • docs/REVERSE_PROXY.md
  • docs/img/REVERSE_PROXY/reverse_proxy_flow.drawio
🧰 Additional context used
🧠 Learnings (3)
📚 Learning: 2025-10-19T01:40:57.095Z
Learnt from: adamoutler
Repo: jokob-sk/NetAlertX PR: 1230
File: .devcontainer/resources/devcontainer-overlay/services/config/nginx/netalertx.conf.template:1-2
Timestamp: 2025-10-19T01:40:57.095Z
Learning: In the NetAlertX repository, .devcontainer/resources/devcontainer-overlay/services/config/nginx/netalertx.conf.template is an auto-generated file that is intentionally committed to source control. It cannot be regenerated automatically outside the devcontainer environment and is required for the devcontainer to start, creating a bootstrap dependency.

Applied to files:

  • docs/REVERSE_PROXY.md
📚 Learning: 2026-01-10T06:38:03.977Z
Learnt from: adamoutler
Repo: jokob-sk/NetAlertX PR: 1400
File: install/production-filesystem/services/start-nginx.sh:38-43
Timestamp: 2026-01-10T06:38:03.977Z
Learning: In NetAlertX, nginx and PHP may run as root (when PUID=0) to support Synology NAS systems using AUFS (Another Union File System), which cannot use Linux capabilities assigned to binaries for privilege management. This is a known limitation of AUFS on Synology platforms.

Applied to files:

  • docs/REVERSE_PROXY.md
📚 Learning: 2025-09-20T14:09:29.159Z
Learnt from: adamoutler
Repo: jokob-sk/NetAlertX PR: 1184
File: .devcontainer/scripts/setup.sh:103-116
Timestamp: 2025-09-20T14:09:29.159Z
Learning: In NetAlertX devcontainer setup, the netalertx user has write permissions to /var/log/nginx/ directory as it's explicitly chowned to netalertx:www-data in the Dockerfile, so setup.sh can write to nginx log files without sudo.

Applied to files:

  • docs/REVERSE_PROXY.md
🪛 LanguageTool
docs/REVERSE_PROXY.md

[style] ~583-~583: Consider a more concise word here.
Context: ...s as root which is a Security Risk. > In order to solve this, it's recommended to create ...

(IN_ORDER_TO_PREMIUM)


[style] ~1094-~1094: Consider a more concise word here.
Context: ...required to open up some Firewall Ports in order to be able to access the Endpoints from ou...

(IN_ORDER_TO_PREMIUM)


[style] ~1102-~1102: Consider a more concise word here.
Context: ...dora-firewall.png) ### Authentik Setup In order to enable Single Sign On (SSO) with Authen...

(IN_ORDER_TO_PREMIUM)


[grammar] ~1103-~1103: Use a hyphen to join words.
Context: ...tik Setup In order to enable Single Sign On (SSO) with Authentik, you will need t...

(QB_NEW_EN_HYPHEN)


[style] ~1106-~1106: Often, this adverbial phrase is redundant. Consider using an alternative.
Context: ...g/REVERSE_PROXY/authentik-sidebar.png) First of all, using the Left Sidebar, navigate to `A...

(FIRST_OF_ALL)


[style] ~1150-~1150: Consider a different phrase to strengthen your wording.
Context: ... Issues I was experiencing, I increased a lot the client_body_buffer_size and large_c...

(A_LOT_CONSIDERABLY)

🪛 markdownlint-cli2 (0.18.1)
docs/REVERSE_PROXY.md

584-584: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


591-591: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


613-613: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


668-668: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


686-686: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


697-697: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


704-704: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


874-874: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


888-888: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


933-933: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


1036-1036: Hard tabs
Column: 20

(MD010, no-hard-tabs)


1052-1052: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


1153-1153: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


1166-1166: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1167-1167: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1168-1168: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1173-1173: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1176-1176: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1177-1177: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1178-1178: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1179-1179: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1180-1180: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1181-1181: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1182-1182: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1183-1183: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1185-1185: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1186-1186: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1187-1187: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1189-1189: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1190-1190: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1192-1192: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1193-1193: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1194-1194: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1195-1195: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1196-1196: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1198-1198: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1199-1199: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1200-1200: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1202-1202: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1203-1203: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1204-1204: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1207-1207: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1208-1208: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1209-1209: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1211-1211: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1212-1212: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1213-1213: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1215-1215: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1216-1216: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1217-1217: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1219-1219: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1220-1220: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1221-1221: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1223-1223: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1224-1224: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1225-1225: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1227-1227: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1228-1228: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1231-1231: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1232-1232: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1234-1234: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1235-1235: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1240-1240: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1241-1241: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1261-1261: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1266-1266: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1268-1268: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1269-1269: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1279-1279: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


1298-1298: Hard tabs
Column: 2

(MD010, no-hard-tabs)


1379-1379: Hard tabs
Column: 1

(MD010, no-hard-tabs)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: docker-tests
  • GitHub Check: docker_dev
🔇 Additional comments (3)
docs/REVERSE_PROXY.md (2)

652-654: Good security warning about unauthenticated GraphQL.

This warning appropriately highlights that the GraphQL endpoint is not protected by SSO, which aligns with the PR objectives noting that GraphQL SSO authentication needs further work.


1102-1145: Comprehensive Authentik setup instructions.

The step-by-step setup guide with screenshots is well-structured and should help users configure the SSO integration correctly.

docs/img/REVERSE_PROXY/reverse_proxy_flow.drawio (1)

1-202: No action needed. The SVG file reverse_proxy_flow.svg exists in the same directory and is correctly referenced in the documentation. The .drawio file serves as the source file for the exported SVG version, which is standard practice for diagram maintenance.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Comment on lines +567 to +573
- Web GUI:

i. Client accesses `http://authentik.MYDOMAIN.TLD:80`: default (built-in Caddy) Redirect to `https://authentik.MYDOMAIN.TLD:443`

ii. Client accesses `https://authentik.MYDOMAIN.TLD:443` -> reverse Proxy to internal Port 20211 (NetAlertX Web GUI / NGINX - unencrypted)
- GraphQL: Client accesses `https://authentik.MYDOMAIN.TLD:20212` -> reverse Proxy to internal Port 20219 (NetAlertX GraphQL - unencrypted)
- Authentik Outpost: Client accesses `https://authentik.MYDOMAIN.TLD:9443` -> reverse Proxy to internal Port 6000 (Authentik Outpost Proxy - unencrypted)
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Hostname inconsistency in flow description.

The flow description uses authentik.MYDOMAIN.TLD but the Introduction (lines 533-537) establishes that access should be via netalertx.MYDOMAIN.TLD. This appears to be a copy-paste error.

📝 Suggested fix
 - Web GUI:
 
-   i. Client accesses `http://authentik.MYDOMAIN.TLD:80`: default (built-in Caddy) Redirect to `https://authentik.MYDOMAIN.TLD:443`
+   i. Client accesses `http://netalertx.MYDOMAIN.TLD:80`: default (built-in Caddy) Redirect to `https://netalertx.MYDOMAIN.TLD:443`
 
-   ii. Client accesses `https://authentik.MYDOMAIN.TLD:443` -> reverse Proxy to internal Port 20211 (NetAlertX Web GUI / NGINX - unencrypted)
-- GraphQL: Client accesses `https://authentik.MYDOMAIN.TLD:20212` -> reverse Proxy to internal Port 20219 (NetAlertX GraphQL - unencrypted)
-- Authentik Outpost: Client accesses `https://authentik.MYDOMAIN.TLD:9443` -> reverse Proxy to internal Port 6000 (Authentik Outpost Proxy - unencrypted)
+   ii. Client accesses `https://netalertx.MYDOMAIN.TLD:443` -> reverse Proxy to internal Port 20211 (NetAlertX Web GUI / NGINX - unencrypted)
+- GraphQL: Client accesses `https://netalertx.MYDOMAIN.TLD:20212` -> reverse Proxy to internal Port 20219 (NetAlertX GraphQL - unencrypted)
+- Authentik Outpost: Client accesses `https://netalertx.MYDOMAIN.TLD:9443` -> reverse Proxy to internal Port 6000 (Authentik Outpost Proxy - unencrypted)
🤖 Prompt for AI Agents
In `@docs/REVERSE_PROXY.md` around lines 567 - 573, Replace the incorrect hostname
occurrences "authentik.MYDOMAIN.TLD" with the correct "netalertx.MYDOMAIN.TLD"
in the reverse proxy flow lines describing Web GUI, GraphQL and Authentik
Outpost (the three bullets referencing ports 80/443/20212/9443), ensuring the
flow text and examples consistently use netalertx.MYDOMAIN.TLD to match the
Introduction.

Comment on lines +746 to +750

# Local built Image including latest Changes
image: localhost/netalertx-dev:dev-20260109-232454

read_only: true # Make the container filesystem read-only
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Replace development image with official image reference.

The compose example references a local development image (localhost/netalertx-dev:dev-20260109-232454) that users won't have. Replace with the official image or a placeholder.

📝 Suggested fix
     # Local built Image including latest Changes
-    image: localhost/netalertx-dev:dev-20260109-232454
+    # Replace with the official image from Docker Hub or GitHub Container Registry
+    image: jokobsk/netalertx:latest
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Local built Image including latest Changes
image: localhost/netalertx-dev:dev-20260109-232454
read_only: true # Make the container filesystem read-only
# Local built Image including latest Changes
# Replace with the official image from Docker Hub or GitHub Container Registry
image: jokobsk/netalertx:latest
read_only: true # Make the container filesystem read-only
🤖 Prompt for AI Agents
In `@docs/REVERSE_PROXY.md` around lines 746 - 750, Replace the local development
image reference "image: localhost/netalertx-dev:dev-20260109-232454" with the
official/public image or a generic placeholder; for example use the official
registry reference (e.g., ghcr.io/netalertx/netalertx:latest) or a clear
placeholder like "your-registry/netalertx:tag" so users can pull the image;
update the single-line image value in the compose example accordingly.

Comment on lines +823 to +828
PORT: ${PORT:-20211} # Application port
PORT_SSL: ${PORT_SSL:-443}
GRAPHQL_PORT: ${GRAPHQL_PORT:-20212} # GraphQL API port
ALWAYS_FRESH_INSTALL: ${ALWAYS_FRESH_INSTALL:-false} # Set to true to reset your config and database on each container start
NETALERTX_DEBUG: ${NETALERTX_DEBUG:-0} # 0=kill all services and restart if any dies. 1 keeps running dead services.
BACKEND_API_URL: ${BACKEND_API_URL-"https://netalertx.MYDOMAIN.TLD:20212"}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

GRAPHQL_PORT default value mismatch.

The default GRAPHQL_PORT:-20212 contradicts the .env.server example (line 691) which specifies GRAPHQL_PORT=20219. The internal GraphQL server listens on 20219, while 20212 is the external Caddy port.

📝 Suggested fix
       PORT: ${PORT:-20211}                                      # Application port
       PORT_SSL: ${PORT_SSL:-443}
-      GRAPHQL_PORT: ${GRAPHQL_PORT:-20212}                      # GraphQL API port
+      GRAPHQL_PORT: ${GRAPHQL_PORT:-20219}                      # GraphQL API internal port
🤖 Prompt for AI Agents
In `@docs/REVERSE_PROXY.md` around lines 823 - 828, The documented default for
GRAPHQL_PORT in REVERSE_PROXY.md is incorrect (shows GRAPHQL_PORT:-20212) and
conflicts with the .env.server example and the actual internal GraphQL server
which uses 20219; update the default value to 20219 in the env example so
GRAPHQL_PORT, BACKEND_API_URL and any references to the internal GraphQL service
consistently use 20219 (ensure the variable assignment syntax stays
${GRAPHQL_PORT:-20219} and adjust any explanatory text if present).

Comment on lines +948 to +950
# Local built Image including latest Changes
Image=localhost/netalertx-dev:dev-20260109-232454
Pull=missing
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Replace development image in Quadlet configuration.

Same issue as the Compose example—replace the local development image with the official image.

📝 Suggested fix
 # Local built Image including latest Changes
-Image=localhost/netalertx-dev:dev-20260109-232454
+# Replace with the official image
+Image=docker.io/jokobsk/netalertx:latest
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Local built Image including latest Changes
Image=localhost/netalertx-dev:dev-20260109-232454
Pull=missing
# Local built Image including latest Changes
# Replace with the official image
Image=docker.io/jokobsk/netalertx:latest
Pull=missing
🤖 Prompt for AI Agents
In `@docs/REVERSE_PROXY.md` around lines 948 - 950, Quadlet configuration
currently references a local dev image
(Image=localhost/netalertx-dev:dev-20260109-232454) and uses Pull=missing;
replace the local image reference with the official published image name (e.g.,
Image=ghcr.io/netalertx/netalertx:latest or your release tag) and set Pull to a
value that ensures the official image is fetched (e.g., Pull=always or
Pull=if-not-present per your deployment policy) so the quadlet uses the official
build instead of the local dev image.

Comment on lines +1015 to +1027

# GraphQL API port
Environment=GRAPHQL_PORT=20212

# Set to true to reset your config and database on each container start
Environment=ALWAYS_FRESH_INSTALL=false

# 0=kill all services and restart if any dies. 1 keeps running dead services.
Environment=NETALERTX_DEBUG=0

# Set the GraphQL URL for external Access (via Caddy Reverse Proxy)
Environment=BACKEND_API_URL=https://netalertx-fedora.MYDOMAIN.TLD:20212

Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Port and hostname inconsistencies in Quadlet configuration.

  1. GRAPHQL_PORT=20212 here contradicts line 542 which states GRAPHQL_PORT=20219. The Caddyfile (line 1360) proxies to port 20219, confirming that 20219 is the internal port.

  2. BACKEND_API_URL uses netalertx-fedora.MYDOMAIN.TLD but all other examples use netalertx.MYDOMAIN.TLD.

📝 Suggested fix
 # GraphQL API port
-Environment=GRAPHQL_PORT=20212
+Environment=GRAPHQL_PORT=20219

 # Set to true to reset your config and database on each container start
 Environment=ALWAYS_FRESH_INSTALL=false

 # 0=kill all services and restart if any dies. 1 keeps running dead services.
 Environment=NETALERTX_DEBUG=0

 # Set the GraphQL URL for external Access (via Caddy Reverse Proxy)
-Environment=BACKEND_API_URL=https://netalertx-fedora.MYDOMAIN.TLD:20212
+Environment=BACKEND_API_URL=https://netalertx.MYDOMAIN.TLD:20212
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# GraphQL API port
Environment=GRAPHQL_PORT=20212
# Set to true to reset your config and database on each container start
Environment=ALWAYS_FRESH_INSTALL=false
# 0=kill all services and restart if any dies. 1 keeps running dead services.
Environment=NETALERTX_DEBUG=0
# Set the GraphQL URL for external Access (via Caddy Reverse Proxy)
Environment=BACKEND_API_URL=https://netalertx-fedora.MYDOMAIN.TLD:20212
# GraphQL API port
Environment=GRAPHQL_PORT=20219
# Set to true to reset your config and database on each container start
Environment=ALWAYS_FRESH_INSTALL=false
# 0=kill all services and restart if any dies. 1 keeps running dead services.
Environment=NETALERTX_DEBUG=0
# Set the GraphQL URL for external Access (via Caddy Reverse Proxy)
Environment=BACKEND_API_URL=https://netalertx.MYDOMAIN.TLD:20212
🤖 Prompt for AI Agents
In `@docs/REVERSE_PROXY.md` around lines 1015 - 1027, The Quadlet has inconsistent
GraphQL port and hostname: update the Environment entries so GRAPHQL_PORT
matches the internal port used by the Caddy proxy (change GRAPHQL_PORT value to
20219 to match Caddyfile proxying) and normalize BACKEND_API_URL hostname to
netalertx.MYDOMAIN.TLD (replace netalertx-fedora.MYDOMAIN.TLD with
netalertx.MYDOMAIN.TLD) so examples and configuration are consistent; verify the
Caddyfile proxy target and any other occurrences of GRAPHQL_PORT and
BACKEND_API_URL to keep them synchronized.

Comment on lines +1085 to +1088

# Network Configuration
Network=container:supermicro-ikvm-pve031-caddy

Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Environment-specific container name in network configuration.

Network=container:supermicro-ikvm-pve031-caddy appears to be a personal environment reference. For a pod-based setup, this should either be removed (since the pod already defines Network=host) or corrected to reference the Caddy container from this setup.

📝 Suggested fix
 # Network Configuration
-Network=container:supermicro-ikvm-pve031-caddy
+# Network is inherited from the pod (host mode)
+# If running standalone, use: Network=host
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Network Configuration
Network=container:supermicro-ikvm-pve031-caddy
# Network Configuration
# Network is inherited from the pod (host mode)
# If running standalone, use: Network=host
🤖 Prompt for AI Agents
In `@docs/REVERSE_PROXY.md` around lines 1085 - 1088, The Network setting uses a
personal container name ("Network=container:supermicro-ikvm-pve031-caddy") which
is environment-specific; remove this line or replace it with the correct Caddy
container reference for the pod (e.g., "Network=container:caddy") — or simply
delete the Network line if the pod/service already sets "Network=host" so
networking is defined at the pod level.

Comment on lines +1336 to +1341
# IPv4 Reverse Proxy to NetAlertX Web GUI (internal unencrypted Host)
reverse_proxy http://0.0.0.0:20211

# IPv6 Reverse Proxy to NetAlertX Web GUI (internal unencrypted Host)
# reverse_proxy http://[::1]:20211
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Incorrect reverse proxy target address.

0.0.0.0 is a bind address (meaning "all interfaces"), not a valid connection target. For proxying to local services, use 127.0.0.1 or localhost.

🔧 Suggested fix
     # IPv4 Reverse Proxy to NetAlertX Web GUI (internal unencrypted Host)
-    reverse_proxy http://0.0.0.0:20211
+    reverse_proxy http://127.0.0.1:20211

     # IPv6 Reverse Proxy to NetAlertX Web GUI (internal unencrypted Host)
     # reverse_proxy http://[::1]:20211
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# IPv4 Reverse Proxy to NetAlertX Web GUI (internal unencrypted Host)
reverse_proxy http://0.0.0.0:20211
# IPv6 Reverse Proxy to NetAlertX Web GUI (internal unencrypted Host)
# reverse_proxy http://[::1]:20211
}
# IPv4 Reverse Proxy to NetAlertX Web GUI (internal unencrypted Host)
reverse_proxy http://127.0.0.1:20211
# IPv6 Reverse Proxy to NetAlertX Web GUI (internal unencrypted Host)
# reverse_proxy http://[::1]:20211
}
🤖 Prompt for AI Agents
In `@docs/REVERSE_PROXY.md` around lines 1336 - 1341, The reverse proxy target
uses the bind address "0.0.0.0" which is invalid as a connection target; update
the "reverse_proxy http://0.0.0.0:20211" entry to use a loopback address such as
"127.0.0.1" or "localhost" and, if un-commenting the IPv6 example, replace
"[::1]" with the proper loopback "[::1]" (ensure the IPv6 example remains
commented or matches the same loopback convention) so the reverse_proxy
directive points to a valid local service endpoint.

Comment on lines +1359 to +1364
# IPv4 Reverse Proxy to NetAlertX GraphQL Endpoint (internal unencrypted Host)
reverse_proxy http://0.0.0.0:20219

# IPv6 Reverse Proxy to NetAlertX GraphQL Endpoint (internal unencrypted Host)
# reverse_proxy http://[::1]:6000
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Same issue: incorrect proxy target for GraphQL endpoint.

🔧 Suggested fix
     # IPv4 Reverse Proxy to NetAlertX GraphQL Endpoint (internal unencrypted Host)
-    reverse_proxy http://0.0.0.0:20219
+    reverse_proxy http://127.0.0.1:20219

     # IPv6 Reverse Proxy to NetAlertX GraphQL Endpoint (internal unencrypted Host)
-    # reverse_proxy http://[::1]:6000
+    # reverse_proxy http://[::1]:20219

Note: The commented IPv6 line also had port 6000 instead of 20219.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# IPv4 Reverse Proxy to NetAlertX GraphQL Endpoint (internal unencrypted Host)
reverse_proxy http://0.0.0.0:20219
# IPv6 Reverse Proxy to NetAlertX GraphQL Endpoint (internal unencrypted Host)
# reverse_proxy http://[::1]:6000
}
# IPv4 Reverse Proxy to NetAlertX GraphQL Endpoint (internal unencrypted Host)
reverse_proxy http://127.0.0.1:20219
# IPv6 Reverse Proxy to NetAlertX GraphQL Endpoint (internal unencrypted Host)
# reverse_proxy http://[::1]:20219
}
🤖 Prompt for AI Agents
In `@docs/REVERSE_PROXY.md` around lines 1359 - 1364, Update the reverse_proxy
targets to point to the internal GraphQL host on the correct port 20219: replace
the incorrect IPv6 target "reverse_proxy http://[::1]:6000" with "reverse_proxy
http://[::1]:20219" and verify the IPv4 proxy line "reverse_proxy
http://0.0.0.0:20219" is the intended GraphQL endpoint (or change it to the
correct host like http://127.0.0.1:20219 if required).

@jokob-sk jokob-sk merged commit ce00bd8 into netalertx:main Jan 15, 2026
6 checks passed
@jokob-sk
Copy link
Collaborator

Thanks a lot @luckylinux !

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