使用 Docker 和 Pelican 自动化生成与托管静态网站脚本
Page content
使用 Docker 和 Pelican 自动化生成与托管静态网站脚本。
1.pelican 服务:
用于监控 content 目录中 .md 和 .rst 文件的变化,并自动运行 Pelican 构建静态文件。 PIP_INDEX_URL 设置了 pip 的镜像源为清华大学镜像,避免因网络问题导致安装缓慢。 通过 command 实现:安装依赖。 使用 watchmedo 监控文件变化并重新生成静态站点。
2.caddy 服务:
托管 Pelican 生成的静态站点内容。 使用挂载的 Caddyfile 配置托管细节,可以根据需要支持 HTTP 和 HTTPS。
依赖关系: depends_on 确保 caddy 服务先启动,因为 pelican 生成的文件需要被 Caddy 托管。 挂载的目录: my_pelican_project:主机上的 Pelican 项目根目录。 output:Pelican 生成的静态文件,将被挂载到 Caddy 的 /srv 目录中。 Caddyfile:Caddy 的配置文件,用于定义静态文件的服务规则。
如果构建未触发或日志为空,可以通过 docker logs 检查容器日志:
docker logs -f pelican-builder
3. 启动服务:
#后台运行服务
docker-compose up -d
#停止服务,停止并移除所有相关容器
docker-compose down
4. 实时监控日志和查看日志:
tail -f my_pelican_project/build.log # 实时监控日志
cat my_pelican_project/build.log # 查看日志
5. docker-compose.yml
经测试,虽然pelican --autoreload
命令可以实现实时监控文件变化并重新生成静态站点,但是在使用 docker-compose 时,需要使用 watchmedo 命令来监控文件变化并执行命令。
services:
pelican: # Pelican 服务,用于生成静态站点
image: python:3.12-slim # 使用轻量级的 Python 3.12 镜像
container_name: pelican-builder # 设置容器的名称为 pelican-builder
working_dir: /app # 指定容器内的工作目录
volumes:
- /vol1/1000/my_programme/docker_pelican_caddy/ranvane_pelican_blog:/app # 将本地项目目录挂载到容器内的 /app 目录
environment:
- PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple # 使用清华大学的 pip 镜像源
# 容器启动时执行的命令:
# 从新的相对路径读取 requirements.txt 安装依赖
# 初始化Pelican 构建
# 监控文件变化并执行命令
# 监控文件模式:.rst 和.md 文件,递归监控所有子目录
# 文件变化时运行 Pelican 构建,并将日志重定向到 /app/pelican_build.log
command: >
sh -c "echo 'pip install .... ' &&
pip install --root-user-action=ignore -r requirements.txt &&
pip install --root-user-action=ignore watchdog[watchmedo] &&
echo 'Init.... Pelican build' &&
pelican content -o output -s pelicanconf.py &&
echo 'watch and rebulid....' &&
watchmedo shell-command \
--patterns='*.rst;*.md;*.MD' \
--recursive \
--command='pelican content -o output -s pelicanconf.py' > /app/pelican_build.log 2>&1"
depends_on:
- caddy # 设置服务依赖关系,确保 caddy 服务在 pelican 服务之前启动
caddy: # Caddy 服务,用于托管静态站点
image: caddy:latest # 使用最新版本的 Caddy 镜像
container_name: caddy-server # 设置容器的名称为 caddy-server
ports:
- "80:80" # 将主机的 80 端口映射到容器的 80 端口(HTTP 服务)
- "443:443" # 将主机的 443 端口映射到容器的 443 端口(HTTPS 服务)
volumes:
- ./my_pelican_project/output:/srv # 将 Pelican 生成的静态文件挂载到容器的 /srv 目录
- ./Caddyfile:/etc/caddy/Caddyfile # 将本地的 Caddy 配置文件挂载到容器的 /etc/caddy/Caddyfile
6.Caddyfile:
# 使用默认的 80 和 443 端口
:80 {
root * /srv # 设置静态文件的根目录,匹配 Docker 中挂载的 /srv
file_server # 启用文件服务器功能
try_files {path} {path}.html #Caddy 在找不到目录时尝试加载相应的 .html 文件
# 如果需要支持 HTTPS,启用以下注释并配置域名和证书:
# tls [email protected] # 使用 Let's Encrypt 自动获取证书
}
# 示例:如果你有自定义域名
example.com {
root * /srv
file_server
try_files {path} {path}.html #Caddy 在找不到目录时尝试加载相应的 .html 文件
# 自动获取和管理 HTTPS 证书
tls [email protected]
}
7.pelicanconf.py 配置:
调整 Pelican 的 URL 生成规则,以确保生成的 URL 与 Caddy 的配置相匹配。
ARTICLE_URL = "{category}/{slug}.html"
ARTICLE_SAVE_AS = "{category}/{slug}.html"
PAGE_URL = '{slug}.html'
PAGE_SAVE_AS = '{slug}.html'
这样配置后,pelican 会根据文件变化实时更新内容,而 caddy 会自动提供最新的静态站点,无需手动重启或干预。