




























今天经过了一些尝试,我终于是把博客从 Cloudflare Pages 迁移到了自己的服务器上,整个过程对访客应该是无感的,无缝切换?Who Knows?
不是必要的准备工作:
将 GitHub 存储库作为备份,另外给博客源代码添加一个远程存储库 URL
检查一下
嗯,现在一次 Git Push 会同时推送到 GitHub 和自己的 Gitea 存储库,这样就好了。
整个 Workflow 比较简单暴力,缺乏安全和性能上的考虑,后面碰到具体问题再补充吧。进入 Hugo 根目录添加 .woodpecker/hugo-build-site.yml,大概如下:
when:
event:
- push
branch:
- master
steps:
- name: build hugo site
image: hugomods/hugo:dart-sass-git-0.155.1
volumes:
- /tmp/hugo_cache:/tmp/hugo_cache
- /var/www:/var/www
commands:
- rm -rf /var/www/yourblog/html/*
- hugo --minify -d /var/www/yourblog/html
- name: site deploy
image: alpine:3.20
commands:
- echo "site build success,update path /var/www/yourblog/html"
- name: purge-cdn
image: curlimages/curl:8.18.0
environment:
CF_PURGE_CACHE_API_TOKEN:
from_secret: CF_PURGE_CACHE_API_TOKEN
CF_ZONE_ID:
from_secret: CF_ZONE_ID
commands:
- echo "purge Cloudflare CDN cache for blog ..."
- |
curl -sS "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/purge_cache" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $CF_PURGE_CACHE_API_TOKEN" \
-d '{"hosts":["blog.your.domain"]}'
开头的 when 定义执行条件,即:当存储库有 push 到 master 分支时,开始执行。steps 里描述具体执行哪些步骤:
添加一个 Nginx 虚拟主机配置,用于直接提供静态网页服务
server {
listen 80;
listen [::]:80;
server_name blog.your.domain;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name blog.your.domain;
ssl_certificate /path/to/cert/blog.your.domain.pem;
ssl_certificate_key /path/to/cert/blog.your.domain.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ecdh_curve X25519:P-256:P-384;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE+AES128:RSA+AES128:ECDHE+AES256:RSA+AES256';
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
access_log /var/log/nginx/blog.your.domain.access.log;
error_log /var/log/nginx/blog.your.domain.error.log;
root /var/www/blog.your.domain/html;
index index.html;
error_page 404 /404.html;
proxy_set_header X-Forwarded-For $realip_remote_addr;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
gzip on;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_min_length 256;
gzip_proxied any;
gzip_types text/plain text/css text/javascript application/javascript application/json application/xml application/rss+xml application/wasm;
gzip_vary on;
location = /404.html {
internal;
}
location ~* \.html$ {
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
add_header Cache-Control "no-cache, no-store, must-revalidate";
}
location ~* \.(?:ico|css|js|gif|jpe?g|png|webp|woff2?|ttf|svg|eot|mp4|webm)$ {
access_log off;
}
location / {
try_files $uri $uri/ =404;
}
}
需要注意的是,上面没有添加任何 Nginx 缓存配置,实际上应当需要设置合理的缓存。但我对此还不是很了解,暂时就用 CDN 自定义缓存规则替代吧。
如果需要第三步,需要在 Cloudflare 创建一个最小权限的 API Token

设置自定义令牌的权限,如果可以请尽可能加上服务器的 IP 作为客户端限制

复制博客使用域名的区域 ID

上面会获取两个机密
CF_PURGE_CACHE_API_TOKENCF_ZONE_ID在 Woodpecker 仪表盘添加博客存储库,在该存储库设置里添加上面两个 Secret,应该给 Push 作用域就够用了

设置信任卷挂载

在 Woodpecker 容器的 Compose 模板,添加构建的静态网站输出目录
woodpecker-agent:
image: woodpeckerci/woodpecker-agent:v3
container_name: woodpecker-agent
restart: unless-stopped
# ...
# only for woodpecker-agent
# ...
volumes:
# ...
# add this(for example)
- /var/www:/var/www
# ...
然后更新容器
sudo docker compose up -d
尝试推送一次博客更新,构建速度非常快!

总之,这是一次成功的尝试,过程还算顺利(也就失败了十几次而已😅)。访问速度不一定比 Cloudflare Pages 更好,但是好在再也没有构建次数限制了。
参考资料:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。