解决思路
对于想搭建个人博客的,使用云服务器的话,比如我在阿里云注册的一台基础版99元/年的服务器配置是2 核(vCPU)2 GiB,公网带宽3Mbps,好的是有公网IP,性能显然是不够用的。如果使用自己家里的飞牛NAS建站,性能应该是能够满足,但是又苦于没有公网IP,即使使用DDNS穿透,也只限于能够IPv6能够访问。如果使用飞牛OS建站,在云服务器、家里的飞牛OS上安装Zerotier组建虚拟局域网,然后在云服务器上搭建Nginx Proxy Manager (NPM),配置NPM作为反向代理,将不同的域名请求转发到Halo服务,并设置HTTP到HTTPS的重定向。
这是我搭建好的博客效果:https://www.weixr.cn
一、在飞牛OS上部署halo博客系统
Halo是一个现代化的开源博客系统,使用Java开发。以下是使用Docker Compose部署Halo的步骤:
创建halo服务并启动
在飞牛OS的文件管理创建一个专门用于Halo的文件夹,例如
halo
。在飞牛OS的Docker应用中,选择 Compose > 新增项目。
项目名称填写为
halo
,路径选择你刚才创建的halo
目录。选择创建docker-compose.yml,复制下面的代码,勾选创建项目后立即启动。
version: "3"
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.21
restart: on-failure:3
container_name: halo
depends_on:
halo_db:
condition: service_healthy
volumes:
- ./halo:/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://halo_db/halo
- --spring.r2dbc.username=halo
# PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。
- --spring.r2dbc.password=YourStrongPassword123!
- --spring.sql.init.platform=postgresql
# 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/
halo_db:
image: postgres:15.4
restart: on-failure:3
container_name: halo_db
volumes:
- ./halosql:/var/lib/postgresql/data
healthcheck:
test: [ "CMD", "pg_isready" ]
interval: 10s
timeout: 5s
retries: 5
environment:
- POSTGRES_PASSWORD=YourStrongPassword123!
- POSTGRES_USER=halo
- POSTGRES_DB=halo
- PGUSER=halo
重要提示:请务必将
YourStrongPassword123!
替换为你自己的强密码(同时修改两处),并妥善保管。
然后点击 确定,等待片刻,Docker会开始拉取镜像并创建容器。你可以在Compose项目的日志中查看启动状态。
初始化Halo
在浏览器中访问
http://你的飞牛OS IP地址:8090
。你将看到Halo的初始化界面,根据提示设置管理员账号、博客标题等基本信息。
初始化完成后,你就可以通过
http://你的飞牛OS IP地址:8090/console
登录到Halo的管理后台了。
二、准备域名和服务器
到云服务商,注册域名,购买云服务器。我是在阿里云(https://www.aliyun.com/)注册的,域名15元/年,云服务器99元/年。
域名购买之后域名备案,申请之后可能需要几天时间。域名备案后将域名解释到你的云服务器的公网IP地址。
你注册的域名通常是二级域名,你也可以解析三级域名到各种设置,比如你家里的宽带有IPv6的话,也可以通过在飞牛OS上配置DDNS,将域名解析到你飞牛OS,然后在有IPv6的网络环境中,直接使用域名访问你nas。我的域名是weixr.cn,我将weixr.cn、www.weixr.cn解析到了我的个人博客,另外还配置了fn.weixr.cn就解析到了我的飞牛。
在云服务器安全组配置放开80,81,443端口允许访问。
三、安装并配置Nginx Proxy Manager (NPM)
Nginx Proxy Manager (NPM) 提供了一个友好的Web界面来管理Nginx反向代理和SSL证书,比直接配置Nginx配置文件更简单。
在云服务器上安装docker以及docker compose。
部署Nginx Proxy Manager
在云服务器中,部署Nginx Proxy Manager服务。 docker-compose.yml
文件内容如下:
version: "3"
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # HTTP端口
- '443:443' # HTTPS端口
- '81:81' # NPM管理界面端口
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
environment:
DB_SQLITE_FILE: "/data/database.sqlite"
启动成功后,如果你配置好了域名解析的话,在浏览器中访问
http://你的域名:81
打开NPM的管理界面,也可以使用http://云服务器公网IP:81
来打开NPM的管理界面。首次登录使用默认账号:
邮箱:
admin@example.com
密码:
changeme
登录后,系统会立即要求你修改管理员邮箱和密码,请务必进行修改。
申请并配置SSL证书
NPM内置了SSL证书申请功能,推荐在NPM中配置SSL证书。
在NPM管理界面(
:81
端口),点击 SSL Certificates > Add SSL Certificate > Let's Encrypt。填写你的域名:
在 Domain Names 中填写
weixr.cn
和www.weixr.cn
(每行一个或用英文逗号分隔,将域名改为你的域名)。
勾选 Use a DNS challenge 和 I agree to the Let's Encrypt Terms of Service。
DNS挑战验证:对于家庭宽带通常封锁80端口的情况,DNS验证是最可靠的方式。你需要根据你的域名注册商(阿里云)在NPM中配置相应的API凭证,以便Certbot自动添加TXT记录。
由于阿里云API的配置较为复杂,如果遇到困难,你可以选择在NPM中手动验证,然后根据提示到阿里云DNS解析设置中手动添加指定的TXT记录值。
点击 Save,NPM会自动尝试申请证书。成功后,你会在证书列表中看到它。
配置反向代理与域名访问
现在,你需要将域名指向Halo服务,并强制使用HTTPS。
在NPM管理界面,点击 Hosts > Proxy Hosts > Add Proxy Host。
进行如下配置:
Domain Names: 输入
weixr.cn
和www.weixr.cn
。Scheme:
http
Forward Hostname / IP: 填写你的飞牛OS主机在Docker网络内的IP地址(通常是
172.x.x.x
)或主机名。如果Halo和NPM在同一个Docker Compose项目中,你可以使用服务名halo
;否则,可能需要填写Halo容器的实际IP。一个简单的方法是填写飞牛OS的内网IPv4地址或localhost
。Forward Port:
8090
(Halo的服务端口)。
SSL标签页:
SSL Certificate: 选择你刚才申请的SSL证书(例如
weixr.cn
)。开启 Force SSL 和 HTTP/2 Support。
点击 Save,配置即刻生效。