容器部署

采用Halo 2.7的 Docker 镜像进行部署

拉取最新Halo镜像

docker pull halohub/halo

在系统任意位置创建一个工作文件夹,此文档以/data/halo为例

 mkdir /data/halo && cd /data/halo

注意:后续操作中,Halo 产生的所有数据都会保存在这个目录,请妥善保存。

建立halo网络

docker network create halo_network

编辑创建yaml配置文件

version: "3"

services:
  halo:
    image: halohub/halo:2.7
    container_name: halo
    restart: on-failure:3
    depends_on:
      halodb:
        condition: service_healthy
    networks:
      halo_network:
    volumes:
      - ./:/root/.halo2
    ports:
      - "8099:8090"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8099/actuator/health/readiness"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s
    command:
      - --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/linhut_halo
      - --spring.r2dbc.username=root
      # MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
      - --spring.r2dbc.password=P@w%bI*
      - --spring.sql.init.platform=mysql
      # 外部访问地址,请根据实际需要修改
      - --halo.external-url=https://www.linhut.cn/
      # 初始化的超级管理员用户名
      - --halo.security.initializer.superadminusername=linhutAdmin
      # 初始化的超级管理员密码
      - --halo.security.initializer.superadminpassword=P@josea%i*

  halodb:
    image: mysql:8.0.31
    container_name: halodb
    restart: on-failure:3
    networks:
      halo_network:
    command: 
      - --default-authentication-plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_general_ci
      - --explicit_defaults_for_timestamp=true
    volumes:
      - ./mysql:/var/lib/mysql
      - ./mysqlBackup:/data/mysqlBackup
    ports:
      - "3308:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
      interval: 3s
      retries: 5
      start_period: 30s
    environment:
      # 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
      - MYSQL_ROOT_PASSWORD=P@w%bI*
      - MYSQL_DATABASE=linhut_halo
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '81:80'              # 不建议修改端口
      - '811:81'              # 可以把冒号左边的 81 端口修改成你服务器上没有被占用的端口
      - '4443:443'            # 不建议修改端口
    volumes:
      - ./data:/data         # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 data 目录,用于存放数据,如果不存在的话,会自动创建
      - ./letsencrypt:/etc/letsencrypt  # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 letsencrypt 目录,用于存放证书,如果不存在的话,会自动创建

networks:
  halo_network:

关于docker-compose-mysql非默认端口设置

在更改默认MySQL业务端口时,需自定义mysql配置文件并映射进yaml启用文件中,否则将会报错

halo    | 2023-04-28T02:41:17.600+08:00  INFO 7 --- [         main] c.g.j.r.m.MysqlConnectionFactoryProvider : set jasync.mysql.CLIENT_FOUND_ROWS=true

创建docker-compose-mysql的工作目录

 cd /etc/docker
mkdir -p docker-compose-mysql/{data,conf}

文件附权

chown -R mysql:mysql docker-compose-mysql/data

自定义配置文件mysql.conf

vim docker-compose-mysql/conf/mysql.cnf

[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8

在启动文件docker-compose.yml中进行设置

 ports:
"3308:3306"
volumes:
/etc/docker/docker-compose-mysql/conf/:/etc/mysql/conf.d/
./mysqlBackup:/data/mysqlBackup
 /etc/docker/docker-compose-mysql/data:/var/lib/mysql

安装脚本执行

 sudo docker compose up -d

版本更新

# 拉取最新的 Halo 镜像

docker-compose pull

# 重新构建容器

docker-compose up -d

常用命令

# 停止容器运行

docker-compose stop

# 启动容器

docker-compose start

# 查看实时日志

docker-compose logs -f

# 重启容器

docker-compose restart

# 查看容器内部地址

ip addr show docker0

# 进入容器

docker exec -it halo bash

报错处理


出现上述报错,容器启动失败了,原因是 s6-svscanctl: fatal: unable to control /var/run/s6/services: supervisor not listening。这个错误提示显示 supervisor 没有在监听 /var/run/s6/services,可能是 supervisor 进程没有正常启动。建议检查 supervisor 进程是否正常启动,或者在容器启动时通过 docker logs 命令查看更多的日志信息,以便找到问题的根本原因。

解决方法:

Supervisor的定义是超级用户,监管员。Supervisor是一个进程管理工具,当进程中断的时候Supervisor能自动重新启动它。可以运行在各种类unix的机器上,supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

安装 Supervisor:可以使用以下命令在 CentOS 系统上安装 Supervisor:

sudo yum install epel-release
sudo yum install supervisor

配置 Supervisor:Supervisor 的配置文件位于 /etc/supervisord.d/ 目录下,可以创建一个新的配置文件来管理需要启动的进程。例如,创建一个名为 myapp.conf 的配置文件:

[program:myapp]
command=/path/to/myapp
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/myapp.log

上述配置文件定义了一个名为 myapp 的进程,它的启动命令是 /path/to/myapp,并且在进程意外退出时自动重启。redirect_stderr=true 表示将标准错误输出重定向到标准输出,stdout_logfile=/var/log/myapp.log 表示将标准输出重定向到 /var/log/myapp.log 文件中。

启动 Supervisor:可以使用以下命令启动 Supervisor:

sudo systemctl start supervisord

启动后,Supervisor 将会读取配置文件并启动相应的进程。

管理进程:可以使用以下命令管理进程:

sudo supervisorctl status
sudo supervisorctl start myapp
sudo supervisorctl stop myapp
sudo supervisorctl restart myapp

status 命令用于查看进程状态,start 命令用于启动进程,stop 命令用于停止进程,restart 命令用于重启进程。