your-domain.com
,并将其 A记录 指向你的服务器 IP 地址。bash展开代码nslookup your-domain.com
在你的 Linux 服务器上执行以下命令来创建项目目录:
bash展开代码mkdir -p ~/vanblog-production
cd ~/vanblog-production
mkdir caddy-proxy
在 ~/vanblog-production/caddy-proxy/
目录下创建 Caddyfile
文件,内容如下:
bash展开代码nano ~/vanblog-production/caddy-proxy/Caddyfile
将以下内容粘贴到文件中,并将 your-domain.com
和 your-email@example.com
替换为你的实际域名和邮箱地址:
展开代码# 全局配置:设置邮箱用于 Let's Encrypt 证书申请 { email your-email@example.com acme_ca https://acme-v02.api.letsencrypt.org/directory # 使用 Let's Encrypt 生产环境 } # 主站配置:使用你的域名自动申请 Let's Encrypt 证书 your-domain.com { reverse_proxy vanblog:80 encode gzip # 启用 Gzip 压缩 header { Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" # HSTS X-Frame-Options "SAMEORIGIN" # 防止点击劫持 X-XSS-Protection "1; mode=block" # 防止 XSS X-Content-Type-Options "nosniff" # 防止 MIME 类型嗅探 } } # 可选:www 重定向到主域名 www.your-domain.com { redir https://your-domain.com{uri} permanent } # HTTP 重定向到 HTTPS :80 { redir https://{host}{uri} permanent }
保存并退出编辑器(在 nano
中按 Ctrl+X
,然后按 Y
,再按 Enter
)。
在 ~/vanblog-production
目录下创建 docker-compose.yml
文件,内容如下:
bash展开代码nano ~/vanblog-production/docker-compose.yml
将以下内容粘贴到文件中:
yaml展开代码networks:
vanblog-network:
driver: bridge
services:
vanblog:
image: kevinchina/deeplearning:vanblog-latest
restart: always
environment:
TZ: 'Asia/Shanghai'
EMAIL: 'your-email@example.com'
NODE_ENV: 'production'
VAN_BLOG_VERSION: 'v1.0.0'
volumes:
- ${PWD}/data/static:/app/static
- ${PWD}/log:/var/log
- ${PWD}/caddy/config:/root/.config/caddy
- ${PWD}/caddy/data:/root/.local/share/caddy
- ${PWD}/aliyunpan/config:/root/.config/aliyunpan
networks:
- vanblog-network
depends_on:
- mongo
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80"]
interval: 30s
timeout: 10s
retries: 3
caddy-proxy:
image: caddy:latest
restart: always
ports:
- "443:443"
- "80:80"
volumes:
- ${PWD}/caddy-proxy/Caddyfile:/etc/caddy/Caddyfile
- ${PWD}/caddy-proxy/data:/data
- ${PWD}/caddy-proxy/config:/config
networks:
- vanblog-network
environment:
TZ: 'Asia/Shanghai'
depends_on:
- vanblog
mongo:
image: mongo:latest
restart: always
environment:
TZ: 'Asia/Shanghai'
volumes:
- ${PWD}/data/mongo:/data/db
networks:
- vanblog-network
healthcheck:
test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet
interval: 30s
timeout: 10s
retries: 3
保存并退出编辑器。
在启动前,确保替换以下内容:
your-domain.com
替换为你自己的域名。your-email@example.com
替换为你的邮箱地址(用于申请 Let's Encrypt 证书)。执行以下命令来检查 Docker Compose 配置文件的语法:
bash展开代码docker compose config
然后启动所有服务:
bash展开代码docker compose up -d
检查服务状态:
bash展开代码docker compose ps
查看 Caddy 的日志,观察证书申请过程:
bash展开代码docker compose logs -f caddy-proxy
查看 VanBlog 的日志:
bash展开代码docker compose logs -f vanblog
http://your-domain.com
,它应该自动重定向到 https://your-domain.com
。https://your-domain.com
,你应该看到 VanBlog 界面。关于 version
字段的警告
swift展开代码WARN[0000] /home/yanc/vanblog-production/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
这个警告是因为 Docker Compose v2 版本开始不再使用 version
字段来指定版本号。所以,你可以从 docker-compose.yml
文件中删除 version
字段。
解决方法:
从 docker-compose.yml
中删除 version: '3.8'
字段。修改后的文件开头应该是这样:
yaml展开代码networks:
vanblog-network:
driver: bridge
出现的错误信息表明 Docker 尝试将 /home/yanc/vanblog-production/caddy-proxy/caddy-proxy/Caddyfile
这个文件挂载到容器内的 /etc/caddy/Caddyfile
,但是系统无法创建挂载点,原因是目标路径 /etc/caddy/Caddyfile
不是一个目录。这通常是因为 Docker 在挂载路径时遇到的目录与文件的冲突。
错误分析:
错误信息的关键部分是:
swift展开代码error mounting "/home/yanc/vanblog-production/caddy-proxy/caddy-proxy/Caddyfile" to rootfs at "/etc/caddy/Caddyfile": create mountpoint for /etc/caddy/Caddyfile mount: cannot create subdirectories in "/var/lib/docker/overlay2/d0b469377da051a129dca9971e291e7246a719be33368b66e76b6e43f300a180/merged/etc/caddy/Caddyfile": not a directory: unknown
说明 Docker 尝试将文件挂载到 /etc/caddy/Caddyfile
,但出现了路径问题,可能是因为目标路径不是文件夹。
解决方法:
检查路径:首先确认 Caddyfile
在宿主机上的路径是否正确。确认你没有意外创建了一个文件夹层级为 caddy-proxy/caddy-proxy
,这可能导致路径错误。
你可以通过以下命令检查 Caddyfile
的路径:
bash展开代码ls -l /home/yanc/vanblog-production/caddy-proxy/caddy-proxy/Caddyfile
确保它是一个文件,而不是目录。
修改 docker-compose.yml
中的挂载路径:
如果路径是正确的,请确保 docker-compose.yml
文件中 caddy-proxy
服务的 volumes
配置正确,特别是对 Caddyfile
文件的挂载。你可能在 docker-compose.yml
中错误地引用了目录,而不是文件。
修改如下:
yaml展开代码volumes:
- /home/yanc/vanblog-production/caddy-proxy/Caddyfile:/etc/caddy/Caddyfile
确保宿主机的路径 /home/yanc/vanblog-production/caddy-proxy/Caddyfile
是文件,而不是目录。
确认正确的文件路径:
~/vanblog-production/caddy-proxy/
目录下创建了 Caddyfile
文件。你可以在正确的目录中创建文件,如下所示:bash展开代码nano /home/yanc/vanblog-production/caddy-proxy/Caddyfile
创建完成后,再次检查文件是否存在:
bash展开代码ls -l /home/yanc/vanblog-production/caddy-proxy/Caddyfile
你应该看到类似如下的输出:
bash展开代码-rw-r--r-- 1 yanc yanc 1234 Jun 18 10:00 /home/yanc/vanblog-production/caddy-proxy/Caddyfile
文件和配置都无误后,重新启动 Docker Compose 服务:
bash展开代码docker compose down docker compose up -d
本文作者:冬月
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!