自己策划, Agent 进行开发的博客终于做好了,在本地 Windows 下开发的,项目是纯 Go 后端 + 服务端渲染(SSR),没有前端框架。
后端:
- 语言:Go 1.27
- Web 框架:go-chi/chi/v5(轻量路由,标准 net/http 中间件)
- 数据库:MySQL 8.0,直接 database/sql + go-sql-driver/mysql(无 ORM)
- 模板:标准库 html/template(服务端渲染)
- Markdown:yuin/goldmark + alecthomas/chroma(代码高亮)
- 安全/HTML:bluemonday(白名单净化)
- 其他:mozillazg/go-pinyin(中文转拼音 slug)、skip2/go-qrcode(二维码)、golang.org/x/crypto(密码哈希)、golang.org/x/image
前端
就是原生 HTML + 手写 CSS + 原生 JS
第一次用 go 语言来做项目,记录一下部署到 Linux 服务器上的部署过程,服务器是 Ubuntu 24.04 系统,amd64。原博客是 WordPress 站点,将原博客文章迁移到这个系统中。
部署过程
- 本地 powershell 下,进行编译:
code
$env:GOOS="linux"; $env:GOARCH="amd64"; go build -o 66hero .
- 将编译好的 66hero 文件和整个 Web 文件夹上传到网站根目录下
- 把 uploads 文件夹上传到网站根目录下
- 在宝塔绑定域名和网站根目录那些就不细说了,之后进行反向代理,所选端口不能是之前网站使用的端口,比如选择8081端口。

注意:这里发送域名需要写 $host,不能写 127.0.0.1,因为有可能有非法跨站之类的报错。
- 创建
.env文件,内容:
code
ADDR=127.0.0.1:8081
BASE_URL=https://blog.xxxx.com
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USER=66hero
DB_PASSWORD=d1234556cN
DB_NAME=66hero
UPLOAD_DIR=uploads
SESSION_KEY=egYSX4j7A/sdffdsfhgfdsfsdqEkRMmJxdsaU=
COOKIE_SECURE=1
DEV=0
- 准备工作
code
cd /www/wwwroot/站点目录
sudo mv 66hero-linux-amd64 66hero
sudo chmod 755 66hero
sudo chown -R www:www /www/wwwroot/站点目录
sudo chown www:www /www/wwwroot/站点目录/.env
SESSION_KEY 生成随机串:head -c 32 /dev/urandom | base64
- 新建独立服务 /etc/systemd/system/66hero-blog.service
文件名必须和“unit 名”一致:文件叫 66hero-blog.service,命令里就用 66hero-blog。
code
sudo tee /etc/systemd/system/66hero-blog.service >/dev/null <<'EOF'
[Unit]
Description=66hero blog
After=network.target mysql.service
[Service]
User=www
WorkingDirectory=/www/wwwroot/站点目录
EnvironmentFile=/www/wwwroot/站点目录/.env
ExecStart=/www/wwwroot/站点目录/66hero
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
- 让 systemd 识别服务并启动
code
sudo systemctl daemon-reload # 新建/改过 .service 后必须执行
sudo systemctl enable 66hero-blog # 开机自启
sudo systemctl start 66hero-blog # 立即启动
第 6-7 步可以写一个脚本放在网站根目录下面,一键执行:
code
#!/usr/bin/env bash
# setup-service.sh —— 放到网站根目录,一键创建 systemd 服务并设置开机自启
#
# 用法:
# cd /www/wwwroot/你的站点目录
# sudo ./setup-service.sh # 服务名默认用目录名
# sudo ./setup-service.sh 66hero-blog # 自定义服务名
#
# 约定:脚本所在目录即为站点根,需包含 66hero(可执行文件)与 .env
set -euo pipefail
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
NAME="${1:-$(basename "$DIR")}"
UNIT="/etc/systemd/system/${NAME}.service"
BIN="$DIR/66hero"
ENVF="$DIR/.env"
if [ "$(id -u)" -ne 0 ]; then
echo "请用 root 运行:sudo $0 $*" >&2
exit 1
fi
[ -f "$BIN" ] || { echo "错误:找不到可执行文件 $BIN" >&2; exit 1; }
[ -f "$ENVF" ] || { echo "错误:找不到环境文件 $ENVF" >&2; exit 1; }
chmod +x "$BIN" 2>/dev/null || true
# 运行用户:优先取目录属主;若是 root 则回退到 www(存在时)
RUN_USER="$(stat -c '%U' "$DIR")"
if [ "$RUN_USER" = "root" ] && id www >/dev/null 2>&1; then
RUN_USER="www"
fi
# 端口占用提示(非致命)
PORT="$(sed -n 's/^ADDR=.*:\([0-9]\+\)$/\1/p' "$ENVF" | head -n1)"
if [ -n "$PORT" ] && ss -ltnH "sport = :$PORT" 2>/dev/null | grep -q .; then
if [ "$(systemctl show -p MainPID --value "$NAME" 2>/dev/null || echo 0)" = "0" ]; then
echo "提示:端口 $PORT 已被其他进程占用,若不是本服务请检查 .env 的 ADDR。" >&2
fi
fi
if [ -f "$UNIT" ]; then
echo "提示:$UNIT 已存在,将覆盖并重启该服务。"
fi
cat > "$UNIT" <<EOF
[Unit]
Description=66hero blog (${NAME})
After=network.target mysql.service
[Service]
User=${RUN_USER}
WorkingDirectory=${DIR}
EnvironmentFile=${ENVF}
ExecStart=${BIN}
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable "$NAME" >/dev/null 2>&1 || true
systemctl restart "$NAME"
sleep 1
echo "----------------------------------------"
echo "服务名 : ${NAME}"
echo "运行用户 : ${RUN_USER}"
echo "站点目录 : ${DIR}"
echo "开机自启 : 已启用"
echo "----------------------------------------"
systemctl --no-pager --full status "$NAME" | head -n 6 || true
之后进入到网站根目录执行即可:
code
cd /www/wwwroot/xxx.xxx.com
sudo ./setup-service.sh 66hero-xxx
8.之后运行网站,会进入到 install 安装过程,填写网站信息、管理员信息和数据库信息,之后确定
9. 登录网站后台 进入插件市场——配置——上传 WordPress 导出的 XML 文件,这样文章就迁移好了。
评论 (0)