Orange Pi / 低配服务器部署 Authelia 与 Caddy 单点登录(SSO)笔记

本笔记记录了在 1核1G 内存架构(如 Orange Pi 等低配 ARM 板或轻量云主机)下,使用 Podman 部署 Authelia (v4.39.20) 与 Caddy 实现统一认证的完整坑位踩完过程。

重点针对低配服务器性能优化(极速压榨 CPU/内存/磁盘 I/O)以及阿里云 ESA(CDN/隧道)环境下的 Cookie 无限循环登录问题进行了深度优化。


一、 项目总目录结构

在宿主机上,建议的部署根目录结构如下:

.
├── podman-compose.yml     # 容器编排文件
├── caddy/
│   └── Caddyfile          # Caddy 反向代理与拦截配置
└── authelia/
    ├── configuration.yml  # Authelia 主配置文件
    └── users_database.yml # 初始本地用户数据库

二、 容器编排配置 (podman-compose.yml)

优化设计:

  1. logging: driver: none:针对 Caddy 容器彻底关闭容器层面的日志收集。Podman 不会再捕获标准输出并高频刷盘,从而切断磁盘 I/O 损耗。
  2. logging: max-size:针对 Authelia 容器采用严格的日志轮转,防止日志无限膨胀死锁磁盘。
  3. 环境参数:注入 TZ=Asia/Shanghai 保持时区一致。
version: '3.8'

services:
  caddy:
    image: docker.io/library/caddy:latest
    container_name: caddy
    restart: always
    ports:
      - "80:80"
      - "443:443"
    # 究极优化:容器层面关闭日志驱动,切断一切标准输出刷盘 I/O
    logging:
      driver: none
    volumes:
      - ./caddy/Caddyfile:/etc/caddy/Caddyfile
    # 允许 Caddy 与 Authelia 容器通过内部服务名互联
    networks:
      - authelia_net

  authelia:
    image: docker.1ms.run/authelia/authelia:latest
    container_name: authelia
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    environment:
      - PUID=0
      - PGID=0
      - TZ=Asia/Shanghai
      - X_AUTHELIA_CONFIG=/config/configuration.yml
    volumes:
      - ./authelia:/config
    networks:
      - authelia_net

networks:
  authelia_net:
    driver: bridge

三、 Authelia 配置文件

在新版 Authelia(v4.38.0+ / v4.39.X)中,旧版的配置层级发生了重大变化,必须严格按照新语法编写,否则将直接引发 Fatal 崩溃或不跳转。

1. 主配置 (authelia/configuration.yml)

关键避坑与优化项:

  • storage.encryption_key:必须在 storage 的根层级,不能再写在 storage.local 内。
  • identity_validation.reset_password.jwt_secret:旧版的根层级 jwt_secret 已彻底弃用,必须移动至此。
  • **storage.local.wal: truesync: 'normal'**:开启 SQLite 预写日志,降低 fsync 磁头刷盘高频锁死,最大化降低低配服务器的磁盘负载。
  • session.cookies.insecure: true:在配合阿里云 ESA 等外部 CDN 接入时,边缘节点回源通常采用 HTTP。此时必须开启该参数,否则 Authelia 会因非 TLS 连接直接拒绝写入 Cookie,引发页面“无限循环输入账号密码”的经典故障。
  • log.level: 'error':应用层级别设置为最低,只记录崩溃,避免频繁写盘。
server:
  address: 'tcp://0.0.0.0:9091'
  buffers:
    read: 4096
    write: 4096

log:
  level: 'error' # 极简日志,只记录严重错误,压榨 I/O
  format: 'text'

telemetry:
  metrics:
    enabled: false # 关闭度量指标,节省内存和 CPU

authentication_backend:
  password_reset:
    disable: false
  file:
    path: '/config/users_database.yml'
    password:
      algorithm: 'argon2'

identity_validation:
  reset_password:
    jwt_secret: '通过命令生成的随机长字符串_JWT_SECRET' # 修复旧版警告

access_control:
  default_policy: 'deny'
  rules:
    - domain: '*.zhaopeng.site'
      policy: 'one_factor' # 一级密码认证

session:
  secret: '通过命令生成的随机长字符串_SESSION_SECRET'
  cookies:
    - domain: 'zhaopeng.site' # 必须填主域名(根域),以便各子域名共享单点登录 Cookie
      authelia_url: 'https://zaut.zhaopeng.site'

storage:
  encryption_key: '通过命令生成的随机长字符串_ENCRYPTION_KEY' # 修复旧版崩溃错误
  local:
    path: '/config/db.sqlite3'

notifier:
  filesystem:
    filename: '/config/notification.txt' # 密码找回等通知直接输出到文本中,避免 SMTP 模块消耗

附:生成高强度随机密钥的命令

podman run --rm authelia/authelia authelia crypto rand --length 64

提示:主配置中涉及的三个密钥必须独立运行上述命令生成三个不同的值填入。

2. 用户数据库 (authelia/users_database.yml)

在同目录下建立基础用户文件,初始账号为 admin,初始密码为 password

users:
  admin:
    displayname: "Admin User"
    password: "$argon2id$v=19$m=65536,t=3,p=4$4mPZ6S5/S0YAnL7o11Yn3g$pI+3W+ZfCmsC1p/1S0N7gYWhAWhA4vWhA4vWhA4vWhA"
    email: admin@zhaopeng.site
    groups:
      - admins

四、 网关反向代理配置 (caddy/Caddyfile)

优化与避坑设计:

  1. trusted_proxies forwarded:必须显式声明。以此让 Caddy 信任并接收来自阿里云 ESA(CDN)传递过来的 X-Forwarded-For 用户真实 IP,防止 Authelia 因误判防爆破逻辑而全网锁死。
  2. log { output discard }:在各域名块中显式指定,Caddy 会在内存中直接丢弃所有网页访问日志。
  3. forward_auth:通过极为轻量的方式实现流量拦截。外部访问 ztools 时,Caddy 会自动通过内部网络无缝询问 authelia:9091/api/verify 接口。
{
    # 1. 全局系统日志:只记录 ERROR 级别及以上的核心错误,压榨 1c1g 服务器性能
    log {
        level ERROR
    }

    # 2. 全局信任代理:信任腾讯 EdgeOne 传递过来的 X-Forwarded-For 真实用户 IP
    servers {
        trusted_proxies static 0.0.0.0/0 ::/0
    }
}

# 认证中心门户
zaut.zhaopeng.site {
    reverse_proxy authelia:9091 {
        header_up X-Forwarded-Proto {scheme}
        header_up X-Forwarded-Host {host}
    }

    # 显式丢弃当前域名的所有访问日志 (Access Log),达到零磁盘写 I/O
    log {
        output discard
    }
}

# 示例:受 Authelia 保护的受纳应用(如工具箱)
ztools.zhaopeng.site {
    # 统一前置拦截鉴权机制
    forward_auth authelia:9091 {
        uri /api/verify?rd=https://zaut.zhaopeng.site/
        copy_headers Remote-User Remote-Groups Remote-Name Remote-Email
    }

    # 鉴权通过后放行至内部应用后端
    # 请根据实际情况修改为你内部的服务容器名和端口
    reverse_proxy ztools_backend:80

    # 显式丢弃当前域名的所有访问日志 (Access Log)
    log {
        output discard
    }
}

五、 阿里云 ESA(边缘安全加速/CDN)关键环境避坑指南

若网站外部套了阿里云 ESA 或 Cloudflare 等 CDN 产品,即使用户输入正确的账号密码,也极易出现“页面频繁刷新不跳转且无报错”或静态脚本引发 “304 Not Modified” 状态的死循环。测试后,caddy配置的全局需要添加trusted_proxies static 0.0.0.0/0 ::/0,主要点,关闭加速的缓存,zip压缩,回源。

请严格在阿里云 ESA 控制台检查并配置以下三项:

  1. 关闭缓存创建缓存规则(核心)
    路径:进入站点 -> 规则引擎(或页面规则)。
    匹配目标:zaut.zhaopeng.site/*
    策略行为:将 缓存模式 修改为 绕过缓存 (Bypass Cache / No Cache);将边缘缓存 TTL 和浏览器缓存 TTL 全部设为 0
    目的:防止 CDN 缓存 Authelia 的前端静态 JS 鉴权逻辑导致本地 Token 同步错位。
  2. 关闭各种zip压缩关闭安全与干扰模块
    针对 zaut.zhaopeng.site 的规则中,将 火箭筒加速/页面优化 (Rocket Loader / Minification) 彻底 关闭(避免阿里的边缘脚本注入破坏 Authelia 的原生登录前端代码)。
    在调试期间将 Web 应用防火墙(WAF)和 Bot 机器人管理暂时关闭,规避因未透传 IP 时阿里节点被 Authelia 误判为暴力破解而导致的安全拒绝。
  3. 回源,腾讯有,阿里没有配,貌似也行SSL/TLS 回源匹配
    确保控制台的 SSL 模式设置为完全(Strict)或灵活(Flexible)。同时必须配合 Authelia 配置中的 insecure: true 妥协接受非 TLS 回源流量。

腾讯edgeone如下,真实修改只有头部名称,木有取值,就没填取值,也能用

  1. 进入 EdgeOne 的 回源配置 -> 自定义回源 HTTP 请求头
  2. 添加一条规则:
    头部名称 (Header Name):填写 X-Forwarded-For(这是国际通用标准)。
    头部取值 (Header Value):选择 客户端真实 IP (Client IP / Connecting IP)

每次调整控制台规则后,必须开启浏览器的无痕模式(排除本地 304 强缓存干扰)进行登录测试。

标签: none

添加新评论