Halo博客搭建小记

Halo博客搭建小记

写在前面

早先,出于练手的需要,加之有些东西不太方便写在公共平台上,于是便打算自己搭建博客来记录。当时基于多种考量,最后选择了Halo作为自己的博客系统,一年前的Halo还通过发布jar包来进行部署,这个方式也确实很方便,仅需要主机有java环境即可,简单使用nginx配置一下反代就可以迅速的部署在主机上。部署完成后,我也记录了一些东西,可惜后来由于学业压力和身体原因,就废弃了之前的内容。前段时间恰有需要,就将重建提上了日程,遂惊喜发现,Halo已全面转向使用docker部署。

这篇日志就把部署过程和踩的坑小记一下,希望能够帮到需要的人。

环境需要

本人使用的是Ubuntu 22.04,包括数据库和docker在内的应用,都来自于ubuntu的官方源。

halo官方文档要求的配置和环境如下:

硬件配置

提示

如果你要使用服务器进行部署 Halo,需要注意的是,Halo 目前不支持市面上的云虚拟主机,请使用云服务器或者 VPS。

CPU

无特别要求。目前我们的 Docker 镜像 也已经支持多平台。

内存

为了获得更好的体验,我们建议至少配置 1G 的 RAM。

磁盘

无特别要求,理论上如果不大量在服务器上传附件,Halo 对磁盘的容量要求并不是很高。但我们推荐最好使用 SSD 硬盘的服务器,能更快的运行 Halo。

网络

Halo 目前必须在外网畅通的情况下使用,否则会导致页面异常。

软件环境

Halo 理论上可以运行在任何支持 Docker 及 Java 的平台。

Docker

必须在运行环境安装好 Docker 环境,目前 Halo 的默认安装运行方式均使用容器。

JRE(可选)

目前 Halo 的默认及推荐安装方式为 Docker 容器运行,使用 jar 包运行的方式需要用户自行构建 jar 包。

信息

当前版本(2.0)需要 JRE 17 的版本,推荐使用 OpenJDK 17。

PostgreSQL(可选)

也可以使用系统自带的 H2 Database 数据库,无需安装。但不推荐在生产环境中使用 H2 Database。

Web 服务器(可选)

如果你部署在生产环境,那么你很可能需要进行域名绑定,这时候我们推荐使用诸如 NginxCaddy 之类的 Web 服务器进行反向代理。但需要注意的是,目前 Halo 不支持代理到子目录(如:halo.run/blog)。

我们这里需要三个东西就够了,运行容器的Docker,数据库,还有web服务器。

安装docker

首先安装docker,对于ubuntu,我们需要安装这几个包:

  • docker.io

  • docker-compose

  • docker-compose-v2

  • docker-doc

  • podman-docker

在你的控制台输入:

sudo apt install docker.io docker-compose docker-compose-v2 docker-doc podman-docker

等待安装完成。。。

安装和配置数据库

正如官方文档所说,你可以选择三种数据库,这里以PostgreSQL为例。

sudo apt install postgresql -y
sudo su postgres
psql
\password
CREATE DATABASE halo;

好了,现在你已经有了一个数据库了,现在我们还需要再创建一个数据库用户给halo使用。

创建一个yourname的用户,密码是password

create user yourname with password 'password';

把刚才创建的halo数据库的操作权力都授予yourname

GRANT ALL PRIVILEGES ON DATABASE halo TO yourname;

然后输入/q退出数据库的操作,然后exit退回到你的系统用户,接下来就可以拉取halo的docker镜像并启动了。

不过,在此之前,你需要修改PostgreSQL的配置文件,因为它默认是禁止从localhost登陆的。

修改 /etc/postgresql/14/main/postgresql.conf 文件第 60 行取消注释,允许本地登入数据库。

listen_addresses = 'localhost' # what IP address(es) to listen on;

然后重启服务使其生效。

sudo systemctl restart postgresql.service

拉取docker镜像和启动

按照官方文档的说法:

目前 Halo 2 并未更新 Docker 的 latest 标签镜像,主要因为 Halo 2 不兼容 1.x 版本,防止使用者误操作。我们推荐使用固定版本的标签,比如 halohub/halo:2.10 或者 halohub/halo:2.10.0。

halohub/halo:2.10:表示最新的 2.10.x 版本,即每次发布 patch 版本都会同时更新 halohub/halo:2.10 镜像。

halohub/halo:2.10.0:表示一个具体的版本。

后续文档以 halohub/halo:2.10 为例。

我们先创建一个文件夹,把这个文件夹作为之后halo工作的目录。

mkdir halo && cd halo

然后创建 docker-compose.yaml

nano docker-compose.yaml

由于我们已经配置好了外部的数据库,所以里面的内容如下:

version: "3"

services:
  halo:
    image: halohub/halo:2.10
    container_name: halo
    restart: on-failure:3
    network_mode: "host"
    volumes:
      - ./halo2:/root/.halo2
    command:
      # 修改为自己已有的 sql 配置
      - --spring.r2dbc.url=r2dbc:pool:postgresql://localhost:5432/halo
      - --spring.r2dbc.username=你刚才创建的数据库用户名
      - --spring.r2dbc.password=你对应用户的密码
      - --spring.sql.init.platform=postgresql
      # 外部访问地址,请根据实际需要修改
      - --halo.external-url=http://localhost:8090/
      # 端口号 默认8090
      - --server.port=8090

保存退出后,就可以拉取镜像并启动了。

sudo docker-compose up -d

n你可能会遇到 did not resolve to an alias and no unqualified-search registries are defined in "/etc/containers/registries.conf"这样的错误,只需要把unqualified-search-registries=["docker.io"]

添加进/etc/containers/registries.conf

通过docker-compose logs -f则可以查看启动的日志。

使用nginx配置https访问

安装nginx,卸载apache2

sudo apt install nginx

sudo apt purge apache2

sudo apt autoremove

创建nginx的配置文件

sudo nano /etc/nginx/sites-available/halo.conf

sudo cp /etc/nginx/sites-available/halo.conf /etc/nginx/sites-enabled/

upstream halo {
  server 127.0.0.1:8090;
}

server {
    listen 80;
    server_name 你的域名;
    return 301 https://$server_name$request_uri;
}

server {
  listen 443 ssl;
  server_name 你的域名;
  ssl_certificate     /home/yourname/ssl/你的域名_bundle.crt; #这俩证书文件换成你自己的
  ssl_certificate_key /home/yourname/ssl/你的域名.key;

  client_max_body_size 1024m;
  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;
  }
}

这时候,如果你的防火墙开启了80和443端口后,且云服务商并没有因为没备案而阻拦的话,你就可以通过

https://你的域名/console来初始化并管理后台了。

Licensed under CC BY-NC-SA 4.0