这是一篇来自于旧站的重置文章。

前言

又回到最初的起点了属于:《[无敌小白版] 阿里云服务器+宝塔halo个人博客搭建》。

Halo1.+ 版本 甚至是 Halo <1.5 版本已经不能支持我的需求了,尤其是数学公式Markdown上面的需求。

于是乎,准备转型更高级的Halo 和 Sakura了。

正文

1. 阿里云服务器

我们选用了

  • 硬件配置:28元/月 非中国BGP优化

  • 系统:Ubuntu 24.04

2. Docker Compose 环境搭建

对于安装,我们将会对Halo文档,直接进行一个进攻,我们这里会使Docker Compose 进行部署,是时候,跟上一些时代的脚步了。

我们优先搭建环境:

2.1 Docker Engine 前置要求

优先搭建Docker Engine,Install Docker Engine on Ubuntu

首先我们注意,防火墙的事情,原文如下:

  • If you use ufw or firewalld to manage firewall settings, be aware that when you expose container ports using Docker, these ports bypass your firewall rules. For more information, refer to Docker and ufw.

  • Docker is only compatible with iptables-nft and iptables-legacy. Firewall rules created with nft are not supported on a system with Docker installed. Make sure that any firewall rulesets you use are created with iptables or ip6tables, and that you add them to the DOCKER-USER chain, see Packet filtering and firewalls.

大意就是,如果以后要放端口,要iptablesiptables,也记得加DOCKER-USER

然后就是,先把旧版本的conflicting packages给卸载了,一些Linux的版本可能会提供一些unofficial 的 Docker packages,我们需要把这些都给删除了:

  • docker.io

  • docker-compose

  • docker-compose-v2

  • docker-doc

  • podman-docker

  • Moreover, Docker Engine depends on containerd and runc. Docker Engine bundles these dependencies as one bundle: containerd.io. If you have installed the containerd or runc previously, uninstall them to avoid conflicts with the versions bundled with Docker Engine.

需要用以下的命令把 conflicting packages给去掉:

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

apt-get might report that you have none of these packages installed.apt-get可能报告你没有安装这些packages,很正常,因为我们全新的Ubuntu没有这些packages)

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package docker.io
E: Couldn't find any package by glob 'docker.io'
E: Couldn't find any package by regex 'docker.io'
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package docker-doc
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package docker-compose
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package docker-compose-v2
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package podman-docker
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package containerd
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package runc

我们没有任何这些packages,很perfect!

Images, containers, volumes, and networks stored in /var/lib/docker/ aren't automatically removed when you uninstall Docker. If you want to start with a clean installation, and prefer to clean up any existing data, read the uninstall Docker Engine section.(我们这里应该不存在,我相信我们这个阿里云提供的Ubuntu 24.04 是Clean 中之 Clean!)

2.2 安装 Docker Engine

我们有多种方式安装Docker Engine,这里我们选用通过apt 来进行安装,设置Docker's apt 的 repository:

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

安装Docker packages,直接安装,最新版:

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

验证,安装是否成功:

sudo docker run hello-world

出现下面,就证明我们已经成功安装Docker Engine了:

Hello from Docker!
This message shows that your installation appears to be working correctly.

2.3 安装 Docker Compose

我们参考:Install the Docker Compose plugin,我们已经在2.2 安装了Docker repository的apt。我们更新最新版本的 Docker Compose。对于Ubuntu来说:

sudo apt-get update
sudo apt-get install docker-compose-plugin

检查一下Docker Compose是否成功安装:

docker compose version

3. 安装 Halo

【来自官方】目前 Halo 2 并未更新 Docker 的 latest 标签镜像,主要因为 Halo 2 不兼容 1.x 版本,防止使用者误操作。我们推荐使用固定版本的标签,比如 2.21 或者 2.21.0。

  • registry.fit2cloud.com/halo/halo:2:表示最新的 2.x 版本,即每次发布新版本都会更新此镜像。

  • registry.fit2cloud.com/halo/halo:2.21:表示最新的 2.21.x 版本,即每次发布 patch 版本都会同时更新此镜像。

  • registry.fit2cloud.com/halo/halo:2.21.0:表示一个具体的版本。

后续文档以 registry.fit2cloud.com/halo/halo:2.21 为例。

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

mkdir ~/halo && cd ~/halo

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

创建文件夹后,我们为Docker创建docker-compose.yaml

version: "3"

services:
  halo:
    image: registry.fit2cloud.com/halo/halo:2.21
    restart: on-failure:3
    depends_on:
      halodb:
        condition: service_healthy
    networks:
      halo_network:
    volumes:
      - ./halo2:/root/.halo2
    ports:
      - "8090:8090"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s
    environment:
      # JVM 参数,默认为 -Xmx256m -Xms256m,可以根据实际情况做调整,置空表示不添加 JVM 参数
      - JVM_OPTS=-Xmx256m -Xms256m
    command:
      - --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
      - --spring.r2dbc.username=halo
      # PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。
      - --spring.r2dbc.password=openpostgresql
      - --spring.sql.init.platform=postgresql
      # 外部访问地址,请根据实际需要修改
      - --halo.external-url=http://localhost:8090/
  halodb:
    image: postgres:15.4
    restart: on-failure:3
    networks:
      halo_network:
    volumes:
      - ./db:/var/lib/postgresql/data
    healthcheck:
      test: [ "CMD", "pg_isready" ]
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      - POSTGRES_PASSWORD=openpostgresql
      - POSTGRES_USER=halo
      - POSTGRES_DB=halo
      - PGUSER=halo

networks:
  halo_network:

注意:

  1. 需要注意的是,此文档为了更加方便的管理配置,所有与 Halo 相关的配置都使用 Docker 容器启动参数代替,所以无需创建 application.yaml 文件。

  2. 此示例的 PostgreSQL 数据库容器默认没有设置端口映射,如果需要在容器外部访问数据库,可以自行在 halodb 服务中添加端口映射,PostgreSQL 的端口为 5432。

添加用户,我们admin,到docker组(记得重新开启terminal)

sudo usermod -aG docker admin

启动 Halo 服务:

docker compose up -d

实时查看日志:

docker compose logs -f

成功了:

成功登录:

4. 反向代理(Nginx Proxy Manager)

我们参考与 Nginx Proxy Manager 配合使用的Halo部署。

来自官网对于 Nginx Proxy Manager的介绍:

顾名思义,Nginx Proxy Manager 就是一个 Nginx 的代理管理器,它最大的特点是简单方便。

即使是没有 Nginx 基础的小伙伴,也能轻松地用它来完成反向代理的操作,而且因为自带面板,操作极其简单,非常适合配合 docker 搭建的应用使用。

Nginx Proxy Manager 后台还可以一键申请 SSL 证书,并且会自动续期,方便省心。

下面我们就来介绍如何用 Nginx Proxy Manger 来配合 Halo,实现反向代理和 HTTPS 访问。

创建一个文件夹来存放 NPM 的 docker-compose.yml 文件:

mkdir -p ~/data/docker_data/nginxproxymanager   # 创建一个 npm 的文件夹
cd ~/data/docker_data/nginxproxymanager    # 进入该文件夹
vim docker-compose.yml

以下我们要创建的docker-compose.yml

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'              # 不建议修改端口
      - '81:81'              # 可以把冒号左边的 81 端口修改成你服务器上没有被占用的端口
      - '443:443'            # 不建议修改端口
    volumes:
      - ./data:/data         # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 data 目录,用于存放数据,如果不存在的话,会自动创建
      - ./letsencrypt:/etc/letsencrypt  # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 letsencrypt 目录,用于存放证书,如果不存在的话,会自动创建

注意:安装了 NPM 之后,就不需要再安装 Nginx 了,否则会端口冲突(不建议修改 NPM 的 80、443 端口)。如果你的服务器安装了宝塔面板,也可以和 NPM 一起使用,只要你到软件后台把宝塔安装的 Nginx 关闭或者卸载即可。

启动 NPM:

docker compose up -d     # 如果你用的是 docker-compose-plugin 的话,用这条命令;d 表示后台运行

不出意外,此时你使用 http://127.0.0.1:81 就可以访问 NPM 的网页端了。(注意把 127.0.0.1 替换成你实际服务器的 IP)(同时注意:记得在阿里云防火墙端口)

默认登录的用户名admin@example.com 密码changeme

第一次登录会提示更改用户名和密码,建议修改一个复杂一点的密码。

至此,我们已经完成了 Nginx Proxy Manager 的搭建,之后就可以用它给我们的 Halo 或者其他 Web 应用做反向代理了。

成功登录!

我们这里点击Proxy Hosts:

点击增加:

我们配置一下Proxy:

我们只要用到其中的几个功能即可,这边稍微解释一下:

  • Domain Names :填我们 Halo 网站的域名,首先记得做好 DNS 解析,把域名绑定到我们的服务器的 IP 上

  • Scheme :默认 http 即可,除非你有自签名证书(我们后续设置)

  • Forward Hostname/IP :填入服务器的 IP,或者 Docker 容器内部的 IP(如果 NPM 和 Halo 搭建在同一台服务器上的话(我们的情况)ip addr show docker0查询即可,我们这里的172.17.0.1

  • Forward Port:填入 Halo 映射出的端口,这边默认是 8090

  • Cache Assets :缓存,可以选择打开

  • Block Common Exploits:阻止常见的漏洞,可以选择打开

  • Websockets Support:WS 支持,可以选择打开

  • Access List:这个是 NPM 自带的一个限制访问功能,这边我们不管,后续可以自行研究。

成功!

发现Proxy 自带SSL申请,我们直接一个申请:

这样我们就拥有3个月的Let's Encrypt。

之后如果要更新的话 可以参考 《[无敌小白版] 上传Let's Encrypt 来代替原版的 SSL证书》

5. Sakura 主题安装

根据Sakura描述,由于Sakura 已经上传到了应用商店,我们直接应用商店即可。

完结,撒花!

总结

完结,撒花!

我去把旧版的,迁移过来去了。

参考

[1] [无敌小白版] 阿里云服务器+宝塔halo个人博客搭建
[2] Halo文档
[3] Docker 安装文档
[4] Docker Compose 安装文档
[5] Install Docker Engine on Ubuntu
[6] Install the Docker Compose plugin
[7] 与 Nginx Proxy Manager 配合使用
[8] [无敌小白版] 上传Let's Encrypt 来代替原版的 SSL证书

立志做一个有趣的碳水化合物。