云轩技术分享

云轩技术分享

技术学习、经验分享

66hero 博客部署并迁移原 WordPress 文章

自己策划, 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 站点,将原博客文章迁移到这个系统中。

部署过程

  1. 本地 powershell 下,进行编译:
code
$env:GOOS="linux"; $env:GOARCH="amd64"; go build -o 66hero .
  1. 将编译好的 66hero 文件和整个 Web 文件夹上传到网站根目录下
  2. 把 uploads 文件夹上传到网站根目录下
  3. 在宝塔绑定域名和网站根目录那些就不细说了,之后进行反向代理,所选端口不能是之前网站使用的端口,比如选择8081端口。
    20261008000910da1d575eac76.png

注意:这里发送域名需要写 $host,不能写 127.0.0.1,因为有可能有非法跨站之类的报错。

  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
  1. 准备工作
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
  1. 新建独立服务 /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
  1. 让 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)

还没有评论,来做第一个吧。

发表评论

提交后需管理员审核通过后显示