使用 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 会自动提供最新的静态站点,无需手动重启或干预。