部署相关配置
Hugo 的部署配置系统为现代化的持续集成和部署工作流提供了完整支持。通过合理配置部署目标、构建优化和部署策略,您可以实现高效、可靠的自动化部署流程。
部署目标配置
Hugo 内置了多种部署目标支持,包括云存储、CDN 和静态托管服务。
基础部署配置
# config/_default/hugo.toml
[deployment]
# 部署顺序和重试配置
order = [".jpg$", ".gif$"] # 优先上传图片文件
maxDeletes = 256 # 最大删除文件数
# 全局部署配置
[[deployment.targets]]
name = "production"
URL = "s3://my-bucket?region=us-east-1"
# 可选的配置参数
cloudFrontDistributionID = "E1234567890123"
多环境部署配置
# 生产环境部署
[[deployment.targets]]
name = "production"
URL = "s3://myblog-prod?region=us-east-1"
cloudFrontDistributionID = "E1234567890123"
# 测试环境部署
[[deployment.targets]]
name = "staging"
URL = "s3://myblog-staging?region=us-east-1"
cloudFrontDistributionID = "E9876543210987"
# 开发环境部署
[[deployment.targets]]
name = "development"
URL = "s3://myblog-dev?region=us-east-1"
部署匹配器配置
通过匹配器可以为不同类型的文件设置不同的缓存策略:
[deployment]
# CSS 和 JS 文件 - 长期缓存
[[deployment.matchers]]
pattern = "^.+\\.(js|css|svg|ttf|woff|woff2)$"
cacheControl = "max-age=31536000, no-transform, public"
gzip = true
contentEncoding = "gzip"
# 图片文件 - 长期缓存,不压缩
[[deployment.matchers]]
pattern = "^.+\\.(png|jpg|jpeg|gif|ico|webp)$"
cacheControl = "max-age=31536000, no-transform, public"
gzip = false
# HTML 文件 - 短期缓存
[[deployment.matchers]]
pattern = "^.+\\.(html|xml|json)$"
cacheControl = "max-age=3600, public"
gzip = true
# 特殊文件处理
[[deployment.matchers]]
pattern = "^sitemap\\.xml$"
cacheControl = "max-age=86400, public"
contentType = "application/xml"
[[deployment.matchers]]
pattern = "^robots\\.txt$"
cacheControl = "max-age=86400, public"
contentType = "text/plain"
高级部署配置
[deployment]
# 文件上传顺序
order = [
".jpg$", ".jpeg$", ".png$", ".gif$", # 首先上传图片
".css$", ".js$", # 然后上传静态资源
".html$" # 最后上传 HTML
]
# 安全配置
maxDeletes = 100 # 限制单次删除文件数量
# 并发配置
workers = 10 # 并发上传线程数
# 部署目标配置
[[deployment.targets]]
name = "production"
URL = "s3://myblog-prod?region=us-east-1"
# AWS 特定配置
cloudFrontDistributionID = "E1234567890123"
acl = "public-read"
storageClass = "STANDARD"
# 认证配置(通过环境变量)
# AWS_ACCESS_KEY_ID
# AWS_SECRET_ACCESS_KEY
构建优化配置
构建优化配置可以显著提升站点的构建速度和运行性能。
基础构建优化
# config/_default/hugo.toml
# 构建统计
[buildStats]
enable = true
disableClasses = false
disableIDs = false
disableTags = false
# 构建缓存
[build]
useResourceCacheWhen = "fallback"
writeStats = true
# 缓存清除器
[[cachebusters]]
source = "assets/watching/hugo_stats\\.json"
target = "styles\\.css"
[[cachebusters]]
source = "(postcss|tailwind)\\.config\\.js"
target = "css"
[[cachebusters]]
source = "assets/.*\\.(scss|sass)$"
target = "css"
资源处理优化
# 资源处理配置
[build]
# 资源缓存策略
useResourceCacheWhen = "fallback"
# 构建输出统计
writeStats = true
# PostCSS 处理配置
[build.buildStats]
enable = true
# 资源管道配置
[[build.resourceHints]]
rel = "preconnect"
href = "https://fonts.googleapis.com"
[[build.resourceHints]]
rel = "dns-prefetch"
href = "https://www.google-analytics.com"
代码分割与压缩
# 代码处理配置
[minify]
# HTML 压缩
[minify.tdewolff.html]
keepComments = false
keepConditionalComments = true
keepDefaultAttrVals = true
keepDocumentTags = true
keepEndTags = true
keepQuotes = false
keepWhitespace = false
# CSS 压缩
[minify.tdewolff.css]
keepCSS2 = true
precision = 0
# JS 压缩
[minify.tdewolff.js]
keepVarNames = false
precision = 0
# JSON 压缩
[minify.tdewolff.json]
precision = 0
keepNumbers = false
# SVG 压缩
[minify.tdewolff.svg]
precision = 0
# XML 压缩
[minify.tdewolff.xml]
keepWhitespace = false
CI/CD 集成配置
GitHub Actions 配置
# .github/workflows/deploy.yml
name: Build and Deploy Hugo Site
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
HUGO_VERSION: 0.125.0
jobs:
build:
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: ${{ env.HUGO_VERSION }}
extended: true
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build site
run: hugo --minify --environment production
- name: Deploy to S3
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
HUGO_DEPLOY_TARGET: production
run: hugo deploy --target production --confirm
- name: Invalidate CloudFront
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run: |
aws cloudfront create-invalidation \
--distribution-id ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }} \
--paths "/*"
GitLab CI 配置
# .gitlab-ci.yml
image: registry.gitlab.com/pages/hugo/hugo:latest
variables:
HUGO_ENV: production
HUGO_VERSION: "0.125.0"
before_script:
- apk add --update --no-cache git
- git submodule sync --recursive
- git submodule update --init --recursive
test:
stage: test
script:
- hugo config
- hugo --environment staging --destination test/
artifacts:
paths:
- test/
except:
- main
pages:
stage: deploy
script:
- hugo --minify --environment production
artifacts:
paths:
- public
only:
- main
deploy_s3:
stage: deploy
script:
- hugo deploy --target production --confirm
environment:
name: production
url: https://myblog.com
only:
- main
Docker 构建配置
# Dockerfile
FROM klakegg/hugo:0.125.0-ext-alpine AS builder
WORKDIR /src
COPY . .
# 安装依赖
RUN npm ci
# 构建站点
RUN hugo --minify --environment production
# 生产镜像
FROM nginx:alpine
# 复制构建产物
COPY --from=builder /src/public /usr/share/nginx/html
# 复制 Nginx 配置
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
# docker-compose.yml
version: '3.8'
services:
hugo-build:
build:
context: .
dockerfile: Dockerfile
environment:
- HUGO_ENVIRONMENT=production
- HUGO_BASEURL=https://myblog.com
volumes:
- ./public:/src/public
hugo-dev:
image: klakegg/hugo:0.125.0-ext-alpine
command: server --bind 0.0.0.0 --buildDrafts --buildFuture
volumes:
- .:/src
ports:
- "1313:1313"
environment:
- HUGO_ENVIRONMENT=development
多环境部署策略
环境特定配置
# config/staging/hugo.toml
baseURL = "https://staging.myblog.com"
environment = "staging"
[deployment]
[[deployment.targets]]
name = "staging"
URL = "s3://myblog-staging?region=us-east-1"
[params]
enableAnalytics = false
enableComments = false
robotsNoIndex = true # 防止搜索引擎索引测试环境
# config/production/hugo.toml
baseURL = "https://myblog.com"
environment = "production"
[deployment]
[[deployment.targets]]
name = "production"
URL = "s3://myblog-prod?region=us-east-1"
cloudFrontDistributionID = "E1234567890123"
[params]
enableAnalytics = true
enableComments = true
robotsNoIndex = false
部署脚本配置
#!/bin/bash
# scripts/deploy.sh
set -euo pipefail
ENVIRONMENT=${1:-staging}
DRY_RUN=${2:-false}
echo "部署到 $ENVIRONMENT 环境..."
# 环境验证
case $ENVIRONMENT in
staging|production)
echo "部署环境: $ENVIRONMENT"
;;
*)
echo "错误: 不支持的环境 '$ENVIRONMENT'"
echo "支持的环境: staging, production"
exit 1
;;
esac
# 构建站点
echo "构建站点..."
hugo --environment "$ENVIRONMENT" --minify
# 部署前检查
echo "部署前检查..."
if [ ! -d "public" ]; then
echo "错误: public 目录不存在"
exit 1
fi
# 执行部署
if [ "$DRY_RUN" = "true" ]; then
echo "执行试运行部署..."
hugo deploy --target "$ENVIRONMENT" --dryRun
else
echo "执行实际部署..."
hugo deploy --target "$ENVIRONMENT" --confirm
fi
echo "部署完成!"
性能监控与优化
构建性能监控
# config/_default/hugo.toml
[build]
# 启用构建统计
writeStats = true
# 构建报告配置
[buildStats]
enable = true
disableClasses = false
disableIDs = false
disableTags = false
# 性能分析
[params.performance]
enableBuildTimer = true
enableMemoryStats = true
enableFileStats = true
部署性能优化
#!/bin/bash
# scripts/optimize-deploy.sh
echo "优化部署性能..."
# 并行处理
export HUGO_NUMWORKERMULTIPLIER=2
# 内存限制
export HUGO_MEMORYLIMIT=1G
# 启用缓存
hugo --enableGitInfo --gc
# 构建优化
hugo --minify --environment production
# 压缩文件
find public -name "*.html" -exec gzip -k {} \;
find public -name "*.css" -exec gzip -k {} \;
find public -name "*.js" -exec gzip -k {} \;
echo "优化完成!"
部署验证与回滚
部署验证脚本
#!/bin/bash
# scripts/verify-deployment.sh
SITE_URL=${1:-https://myblog.com}
echo "验证部署: $SITE_URL"
# 检查网站可访问性
if curl -f -s "$SITE_URL" > /dev/null; then
echo "✓ 网站可访问"
else
echo "✗ 网站不可访问"
exit 1
fi
# 检查关键页面
PAGES=("/" "/posts/" "/about/" "/sitemap.xml" "/robots.txt")
for page in "${PAGES[@]}"; do
if curl -f -s "$SITE_URL$page" > /dev/null; then
echo "✓ $page 可访问"
else
echo "✗ $page 不可访问"
exit 1
fi
done
# 检查 RSS 订阅
if curl -f -s "$SITE_URL/index.xml" | grep -q "rss"; then
echo "✓ RSS 订阅正常"
else
echo "✗ RSS 订阅异常"
fi
echo "部署验证通过!"
自动回滚配置
#!/bin/bash
# scripts/rollback.sh
BACKUP_DIR="backups/$(date +%Y%m%d_%H%M%S)"
CURRENT_DIR="public"
echo "执行回滚操作..."
# 创建当前版本备份
if [ -d "$CURRENT_DIR" ]; then
mkdir -p "backups"
cp -r "$CURRENT_DIR" "$BACKUP_DIR"
echo "当前版本已备份到: $BACKUP_DIR"
fi
# 恢复上一个版本
LAST_BACKUP=$(ls -t backups/ | head -n 2 | tail -n 1)
if [ -n "$LAST_BACKUP" ]; then
rm -rf "$CURRENT_DIR"
cp -r "backups/$LAST_BACKUP" "$CURRENT_DIR"
echo "已回滚到版本: $LAST_BACKUP"
# 重新部署
hugo deploy --target production --confirm
echo "回滚部署完成!"
else
echo "错误: 没有找到可回滚的版本"
exit 1
fi
最佳实践
多环境策略:
- 维护独立的测试和生产环境
- 使用环境特定的配置文件
- 在生产部署前先部署到测试环境
部署安全:
- 使用最小权限的部署凭证
- 定期轮换部署密钥
- 启用部署日志和审计
性能优化:
- 合理配置缓存策略
- 启用文件压缩和优化
- 使用 CDN 加速内容分发
监控与维护:
- 实施部署后验证
- 建立回滚机制
- 监控网站性能和可用性
自动化流程:
- 使用 CI/CD 自动化部署
- 集成测试和部署验证
- 建立完整的部署流水线
通过合理配置部署相关选项,您可以建立起高效、可靠的 Hugo 站点部署体系。