Blog 部署以及踩坑
cd web
bun install
Astro 配置:web/astro.config.mjs
必须加上 Vite 的 rollupOptions,避免生成 Go embed 不支持的文件名(如 _slug_ 开头的文件)。
export default defineConfig({
integrations: [react(), tailwind()],
vite: {
build: {
rollupOptions: {
output: {
entryFileNames: 'assets/entry-[hash].js',
chunkFileNames: 'assets/chunk-[hash].js',
assetFileNames: (assetInfo) => {
if (assetInfo.name && assetInfo.name.endsWith('.css')) {
return `assets/style-[hash][extname]`;
}
return `assets/[name]-[hash][extname]`;
}
}
}
}
},
// ... 其他配置
});
cd web
bun run build
确保 web/dist/assets/ 下有 style-xxx.css 这样的 CSS 文件。
多阶段构建,先前端再后端
Go embed 语法必须为 //go:embed web/dist/**
Dockerfile 示例(核心部分):
FROM oven/bun:alpine AS bun-builder
WORKDIR /app
COPY ./web/package.json ./web/bun.lock ./
RUN bun install --frozen-lockfile
COPY ./web .
RUN bun run build
FROM golang:1.23-alpine AS builder
WORKDIR /app
COPY go.mod go.sum main.go ./
COPY --from=bun-builder /app/dist ./web/dist/
RUN CGO_ENABLED=0 go build -ldflags '-s -w' -o main main.go
FROM alpine AS runner
WORKDIR /app
COPY --from=builder /app/main .
COPY --from=builder /app/web/dist ./web/dist
ENV HOST=0.0.0.0
ENV PORT=3000
EXPOSE 3000
CMD ["/app/main"]
docker build --no-cache -t myblog:latest .
推荐用 scp、rsync 或直接 git clone。
docker build --no-cache -t myblog:latest .
docker stop blog_server && docker rm blog_server
docker run -d --name blog_server -p 80:3000 myblog:latest
http://your_vps_ip/ 或绑定的域名_ 或 . 开头的文件或目录(详见 官方文档)。_slug_...css 文件不会被 embed,导致页面样式 404。style-xxx.css 这类文件名。com.apple.provenance),可能导致 embed 失败。xattr -c 文件名 清除扩展属性。go clean -cache && go clean -modcache,并用 --no-cache 重新 build。//go:embed web/dist/* 只 embed 一级文件,不递归子目录。//go:embed web/dist/**。127.0.0.1,外部无法访问。ENV HOST=0.0.0.0,或运行时加 -e HOST=0.0.0.0。go run 写小测试程序验证 embed 结果如有更多部署细节或自动化脚本需求,欢迎随时补充!