我在服务器上完整部署了一套博客系统,用的是 Halo 2.x + PostgreSQL + Nginx + HTTPS,域名是 corner.ink。服务器环境是 Ubuntu Server,整套软件栈包括 Java 21+、PostgreSQL、Nginx。整个过程其实不算难,但细节挺多的,我中间也踩了一些坑,所以顺手整理了一下,希望能帮到后来的人。

一、先把数据库准备好

一开始我先装了 PostgreSQL,用的是系统自带的包管理器:

sudo apt update
sudo apt install postgresql postgresql-contrib -y

装完之后顺手把服务启动并设置开机自启,然后用 status 看一眼是不是正常跑起来了:

sudo systemctl enable postgresql
sudo systemctl start postgresql
sudo systemctl status postgresql

接下来就是建库,这一步也不复杂,切到 postgres 用户进控制台:

sudo -u postgres psql

然后创建用户、数据库并授权:

CREATE USER halo WITH PASSWORD '你的密码';
CREATE DATABASE halo OWNER halo;
GRANT ALL PRIVILEGES ON DATABASE halo TO halo;

做完之后用 \q 退出就可以了。

二、安装 Java 环境

因为 Halo2 要求 Java 21+,所以我直接装了 openjdk:

sudo apt install openjdk-21-jdk -y

装完跑一下 java -version,确认一下版本没问题。

三、部署 Halo2

我把 Halo 的目录统一放在 /home/ubuntu/.halo2,这样后面管理起来比较清晰。把 halo.jar 放进去之后,新建一个 application.yaml,配置大致是这样:

server:
  port: 8090
spring:
  r2dbc:
    url: r2dbc:pool:postgresql://127.0.0.1:5432/halo
    username: halo
    password: 你的密码
  sql:
    init:
      mode: always
      platform: postgresql
halo:
  work-dir: /home/ubuntu/.halo2
  external-url: https://corner.ink
  attachment:
    resource-mappings:
      - pathPattern: /upload/**
        locations:
          - migrate-from-1.x

配置好之后,直接用命令启动:

java -jar halo.jar

这个时候访问 http://服务器IP:8090 就可以进入初始化页面了。

不过这里我踩了一个坑,当时启动直接报错:permission denied for schema public。一开始有点懵,后来查了一下发现是 PostgreSQL 的 schema 权限问题,其实很好解决,重新进数据库执行两句就行:

ALTER SCHEMA public OWNER TO halo;
GRANT ALL ON SCHEMA public TO halo;

处理完之后就正常了。

四、用 systemd 管理服务

一开始我是直接用命令跑的,但这样不太方便管理,所以后面还是加了 systemd。建一个 /etc/systemd/system/halo.service

[Unit]
Description=Halo Blog Service
After=network.target postgresql.service

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/.halo2
ExecStart=/usr/bin/java -jar /home/ubuntu/.halo2/halo.jar
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

然后加载配置、设置开机启动并启动服务:

sudo systemctl daemon-reload
sudo systemctl enable halo
sudo systemctl start halo
sudo systemctl status halo

有了这个之后就轻松很多了,服务挂了也会自动拉起。

五、Nginx 反向代理

接下来就是上 Nginx,这一步非常有必要:

sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx

然后我新建了一个站点配置 /etc/nginx/sites-available/corner.ink

server {
    listen 80;
    server_name corner.ink www.corner.ink;

    client_max_body_size 100m;

    location / {
        proxy_pass http://127.0.0.1:8090;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

然后启用配置并重启:

sudo ln -s /etc/nginx/sites-available/corner.ink /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl restart nginx

到这一步,已经可以 http 用正常访问了。

六、升级为 HTTPS

最后我用 certbot 去签 HTTPS:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d corner.ink -d www.corner.ink

这里我当时卡了一下,证书一直签不下来,提示超时。后来排查才发现是 80 端口没开。这个地方我总结了三个必须检查的点:安全组有没有放行 80/443/22、服务器防火墙有没有放行、域名 A 记录是不是指向了正确的公网 IP。

把这些确认一遍之后,证书就顺利签发了。

七、后期更新

之后如果需要更新 halo 版本,只需在 halo 版本发布页 下载 jar 包,替换下位于 ~/./halo2/ 下的 halo.jar 文件,然后重新启动服务即可 sudo systemctl starthalo ,记得更新前先运行命令 sudo systemctl stop halo 停止 halo 服务。

最后

全部跑通之后,直接访问 https://corner.ink 就能正常打开博客了。整个过程虽然不算特别复杂,但确实容易在一些细节上卡住,比如权限、端口、反向代理这些地方。

我自己的感受是,Halo2 配合 PostgreSQL 还是可以的,systemd 管理进程很方便,Nginx 基本是必备,而 HTTPS 出问题大多数都是端口或者网络配置的问题。