caddy2: alpine镜像,支持amd64;arm64v8;arm32v7,集成常用插件及geoipupdate
1.8K
自用Caddy2 Alpine镜像,支持amd64;arm64v8;arm32v7系统。在Caddy官方builder镜像添加常用插件,集成caddy-geo-ops插件实现GeoIP请求过滤与数据库统一管理(文件变更热重载+定时自动更新,配合P3TERX/GeoLite.mmdb镜像源无需注册账号)。
项目地址:https://github.com/DoTheBetter/docker/tree/master/caddy2
各插件用法详见插件地址,镜像自带部分插件配置使用示例Caddyfile.default
| 名称 | 插件地址 | 说明 |
|---|---|---|
| caddy-docker-proxy/plugin/v2 | https://github.com/lucaslorentz/caddy-docker-proxy | 该插件使 Caddy 能够通过标签用作 Docker 容器的反向代理,labels标签可与Caddyfile配置文件同时使用,Caddyfile配置文件修改后自动重载 |
| caddy-webdav | https://github.com/mholt/caddy-webdav | 提供webdav服务 |
| caddy-geo-ops | https://github.com/ubiuser/caddy-geo-ops | 根据geoip数据库过滤请求(国家/省份/ASN等),支持数据库文件变更热重载与auto_update定时更新,可通过{geo.*}占位符输出访客地理位置。使用示例详见Caddyfile.default |
| acmedns | https://github.com/caddy-dns/acmedns | 一个简化的DNS服务器,配备RESTful HTTP API,提供一种简单的方式来自动化ACME DNS-01 challenges |
| caddy-dns/alidns | https://github.com/caddy-dns/alidns | https证书签署dns认证 |
| caddy-dns/tencentcloud | https://github.com/caddy-dns/tencentcloud | https证书签署dns认证 |
| caddy-dns/huaweicloud | https://github.com/caddy-dns/huaweicloud | https证书签署dns认证 |
| caddy-dns/cloudflare | https://github.com/caddy-dns/cloudflare | https证书签署dns认证 |
| caddy-dns/godaddy | https://github.com/caddy-dns/godaddy | https证书签署dns认证 |
| caddy-dns/namecheap | https://github.com/caddy-dns/namecheap | https证书签署dns认证 |
| caddy-dns/namesilo | https://github.com/caddy-dns/namesilo | https证书签署dns认证 |
下面是可用于自定义安装的可用选项的完整列表。
| 变量名 | 是否必须 | 默认值 | 说明 |
|---|---|---|---|
TZ | 可选 | Asia/Shanghai | 设置时区 |
CADDY_DOCKER_LOG_LEVEL | 可选 | WARN | caddy-docker-proxy 模块日志等级:DEBUG、INFO、WARN、ERROR |
GEOIPUPDATE_AUTO | 可选 | false | GeoIP Update服务开关,true为开启:容器初始化阶段(Caddy启动前)自动初始下载数据库,未配置MaxMind凭证时按GEOIPUPDATE_FREQUENCY定时更新 |
GEOIPUPDATE_EDITION_IDS | 可选 | GeoLite2-Country | geoip数据库类型(多个用英文逗号分隔),可选值:GeoLite2-Country(国家)、GeoLite2-City(城市)、GeoLite2-ASN(ASN),对应Caddyfile占位符库名为geolite2-country/geolite2-city/geolite2-asn |
GEOIPUPDATE_DL_URL | 可选 | https://github.com/P3TERX/GeoLite.mmdb/releases/latest/download | geoip数据库下载地址,最终下载URL为<GEOIPUPDATE_DL_URL>/<库名>.mmdb;国内直连不畅时可替换为加速前缀,如https://gh-proxy.com/https://github.com/P3TERX/GeoLite.mmdb/releases/latest/download |
GEOIPUPDATE_FREQUENCY | 可选 | 72 | geoip数据库更新间隔(小时),注意不能为0。 |
GEOIPUPDATE_ACCOUNT_ID | 可选 | 无 | MaxMind账号ID,与GEOIPUPDATE_LICENSE_KEY同时配置并在Caddyfile中启用auto_update后,geoip数据库由caddy-geo-ops插件通过MaxMind官方协议自动更新(GeoIP Update服务完成数据库补齐后自动退出) |
GEOIPUPDATE_LICENSE_KEY | 可选 | 无 | MaxMind许可证密钥,作用同上 |
GEOFILTER_COUNTRIES | 可选 | CN | Geo过滤放行的国家码(多个用英文逗号分隔),init脚本据此自动生成/config/geofilter.caddy过滤片段(反向拒绝逻辑:@denied匹配器内联not geo_ops国家条件) |
GEOFILTER_WHITELIST | 可选 | 无 | Geo过滤放行的白名单IP/CIDR(多个用英文逗号分隔),即使访客国家码不在GEOFILTER_COUNTRIES放行列表内也予放行;为空则跳过白名单 |
注意:geoip数据库由caddy-geo-ops插件统一管理(文件变更热重载,配置示例详见Caddyfile.default)。开启
GEOIPUPDATE_AUTO=true后,首次启动若/data/GeoIP目录为空,会在容器初始化阶段(Caddy启动前)自动从P3TERX/GeoLite.mmdb镜像源下载GeoLite2免费初始库(无需注册账号),确保Caddy加载geoip数据库时库已就位(下载失败不阻塞启动,由GeoIP Update服务按周期重试补齐):
- 未配置MaxMind凭证:由GeoIP Update服务按
GEOIPUPDATE_FREQUENCY定时从镜像源更新;- 配置了
GEOIPUPDATE_ACCOUNT_ID/GEOIPUPDATE_LICENSE_KEY(MaxMind免费账号注册地址:https://www.maxmind.com/en/geolite2/signup ):在Caddyfile中启用auto_update及凭证配置后,由插件通过MaxMind官方协议自动更新(GeoIP Update服务完成数据库补齐后自动退出)。
Geo过滤片段:容器初始化阶段,init脚本会根据
GEOFILTER_COUNTRIES/GEOFILTER_WHITELIST自动生成/config/geofilter.caddy过滤逻辑(反向拒绝规则:@denied匹配器内联not geo_ops <国家码>与not remote_ip <白名单>条件,既非放行国家又非白名单的请求返回403,放行请求自然 fall through 到站点后续 handler;覆盖写入、每次重启重新生成)。站点无需手写过滤逻辑,在对应handle块内import /config/geofilter.caddy即可(示例见Caddyfile.default)。
| 范围 | 描述 |
|---|---|
80 | http端口 |
443 | https端口 |
443/udp | QUIC/HTTP3协议端口 |
2019 | Caddy2 API端口 (可选) |
下面的目录用于配置,并且可以映射为持久存储。
| 目录 | 描述 |
|---|---|
/config | 配置文件目录 |
/data | TLS 证书、私钥、GeoIP数据和其他必要信息存储目录 |
/var/run/docker.sock | 宿主机Docker守护进程默认监听的Unix域套接字(Unix domain socket) |
本镜像在 docker hub,ghcr.io 及 aliyuncs同步推送,docker hub 不能使用时可使用其他仓库
docker network create web
docker run -d \
--net web \
--name caddy2 \
--restart always \
--cap-add NET_ADMIN \
-e TZ=Asia/Shanghai \
-e GEOIPUPDATE_AUTO=true \
-p 8080:80 \
-p 4443:443 \
-p 4443:443/udp \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v /docker/caddy2/config:/config \
-v /docker/caddy2/data:/data \
dothebetter/caddy2:latest
#ghcr.io/dothebetter/caddy2:latest
#registry.cn-hangzhou.aliyuncs.com/dothebetter/caddy2:latest
version: '3'
services:
caddy2:
image: dothebetter/caddy2:latest
#ghcr.io/dothebetter/caddy2:latest
#registry.cn-hangzhou.aliyuncs.com/dothebetter/caddy2:latest
container_name: caddy2
restart: always
networks:
- web
cap_add:
- NET_ADMIN
environment:
- TZ=Asia/Shanghai
- GEOIPUPDATE_AUTO=true
ports:
- "8080:80"
- "4443:443"
- "4443:443/udp"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /docker/caddy2/config:/config
- /docker/caddy2/data:/data
networks:
web:
external: true
Content type
Image
Digest
sha256:94b435486…
Size
30.9 MB
Last updated
20 days ago
docker pull dothebetter/caddy2