乐呵呵、欢的博客

lehhair's Blog

如何部署一个属于自己的博客(halo)

382
2023-10-29

如何部署一个halo博客

写在前面:从2021年开始玩vps,也有了属于自己的小站点,记录一下自己的学习,这次是在虚拟机上部署一次halo博客,这次写一个部署教程

使用的系统是Ubuntu22 x64

官方文档:安装指南

配置环境

这里是使用官方推荐的docker-compose方式部署,所以需要安装docker和docker-compose,下面是安装docker和docker-compose的教程,如果已经安装了可以跳过这一步。

安装docker和docker-compose

从存储库安装

  1. 设置存储库
# Add Docker's official GPG key:
sudo apt-get update # 更新apt源
sudo apt-get install ca-certificates curl gnupg
#gnupg与ca-certificates一个负责加密、一个负责证书登记,和信息安全方面的处理相关。curl则是一个网络请求发起的工具。
sudo install -m 0755 -d /etc/apt/keyrings # 创建目录
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg  # 下载docker官方的gpg密钥
sudo chmod a+r /etc/apt/keyrings/docker.gpg # 修改权限
# Add the repository to Apt sources:
# 添加docker的apt源
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update # 更新apt源
  1. 安装Docker和Docker Compose
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

部署halo博客

在系统的任意目录下创建一个文件夹

sudo mkdir /home/halo && cd /home/halo

创建docker-compose.yml文件

sudo vi docker-compose.yml

复制以下内容到docker-compose.yml文件中(Halo + MySQL),在英文状态下输入i进入编辑模式,然后按下Ctrl+Shift+V粘贴,然后按下Esc,再输入:wq保存退出。

version: "3" #版本号

services: #服务
  halo: #服务名
    image: halohub/halo:2.10 #镜像名
    container_name: halo #容器名
    restart: on-failure:3 #重启策略,这里是失败重启3次
    depends_on: #依赖
      halodb: #依赖的服务名
        condition: service_healthy #依赖的服务健康时才启动
    networks: #网络
      halo_network: #网络名
    volumes: #挂载卷
      - ./halo2:/root/.halo2 #将容器中的/root/.halo2目录挂载到当前目录下的halo2目录
    ports:
      - "8090:8090" #将容器中的8090端口映射到主机的8090端口,前面的8090是主机端口,后面的8090是容器端口
    healthcheck: #健康检查
      test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] #检查的命令
      interval: 30s #检查间隔
      timeout: 5s #检查超时时间
      retries: 5    #检查失败重试次数
      start_period: 30s #检查开始时间
    command: #命令
      #数据库连接地址,这里的halodb是上方的依赖服务名,3306是MySQL的默认端口,halo是数据库名
      - --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo
      #数据库连接地址,这里的halodb是上方的依赖服务名,3306是MySQL的默认端口,halo是数据库名
      - --spring.r2dbc.username=root
      # MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
      - --spring.r2dbc.password=o#DwN&JSa56
      # 这里的mysql是数据库类型,如果你使用的是其他数据库,请修改为对应的数据库类型,比如 PostgreSQL 为 postgresql
      - --spring.sql.init.platform=mysql
      # 外部访问地址,如果你的 Halo 是通过反向代理访问的,请修改为反向代理的地址。
      - --halo.external-url=http://localhost:8090/

  halodb: #服务名
    image: mysql:8.1.0 #镜像名
    container_name: halodb #容器名
    restart: on-failure:3 #重启策略,这里是失败重启3次
    networks: 
      halo_network: #网络名
    command: 
      - --default-authentication-plugin=caching_sha2_password #密码验证方式
      - --character-set-server=utf8mb4 #字符集
      - --collation-server=utf8mb4_general_ci #字符集
      - --explicit_defaults_for_timestamp=true #时间戳
    volumes:
      - ./mysql:/var/lib/mysql #将容器中的/var/lib/mysql目录挂载到当前目录下的mysql目录
      - ./mysqlBackup:/data/mysqlBackup 
      #将容器中的/data/mysqlBackup目录挂载到当前目录下的mysqlBackup目录

    ports:
      - "3306:3306" #将容器中的3306端口映射到主机的3306端口,前面的3306是主机端口,后面的3306是容器端口
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
      #检查的命令,这里是使用mysqladmin命令检查MySQL是否正常
      interval: 3s #检查间隔
      retries: 5 #检查失败重试次数
      start_period: 30s #检查开始时间
    environment:
      # 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
      - MYSQL_ROOT_PASSWORD=o#DwN&JSa56
      - MYSQL_DATABASE=halo

networks:
  halo_network: 

然后键盘输入Esc,再输入:wq保存退出。

编辑好之后,使用docker-compose启动

sudo docker compose up -d
# 创建并后台运行所有容器

启动完成后,访问http://localhost:8090,如果出现下面的页面,说明halo已经部署成功了。
localhost请改为你实际的ip地址或者域名。

部署Nginx Proxy Manager(halo官方手册)

创建文件夹,添加配置文件

mkdir -p /home/nginxproxymanager   # 创建一个 npm 的文件夹

cd /home/nginxproxymanager    # 进入该文件夹

vi docker-compose.yml

在英文安装下输入i进入编辑模式,然后按下Ctrl+Shift+V粘贴,然后按下Esc,再输入:wq保存退出。

粘贴docker-compose.yml

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest' # 镜像
    restart: unless-stopped 
    # 可以确保容器在运行docker-compose down命令之前一直运行。这对于需要持续运行的服务非常重要
    ports:
      - '80:80'              # 不建议修改端口
      - '81:81'              # 可以把冒号左边的 81 端口修改成你服务器上没有被占用的端口
      - '443:443'            # 不建议修改端口
    volumes:
      - ./data:/data         # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 data 目录,用于存放数据,如果不存在的话,会自动创建
      - ./letsencrypt:/etc/letsencrypt  # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 letsencrypt 目录,用于存放证书,如果不存在的话,会自动创建

保存后运行

sudo docker compose up -d
# 创建并后台运行所有容器

这个时候访问http://localhost:81,如果出现下面的页面,说明NPM已经部署成功了。
localhost请改为你实际的ip地址或者域名。

默认的登录账户和密码是[email protected] changeme

然后点击Dashboard中的Proxy Hosts再点击Add Proxy Host

按照图上填写,这里我域名填写的是虚拟机的ip地址,可以更改为你自己的域名

由于都是使用容器安装的所以反代的时候地址要填写容器的ip

运行

ip addr show docker0

回显

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:68:97:9e:8d brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

最后访问域名就可以访问到halo了

可以看到这里访问的是虚拟机的ip,没有加端口号默认是80,可以在NPM里面配置SSL。

halo博客的官方文档里面也有教学