自动化部署
将 Hugo 站点部署到 GitHub Pages、Netlify、Vercel、Cloudflare Pages 和自有服务器
自动化部署
Hugo 构建后的输出目录默认是 public/。部署的本质就是把 public/ 里的静态文件发布到托管平台。
推荐工作流:
本地写作
↓
git push
↓
托管平台拉取仓库
↓
安装 Hugo、Node、Go 等构建依赖
↓
hugo --gc --minify
↓
发布 public/
部署前检查
hugo --gc --minify
确认:
- 本地构建成功
baseURL是线上域名或部署平台提供的预览 URL- 线上 Hugo 版本与本地一致
- 主题 submodule 或 Hugo Modules 可以被 CI 拉取
public/不提交到源码仓库- 草稿、未来文章、测试内容不会进入正式构建
.gitignore:
/public/
/resources/
/.hugo_build.lock
固定 Hugo 版本
Hugo 版本变化可能影响模板函数、资源管道和主题兼容性。部署环境建议固定版本。
本文按 2026 年 6 月官方文档整理,Hugo GitHub Releases 当前最新稳定版为 0.163.0。
常见环境变量:
HUGO_VERSION=0.163.0
HUGO_ENVIRONMENT=production
TZ=Asia/Shanghai
如果主题需要 Dart Sass、PostCSS、Tailwind 或 Hugo Modules,还要配置对应版本和安装步骤。
GitHub Pages
GitHub Pages 推荐使用 GitHub Actions 构建和部署。先到仓库:
Settings -> Pages -> Source -> GitHub Actions
创建 .github/workflows/hugo.yaml:
name: Build and deploy Hugo
on:
push:
branches:
- main
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: pages
cancel-in-progress: false
jobs:
build:
runs-on: ubuntu-latest
env:
HUGO_VERSION: 0.163.0
HUGO_ENVIRONMENT: production
TZ: Asia/Shanghai
steps:
- name: Checkout
uses: actions/checkout@v6
with:
submodules: recursive
fetch-depth: 0
- name: Setup Pages
id: pages
uses: actions/configure-pages@v6
- name: Install Hugo
run: |
curl -sLJO "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz"
mkdir "${HOME}/hugo"
tar -C "${HOME}/hugo" -xf "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz"
echo "${HOME}/hugo" >> "${GITHUB_PATH}"
- name: Install Node dependencies
run: |
[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true
- name: Build
run: |
hugo --gc --minify --baseURL "${{ steps.pages.outputs.base_url }}/"
- name: Upload artifact
uses: actions/upload-pages-artifact@v5
with:
path: ./public
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy
id: deployment
uses: actions/deploy-pages@v5
如果你的站点使用 Hugo Modules,添加 Go:
- name: Setup Go
uses: actions/setup-go@v6
with:
go-version: '1.26.3'
如果使用 Dart Sass,需要在构建前安装 Dart Sass。Hugo 官方 GitHub Pages 文档提供了完整示例,可以按主题需求扩展。
Netlify
创建 netlify.toml:
[build.environment]
HUGO_VERSION = "0.163.0"
HUGO_ENVIRONMENT = "production"
NODE_VERSION = "24.16.0"
GO_VERSION = "1.26.3"
TZ = "Asia/Shanghai"
[build]
publish = "public"
command = "hugo --gc --minify --baseURL \"$URL\""
如果使用 npm 依赖:
[build]
publish = "public"
command = "npm ci && hugo --gc --minify --baseURL \"$URL\""
如果使用 Dart Sass,要先安装 Dart Sass,再执行 Hugo。可参考 Hugo 官方 Netlify 文档中的完整脚本。
Netlify 常见设置:
| 项目 | 值 |
|---|---|
| Build command | hugo --gc --minify |
| Publish directory | public |
| Hugo version | HUGO_VERSION=0.163.0 |
Vercel
Vercel 可以自动识别 Hugo 项目。导入 Git 仓库后,通常使用:
| 项目 | 值 |
|---|---|
| Framework Preset | Hugo |
| Build Command | hugo --gc --minify |
| Output Directory | public |
| Install Command | 按项目需要,常见为 npm ci |
建议在项目环境变量中设置:
HUGO_VERSION=0.163.0
HUGO_ENVIRONMENT=production
也可以创建 vercel.json:
{
"buildCommand": "hugo --gc --minify",
"outputDirectory": "public",
"installCommand": "npm ci || true"
}
如果使用 Git submodule,确认 Vercel 能拉取 submodule。公开主题通常没问题;私有主题需要配置访问权限。
Cloudflare Pages
Cloudflare Pages 设置:
| 项目 | 值 |
|---|---|
| Production branch | main |
| Build command | hugo --gc --minify |
| Build output directory | public |
环境变量:
HUGO_VERSION=0.163.0
HUGO_ENVIRONMENT=production
TZ=Asia/Shanghai
Cloudflare Pages 提供 CF_PAGES_URL,预览部署时可以用它作为 baseURL:
hugo --gc --minify --baseURL "$CF_PAGES_URL"
如果生产域名已固定,可以在生产环境使用真实域名,在预览环境使用 CF_PAGES_URL。
Cloudflare Workers Static Assets
Hugo 官方文档也提供了 Cloudflare Workers 静态资源部署方式。适合需要 Workers 能力的项目。
最小 wrangler.toml:
name = "my-hugo-site"
compatibility_date = "2026-06-10"
[assets]
directory = "./public"
not_found_handling = "404-page"
构建:
hugo --gc --minify
npx wrangler deploy
只需要静态站时,Cloudflare Pages 更简单;需要 Workers 路由、边缘逻辑或更复杂控制时,再考虑 Workers。
自有服务器
构建:
hugo --gc --minify
用 rsync 上传:
rsync -avz --delete public/ user@example.com:/var/www/example.org/
Nginx 示例:
server {
listen 80;
server_name example.org www.example.org;
root /var/www/example.org;
index index.html;
location / {
try_files $uri $uri/ =404;
}
location ~* \.(css|js|jpg|jpeg|png|gif|webp|svg|woff2?)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
HTTPS 建议使用 Caddy 自动证书,或 Nginx + Certbot。
baseURL 策略
baseURL 决定 canonical、RSS、Sitemap、绝对链接和部分资源地址。
生产站点:
baseURL = 'https://example.org/'
CI 临时覆盖:
hugo --baseURL https://example.org/
预览环境:
hugo --baseURL "$DEPLOY_PRIME_URL"
Netlify 常见变量:
URL生产站点 URLDEPLOY_PRIME_URL当前部署 URL
Cloudflare Pages 常见变量:
CF_PAGES_URL当前 Pages URL
私有主题和 submodule
如果主题使用 Git submodule:
git submodule update --init --recursive
CI checkout 要启用 submodule:
with:
submodules: recursive
私有主题要配置:
- GitHub Deploy Key
- Personal Access Token
- 平台提供的私有子模块访问设置
如果 submodule 经常让部署复杂,可以考虑 Hugo Modules 或把主题 fork 到同一组织。
部署常见问题
Q: 本地正常,线上构建失败
A: 优先检查 Hugo 版本、Extended 版本、Node/Go/Dart Sass 是否安装,以及主题 submodule 是否拉取。
Q: 线上样式丢失
A: 检查 baseURL、主题是否安装、资源路径是否写死为错误域名。
Q: 页面部署成功但 404
A: 检查输出目录是否是 public,仓库 Pages Source 是否设置为 GitHub Actions,平台发布目录是否填错。
Q: 新文章没有上线
A: 检查 draft: true、未来日期、构建日志和缓存。正式构建默认跳过草稿。
Q: 中文文件名或路径乱码
A: CI 中可以设置:
git config core.quotepath false
也建议文章 URL 使用英文 slug。
推荐部署方案
| 使用场景 | 推荐平台 |
|---|---|
| 纯博客、开源项目文档 | GitHub Pages |
| 希望配置简单、表单和重定向强 | Netlify |
| 需要预览部署和前端团队协作 | Vercel |
| 已使用 Cloudflare DNS/CDN | Cloudflare Pages |
| 需要完全控制服务器 | 自有服务器 |
下一步
继续阅读 故障排除,遇到构建或显示问题时按清单定位。
评论