在配置完ssh连接之后,就可以开始着手于搭建博客所需的基础设施了。首先需要确认的是,搭建一个博客想要何种架构的博客,不同架构的博客对应不同的搭建难度,维护难度和其它的要素。因此,对博客架构的选择必须审慎的。以下是几种可选的架构与简要说明:
一、图形化面板
可以选择1panel或者宝塔面板,再在面板上进行安装,这一部分的具体做法在官方的文档里已有详细说明,这里不做说明。
1panel安装教程:https://1panel.cn/docs/v2/installation/online_installation/
宝塔面板安装教程:https://docs.bt.cn/getting-started/quick-installation-of-bt-panel
二、稍微有些复杂度的docker compose容器化部署Halo + postgreSQL + Caddy(目前本博客使用这种部署方式)
安装Docker
首先需要安装docker,阿里云官方的文档有对安装docker的步骤进行详细说明:https://help.aliyun.com/zh/ecs/user-guide/install-and-use-docker,在命令行中具体的命令如下所示:
#更新包管理工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
#添加Docker软件包源(使用keyrings方式管理GPG密钥)
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
ARCH=$(dpkg --print-architecture)
DISTRO=$(. /etc/os-release && echo "$VERSION_CODENAME")
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null <<EOF
deb [arch=${ARCH} signed-by=/etc/apt/keyrings/docker.gpg] http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu ${DISTRO} stable
EOF
sudo apt-get update
#安装Docker社区版本,容器运行时containerd.io,以及Docker构建和Compose插件
sudo apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#启动Docker
sudo systemctl start docker
#设置Docker守护进程在系统启动时自动启动
sudo systemctl enable docker此外,由于网络问题,无法直接从Docker Hub拉取镜像,此时需要配置镜像加速器解决该问题,步骤如下:
登录阿里云的容器镜像服务控制台,在左侧导航栏选择镜像工具 > 镜像加速器,在镜像加速器页面获取加速器地址。
编辑Docker配置文件
/etc/docker/daemon.json。
{
"registry-mirrors": ["<加速器地址>"]
}重启Docker服务应用新配置。
sudo systemctl restart docker在配置完基础设施后就可以开始着手于通过yaml文件编排容器了。
使用Docker Compose编排
镜像选择
Halo分为社区版和付费版,这里使用社区版,镜像名称为:halohub/halo:<version>
PostgreSQL选择PostgreSQL:15.4镜像
Caddy则单独安装到系统中,可以单独将Caddy编排入容器中,请注意,需要单独设置持久卷,实现写好Caddyfile配置文件再通过映射至Caddy容器中实现对容器中的配置文件的修改,以及配置端口映射或者配置容器运行时的网络模式为Host模式使之共享宿主机的网络命名空间。
创建容器
在系统的任意位置创建文件夹,此处以
~/halo为例。
mkdir ~/halo && cd ~/halo创建docker-compose.yaml文件。
此处提供编排 Halo + PostgreSQL 的docker-compose.yaml文件内容:
services:
halo:
image: registry.fit2cloud.com/halo/halo-pro:2.25
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:配置完后运行docker compose up -d 命令启动Halo服务,接着使用docker ps 检测容器状态,names列中为halo的这一行在status列中应该在过一段时间后显示(healthy)。此时你就可以使用Termius中的端口转发将本机的8090端口通过服务器映射到服务器的本机地址的8090端口,此时在本地访问http://localhost:8090端口,此时虽然是http协议访问博客,但是因为在http协议外套了一层ssh协议,因此无需担心安全问题。
安装并配置Caddy
Caddy用作站点、服务和应用程序提供服务,此处将其用作反向代理,用作拦截并转发请求和隐藏后端。
此处提供安装Caddy所需的命令行:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg
sudo chmod o+r /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy安装完成之后修改Caddy的配置文件Caddyfile,使之能够通过拦截443端口请求,并将请求代理至本机地址的8090端口,以下是Caddyfile文件的具体内容:
你的域名 {
#此处标记/console和/login这两个后台的路径
@adminPath {
path /console*
path /login*
}
#当外部请求尝试访问标记中的路径时会返回403,以此保证博客的安全
respond @adminPath "403 Forbidden" 403
#其它没有被返回403的请求被转发至本机地址的8090端口
reverse_proxy localhost:8090
}这样,至少在外部请求看来,这个博客是相当安全的。
博客的优化
等我过段时间再写一篇文章说明如何让博客给你自己的邮箱发送提醒邮件。