使用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.18mysql8.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

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

配置

首先我们登录网页端之后,会弹出修改用户名和密码的对话框,我们根据自己的实际来修改自己的用户名和邮箱。

Nginx Proxy Manager 1

保存之后,会让我们修改密码(建议用一个复杂的密码)。

Nginx Proxy Manager 2

点击 Proxy Hosts

Nginx Proxy Manager 3

接着点击 Add Proxy Host,弹出如下对话框:

Nginx Proxy Manager 4

看起来都是英文,很复杂,但是其实很简单,我们只要用到其中的几个功能即可,这边稍微解释一下:

  • 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 自带的一个限制访问功能,这边我们不管,后续可以自行研究。

以下是一个样列:

Nginx Proxy Manager 5

因为样例的 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 访问。

Nginx Proxy Manager 6

Nginx Proxy Manager 7

如图所示,记得打开强制 SSL,其他四个的功能请自行研究,这边不多做讨论。

不出意外,你将成功申请到 SSL 证书,证书会三个月自动续期。

再次点开配置,查看一下,将强制 SSL 打开。

Nginx Proxy Manager 8

至此,你已经成功完成了 Halo 的反向代理,快尝试使用域名访问一下看看吧!