Compare commits

...

5 Commits

Author SHA1 Message Date
f4dd57fa60 fix: add start-hermes.sh baked into image, replace broken ENTRYPOINT
Some checks failed
Build Hermes agent / build (pull_request) Has been cancelled
Build ollama (gfx906) / build (pull_request) Has been cancelled
- New start-hermes.sh: multi-profile launcher that works with s6-overlay's
  main-program model (replaces bash->tini->entrypoint.sh chain)
- Dockerfile: COPY start-hermes.sh into /usr/local/bin/ alongside
  run-multi-gateways.sh (which is now unused but kept for reference)
- compose.yml: remove entrypoint override, CMD now points at
  /usr/local/bin/start-hermes.sh via the image default ENTRYPOINT

Fixes the SIGTERM crash loop caused by S6_CMD_ARG0 being unset when the
deprecated entrypoint.sh shim bypassed s6-overlay's /init.
2026-07-07 21:58:41 -04:00
a6b25ee84d fix: replace broken ENTRYPOINT override with s6-overlay compatible CMD
The custom ENTRYPOINT chained bash -> tini -g -> deprecated entrypoint.sh,
bypassing s6-overlay's /init entirely. This left S6_CMD_ARG0 unset and the
orphan -g flag crashed rc.init with '-g: not found' -> SIGTERM -> restart loop.

Fix:
- Remove the ENTRYPOINT override so the image default is used:
  ENTRYPOINT ['/init', '/opt/hermes/docker/main-wrapper.sh']
- Change CMD to point at /opt/data/start-hermes.sh, a new launcher
  that starts per-profile gateways in background then the default
  gateway in foreground (via s6-overlay's main-program model).

The old /usr/local/bin/run-multi-gateways.sh is no longer called.
2026-07-07 21:56:33 -04:00
54e0661396 fix: add missing USER hermes at end of Dockerfile
The Dockerfile was switching to USER root for the final chown but never
switched back to USER hermes. This caused ALL container processes to run
as root (uid 0) instead of the hermes user (uid 10000).

The entrypoint's gosu privilege drop only caught the main exec chain,
leaving backgrounded subprocesses (dashboard PTY sessions, workers with
start_new_session=True) running as root — creating files owned by root
in ExoKortex and breaking Syncthing sync.

Adding USER hermes at the end ensures the container runs unprivileged
and ALL child processes inherit uid 10000 from the start.
2026-07-07 14:58:44 -04:00
2571930efa Local change dump 2026-07-07 14:11:31 -04:00
e525145057 Merge pull request 'feat: add Honcho memory provider with Traefik + Authelia' (#48) from feat/honcho-only into master
Some checks failed
Build Hermes agent / build (push) Has been cancelled
Build ollama (gfx906) / build (push) Has been cancelled
Reviewed-on: #48
2026-06-15 17:08:20 +00:00
15 changed files with 178 additions and 135 deletions

View File

@@ -1,46 +1,24 @@
services: services:
# webui:
# image: ghcr.io/open-webui/open-webui:main
# volumes:
# - /mnt/HoardingCow_docker_data/Ollama/open-webui:/app/backend/data
# restart: always
# environment:
# - OLLAMA_API_BASE_URL=http://ollama:11434/api
# networks:
# - ai_net
# - ai_backend
# labels:
# - "traefik.enable=true"
# # Router for HTTP + redirection to HTTPS
# - "traefik.http.routers.webui-http.rule=Host(`ai.lazyworkhorse.net`)"
# - "traefik.http.routers.webui-http.entrypoints=web"
# - "traefik.http.routers.webui-http.middlewares=redirect-to-https"
# # Router for HTTPS with TLS
# - "traefik.http.routers.webui-https.rule=Host(`ai.lazyworkhorse.net`)"
# - "traefik.http.routers.webui-https.entrypoints=websecure"
# - "traefik.http.routers.webui-https.tls=true"
# - "traefik.http.routers.webui-https.tls.certresolver=njalla"
hermes: hermes:
build: build:
context: ./hermes context: ./hermes
ssh: ssh:
- default - default
container_name: hermes container_name: hermes
entrypoint: ["/bin/bash", "-c",
"bash /opt/data/hermes-tools/install.sh && bash /usr/local/bin/run-multi-gateways.sh && exec /usr/bin/tini -g -- /opt/hermes/docker/entrypoint.sh \"$@\"",
"hermes-entrypoint"]
restart: always restart: always
# Gateway run enables the internal API server on port 8642 # Use the image default ENTRYPOINT ["/init", "/opt/hermes/docker/main-wrapper.sh"]
command: gateway run # for proper s6-overlay supervision. The CMD runs our multi-profile launcher
# which spawns per-profile gateways in background, then the default gateway
# in foreground (keeps the container alive).
command: ["/usr/local/bin/start-hermes.sh"]
environment: environment:
- HERMES_UID=10000
- HERMES_GID=10000
- OLLAMA_HOST=http://ollama:11434 - OLLAMA_HOST=http://ollama:11434
- HERMES_DASHBOARD=1 - HERMES_DASHBOARD=1
# Multi-profile: comma-separated list of profiles to run as gateways. # Multi-profile: comma-separated list of profiles to run as gateways.
# The entrypoint reads this and starts one gateway per profile. # start-hermes.sh reads this and starts one gateway per profile.
# Add profiles here when they exist on disk (e.g. default,researcher,writer) # Add profiles here when they exist on disk (e.g. default,researcher,writer)
- HERMES_PROFILES=ashley,claire,finn,matt,paul - HERMES_PROFILES=ashley,claire,finn,matt,paul
- API_SERVER_ENABLED=true - API_SERVER_ENABLED=true
@@ -59,10 +37,7 @@ services:
- TZ=America/Montreal - TZ=America/Montreal
volumes: volumes:
- /mnt/HoardingCow_docker_data/Hermes/data:/opt/data - /mnt/HoardingCow_docker_data/Hermes/data:/opt/data
# Syncthing-shared org files — read-only view of user's agenda - /mnt/HoardingCow_docker_data/Hermes/Syncthing/ExoKortex:/opt/data/ExoKortex
- /mnt/HoardingCow_docker_data/Syncthing/telos-ro:/opt/data/telos-ro:ro
# Syncthing-shared inbox — write tasks here, they sync to user's laptop
- /mnt/HoardingCow_docker_data/Syncthing/telos-rw:/opt/data/telos-rw:rw
devices: devices:
- /dev/kfd:/dev/kfd - /dev/kfd:/dev/kfd
- /dev/dri:/dev/dri - /dev/dri:/dev/dri
@@ -109,24 +84,29 @@ services:
- "21027:21027/udp" - "21027:21027/udp"
environment: environment:
- TZ=America/Montreal - TZ=America/Montreal
- PUID=10000
- PGID=10000
volumes: volumes:
- /mnt/HoardingCow_docker_data/Syncthing/config:/var/syncthing/config - /mnt/HoardingCow_docker_data/Hermes/Syncthing/config:/var/syncthing/config
- /mnt/HoardingCow_docker_data/Syncthing/telos-ro:/telos-ro - /mnt/HoardingCow_docker_data/Hermes/Syncthing/ExoKortex:/ExoKortex
- /mnt/HoardingCow_docker_data/Syncthing/telos-rw:/telos-rw
networks: networks:
- ai_backend - ai_backend
- ai_net - ai_net
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.docker.network=ai_net"
- "traefik.http.routers.syncthing-http.rule=Host(`syncthing.lazyworkhorse.net`)" - "traefik.http.routers.syncthing-http.rule=Host(`syncthing.lazyworkhorse.net`)"
- "traefik.http.routers.syncthing-http.entrypoints=web" - "traefik.http.routers.syncthing-http.entrypoints=web"
- "traefik.http.routers.syncthing-http.middlewares=redirect-to-https" - "traefik.http.routers.syncthing-http.middlewares=redirect-to-https"
- "traefik.http.routers.syncthing-https.rule=Host(`syncthing.lazyworkhorse.net`)" - "traefik.http.routers.syncthing-https.rule=Host(`syncthing.lazyworkhorse.net`)"
- "traefik.http.routers.syncthing-https.entrypoints=websecure" - "traefik.http.routers.syncthing-https.entrypoints=websecure"
- "traefik.http.routers.syncthing-https.tls=true" - "traefik.http.routers.syncthing-https.tls=true"
- "traefik.http.routers.syncthing-https.tls.certresolver=njalla" - "traefik.http.routers.syncthing-https.tls.certresolver=njalla"
- "traefik.http.services.syncthing.loadbalancer.server.port=8384" - "traefik.http.routers.syncthing-https.middlewares=hermes-auth"
- "traefik.http.services.syncthing.loadbalancer.server.port=8384"
ollama: ollama:
build: build:
@@ -203,10 +183,8 @@ services:
# Service Loadbalancer (nginx port) # Service Loadbalancer (nginx port)
- "traefik.http.services.honcho.loadbalancer.server.port=80" - "traefik.http.services.honcho.loadbalancer.server.port=80"
depends_on: depends_on:
honcho-db: - honcho-db
condition: service_healthy - honcho-redis
honcho-redis:
condition: service_healthy
honcho-db: honcho-db:
image: pgvector/pgvector:pg15 image: pgvector/pgvector:pg15
@@ -225,11 +203,6 @@ services:
- ./honcho/init-db.sql:/docker-entrypoint-initdb.d/init.sql:ro - ./honcho/init-db.sql:/docker-entrypoint-initdb.d/init.sql:ro
networks: networks:
- ai_backend - ai_backend
healthcheck:
test: ["CMD-SHELL", "pg_isready -U honcho -d honcho"]
interval: 5s
timeout: 5s
retries: 5
honcho-redis: honcho-redis:
image: redis:8 image: redis:8
@@ -241,15 +214,10 @@ services:
- /mnt/HoardingCow_docker_data/Honcho/redis:/data - /mnt/HoardingCow_docker_data/Honcho/redis:/data
networks: networks:
- ai_backend - ai_backend
healthcheck:
test: ["CMD-SHELL", "redis-cli ping"]
interval: 5s
timeout: 5s
retries: 5
networks: networks:
ai_net: ai_net:
external: true driver: bridge
name: ai_net name: ai_net
ai_backend: ai_backend:
driver: bridge driver: bridge
@@ -257,7 +225,7 @@ networks:
volumes: volumes:
honcho_data: honcho_data:
external: true driver: bridge
name: honcho_data name: honcho_data
# llama_cpp_devstral: # llama_cpp_devstral:
@@ -348,6 +316,30 @@ volumes:
# - /mnt/HoardingCow_docker_data/vllm/models:/root/.cache/huggingface # - /mnt/HoardingCow_docker_data/vllm/models:/root/.cache/huggingface
# restart: unless-stopped # restart: unless-stopped
# webui:
# image: ghcr.io/open-webui/open-webui:main
# volumes:
# - /mnt/HoardingCow_docker_data/Ollama/open-webui:/app/backend/data
# restart: always
# environment:
# - OLLAMA_API_BASE_URL=http://ollama:11434/api
# networks:
# - ai_net
# - ai_backend
# labels:
# - "traefik.enable=true"
# # Router for HTTP + redirection to HTTPS
# - "traefik.http.routers.webui-http.rule=Host(`ai.lazyworkhorse.net`)"
# - "traefik.http.routers.webui-http.entrypoints=web"
# - "traefik.http.routers.webui-http.middlewares=redirect-to-https"
# # Router for HTTPS with TLS
# - "traefik.http.routers.webui-https.rule=Host(`ai.lazyworkhorse.net`)"
# - "traefik.http.routers.webui-https.entrypoints=websecure"
# - "traefik.http.routers.webui-https.tls=true"
# - "traefik.http.routers.webui-https.tls.certresolver=njalla"
# n8n: # n8n:
# image: n8nio/n8n:latest # image: n8nio/n8n:latest
# container_name: n8n # container_name: n8n

View File

@@ -9,26 +9,6 @@
# ---------- Base: official Hermes image (system deps, npm, uv, Playwright) ---------- # ---------- Base: official Hermes image (system deps, npm, uv, Playwright) ----------
FROM nousresearch/hermes-agent:latest FROM nousresearch/hermes-agent:latest
# ---------- Overlay our forked source ----------
# Uses SSH agent forwarding from the build host (no key baked into image).
# --exclude node_modules/.venv keeps the base image's pre-built layers intact.
# Only the Python source, web UI source, and config change.
RUN --mount=type=ssh \
mkdir -p /root/.ssh && \
ssh-keyscan -p 2222 code.lazyworkhorse.net >> /root/.ssh/known_hosts 2>/dev/null && \
cd /tmp && \
GIT_SSH_COMMAND='ssh -p 2222 -o StrictHostKeyChecking=no' \
git clone --depth 1 --branch main \
git@code.lazyworkhorse.net:gortium/hermes-agent.git fork && \
rm -rf fork/node_modules fork/.venv fork/.git && \
cp -a fork/. /opt/hermes/ && \
rm -rf /tmp/fork /root/.ssh/
# ---------- Reinstall Python package (editable) ----------
# Picks up source changes from our fork.
RUN . /opt/hermes/.venv/bin/activate && \
uv pip install --no-cache-dir --no-deps -e /opt/hermes
# ---------- Extra system deps ---------- # ---------- Extra system deps ----------
USER root USER root
RUN apt-get update && \ RUN apt-get update && \
@@ -43,12 +23,6 @@ RUN apt-get update && \
# ---------- UV ---------- # ---------- UV ----------
COPY --chmod=0755 --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/ COPY --chmod=0755 --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/
# ---------- Matrix bridge + extra pip deps ----------
# Previously installed inline at container startup and persisted via volume mount.
# Now baked into the image so the fragile venv volume mount can be removed.
RUN . /opt/hermes/.venv/bin/activate && \
uv pip install --no-cache-dir 'mautrix[encryption]' openai
WORKDIR /opt/hermes WORKDIR /opt/hermes
# ---------- Matrix bridge + extra pip deps ---------- # ---------- Matrix bridge + extra pip deps ----------
@@ -88,6 +62,11 @@ PYEOF
# Launches one gateway process per profile (HERMES_PROFILES env var) # Launches one gateway process per profile (HERMES_PROFILES env var)
COPY --chmod=0755 run-multi-gateways.sh /usr/local/bin/run-multi-gateways.sh COPY --chmod=0755 run-multi-gateways.sh /usr/local/bin/run-multi-gateways.sh
# ---------- Install s6-overlay compatible startup script ----------
# Runs as the CMD via s6-overlay's main-program model.
# Replaces the old bash->tini->entrypoint.sh chain that caused SIGTERM crash loops.
COPY --chmod=0755 start-hermes.sh /usr/local/bin/start-hermes.sh
# ---------- Runtime ---------- # ---------- Runtime ----------
USER hermes USER hermes
ENV HERMES_HOME=/opt/data ENV HERMES_HOME=/opt/data
@@ -101,3 +80,8 @@ USER root
RUN chown -R hermes:hermes /opt/hermes/tools /opt/hermes/toolsets.py RUN chown -R hermes:hermes /opt/hermes/tools /opt/hermes/toolsets.py
VOLUME [ "/opt/data" ] VOLUME [ "/opt/data" ]
# Switch to the hermes user so the container runs unprivileged.
# All child processes inherit this user — no more orphan root processes
# that escape gosu privilege drops in the entrypoint.
USER hermes

38
ai/hermes/start-hermes.sh Normal file
View File

@@ -0,0 +1,38 @@
#!/bin/bash
# Multi-profile + default gateway launcher — runs as the CMD via s6-overlay.
#
# The image's default ENTRYPOINT ["/init", "/opt/hermes/docker/main-wrapper.sh"]
# starts the s6 supervision tree, then exec's main-wrapper.sh with the CMD args.
# main-wrapper.sh sources the venv, drops to the hermes user via s6-setuidgid,
# and exec's this script.
#
# This script:
# 1. Launches per-profile background gateways (HERMES_PROFILES env var)
# 2. Starts the default gateway in foreground (keeps the container alive)
#
# Replaces the old approach of chaining bash -> tini -g -> deprecated entrypoint.sh
# which bypassed s6-overlay and caused the SIGTERM crash loop.
set -e
HERMES_BIN="/opt/hermes/.venv/bin/hermes"
# --- Multi-profile gateways (background) ---
if [ -n "${HERMES_PROFILES:-}" ]; then
echo "[start-hermes] Launching per-profile gateways: ${HERMES_PROFILES}"
IFS=',' read -ra PROFILES <<< "${HERMES_PROFILES}"
for profile in "${PROFILES[@]}"; do
profile="$(echo "${profile}" | xargs)" # trim whitespace
[ -z "${profile}" ] && continue
echo "[start-hermes] -> background gateway for profile '${profile}'"
# No gosu/s6-setuidgid needed — we're already running as the hermes user
# (main-wrapper.sh drops privileges before exec'ing this script).
nohup "${HERMES_BIN}" --profile "${profile}" gateway run \
>> "/opt/data/logs/gateway-${profile}.log" 2>&1 &
done
echo "[start-hermes] All profile gateways launched"
fi
# --- Default gateway (foreground — keeps container alive) ---
echo "[start-hermes] Starting default gateway (foreground)"
exec "${HERMES_BIN}" gateway run

View File

@@ -32,5 +32,5 @@ services:
networks: networks:
auth_net: auth_net:
external: true driver: bridge
name: auth_net name: auth_net

View File

@@ -68,33 +68,33 @@ services:
labels: labels:
- "traefik.enable=false" # Internal only, accessed by restic-browser - "traefik.enable=false" # Internal only, accessed by restic-browser
restic-browser: # restic-browser:
image: embergarage/restic-browser:latest # image: mazzolino/restic-browser:latest
container_name: restic-browser # container_name: restic-browser
restart: always # restart: always
environment: # environment:
- TZ=America/Montreal # - TZ=America/Montreal
- RESTIC_REPOSITORY=http://restic-server:8080 # - RESTIC_REPOSITORY=http://restic-server:8080
- RESTIC_PASSWORD=${RESTIC_PASSWORD} # - RESTIC_PASSWORD=${RESTIC_PASSWORD}
networks: # networks:
- backup_net # - backup_net
labels: # labels:
- "traefik.enable=true" # - "traefik.enable=true"
# 1. HTTP to HTTPS Redirect # # 1. HTTP to HTTPS Redirect
- "traefik.http.routers.restic-browser-http.rule=Host(`backup.lazyworkhorse.net`)" # - "traefik.http.routers.restic-browser-http.rule=Host(`backup.lazyworkhorse.net`)"
- "traefik.http.routers.restic-browser-http.entrypoints=web" # - "traefik.http.routers.restic-browser-http.entrypoints=web"
- "traefik.http.routers.restic-browser-http.middlewares=redirect-to-https@docker" # - "traefik.http.routers.restic-browser-http.middlewares=redirect-to-https@docker"
#
# 2. HTTPS Configuration # # 2. HTTPS Configuration
- "traefik.http.routers.restic-browser.rule=Host(`backup.lazyworkhorse.net`)" # - "traefik.http.routers.restic-browser.rule=Host(`backup.lazyworkhorse.net`)"
- "traefik.http.routers.restic-browser.entrypoints=websecure" # - "traefik.http.routers.restic-browser.entrypoints=websecure"
- "traefik.http.routers.restic-browser.tls=true" # - "traefik.http.routers.restic-browser.tls=true"
- "traefik.http.routers.restic-browser.tls.certresolver=njalla" # - "traefik.http.routers.restic-browser.tls.certresolver=njalla"
#
# 3. Backend Service Config # # 3. Backend Service Config
- "traefik.http.services.restic-browser.loadbalancer.server.port=8000" # - "traefik.http.services.restic-browser.loadbalancer.server.port=8000"
networks: networks:
backup_net: backup_net:
external: true driver: bridge
name: backup_net name: backup_net

View File

@@ -6,6 +6,7 @@ services:
restart: always restart: always
networks: networks:
- cloud_net - cloud_net
- cloud_internal
environment: environment:
- PUID=1000 - PUID=1000
- PGID=1000 - PGID=1000
@@ -51,7 +52,7 @@ services:
container_name: nextcloud_cron container_name: nextcloud_cron
restart: always restart: always
networks: networks:
- cloud_net - cloud_internal
entrypoint: /cron.sh entrypoint: /cron.sh
volumes: volumes:
- /mnt/HoardingCow_docker_data/NextCloud/data:/var/www/html:rw - /mnt/HoardingCow_docker_data/NextCloud/data:/var/www/html:rw
@@ -75,7 +76,7 @@ services:
networks: networks:
cloud_net: cloud_net:
external: true driver: bridge
name: cloud_net name: cloud_net
cloud_internal: cloud_internal:
driver: bridge driver: bridge

View File

@@ -103,7 +103,7 @@ services:
networks: networks:
coms_net: coms_net:
external: true driver: bridge
name: coms_net name: coms_net
coms_backend: coms_backend:
driver: bridge driver: bridge

View File

@@ -37,4 +37,5 @@ services:
networks: networks:
finance_net: finance_net:
external: true driver: bridge
name: finance_net

View File

@@ -12,8 +12,8 @@ services:
volumes: volumes:
- /mnt/HoardingCow_docker_data/Home_Assistant:/config:rw - /mnt/HoardingCow_docker_data/Home_Assistant:/config:rw
networks: networks:
- home_auto_net - home_net
- home_auto_backend - home_backend
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
@@ -34,7 +34,7 @@ services:
volumes: volumes:
- /mnt/HoardingCow_docker_data/Mosquitto:/mosquitto - /mnt/HoardingCow_docker_data/Mosquitto:/mosquitto
networks: networks:
- home_auto_backend - home_backend
# ports: # ports:
# - 1883:1883 # - 1883:1883
# - 9001:9001 # - 9001:9001
@@ -43,7 +43,7 @@ services:
image: registry.gitlab.com/hydroqc/hydroqc2mqtt:1.3.0 image: registry.gitlab.com/hydroqc/hydroqc2mqtt:1.3.0
restart: always restart: always
networks: networks:
- home_auto_backend - home_backend
environment: environment:
MQTT_USERNAME: hass MQTT_USERNAME: hass
MQTT_PASSWORD: ${MQTT_PASSWORD} MQTT_PASSWORD: ${MQTT_PASSWORD}
@@ -88,8 +88,9 @@ services:
# restart: unless-stopped # restart: unless-stopped
networks: networks:
home_auto_net: home_net:
external: true
home_auto_backend:
driver: bridge driver: bridge
name: home_auto_backend name: home_net
home_backend:
driver: bridge
name: home_backend

View File

@@ -38,4 +38,5 @@ services:
networks: networks:
homepage_net: homepage_net:
external: true driver: bridge
name: homepage_net

View File

@@ -36,9 +36,9 @@ services:
- cloud_net - cloud_net
- coms_net - coms_net
- finance_net - finance_net
- home_auto_net - home_net
- homepage_net - homepage_net
- passman_net - pass_net
- tak_net - tak_net
- vc_net - vc_net
@@ -99,15 +99,15 @@ networks:
finance_net: finance_net:
driver: bridge driver: bridge
name: finance_net name: finance_net
home_auto_net: home_net:
driver: bridge driver: bridge
name: home_auto_net name: home_net
homepage_net: homepage_net:
driver: bridge driver: bridge
name: homepage_net name: homepage_net
passman_net: pass_net:
driver: bridge driver: bridge
name: passman_net name: pass_net
tak_net: tak_net:
driver: bridge driver: bridge
name: tak_net name: tak_net

View File

@@ -13,7 +13,7 @@ services:
volumes: volumes:
- /mnt/HoardingCow_docker_data/BitWarden/data:/data:rw - /mnt/HoardingCow_docker_data/BitWarden/data:/data:rw
networks: networks:
- passman_net - pass_net
restart: always restart: always
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
@@ -32,5 +32,6 @@ services:
# Internal service # Internal service
- "traefik.http.services.pass.loadbalancer.server.port=80" - "traefik.http.services.pass.loadbalancer.server.port=80"
networks: networks:
passman_net: pass_net:
external: true driver: bridge
name: pass_net

View File

@@ -92,7 +92,8 @@ services:
networks: networks:
tak_net: tak_net:
external: true driver: bridge
name: tak_net
tak_backend: tak_backend:
driver: bridge driver: bridge
name: tak_backend name: tak_backend

View File

@@ -61,4 +61,5 @@ services:
networks: networks:
vc_net: vc_net:
external: true driver: bridge
name: vc_net

View File

@@ -12,7 +12,7 @@ services:
- SYS_MODULE - SYS_MODULE
environment: environment:
- WG_HOST=vpn.lazyworkhorse.net - WG_HOST=vpn.lazyworkhorse.net
- PASSWORD=${WG_PASSWORD} - PASSWORD_HASH=${WG_PASSWORD_HASH}
- WG_PORT=51820 - WG_PORT=51820
- WG_DEFAULT_ADDRESS=10.8.0.x - WG_DEFAULT_ADDRESS=10.8.0.x
- WG_DEFAULT_DNS=1.1.1.1,8.8.8.8 - WG_DEFAULT_DNS=1.1.1.1,8.8.8.8
@@ -22,7 +22,6 @@ services:
- UI_CHART_TYPE=0 - UI_CHART_TYPE=0
ports: ports:
- "51820:51820/udp" - "51820:51820/udp"
- "51821:51821/tcp"
volumes: volumes:
- /mnt/HoardingCow_docker_data/WireGuard:/etc/wireguard:rw - /mnt/HoardingCow_docker_data/WireGuard:/etc/wireguard:rw
sysctls: sysctls:
@@ -31,8 +30,31 @@ services:
restart: unless-stopped restart: unless-stopped
networks: networks:
- vpn_net - vpn_net
labels:
- "traefik.enable=true"
# HTTP → HTTPS redirect
- "traefik.http.routers.wireguard-http.rule=Host(vpn.lazyworkhorse.net)"
- "traefik.http.routers.wireguard-http.entrypoints=web"
- "traefik.http.routers.wireguard-http.middlewares=redirect-to-https"
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
# HTTPS router — protégé par Authelia
- "traefik.http.routers.wireguard-https.rule=Host(vpn.lazyworkhorse.net)"
- "traefik.http.routers.wireguard-https.entrypoints=websecure"
- "traefik.http.routers.wireguard-https.tls=true"
- "traefik.http.routers.wireguard-https.tls.certresolver=njalla"
- "traefik.http.routers.wireguard-https.middlewares=wireguard-auth"
# Authelia forwardAuth
- "traefik.http.middlewares.wireguard-auth.forwardauth.address=http://authelia:9091/api/verify?rd=https://auth.lazyworkhorse.net/"
- "traefik.http.middlewares.wireguard-auth.forwardauth.trustforwardheader=true"
- "traefik.http.middlewares.wireguard-auth.forwardauth.authresponseheaders=X-Forwarded-User,X-Forwarded-Groups"
# Port interne du web UI wg-easy
- "traefik.http.services.wireguard.loadbalancer.server.port=51821"
networks: networks:
vpn_net: vpn_net:
external: true driver: bridge
name: vpn_net name: vpn_net