1. 项目背景与核心价值
在当今的Web服务部署中,HTTPS早已成为标配而非可选功能。传统的证书申请和续期流程繁琐,尤其对于个人开发者和小型项目而言,手动管理证书既耗时又容易出错。我曾经维护过十几个需要HTTPS的服务,每次证书到期前都要手忙脚乱地处理续期,直到发现了Caddy这个神器。
Caddy的自动HTTPS功能彻底改变了游戏规则 - 它内置的ACME客户端可以自动从Let's Encrypt获取并续期证书,整个过程完全无需人工干预。而Docker Compose则是现代服务编排的事实标准,将两者结合能在单机环境下快速构建出生产级的安全Web服务。
这个方案特别适合:
- 个人开发者搭建博客/API服务
- 中小团队部署内部管理系统
- 需要快速验证的POC项目
- 任何需要HTTPS但不想操心证书管理的场景
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与工具选型
2.1 基础环境要求
在开始之前,确保你的服务器满足以下条件:
- 一台运行Linux的云服务器或本地机器(推荐Ubuntu 20.04+)
- 已安装Docker Engine 20.10.0+和Docker Compose 2.0.0+
- 一个已解析到服务器IP的域名(如example.com)
- 开放80和443端口(ACME验证必需)
注意:如果你在本地测试,可以使用类似ngrok的工具将本地端口暴露到公网域名,但生产环境强烈建议使用真实的云服务器和域名。
2.2 为什么选择Caddy?
相比Nginx/Apache,Caddy有几点独特优势:
- 自动HTTPS:内置ACME客户端,自动处理证书申请和续期
- 简洁配置:Caddyfile语法比Nginx配置简单得多
- 零依赖:单个二进制文件即可运行,无需额外安装模块
- HTTP/2和HTTP/3支持:开箱即用,无需复杂配置
2.3 Docker网络设计
我们将使用Docker的bridge网络模式,关键设计点包括:
- 为Caddy创建专用网络(如caddy-net)
- 后端服务(如WordPress)运行在独立容器中
- Caddy作为反向代理接入所有服务网络
- 通过标签(labels)实现动态服务发现
这种架构的优势在于:
- 各服务隔离性好,安全性高
- 新增服务只需添加网络连接,无需修改Caddy配置
- 证书管理完全集中在Caddy容器中
3. 核心配置实现
3.1 Docker Compose文件解析
以下是完整的docker-compose.yml示例:
yaml复制version: '3.7'
services:
caddy:
image: caddy:latest
restart: unless-stopped
ports:
