系统级目录布局

应用配置放在 /opt;Quadlet 单元放在 /etc/containers/systemd。

/opt/podman/
├─ frp/
│  └─ frps.toml
└─ caddy/
   └─ Caddyfile

/etc/containers/systemd/
├─ frps.container
└─ caddy.container

frps 配置

/opt/podman/frp/frps.toml

bindPort = 7000

auth.method = "token"
auth.token = "REPLACE_WITH_STRONG_TOKEN"

webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "REPLACE_WITH_STRONG_PASSWORD"

Caddy 配置

/opt/podman/caddy/Caddyfile

vps.wang1zhen.com:7500 {
  reverse_proxy http://127.0.0.1:7750
}

:80 {
  root * /usr/share/caddy
  file_server
}
:443 {
  root * /usr/share/caddy
  file_server
  tls internal
}

frps Quadlet

/etc/containers/systemd/frps.container

[Unit]
Description=frps

[Container]
Image=docker.io/snowdreamtech/frps:alpine
ContainerName=frps
PublishPort=7000:7000/tcp
PublishPort=127.0.0.1:7750:7500/tcp
Volume=/opt/podman/frp/frps.toml:/etc/frp/frps.toml:ro

[Service]
Restart=always

[Install]
WantedBy=multi-user.target

Caddy Quadlet

/etc/containers/systemd/caddy.container

[Unit]
Description=Caddy

[Container]
Image=docker.io/caddy:2
ContainerName=caddy
Network=host
Volume=/opt/podman/caddy/Caddyfile:/etc/caddy/Caddyfile:ro
Volume=/opt/podman/caddy:/data
Pull=always

[Service]
Restart=always

[Install]
WantedBy=multi-user.target

启动

sudo systemctl daemon-reload sudo systemctl start frpnet-network.service frps.service caddy.service

验证 curl -I http://frp.example.com # 应 301 到 https curl -I https://frp.example.com curl -I https://frp.example.com:7500 podman logs –since=10m frps podman logs –since=10m caddy-frps