跳转到内容

私有部署(Debian + 宝塔面板 + Nginx)

这篇文档面向自有服务器部署场景:服务器系统为 Debian 系 Linux,使用宝塔面板管理站点,并由 Nginx 提供静态文件服务。

ShokaX 是纯静态站点(SSG):部署的核心就是把构建产物 dist/ 放到服务器上,然后让 Nginx 指向该目录。

  • 一个可访问的博客域名(例如 https://blog.example.com/
  • 文章、归档、分类等页面正常打开
  • 搜索(Pagefind)可用(前提:构建时生成索引)
  • 静态资源缓存策略正确(/_astro/ 长缓存)
  • Debian 10/11/12(或同系发行版)
  • 已安装宝塔面板(BT)并启用 Nginx
  • 已准备好域名并解析到服务器 IP

推荐在本地完成构建,再上传 dist/ 到服务器(更稳定、也更快)。

  • Bun 已安装
  • 本地能运行 bun run build 成功

第 1 种方式(推荐):本地构建 + 上传 dist

Section titled “第 1 种方式(推荐):本地构建 + 上传 dist”

请确保 astro.config.mjssite 是你的线上域名(否则 sitemap / RSS / 永久链接等可能不正确):

astro.config.mjs
export default defineConfig({
site: "https://blog.example.com",
// ...
});

说明:本主题启用了 trailingSlash: "always",最终链接通常会以 / 结尾。

在项目根目录执行构建:

Terminal window
bun install
bun run build

构建完成后会得到 dist/ 目录。

  1. 进入宝塔面板 → 网站添加站点
  2. 填写你的域名(例如 blog.example.com
  3. Web 服务器选择 Nginx
  4. 创建完成后,打开该站点的设置

TODO:补充宝塔“添加站点”界面截图

在宝塔站点设置里找到站点根目录(通常类似:/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

在宝塔面板:站点 → SSL

  1. 申请证书(Let’s Encrypt 或上传已有证书)
  2. 开启 HTTPS
  3. 建议开启“强制 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 种方式(可选):在服务器上构建”

适用于你不方便在本地构建、希望“服务器拉代码→构建→发布”的流程。

  1. 服务器上安装 Bun / Git
  2. 拉取仓库
  3. 运行 bun install && bun run build
  4. dist/ 发布到站点目录(或直接让站点根目录指向仓库的 dist/

TODO:补充“Debian 安装 Bun”的可靠步骤与参考链接(以官方文档为准)。

更新站点(发布新文章/改配置)

Section titled “更新站点(发布新文章/改配置)”

方式 A:本地构建后上传(推荐)

Section titled “方式 A:本地构建后上传(推荐)”
  1. 本地修改内容
  2. bun run build
  3. 上传新的 dist/ 覆盖服务器站点目录
  1. 服务器 git pull
  2. bun install(依赖有变化时)
  3. bun run build
  4. 若站点根目录不是 dist/,将新的 dist/ 同步到站点目录

TODO:补充一个“用宝塔计划任务定时拉取并构建”的示例(可选)。

Q1:部署后页面 404 / 样式丢失?

Section titled “Q1:部署后页面 404 / 样式丢失?”

请依次检查:

  1. 站点根目录是否直接包含 index.html(而不是多了一层 dist/
  2. Nginx 是否配置了 try_files $uri $uri/ =404;
  3. 构建是否成功(本地或服务器 bun run build 是否无报错)

通常原因是:没有生成 Pagefind 索引或未上传 pagefind/ 目录。

检查:

  • 你是否执行的是 bun run build(而不是只执行 astro build
  • 站点根目录是否存在 pagefind/

Q3:HTTPS 开启后出现混合内容(Mixed Content)?

Section titled “Q3:HTTPS 开启后出现混合内容(Mixed Content)?”

确保:

  • astro.config.mjssitehttps://...
  • 第三方资源(图片/脚本)也尽量使用 HTTPS
  • /_astro/ 资源通常带 hash,长期缓存不会影响更新
  • 如果你更换了同名文件(例如 /favicon.svg),可能需要清理浏览器缓存或 CDN 缓存

TODO:补充宝塔/Nginx 清理缓存的常用方式(如涉及 CDN)。

津 ICP 备2022001375 号
津公网安备 12011402001353 号