Halo & https配置及ssl设置

之前一直懒得对站点增加 https 的支持。本文的方案希望在一台机器上完成所有功能,不去借助类似 vercel 等服务的部署,所有组件均运行在 docker 中,方便后续迁移和升级

在宝塔上想要使用https,本来是可以在网站设置里设置SSL的,但是halo需要用到反向代理,这里如果设置反向代理就不可以设置ssl,这里我推荐一个反向代理管理软件 Nginx Proxy Manager

Nginx Proxy Manager

同样我们可以在 官方文档 中找到 dcoker compose 的配置内容

你可以可以看下halo的新版的说明:与 Nginx Proxy Manager 配合使用 | Halo 文档

首先,我们创建一个文件夹来存放 NPM 的 docker-compose.yml 文件:

mkdir -p ~/data/docker_data/nginxproxymanager   # 创建一个 npm 的文件夹

cd ~/data/docker_data/nginxproxymanager    # 进入该文件夹

vi docker-compose.yml

在英文状态的输入法下,按下 i,左下角出现 --INSERT-- 后,粘贴填入下面的内容:

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 之后,就不需要再安装 Nginx 了,否则会端口冲突(不建议修改 NPM 的 80、443 端口)。如果你的服务器安装了宝塔面板,也可以和 NPM 一起使用,只要你到软件后台把宝塔安装的 Nginx 关闭或者卸载即可。

之后,同样在英文输入法下,按一下 esc,然后 :wq 保存退出。

启动 NPM:

docker-compose up -d     # -d 表示后台运行

docker compose up -d     # 如果你用的是 docker-compose-plugin 的话,用这条命令

不出意外,此时你使用 http://127.0.0.1:81 就可以访问 NPM 的网页端了。(注意把 127.0.0.1 替换成你实际服务器的 IP)

  1. 不知道服务器 IP,可以直接在命令行输入:curl ip.sb,会显示当前服务器的 IP。

  2. 遇到访问不了的情况,请再次检查在宝塔面板的防火墙和服务商的后台防火墙是否打开对应了端口

默认登陆的用户名:admin@example.com 密码:changeme

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

至此,我们已经完成了 Nginx Proxy Manager 的搭建,之后就可以用它给我们的 Halo 或者其他 Web 应用做反向代理了。

连接 docker 网络

目前我们已经创建了 halo、twikoo 以及 NPM 三个容器,但是这三个容器处于不同网段中,容器和容器之间互相不清楚如何建立连接,此时我们需要使用 docker network connet 网络 容器名 的方式进行联通

为了拿到 网络 和 容器名 我们需要用到如下两个指令

docker ps
# 最后一列 NAMES 既是容器名
CONTAINER ID   IMAGE                           ... NAMES
96772b04b474   jc21/nginx-proxy-manager:latest ... nginx-app-1
28cc2ee3cbf7   halohub/halo:2.8                ... halo
a0c44aaf8a4e   imaegoo/twikoo                  ... twikoo
8da3981f70ed   postgres:latest                 ... halodb
docker network ls
# 第二列 NAME 则是网络名
NETWORK ID     NAME                 DRIVER    SCOPE
c1646cd554fc   bridge               bridge    local
ac59c5c5cab8   halo2_halo_network   bridge    local
f266311bb0a9   host                 host      local
ebd8b3fce3d3   nginx_default        bridge    local
5eec799dd6a0   none                 null      local
4657be95c638   twikoo_default       bridge    local
673c83231bb2   www_default          bridge    local

后面我们需要配置 NPM 的反代规则,因此需要将 nginx-app-1 同时连接到 halo2_halo_network 和 twikoo_default 中,此时则需要运行 connet 指令

docker network connect halo2_halo_network nginx-app-1
docker network connect twikoo_default nginx-app-1

具体请以命令中实际显示的值为准,这里只作为示例展示

查看容器的具体 IP

到了这里我们已经做好了 docker bridge 内网跳发规则配好了,但是由于 NPM 运行在 docker 中,反代转发时,需要填写容器内部的 IP,也就是 halo 和 twikoo 容器所分配的具体 IP,此时需要使用 inspect 指令,查询容器的 ip

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' halo
172.18.0.3
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' twikoo
172.24.0.2

记住你电脑上的这两个值,等会要用

配置 Halo 的反向代理

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

jtjpnjig.webp

后面的跟着官方设置就可以了与 Nginx Proxy Manager 配合使用 | Halo 文档

参考文档:

Halo Twikoo 插件以及 ssl 部署 | L's Blog (liuocean.com)