使用docker-compose部署halo和npm
写这个是因为之前的博客使用的是1panel的一键部署,结果在关掉反向代理后再也打不开了,博客就崩溃了!!!
因此我想在尽量不依靠1panel的方式部署halo
综上所述,我们开始吧。
推荐docker源:
https://dockerpull.com
https://docker.1panel.live
https://dockerproxy.cn
https://docker.hpcloud.cloud
参考文档:Halo 文档
1.新建用户
#root用户执行,以下blog可以修改成你自己想要的名字,这将提示你输入新用户的密码及其他信息。
adduser blog
#给新用户授予管理员权限(加入sudo组)
usermod -aG sudo blog
2.进入目录
#切换到blog
su blog
#切换到自己目录
cd ~
#新建一个用户并进入
mkdir ./halo
cd ./halo
3.编写halo的docker-compose文件
当前文件夹下创建一个docker-compose.yaml
,编写文件,这里使用了halo2.18
和mysql8.1.0
version: "3"
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.18
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
command:
- --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo
- --spring.r2dbc.username=root
# MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
- --spring.r2dbc.password=o#DwN&JSa56
- --spring.sql.init.platform=mysql
# 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/
halodb:
image: mysql:8.1.0
restart: on-failure: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
- ./mysqlBackup:/data/mysqlBackup
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
interval: 3s
retries: 5
start_period: 30s
environment:
# 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
- MYSQL_ROOT_PASSWORD=o#DwN&JSa56
- MYSQL_DATABASE=halo
networks:
halo_network:
写完之后输入以下指令
docker-compose up
此时你已经可以在你ip的8090端口下访问到你的halo,但是如果你需要域名,再配置一下npm
4.编写npm的docker-compose文件
新建文件夹
mkdir ./npm-docker
编写文件,写入以下内容
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
docker-compose up
不出意外,此时你使用服务器ip的81
端口就可以访问 NPM 的网页端了
5.访问npm网页端配置halo反向代理
一开始会让你登录
默认登录的用户名:admin@example.com
密码:changeme
第一次登录会提示更改用户名和密码,建议修改一个复杂一点的密码。
配置
首先我们登录网页端之后,会弹出修改用户名和密码的对话框,我们根据自己的实际来修改自己的用户名和邮箱。
保存之后,会让我们修改密码(建议用一个复杂的密码)。
点击 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
,为 Docker 容器内部的 IP 地址,
可以通过下面的命令查询:
ip addr show docker0
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:e4:a3:b5:b9 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
这边的 IP 是 172.17.0.1
,填入这个 IP,可以不用打开防火墙的 8090
端口。
当然,如果你的 NPM 和 Halo 不在同一台服务上,你需要在 IP 部分填入 你的 Halo 所在的服务器的 IP,并在服务商(部分服务商如腾讯、阿里)的后台打开 8090
端口。
一键申请 SSL 证书
接着我们来申请一张 SSL 证书,让我们的网站支持 https
访问。
如图所示,记得打开强制 SSL,其他四个的功能请自行研究,这边不多做讨论。
不出意外,你将成功申请到 SSL 证书,证书会三个月自动续期。
再次点开配置,查看一下,将强制 SSL 打开。
至此,你已经成功完成了 Halo 的反向代理,快尝试使用域名访问一下看看吧!