avatar

Z Space

You Gotta Move

  • 首页
  • Halo
  • 关于
Home Halo & Postgres docker部署
文章

Halo & Postgres docker部署

Posted 2024-05-8 Updated 2024-05- 22
By 冬天的海
10~13 min read

前阵子看到一个博客,感觉界面挺简洁的,于是跟着页脚的介绍找到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-bookworm

2. 准备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 halo

5. 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.15

application.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试试,有点过于折腾了,以后再说。

Halo
License:  CC BY 4.0
Share

Further Reading

OLDER

NEWER

ufw对docker映射出的端口无效问题

Recently Updated

  • 在debian 13(testing)上安装nvidia驱动
  • 记一次docker desktop的更新故障
  • 关于播客
  • 量化之macd的计算
  • 股票投资的24堂必修课 - 读后

Trending Tags

Halo money 日常 docker pve

Contents

©2025 Z Space. Some rights reserved.

Using the Halo theme Chirpy