此文是出于我想研究一下如何搭建一个简单的个人博客以及如何搭建一个简单的网站在研究了相关技术以及一些视频之后,最终选择了Halo,本文采用的是Halo2.19的文档进行搭建的
一. 搭建博客的基本要求
在开始之前,请确保你已经具备以下条件:
有一台服务器(推荐使用 Ubuntu 24.04 64位系统,和我保持一致,可以在后面避免一些问题)。
有一个域名(可选,我是直接在阿里云上买的)
https://wanwang.aliyun.com/domain 一个shh连接工具(我用的是 XTerminal )
https://www.xterminal.cn/
我的配置如下
# 更换下密码
passwd root
二. 安装docker和Docker Compose并加速镜像
# 安装 Docker 和 Docker Compose
# 首先更新你的软件包索引:
sudo apt update
# 安装 Docker 所需的依赖项:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
# 添加 Docker 官方的 GPG 密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加 Docker APT 存储库到系统源列表中:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 更新软件包索引并安装 Docker:
sudo apt update
sudo apt install docker-ce
# 启动 Docker 服务并将其设置为开机自启动:
sudo systemctl start docker
sudo systemctl enable docker
# 运行以下命令来确认 Docker 是否成功安装:
docker --version
# 安装Docker Compose 先用Rainbond 社区的加速 (推荐使用这个,阿里云的最近不太好使)
docker pull docker.rainbond.cc/library/node:20
docker pull docker.rainbond.cc/rainbond/rainbond:v5.17.2-release-allinone
# 配置镜像加速器
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.rainbond.cc"]
}
EOF
systemctl daemon-reload
systemctl restart docker
# 下载最新版本的 Docker Compose。你可以访问 Docker Compose releases 页面查看最新版本,替换命令中的版本号。
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予 docker-compose 文件可执行权限:
sudo chmod +x /usr/local/bin/docker-compose
# 运行以下命令来验证 Docker Compose 是否正确安装:
docker-compose --version
#以下不用管***********
# GPG 密钥:确保 Docker 软件包来源的真实性和完整性。
# Docker 存储库:从官方源获取最新的 Docker 版本和更新。
# 依赖项:为系统准备必要工具,确保能够安全和高效地下载、安装 Docker。
# docker 镜像加速不好用了(不用)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://2i2za63k.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
三. 安装 Nginx Proxy Manager(没有域名的可以跳过)
注意: 安装Nginx Proxy Manager之前, 域名要先做好解析和备案,不然后面代理会无效
# 创建一个目录来保存 Nginx Proxy Manager 的文件:
mkdir -p ~/nginx-proxy-manager
cd ~/nginx-proxy-manager
# 在这个目录中创建一个 docker-compose.yml 文件,文件在下面
# 启动 NPM:
docker-compose up -d
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 目录,用于存放证书,如果不存在的话,会自动创建
不出意外,此时你使用 http://127.0.0.1:81 就可以访问 NPM 的网页端了。(注意把 127.0.0.1
替换成你实际服务器的公网 IP)
遇到访问不了的情况,请再次检查在服务器中是否打开对应了端口。
80/80 81/81 433/433
访问成功后,我们输入 默认登录的用户名:admin@example.com
密码:changeme
登录即可
配置 Halo 的反向代理
首先我们登录网页端之后,会弹出修改用户名和密码的对话框,我们根据自己的实际来修改自己的用户名和邮箱。
保存之后,会让我们修改密码(建议用一个复杂的密码)。
接着我们就可以来给 Halo 来添加一个反向代理了, 点击 Proxy Hosts
,
接着点击 Add Proxy Host
,弹出如下对话框:
看起来都是英文,很复杂,但是其实很简单,我们只要用到其中的几个功能即可,这边稍微解释一下:
Domain Names
:填我们 Halo 网站的域名,首先记得做好 DNS 解析,把域名绑定到我们的服务器的 IP 上
Scheme
:默认http
即可,除非你有自签名证书
Forward Hostname/IP
:填入服务器的 IP,或者 Docker 容器内部的 IP(如果 NPM 和 Halo 搭建在同一台服务器上的话)
Forward Port
:填入 Halo 映射出的端口,这边默认是8090
Cache Assets
:缓存,可以选择打开
Block Common Exploits
: 阻止常见的漏洞,可以选择打开
Websockets Support
:WS 支持,可以选择打开
Access List
: 这个是 NPM 自带的一个限制访问功能,这边我们不管,后续可以自行研究。
以下是一个样列:
因为样例的 NPM 和 Halo 搭建在同一台 VPS 上,图中IP填的是 172.17.0.1
, 你需要在 IP 部分填入 你的 服务器的 IP,并在服务商(部分服务商如腾讯、阿里)的后台打开 8090
端口。
一键申请 SSL 证书
接着我们来申请一张 SSL 证书,让我们的网站支持 https
访问。
如图所示,记得打开强制 SSL,其他四个的功能请自行研究,这边不多做讨论。
申请证书需要你提前将域名解析到 NPM 所在的服务器的 IP 上;
不出意外,你将成功申请到 SSL 证书,证书会三个月自动续期。
再次点开配置,查看一下,强制 SSL 是否打开
至此,你已经成功完成了 Halo 的反向代理,我们后面就可以直接通过域名访问
四. 安装Halo
在系统任意位置创建一个文件夹,此文档以
~/halo
为例。
mkdir ~/halo
cd ~/halo
注意:后续操作中,Halo 产生的所有数据都会保存在这个目录,请妥善保存。
创建
docker-compose.yaml
我这里使用的是MySQL版的配置
version: "3" # 指定 Compose 文件版本
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.19 # 指定 Halo 服务的 Docker 镜像
restart: on-failure:3 # 如果服务失败,最多重启 3 次
depends_on: # 指定依赖服务
halodb: # 依赖于 halodb 服务
condition: service_healthy # 只有在 halodb 健康检查通过后才启动
networks:
halo_network: # 使用名为 halo_network 的网络
volumes:
- ./halo2:/root/.halo2 # 挂载本地目录到容器内,保存数据
ports:
- "8090:8090" # 将宿主机的 8090 端口映射到容器的 8090 端口
healthcheck: # 配置健康检查
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] # 健康检查命令
interval: 30s # 每 30 秒执行一次健康检查
timeout: 5s # 健康检查命令超时时间为 5 秒
retries: 5 # 如果失败,重试 5 次
start_period: 30s # 启动后 30 秒内不进行健康检查
command: # 启动容器时的命令及参数
- --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo # 数据库连接 URL
- --spring.r2dbc.username=root # 数据库用户名
# MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
- --spring.r2dbc.password=root # 数据库密码
- --spring.sql.init.platform=mysql # 指定初始化 SQL 的平台
# 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/ # 外部访问地址
halodb:
image: mysql:8.1.0 # 指定 MySQL 服务的 Docker 镜像
restart: on-failure:3 # 如果服务失败,最多重启 3 次
networks:
halo_network: # 使用名为 halo_network 的网络
command: # 启动容器时的命令及参数
- --default-authentication-plugin=caching_sha2_password # 设置默认认证插件
- --character-set-server=utf8mb4 # 设置字符集为 utf8mb4
- --collation-server=utf8mb4_general_ci # 设置字符排序规则
- --explicit_defaults_for_timestamp=true # 显式设置时间戳的默认值
volumes:
- ./mysql:/var/lib/mysql # 挂载本地 mysql 数据目录
- ./mysqlBackup:/data/mysqlBackup # 挂载本地备份目录
healthcheck: # 配置健康检查
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"] # 健康检查命令
interval: 3s # 每 3 秒执行一次健康检查
retries: 5 # 如果失败,重试 5 次
start_period: 30s # 启动后 30 秒内不进行健康检查
environment: # 环境变量
# 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
- MYSQL_ROOT_PASSWORD=root # MySQL 根用户密码
- MYSQL_DATABASE=halo # 创建的数据库名
networks:
halo_network: # 定义名为 halo_network 的网络
启动 Halo 服务
docker-compose up -d
实时查看日志:
docker-compose logs -f
启动成功后我们用浏览器访问 域名或公网ip/console 即可进入 Halo 管理页面,首次启动会进入初始化页面,至此就完成了
表单项说明:
站点名称:网站的名称,将会显示在浏览器标签页上。
邮箱:初始管理员的邮箱地址。
用户名:初始管理员的用户名。
密码:初始管理员的密码。
确认密码:重复输入密码以验证是否匹配。
输入完成之后点击初始化按钮即可完成初始化,初始化完成之后,将会跳转到登录页面,输入刚才设置的用户名和密码即可登录。