- `admin :2019` слушал всю web_proxy_network: любой контейнер мог POST-ом в /config/ переписать маршрутизацию и снять forward_auth. Теперь `admin localhost:2019`. - Метрики для netdata отдаёт отдельный site-блок `http://:2020 { metrics /metrics }`, netdata скрейпит новый порт. - Порт для метрик именно 2020, а не 2019, как предлагала задача: сайт на :2019 перехватывает IPv6-петлю (admin висит только на IPv4), из-за чего `caddy reload` внутри контейнера возвращает 0 и молча ничего не применяет — проверено на caddy:2.11.4.
318 lines
8.4 KiB
Caddyfile
318 lines
8.4 KiB
Caddyfile
# -------------------------------------------------------------------
|
||
# Global options
|
||
# -------------------------------------------------------------------
|
||
{
|
||
grace_period 15s
|
||
|
||
# Admin API слушает только loopback контейнера: на :2019 его видела бы вся
|
||
# web_proxy_network, и любое приложение могло бы переписать маршрутизацию
|
||
# или снять forward_auth. Метрики вынесены в отдельный site-блок ниже, и
|
||
# порт у него другой: сайт на :2019 перехватывал бы IPv6-петлю (admin висит
|
||
# только на IPv4), и `caddy reload` молча ничего не применял бы.
|
||
admin localhost:2019
|
||
|
||
# Enable metrics in Prometheus format
|
||
# https://caddyserver.com/docs/metrics
|
||
metrics
|
||
}
|
||
|
||
# -------------------------------------------------------------------
|
||
# Metrics
|
||
# -------------------------------------------------------------------
|
||
|
||
# Prometheus-метрики для netdata (files/netdata/go.d/prometheus.conf).
|
||
# Наружу порт не публикуется — доступен только внутри web_proxy_network.
|
||
http://:2020 {
|
||
metrics /metrics
|
||
}
|
||
|
||
# -------------------------------------------------------------------
|
||
# Snippets
|
||
# -------------------------------------------------------------------
|
||
|
||
# Shared access log for all sites; consumed by GoAccess.
|
||
# Mode 644 lets read-only consumers (goaccess and ad-hoc host-side tail)
|
||
# read the file; lumberjack would otherwise default to 0600.
|
||
(access_log) {
|
||
log {
|
||
output file /var/log/caddy/access.log {
|
||
mode 644
|
||
roll_size 100mib
|
||
roll_keep 10
|
||
roll_keep_for 720h
|
||
}
|
||
format json
|
||
}
|
||
}
|
||
|
||
# -------------------------------------------------------------------
|
||
# Applications
|
||
# -------------------------------------------------------------------
|
||
|
||
vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
# Matrix federation delegation: tells other servers/clients that the
|
||
# homeserver for vakhrushev.me lives at matrix.vakhrushev.me.
|
||
# https://spec.matrix.org/latest/server-server-api/#server-discovery
|
||
handle /.well-known/matrix/server {
|
||
header Content-Type application/json
|
||
header Access-Control-Allow-Origin *
|
||
respond `{"m.server": "matrix.vakhrushev.me:443"}`
|
||
}
|
||
|
||
handle /.well-known/matrix/client {
|
||
header Content-Type application/json
|
||
header Access-Control-Allow-Origin *
|
||
respond `{"m.homeserver": {"base_url": "https://matrix.vakhrushev.me"}}`
|
||
}
|
||
|
||
handle {
|
||
reverse_proxy {
|
||
to homepage_app:80
|
||
}
|
||
}
|
||
}
|
||
|
||
# Дашборд со списком сервисов (gethomepage). Закрыт за Authelia. Это отдельный
|
||
# сервис, не путать с кастомной домашней страничкой homepage_app на apex выше.
|
||
start.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
forward_auth authelia_app:9091 {
|
||
uri /api/authz/forward-auth
|
||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
|
||
}
|
||
|
||
reverse_proxy {
|
||
to dashboard_app:3000
|
||
}
|
||
}
|
||
|
||
matrix.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
reverse_proxy {
|
||
to tuwunel_app:6167
|
||
}
|
||
}
|
||
|
||
auth.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
reverse_proxy authelia_app:9091
|
||
}
|
||
|
||
status.vakhrushev.me, :29999 {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
forward_auth authelia_app:9091 {
|
||
uri /api/authz/forward-auth
|
||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
|
||
}
|
||
|
||
reverse_proxy netdata:19999
|
||
}
|
||
|
||
git.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
reverse_proxy {
|
||
to gitea_app:3000
|
||
}
|
||
}
|
||
|
||
outline.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
reverse_proxy {
|
||
to outline_app:3000
|
||
}
|
||
}
|
||
|
||
gramps.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
reverse_proxy {
|
||
to gramps_app:5000
|
||
}
|
||
}
|
||
|
||
miniflux.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
# /metrics наружу не отдаём. METRICS_ALLOWED_NETWORKS тут не помогает: за
|
||
# прокси Miniflux видит приватный IP контейнера Caddy, а не адрес клиента.
|
||
# Netdata скрейпит miniflux_app:8080/metrics напрямую по докер-сети, мимо Caddy.
|
||
handle /metrics {
|
||
respond 404
|
||
}
|
||
|
||
handle {
|
||
reverse_proxy {
|
||
to miniflux_app:8080
|
||
}
|
||
}
|
||
}
|
||
|
||
wakapi.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
reverse_proxy {
|
||
to wakapi_app:3000
|
||
}
|
||
}
|
||
|
||
wanderer.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
reverse_proxy {
|
||
to wanderer_web:3000
|
||
}
|
||
}
|
||
|
||
memos.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
reverse_proxy {
|
||
to memos_app:5230
|
||
}
|
||
}
|
||
|
||
# tududi сам логинит пользователей через OIDC (Authelia), поэтому здесь без
|
||
# forward_auth — иначе двойная аутентификация.
|
||
tududi.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
reverse_proxy {
|
||
to tududi_app:3002
|
||
}
|
||
}
|
||
|
||
remembos.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
forward_auth authelia_app:9091 {
|
||
uri /api/authz/forward-auth
|
||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
|
||
}
|
||
|
||
reverse_proxy {
|
||
to remembos_app:8080
|
||
}
|
||
}
|
||
|
||
calibre.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
reverse_proxy {
|
||
to calibre_web_app:8083
|
||
}
|
||
}
|
||
|
||
wanderbase.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
forward_auth authelia_app:9091 {
|
||
uri /api/authz/forward-auth
|
||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
|
||
}
|
||
|
||
reverse_proxy {
|
||
to wanderer_db:8090
|
||
}
|
||
}
|
||
|
||
rssbridge.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
forward_auth authelia_app:9091 {
|
||
uri /api/authz/forward-auth
|
||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
|
||
}
|
||
|
||
reverse_proxy {
|
||
to rssbridge_app:80
|
||
}
|
||
}
|
||
|
||
dozzle.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
forward_auth authelia_app:9091 {
|
||
uri /api/authz/forward-auth
|
||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name Remote-Filter
|
||
}
|
||
|
||
reverse_proxy dozzle_app:8080
|
||
}
|
||
|
||
# GoatCounter — веб-аналитика посещений. Один инстанс обслуживает несколько
|
||
# сайтов и выбирает нужный сам, по заголовку Host, поэтому здесь один блок на
|
||
# все имена, а не блок на сайт. Имена рендерятся из goatcounter_sites
|
||
# (group_vars/all/main.yml) — того же списка, по которому плейбук goatcounter
|
||
# заводит сами сайты, чтобы конфиг прокси и база не разъезжались.
|
||
#
|
||
# Без forward_auth: эндпоинты /count и /count.js обязаны быть публичными, их
|
||
# дёргает трекер с сайта. Дашборд закрыт собственным логином goatcounter.
|
||
{{ goatcounter_sites | join(', ') }} {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
reverse_proxy {
|
||
to goatcounter_app:8080
|
||
}
|
||
}
|
||
|
||
goaccess.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
forward_auth authelia_app:9091 {
|
||
uri /api/authz/forward-auth
|
||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
|
||
}
|
||
|
||
@websocket {
|
||
header Connection *Upgrade*
|
||
header Upgrade websocket
|
||
}
|
||
reverse_proxy @websocket goaccess_processor:7890
|
||
|
||
reverse_proxy goaccess_app:8080
|
||
}
|
||
|
||
# Bifrost — внутренний LLM-шлюз. Веб-UI (дашборд + LLM-логи + ключи) закрыт за
|
||
# Authelia (2FA). Сам API tududi дёргает не через Caddy, а по web_proxy_network.
|
||
bifrost.vakhrushev.me {
|
||
tls anwinged@ya.ru
|
||
import access_log
|
||
|
||
forward_auth authelia_app:9091 {
|
||
uri /api/authz/forward-auth
|
||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
|
||
}
|
||
|
||
reverse_proxy bifrost_app:8080
|
||
}
|
||
|