私有部署(Debian + 宝塔面板 + Nginx)
这篇文档面向自有服务器部署场景:服务器系统为 Debian 系 Linux,使用宝塔面板管理站点,并由 Nginx 提供静态文件服务。
ShokaX 是纯静态站点(SSG):部署的核心就是把构建产物 dist/ 放到服务器上,然后让 Nginx 指向该目录。
你会得到什么
Section titled “你会得到什么”- 一个可访问的博客域名(例如
https://blog.example.com/) - 文章、归档、分类等页面正常打开
- 搜索(Pagefind)可用(前提:构建时生成索引)
- 静态资源缓存策略正确(
/_astro/长缓存)
- Debian 10/11/12(或同系发行版)
- 已安装宝塔面板(BT)并启用 Nginx
- 已准备好域名并解析到服务器 IP
本地侧(推荐)
Section titled “本地侧(推荐)”推荐在本地完成构建,再上传 dist/ 到服务器(更稳定、也更快)。
- Bun 已安装
- 本地能运行
bun run build成功
第 1 种方式(推荐):本地构建 + 上传 dist
Section titled “第 1 种方式(推荐):本地构建 + 上传 dist”步骤 1:配置站点 URL(重要)
Section titled “步骤 1:配置站点 URL(重要)”请确保 astro.config.mjs 的 site 是你的线上域名(否则 sitemap / RSS / 永久链接等可能不正确):
export default defineConfig({ site: "https://blog.example.com", // ...});说明:本主题启用了
trailingSlash: "always",最终链接通常会以/结尾。
步骤 2:本地构建
Section titled “步骤 2:本地构建”在项目根目录执行构建:
bun installbun run build构建完成后会得到 dist/ 目录。
步骤 3:在宝塔创建站点
Section titled “步骤 3:在宝塔创建站点”- 进入宝塔面板 → 网站 → 添加站点
- 填写你的域名(例如
blog.example.com) - Web 服务器选择 Nginx
- 创建完成后,打开该站点的设置
TODO:补充宝塔“添加站点”界面截图
步骤 4:上传 dist 到站点目录
Section titled “步骤 4:上传 dist 到站点目录”在宝塔站点设置里找到站点根目录(通常类似:/www/wwwroot/blog.example.com/),将本地 dist/ 目录内的全部文件上传到该目录。
上传后的目录结构应类似:
/www/wwwroot/blog.example.com/ index.html pagefind/ _astro/ posts/ categories/ ...步骤 5:配置 Nginx(伪静态 / try_files)
Section titled “步骤 5:配置 Nginx(伪静态 / try_files)”在宝塔面板里:站点 → 设置 → 伪静态(或“配置文件”),为 Astro 静态站点添加基础规则:
location / { try_files $uri $uri/ =404;}这条规则会让 Nginx:
- 优先寻找实际文件(例如
/favicon.svg) - 如果是目录(例如
/posts/hello-world/),会自动读取目录下的index.html
步骤 6:配置 HTTPS
Section titled “步骤 6:配置 HTTPS”在宝塔面板:站点 → SSL:
- 申请证书(Let’s Encrypt 或上传已有证书)
- 开启 HTTPS
- 建议开启“强制 HTTPS”
TODO:补充宝塔 SSL 配置界面截图
推荐的缓存与安全响应头(可选,但建议)
Section titled “推荐的缓存与安全响应头(可选,但建议)”ShokaX 的静态资源位于 /_astro/,文件名通常包含 hash,适合长期缓存。
你可以在 Nginx 配置中添加:
# 1) /_astro 静态资源长期缓存location ^~ /_astro/ { add_header Cache-Control "public, max-age=31536000, immutable"; try_files $uri =404;}
# 2) 全站基础安全响应头add_header Content-Security-Policy "frame-ancestors 'none';" always;add_header X-Frame-Options "DENY" always;
# 如果你确认站点永远使用 HTTPS,可启用 HSTS# add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;第 2 种方式(可选):在服务器上构建
Section titled “第 2 种方式(可选):在服务器上构建”适用于你不方便在本地构建、希望“服务器拉代码→构建→发布”的流程。
- 服务器上安装 Bun / Git
- 拉取仓库
- 运行
bun install && bun run build - 将
dist/发布到站点目录(或直接让站点根目录指向仓库的dist/)
TODO:补充“Debian 安装 Bun”的可靠步骤与参考链接(以官方文档为准)。
更新站点(发布新文章/改配置)
Section titled “更新站点(发布新文章/改配置)”方式 A:本地构建后上传(推荐)
Section titled “方式 A:本地构建后上传(推荐)”- 本地修改内容
bun run build- 上传新的
dist/覆盖服务器站点目录
方式 B:服务器构建
Section titled “方式 B:服务器构建”- 服务器
git pull bun install(依赖有变化时)bun run build- 若站点根目录不是
dist/,将新的dist/同步到站点目录
TODO:补充一个“用宝塔计划任务定时拉取并构建”的示例(可选)。
Q1:部署后页面 404 / 样式丢失?
Section titled “Q1:部署后页面 404 / 样式丢失?”请依次检查:
- 站点根目录是否直接包含
index.html(而不是多了一层dist/) - Nginx 是否配置了
try_files $uri $uri/ =404; - 构建是否成功(本地或服务器
bun run build是否无报错)
Q2:搜索不可用?
Section titled “Q2:搜索不可用?”通常原因是:没有生成 Pagefind 索引或未上传 pagefind/ 目录。
检查:
- 你是否执行的是
bun run build(而不是只执行astro build) - 站点根目录是否存在
pagefind/
Q3:HTTPS 开启后出现混合内容(Mixed Content)?
Section titled “Q3:HTTPS 开启后出现混合内容(Mixed Content)?”确保:
astro.config.mjs的site是https://...- 第三方资源(图片/脚本)也尽量使用 HTTPS
Q4:缓存导致更新不生效?
Section titled “Q4:缓存导致更新不生效?”/_astro/资源通常带 hash,长期缓存不会影响更新- 如果你更换了同名文件(例如
/favicon.svg),可能需要清理浏览器缓存或 CDN 缓存
TODO:补充宝塔/Nginx 清理缓存的常用方式(如涉及 CDN)。
- Astro 部署指南(通用):https://docs.astro.build/en/guides/deploy/
- 宝塔面板官方文档:TODO
津公网安备 12011402001353 号