Halo & Postgres docker部署
前阵子看到一个博客,感觉界面挺简洁的,于是跟着页脚的介绍找到Halo以及对应的主题Chirpy,打算自己也折腾一个。
翻了一下部署文档,推荐使用docker compose,把数据库和Halo一起部署,但我希望数据库是独立的(也许以后在这服务器上还会搞点别的小应用),虽然使用docker compose方式部署的数据库也不影响其他应用连接,但是总觉得结构不够合理,于是参考docker部署部分和jar部署部分,将Halo和Postgres分别用两段脚本启动docker实例,效果也可以。
1. 启动数据库 Postgres
docker run --name postgres -e POSTGRES_PASSWORD=xxx -p 127.0.0.1:5432:5432 -v ./data:/var/lib/postgresql/data -d postgres:15.6-bookworm2. 准备Halo的数据库环境
首先登入Postgres实例的命令行
docker exec -it postgres bash
su - postgres
psql -U postgres
# halo用户有了以后可以这样登录
psql -U halo -d postgres执行语句创建halo的用户和对应的schema
create user halo with encrypted password 'xxxx';
create schema authorization halo;3. 启动Halo
docker run -d --name halo --network host -v ./halo2:/root/.halo2 halohub/halo:2.15这里使用了--network host方式,是为了直接使用127.0.0.1连接到数据库.
4. 修改一些Halo配置
参考jar部署部分大致可以了解到,将application.yaml放在./halo2下,可以覆盖代码部分的这个配置文件相应的配置项,按文档说明,整理如下:
server:
port: 8090
spring:
r2dbc:
url: r2dbc:pool:postgresql://127.0.0.1:5432/postgres
username: halo
password: xxxx
sql:
init:
mode: always
platform: postgresql
halo:
caches:
page:
# Disable page cache by default due to experimental feature
disabled: true
work-dir: ${user.home}/.halo2
plugin:
plugins-root: ${halo.work-dir}/plugins
attachment:
resource-mappings:
- pathPattern: /upload/**
locations:
- migrate-from-1.x实际上只是修改了数据库的连接部分,其他的复制出来,便于将来调整配置时直接修改。
默认启动时是使用的内置H2数据库,重启一下,就会采用Postgres连接了。
docker stop halo
docker start halo5. nginx配置
修改相应的配置文件,部分内容如下:
upstream halo {
server 127.0.0.1:8090;
}
server {
server_name space.may4th.net;
client_max_body_size 10m;
location / {
proxy_pass http://halo;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}跟部署文档内容没什么区别。
6. 其他
登入系统,修改主题和一些基本设置,都比较傻瓜化,就略了。
另外,要记得防火墙禁止直接外部访问8090端口(也可以修改yaml文件,指定绑定127.0.0.1).
7. 一点补充
虽然本博几乎没人看,但还是要避免服务器成为肉鸡,所以做了一点配置修改。
1) 使用bridge网络启动halo
# pg绑定到docker的lan ip上
docker run --name postgres -e POSTGRES_PASSWORD=xxxx -p 172.19.0.1:5432:5432 -v ./data:/var/lib/postgresql/data -d postgres:15.6-bookworm
# halo使用默认bridge网络,因此需要隐射出端口
docker run -d --name halo -p 127.0.0.1:8090:8090 -v ./halo2:/root/.halo2 halohub/halo:2.15application.yaml中相应的连接ip也需要修改,略。
2) 使用普通用户(非root)启动halo
首先基于官方image build出一个自己的,编写 Dockerfile
FROM halohub/halo:2.15
RUN groupadd halo
RUN useradd -ms /bin/bash -g halo halo
ENV SPRING_CONFIG_LOCATION=optional:classpath:/;optional:file:/home/halo/.halo2/
ENV HALO_WORK_DIR=/home/halo/.halo2
USER halo构建和启动
# build
docker build -t zspace/halo:2.15 .
# 启动
docker run -d --name halo -p 127.0.0.1:8090:8090 -v ./halo2:/home/halo/.halo2 zspace/halo:2.15
# 第一次启动时,因为数据文件目录halo2的所有者是原来的root,会有权限问题,需以root登入docker修改
docker exec -it --user root halo bash
chown -R halo:halo .halo2/存在的问题
通过上面的Dockerfile构建出的镜像,如果是首次启动,使用了-v映射host目录时,host目录会覆盖容器内生成的文件,于是系统会报错。
解决方法就是先不带-v参数启动一次,将生成的/home/halo/.halo2复制到主机目录后再用-v挂载启动。
原因估计是挂载主机目录晚于系统生成那些文件的过程,本想修改源代码中的Dockerfile试试,有点过于折腾了,以后再说。