我在服务器上完整部署了一套博客系统,用的是 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 出问题大多数都是端口或者网络配置的问题。
Ubuntu 部署 Halo2 指南
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法