mirror of
https://github.com/halo-dev/docs.git
synced 2025-10-22 10:58:56 +00:00
docs: update documentation for Halo 2.3 (#196)
为 Halo 2.3 更新文档。 /kind documentation ```release-note None ```
This commit is contained in:
@@ -0,0 +1,346 @@
|
||||
---
|
||||
title: 使用 Docker Compose 部署
|
||||
description: 使用 Docker Compose 部署
|
||||
---
|
||||
|
||||
import DockerArgs from "./slots/docker-args.md"
|
||||
|
||||
:::info
|
||||
在继续操作之前,我们推荐您先阅读[《写在前面》](../prepare.md),这可以快速帮助你了解 Halo。
|
||||
:::
|
||||
|
||||
## 环境搭建
|
||||
|
||||
- Docker 安装文档:<https://docs.docker.com/engine/install/>
|
||||
- Docker Compose 安装文档:<https://docs.docker.com/compose/install/>
|
||||
|
||||
:::tip
|
||||
我们推荐按照 Docker 官方文档安装 Docker 和 Docker Compose,因为部分 Linux 发行版软件仓库中的 Docker 版本可能过旧。
|
||||
:::
|
||||
|
||||
## 创建容器组
|
||||
|
||||
可用的 Halo 2.3.0 的 Docker 镜像:
|
||||
|
||||
- [halohub/halo](https://hub.docker.com/r/halohub/halo)
|
||||
- [ghcr.io/halo-dev/halo](https://github.com/halo-dev/halo/pkgs/container/halo)
|
||||
|
||||
:::info 注意
|
||||
目前 Halo 2 并未更新 Docker 的 latest 标签镜像,主要因为 Halo 2 不兼容 1.x 版本,防止使用者误操作。我们推荐使用固定版本的标签,比如 `halohub/halo:2.3.0`。
|
||||
:::
|
||||
|
||||
1. 在系统任意位置创建一个文件夹,此文档以 `~/halo` 为例。
|
||||
|
||||
```bash
|
||||
mkdir ~/halo && cd ~/halo
|
||||
```
|
||||
|
||||
:::info
|
||||
注意:后续操作中,Halo 产生的所有数据都会保存在这个目录,请妥善保存。
|
||||
:::
|
||||
|
||||
2. 创建 `docker-compose.yaml`
|
||||
|
||||
此文档提供两种场景的 Docker Compose 配置文件,请根据你的需要**选择一种**。
|
||||
|
||||
:::info
|
||||
需要注意的是,此文档为了更加方便的管理配置,所有与 Halo 相关的配置都使用 Docker 环境变量代替,所以无需创建 application.yaml 文件。
|
||||
:::
|
||||
|
||||
1. 创建 Halo + PostgreSQL 的实例:
|
||||
|
||||
```yaml {24-34,51} title="~/halo/docker-compose.yaml"
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
halo:
|
||||
image: halohub/halo:2.3.0
|
||||
container_name: halo
|
||||
restart: on-failure:3
|
||||
depends_on:
|
||||
halodb:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
halo_network:
|
||||
volumes:
|
||||
- ./:/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: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/
|
||||
# 初始化的超级管理员用户名
|
||||
- --halo.security.initializer.superadminusername=admin
|
||||
# 初始化的超级管理员密码
|
||||
- --halo.security.initializer.superadminpassword=P@88w0rd
|
||||
halodb:
|
||||
image: postgres:latest
|
||||
container_name: halodb
|
||||
restart: on-failure:3
|
||||
networks:
|
||||
halo_network:
|
||||
volumes:
|
||||
- ./db:/var/lib/postgresql/data
|
||||
ports:
|
||||
- "5432:5432"
|
||||
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:
|
||||
```
|
||||
|
||||
2. 创建 Halo + MySQL 的实例:
|
||||
|
||||
```yaml {24-34,59} title="~/halo/docker-compose.yaml"
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
halo:
|
||||
image: halohub/halo:2.3.0
|
||||
container_name: halo
|
||||
restart: on-failure:3
|
||||
depends_on:
|
||||
halodb:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
halo_network:
|
||||
volumes:
|
||||
- ./:/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/
|
||||
# 初始化的超级管理员用户名
|
||||
- --halo.security.initializer.superadminusername=admin
|
||||
# 初始化的超级管理员密码
|
||||
- --halo.security.initializer.superadminpassword=P@88w0rd
|
||||
|
||||
halodb:
|
||||
image: mysql:8.0.31
|
||||
container_name: halodb
|
||||
restart: on-failure:3
|
||||
networks:
|
||||
halo_network:
|
||||
command:
|
||||
- --default-authentication-plugin=mysql_native_password
|
||||
- --character-set-server=utf8mb4
|
||||
- --collation-server=utf8mb4_general_ci
|
||||
- --explicit_defaults_for_timestamp=true
|
||||
volumes:
|
||||
- ./mysql:/var/lib/mysql
|
||||
- ./mysqlBackup:/data/mysqlBackup
|
||||
ports:
|
||||
- "3306:3306"
|
||||
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:
|
||||
```
|
||||
|
||||
3. 仅创建 Halo 实例(使用默认的 H2 数据库,**不推荐用于生产环境,建议体验和测试的时候使用**):
|
||||
|
||||
```yaml {19-24} title="~/halo/docker-compose.yaml"
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
halo:
|
||||
image: halohub/halo:2.3.0
|
||||
container_name: halo
|
||||
restart: on-failure:3
|
||||
volumes:
|
||||
- ./:/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:
|
||||
# 外部访问地址,请根据实际需要修改
|
||||
- --halo.external-url=http://localhost:8090/
|
||||
# 初始化的超级管理员用户名
|
||||
- --halo.security.initializer.superadminusername=admin
|
||||
# 初始化的超级管理员密码
|
||||
- --halo.security.initializer.superadminpassword=P@88w0rd
|
||||
```
|
||||
|
||||
参数详解:
|
||||
|
||||
<DockerArgs />
|
||||
|
||||
3. 启动 Halo 服务
|
||||
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
实时查看日志:
|
||||
|
||||
```bash
|
||||
docker-compose logs -f
|
||||
```
|
||||
|
||||
4. 用浏览器访问 `$HALO_EXTERNAL_URL/console/`(外部访问链接)即可进入 Halo 管理端。管理员用户名为 `admin`,登录密码为上方设置的 `HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD`。
|
||||
|
||||
:::tip
|
||||
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
|
||||
:::
|
||||
|
||||
## 更新容器组
|
||||
|
||||
1. 停止运行中的容器组
|
||||
|
||||
```bash
|
||||
cd ~/halo && docker-compose down
|
||||
```
|
||||
|
||||
2. 备份数据(重要)
|
||||
|
||||
```bash
|
||||
cp -r ~/halo ~/halo.archive
|
||||
```
|
||||
|
||||
> 需要注意的是,`halo.archive` 文件名不一定要根据此文档命名,这里仅仅是个示例。
|
||||
|
||||
3. 更新 Halo 服务
|
||||
|
||||
修改 `docker-compose.yaml` 中配置的镜像版本。
|
||||
|
||||
```yaml {3}
|
||||
services:
|
||||
halo:
|
||||
image: halohub/halo:2.3.0
|
||||
container_name: halo
|
||||
```
|
||||
|
||||
```bash
|
||||
docker-compose pull
|
||||
```
|
||||
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## 反向代理
|
||||
|
||||
你可以在下面的反向代理软件中任选一项,我们假设你已经安装好了其中一项,并对其的基本操作有一定了解。 如果你对它们没有任何了解,可以参考我们更为详细的反向代理文档:
|
||||
|
||||
1. 使用 [OneinStack](../install/other/oneinstack.md)
|
||||
2. 使用 [Nginx Proxy Manager](../install/other/nginxproxymanager.md)
|
||||
3. 使用 [Traefik](../install/other/traefik.md)
|
||||
|
||||
### Traefik
|
||||
|
||||
更新 halo 容器组的配置
|
||||
|
||||
1. `networks` 中引入已存在的网络 `traefik`(此网络需要 [提前创建](../install/other/traefik.md#创建-traefik))
|
||||
2. `services.halo.networks` 中添加网络 `traefik`
|
||||
3. 修改外部地址为你的域名
|
||||
4. 声明路由规则、开启 TLS
|
||||
|
||||
```yaml {4-5,16,20,25-31} showLineNumbers
|
||||
version: "3.8"
|
||||
|
||||
networks:
|
||||
traefik:
|
||||
external: true
|
||||
halo:
|
||||
|
||||
services:
|
||||
halo:
|
||||
image: halohub/halo:2.3.0
|
||||
container_name: halo
|
||||
restart: on-failure:3
|
||||
volumes:
|
||||
- ./:/root/.halo2
|
||||
networks:
|
||||
- traefik
|
||||
- halo
|
||||
command:
|
||||
# 外部访问地址,请根据实际需要修改
|
||||
- --halo.external-url=https://yourdomain.com
|
||||
# 初始化的超级管理员用户名
|
||||
- --halo.security.initializer.superadminusername=admin
|
||||
# 初始化的超级管理员密码
|
||||
- --halo.security.initializer.superadminpassword=P@88w0rd
|
||||
labels:
|
||||
traefik.enable: "true"
|
||||
traefik.docker.network: traefik
|
||||
traefik.http.routers.halo.rule: Host(`yourdomain.com`)
|
||||
traefik.http.routers.halo.tls: "true"
|
||||
traefik.http.routers.halo.tls.certresolver: myresolver
|
||||
traefik.http.services.halo.loadbalancer.server.port: 8090
|
||||
```
|
||||
|
||||
### Nginx
|
||||
|
||||
```nginx {2,7,10}
|
||||
upstream halo {
|
||||
server 127.0.0.1:8090;
|
||||
}
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name www.yourdomain.com;
|
||||
client_max_body_size 1024m;
|
||||
location / {
|
||||
proxy_pass http://halo;
|
||||
proxy_set_header HOST $host;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Caddy 2
|
||||
|
||||
```txt {1,5}
|
||||
www.yourdomain.com
|
||||
|
||||
encode gzip
|
||||
|
||||
reverse_proxy 127.0.0.1:8090
|
||||
```
|
108
versioned_docs/version-2.3/getting-started/install/docker.md
Normal file
108
versioned_docs/version-2.3/getting-started/install/docker.md
Normal file
@@ -0,0 +1,108 @@
|
||||
---
|
||||
title: 使用 Docker 部署
|
||||
description: 使用 Docker 部署
|
||||
---
|
||||
|
||||
import DockerArgs from "./slots/docker-args.md"
|
||||
|
||||
:::info
|
||||
在继续操作之前,我们推荐您先阅读[《写在前面》](../prepare),这可以快速帮助你了解 Halo。
|
||||
:::
|
||||
|
||||
:::tip
|
||||
此文档仅提供使用默认 H2 数据库的 Docker 运行方式,主要用于体验和测试,在生产环境我们不推荐使用 H2 数据库。
|
||||
|
||||
如果需要使用其他数据库部署,我们推荐使用 Docker Compose 部署:[使用 Docker Compose 部署](./docker-compose)
|
||||
:::
|
||||
|
||||
## 环境搭建
|
||||
|
||||
- Docker 安装文档:<https://docs.docker.com/engine/install/>
|
||||
|
||||
:::tip
|
||||
我们推荐按照 Docker 官方文档安装 Docker,因为部分 Linux 发行版软件仓库中的 Docker 版本可能过旧。
|
||||
:::
|
||||
|
||||
## 使用 Docker 镜像
|
||||
|
||||
可用的 Halo 2.3.0 的 Docker 镜像:
|
||||
|
||||
- [halohub/halo](https://hub.docker.com/r/halohub/halo)
|
||||
- [ghcr.io/halo-dev/halo](https://github.com/halo-dev/halo/pkgs/container/halo)
|
||||
|
||||
:::info 注意
|
||||
目前 Halo 2 并未更新 Docker 的 latest 标签镜像,主要因为 Halo 2 不兼容 1.x 版本,防止使用者误操作。我们推荐使用固定版本的标签,比如 `halohub/halo:2.3.0`。
|
||||
:::
|
||||
|
||||
1. 创建容器
|
||||
|
||||
```bash
|
||||
docker run \
|
||||
-it -d \
|
||||
--name halo \
|
||||
-p 8090:8090 \
|
||||
-v ~/.halo2:/root/.halo2 \
|
||||
halohub/halo:2.3.0 \
|
||||
--halo.external-url=http://localhost:8090/ \
|
||||
--halo.security.initializer.superadminusername=admin \
|
||||
--halo.security.initializer.superadminpassword=P@88w0rd
|
||||
```
|
||||
|
||||
:::info
|
||||
注意:此命令默认使用自带的 H2 Database 数据库。如需使用 PostgreSQL,请参考:[使用 Docker Compose 部署](./docker-compose)
|
||||
:::
|
||||
|
||||
- **-it**:开启输入功能并连接伪终端
|
||||
- **-d**:后台运行容器
|
||||
- **--name**:为容器指定一个名称
|
||||
- **-p**:端口映射,格式为 `主机(宿主)端口:容器端口` ,可在 `application.yaml` 配置。
|
||||
- **-v**:工作目录映射。形式为:`-v 宿主机路径:/root/.halo2`,后者不能修改。
|
||||
|
||||
变量详解:
|
||||
|
||||
<DockerArgs />
|
||||
|
||||
1. 用浏览器访问 `$HALO_EXTERNAL_URL/console/`(外部访问链接)即可进入 Halo 管理端。管理员用户名为 `admin`,登录密码为上方设置的 `HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD`。
|
||||
|
||||
:::tip
|
||||
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
|
||||
:::
|
||||
|
||||
## 升级版本
|
||||
|
||||
1. 拉取新版本镜像
|
||||
|
||||
```bash
|
||||
docker pull halohub/halo:2.3.0
|
||||
```
|
||||
|
||||
2. 停止运行中的容器
|
||||
|
||||
```bash
|
||||
docker stop halo
|
||||
docker rm halo
|
||||
```
|
||||
|
||||
3. 备份数据(重要)
|
||||
|
||||
```bash
|
||||
cp -r ~/.halo2 ~/halo2.archive
|
||||
```
|
||||
|
||||
> 需要注意的是,`halo2.archive` 文件名不一定要根据此文档命名,这里仅仅是个示例。
|
||||
|
||||
4. 更新 Halo
|
||||
|
||||
修改版本号后,按照最初安装的方式,重新创建容器即可。
|
||||
|
||||
```bash {6}
|
||||
docker run \
|
||||
-it -d \
|
||||
--name halo \
|
||||
-p 8090:8090 \
|
||||
-v ~/.halo2:/root/.halo2 \
|
||||
halohub/halo:2.3.0 \
|
||||
--halo.external-url=http://localhost:8090/ \
|
||||
--halo.security.initializer.superadminusername=admin \
|
||||
--halo.security.initializer.superadminpassword=P@88w0rd
|
||||
```
|
@@ -0,0 +1,164 @@
|
||||
---
|
||||
title: 与 Nginx Proxy Manager 配合使用
|
||||
description: 使用 Nginx Proxy Manager 管理 Halo 服务的反向代理
|
||||
---
|
||||
|
||||
### Halo 部署
|
||||
|
||||
参见 [使用 Docker Compose 部署](https://docs.halo.run/getting-started/install/docker-compose)
|
||||
|
||||
:::info
|
||||
`「反向代理」` 部分不进行操作,保证 Halo 服务运行无误即可。
|
||||
:::
|
||||
|
||||
### 简介
|
||||
|
||||
顾名思义,Nginx Proxy Manager 就是一个 Nginx 的代理管理器,它最大的特点是简单方便。
|
||||
|
||||
即使是没有 Nginx 基础的小伙伴,也能轻松地用它来完成反向代理的操作,而且因为自带面板,操作极其简单,非常适合配合 docker 搭建的应用使用。
|
||||
|
||||
Nginx Proxy Manager 后台还可以一键申请 SSL 证书,并且会自动续期,方便省心。
|
||||
|
||||
下面我们就来介绍如何用 Nginx Proxy Manger 来配合 Halo,实现反向代理和 HTTPS 访问。
|
||||
|
||||
### 安装 Nginx Proxy Manager
|
||||
|
||||
> 说明:默认你的服务器已经安装了 Docker 和 Docker Compose,如果你没有安装,可以参考:[使用 Docker Compose 部署](https://docs.halo.run/getting-started/install/docker-compose) 的环境搭建部分来进行安装。
|
||||
|
||||
点击下方链接进入 Nginx Proxy Manager(以下简称 NPM) 官网:<https://nginxproxymanager.com/>
|
||||
|
||||
我们可以直接选择 [快速安装](https://nginxproxymanager.com/guide/#quick-setup)。
|
||||
|
||||
首先,我们创建一个文件夹来存放 NPM 的 `docker-compose.yml` 文件:
|
||||
|
||||
```bash
|
||||
mkdir -p ~/data/docker_data/nginxproxymanager # 创建一个 npm 的文件夹
|
||||
|
||||
cd ~/data/docker_data/nginxproxymanager # 进入该文件夹
|
||||
|
||||
vi docker-compose.yml
|
||||
```
|
||||
|
||||
在英文状态的输入法下,按下 `i`,左下角出现 `--INSERT--` 后,粘贴填入下面的内容:
|
||||
|
||||
```yaml
|
||||
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:
|
||||
|
||||
```bash
|
||||
docker-compose up -d # -d 表示后台运行
|
||||
|
||||
docker compose up -d # 如果你用的是 docker-compose-plugin 的话,用这条命令
|
||||
```
|
||||
|
||||
不出意外,此时你使用 [http://127.0.0.1:81](http://127.0.0.1:81/) 就可以访问 NPM 的网页端了。(注意把 `127.0.0.1` 替换成你实际服务器的 IP)
|
||||
|
||||
:::info
|
||||
|
||||
1. 不知道服务器 IP,可以直接在命令行输入:curl ip.sb,会显示当前服务器的 IP。
|
||||
2. 遇到访问不了的情况,请再次检查在宝塔面板的防火墙和服务商的后台防火墙是否打开对应了端口。
|
||||
:::
|
||||
|
||||
默认登陆的用户名:`admin@example.com` 密码:`changeme`
|
||||
|
||||
第一次登陆会提示更改用户名和密码,建议修改一个复杂一点的密码。
|
||||
|
||||
至此,我们已经完成了 Nginx Proxy Manager 的搭建,之后就可以用它给我们的 Halo 或者其他 Web 应用做反向代理了。
|
||||
|
||||
### 配置 Halo 的反向代理
|
||||
|
||||
首先我们登陆网页端之后,会弹出修改用户名和密码的对话框,我们根据自己的实际来修改自己的用户名和邮箱。
|
||||
|
||||

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

|
||||
|
||||
接着我们就可以来给 Halo 来添加一个反向代理了。
|
||||
|
||||
点击 `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 地址,
|
||||
|
||||
可以通过下面的命令查询:
|
||||
|
||||
```bash
|
||||
ip addr show docker0
|
||||
```
|
||||
|
||||
```bash {3}
|
||||
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,其他四个的功能请自行研究,这边不多做讨论。
|
||||
|
||||
:::info
|
||||
|
||||
1. 申请证书需要你提前将域名解析到 NPM 所在的服务器的 IP 上;
|
||||
2. 如果你使用的是国内的服务器,默认 `80` 和 `443` 端口是关闭的,你需要备案之后才能使用;
|
||||
3. 如果你使用了 CloudFlare 的 DNS 服务,记得把小黄云关闭(即不开启 CDN)。
|
||||
:::
|
||||
|
||||
不出意外,你将成功申请到 SSL 证书,证书会三个月自动续期。
|
||||
|
||||
再次点开配置,查看一下,将强制 SSL 打开。
|
||||
|
||||

|
||||
|
||||
至此,你已经成功完成了 Halo 的反向代理,快尝试使用域名访问一下看看吧!
|
||||
|
||||
> 同样的,举一反三,试试把你的 NPM 也用一个域名来反向代理一下吧。(小提示:你需要再解析一个域名(可以是二级域名)到 NPM 所在的服务器上,反代页面需要填的 IP 可以填 docker 容器内的 IP 也可以填服务器的 IP,端口填 `81` 即可)
|
@@ -0,0 +1,274 @@
|
||||
---
|
||||
title: 与 OneinStack 配合使用
|
||||
description: 使用 OneinStack 管理 Halo 服务的反向代理
|
||||
---
|
||||
|
||||
## Halo 部署
|
||||
|
||||
参见 [使用 Docker Compose 部署](../docker-compose.md)
|
||||
|
||||
:::info
|
||||
`「反向代理」` 部分不进行操作,保证 Halo 服务运行无误即可。
|
||||
:::
|
||||
|
||||
## 通过 OneinStack 安装 Nginx
|
||||
|
||||
点击下方链接进入 OneinStack 官网,仅选择 `安装 Nginx`,其他的都可以取消选择。
|
||||
|
||||
<https://oneinstack.com/auto>
|
||||
|
||||
最后点击 `复制安装命令` 到服务器执行即可。如果你仅安装 Nginx,你的链接应该是这样:
|
||||
|
||||
```bash
|
||||
wget -c http://mirrors.linuxeye.com/oneinstack-full.tar.gz && tar xzf oneinstack-full.tar.gz && ./oneinstack/install.sh --nginx_option 1
|
||||
```
|
||||
|
||||
:::info
|
||||
这一步会经过编译安装,可能会导致安装时间很漫长,这主要取决于你服务器的性能。
|
||||
:::
|
||||
|
||||
出现下面的信息即代表安装成功:
|
||||
|
||||
```bash
|
||||
Nginx installed successfully!
|
||||
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
|
||||
Redirecting to /bin/systemctl start nginx.service
|
||||
####################Congratulations########################
|
||||
Total OneinStack Install Time: 5 minutes
|
||||
|
||||
Nginx install dir: /usr/local/nginx
|
||||
```
|
||||
|
||||
## 创建 vhost
|
||||
|
||||
> 即创建一个站点,你可以通过这样的方式在你的服务器创建无限个站点。接下来的目的就是创建一个站点,并反向代理到 Halo。这一步在此教程使用 `demo.halo.run` 这个域名做演示,实际情况请修改此域名。
|
||||
|
||||
1. 进入到 oneinstack 目录,执行 vhost 创建命令
|
||||
|
||||
```bash
|
||||
cd oneinstack
|
||||
```
|
||||
|
||||
```bash
|
||||
sh vhost.sh
|
||||
```
|
||||
|
||||
2. 按照提示选择或输入相关信息
|
||||
|
||||
```bash
|
||||
What Are You Doing?
|
||||
1. Use HTTP Only
|
||||
2. Use your own SSL Certificate and Key
|
||||
3. Use Let's Encrypt to Create SSL Certificate and Key
|
||||
q. Exit
|
||||
Please input the correct option:
|
||||
```
|
||||
|
||||
这一步是选择证书配置方式,如果你有自己的证书,输入 <kbd>2</kbd> 即可。如果需要使用 `Let's Encrypt` 申请证书,选择 <kbd>3</kbd> 即可。
|
||||
|
||||
```bash
|
||||
Please input domain(example: www.example.com):
|
||||
```
|
||||
|
||||
输入自己的域名即可,前提是已经提前解析好了域名。
|
||||
|
||||
```bash
|
||||
Please input the directory for the domain:demo.halo.run :
|
||||
(Default directory: /data/wwwroot/demo.halo.run):
|
||||
```
|
||||
|
||||
提示输入站点根目录,因为我们是使用 Nginx 的反向代理,所以这个目录是没有必要配置的,我们直接使用默认的即可(直接回车)。
|
||||
|
||||
```bash
|
||||
Do you want to add more domain name? [y/n]:
|
||||
```
|
||||
|
||||
是否需要添加其他域名,按照需要选择即可,如果不需要,输入 <kbd>n</kbd> 并回车确认。
|
||||
|
||||
```bash
|
||||
Do you want to add hotlink protection? [y/n]:
|
||||
```
|
||||
|
||||
是否需要做防盗链处理,按照需要选择即可。
|
||||
|
||||
```bash
|
||||
Allow Rewrite rule? [y/n]:
|
||||
```
|
||||
|
||||
路径重写配置,我们不需要,选择 <kbd>n</kbd> 回车确定即可。
|
||||
|
||||
```bash
|
||||
Allow Nginx/Tengine/OpenResty access_log? [y/n]:
|
||||
```
|
||||
|
||||
Nginx 的请求日志,建议选择 <kbd>y</kbd>。
|
||||
|
||||
这样就完成了 vhost 站点的创建,最终会输出站点的相关信息:
|
||||
|
||||
```bash
|
||||
Your domain: demo.halo.run
|
||||
Virtualhost conf: /usr/local/nginx/conf/vhost/demo.halo.run.conf
|
||||
Directory of: /data/wwwroot/demo.halo.run
|
||||
```
|
||||
|
||||
Nginx 的配置文件即 `/usr/local/nginx/conf/vhost/demo.halo.run.conf`。
|
||||
|
||||
## 修改 Nginx 配置文件
|
||||
|
||||
上方创建 vhost 的过程并没有创建反向代理的配置,所以需要我们自己修改一下配置文件。
|
||||
|
||||
1. 使用你熟悉的工具打开配置文件,此教程使用 vim。
|
||||
|
||||
```bash
|
||||
vim /usr/local/nginx/conf/vhost/demo.halo.run.conf
|
||||
```
|
||||
|
||||
2. 删除一些不必要的配置
|
||||
|
||||
```nginx
|
||||
location ~ [^/]\.php(/|$) {
|
||||
#fastcgi_pass remote_php_ip:9000;
|
||||
fastcgi_pass unix:/dev/shm/php-cgi.sock;
|
||||
fastcgi_index index.php;
|
||||
include fastcgi.conf;
|
||||
}
|
||||
```
|
||||
|
||||
此段配置是针对 php 应用的,所以可以删掉。
|
||||
|
||||
3. 添加 `upstream` 配置
|
||||
|
||||
在 `server` 的同级节点添加如下配置:
|
||||
|
||||
```nginx {2}
|
||||
upstream halo {
|
||||
server 127.0.0.1:8090;
|
||||
}
|
||||
```
|
||||
|
||||
4. 在 `server` 节点添加如下配置
|
||||
|
||||
```nginx {6}
|
||||
location / {
|
||||
proxy_set_header HOST $host;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_pass http://halo;
|
||||
}
|
||||
```
|
||||
|
||||
5. 修改 `location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$` 节点
|
||||
|
||||
```nginx {2}
|
||||
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
|
||||
proxy_pass http://halo;
|
||||
expires 30d;
|
||||
access_log off;
|
||||
}
|
||||
```
|
||||
|
||||
6. 修改 `location ~ .*\.(js|css)?$` 节点
|
||||
|
||||
```nginx {2}
|
||||
location ~ .*\.(js|css)?$ {
|
||||
proxy_pass http://halo;
|
||||
expires 7d;
|
||||
access_log off;
|
||||
}
|
||||
```
|
||||
|
||||
如果不按照第 5,6 步操作,请求一些图片或者样式文件不会经过 Halo,所以请不要忽略此配置。
|
||||
|
||||
7. 添加 acme.sh 续签验证路由
|
||||
|
||||
OneinStack 使用的 acme.sh 管理证书,如果你在创建 vhost 的时候选择了使用 `Let's Encrypt` 申请证书,那么 OneinStack 会在系统内添加一个定时任务去自动续签证书,acme.sh 默认验证站点所有权的方式为在站点根目录生成一个文件(.well-known)来做验证,由于配置了反向代理,所以在验证的时候是无法直接访问到站点目录下的 .well-known 文件夹下的验证文件的。需要添加如下配置:
|
||||
|
||||
```nginx {4}
|
||||
location ^~ /.well-known/acme-challenge/ {
|
||||
default_type "text/plain";
|
||||
allow all;
|
||||
root /data/wwwroot/demo.halo.run/;
|
||||
}
|
||||
```
|
||||
|
||||
至此,配置修改完毕,保存即可。最终你的配置文件可能如下面配置一样:
|
||||
|
||||
```nginx {2,20,29,34,41-47,51}
|
||||
upstream halo {
|
||||
server 127.0.0.1:8090;
|
||||
}
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
ssl_certificate /usr/local/nginx/conf/ssl/demo.halo.run.crt;
|
||||
ssl_certificate_key /usr/local/nginx/conf/ssl/demo.halo.run.key;
|
||||
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
|
||||
ssl_prefer_server_ciphers on;
|
||||
ssl_session_timeout 10m;
|
||||
ssl_session_cache builtin:1000 shared:SSL:10m;
|
||||
ssl_buffer_size 1400;
|
||||
add_header Strict-Transport-Security max-age=15768000;
|
||||
ssl_stapling on;
|
||||
ssl_stapling_verify on;
|
||||
server_name demo.halo.run;
|
||||
access_log /data/wwwlogs/demo.halo.run_nginx.log combined;
|
||||
index index.html index.htm index.php;
|
||||
root /data/wwwroot/demo.halo.run;
|
||||
if ($ssl_protocol = "") { return 301 https://$host$request_uri; }
|
||||
include /usr/local/nginx/conf/rewrite/none.conf;
|
||||
#error_page 404 /404.html;
|
||||
#error_page 502 /502.html;
|
||||
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
|
||||
proxy_pass http://halo;
|
||||
expires 30d;
|
||||
access_log off;
|
||||
}
|
||||
location ~ .*\.(js|css)?$ {
|
||||
proxy_pass http://halo;
|
||||
expires 7d;
|
||||
access_log off;
|
||||
}
|
||||
location ~ /(\.user\.ini|\.ht|\.git|\.svn|\.project|LICENSE|README\.md) {
|
||||
deny all;
|
||||
}
|
||||
location / {
|
||||
proxy_set_header HOST $host;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_pass http://halo;
|
||||
}
|
||||
location ^~ /.well-known/acme-challenge/ {
|
||||
default_type "text/plain";
|
||||
allow all;
|
||||
root /data/wwwroot/demo.halo.run/;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 重载 Nginx 使配置生效
|
||||
|
||||
验证 nginx 配置
|
||||
|
||||
```bash
|
||||
nginx -t
|
||||
```
|
||||
|
||||
如果输出如下提示则代表配置有效:
|
||||
|
||||
```bash
|
||||
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
|
||||
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
|
||||
```
|
||||
|
||||
重载 Nginx 配置:
|
||||
|
||||
```bash
|
||||
nginx -s reload
|
||||
```
|
||||
|
||||
至此,整个教程完毕,现在你可以访问域名检查是否已经配置成功。
|
@@ -0,0 +1,121 @@
|
||||
---
|
||||
title: 与 Traefik 配合使用
|
||||
description: 使用 Traefik 管理 Halo 服务的反向代理
|
||||
---
|
||||
|
||||
## Halo 部署
|
||||
|
||||
参见 [使用 Docker Compose 部署](../docker-compose.md)
|
||||
|
||||
:::info
|
||||
`「反向代理」` 部分不进行操作,保证 Halo 服务运行无误即可。
|
||||
:::
|
||||
|
||||
## 简介
|
||||
|
||||
[Traefik](https://traefik.io/traefik/) 是一款开源的反向代理与负载均衡工具,它监听后端的变化并自动更新服务配置。
|
||||
|
||||
它与传统反向代理最大的区别,是支持声明式的动态路由规则,大大简化网关规则的配置。而且还有诸多实用特性,例如:健康检查、多实例负载均衡、能够实现 Let's Encrypt 证书的自动签发、验证与续期等等。
|
||||
|
||||
## 创建 Traefik
|
||||
|
||||
下面的配置中,创建了 Traefik 实例。并且做了基础的几项配置:
|
||||
|
||||
1. 监听了宿主机的 80、443 端口,并自动将 80 端口的请求重定向到 443 端口。[文档](https://doc.traefik.io/traefik/routing/entrypoints/)
|
||||
2. 开启 Docker 服务发现,监听检测 Docker 容器声明的服务关系。[文档](https://doc.traefik.io/traefik/providers/docker/#provider-configuration)
|
||||
3. 开启 Traefik Dashboard,建议使用二级域名的形式(示例:`traefik.yourdomain.com`)。[文档](https://doc.traefik.io/traefik/operations/dashboard/#dashboard-router-rule)
|
||||
4. 开启证书自动生成,通过 ACME 自动管理 TLS 证书的申请、校验与续期。[文档](https://doc.traefik.io/traefik/https/acme/)
|
||||
|
||||
:::caution
|
||||
ACME 证书 (`/acme.json`) 一定要 [持久化](https://doc.traefik.io/traefik/https/acme/#storage),否则每次重启 Traefik 服务,都会去申请签发证书。可能会触发 Let's
|
||||
Encrypt 的 [速率限制](https://letsencrypt.org/zh-cn/docs/rate-limits/),导致签名的域名一段时间内无法签发新的证书。
|
||||
:::
|
||||
|
||||
```yaml {19,31,35,41} showLineNumbers
|
||||
version: "3.8"
|
||||
|
||||
networks:
|
||||
traefik:
|
||||
name: traefik
|
||||
attachable: true
|
||||
|
||||
services:
|
||||
traefik:
|
||||
image: traefik:v2.9
|
||||
container_name: traefik
|
||||
networks:
|
||||
- traefik
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- ./acme.json:/acme.json
|
||||
command: >
|
||||
--api.dashboard=true
|
||||
--entrypoints.web.address=:80
|
||||
--entrypoints.websecure.address=:443
|
||||
--entrypoints.web.http.redirections.entrypoint.to=websecure
|
||||
--entrypoints.web.http.redirections.entrypoint.scheme=https
|
||||
--providers.docker=true
|
||||
--providers.docker.endpoint=unix:///var/run/docker.sock
|
||||
--providers.docker.watch=true
|
||||
--providers.docker.exposedByDefault=false
|
||||
--certificatesResolvers.myresolver.acme.httpChallenge.entryPoint=web
|
||||
--certificatesresolvers.myresolver.acme.email=your-mail@mail.com
|
||||
labels:
|
||||
traefik.enable: "true"
|
||||
traefik.docker.network: traefik
|
||||
traefik.http.routers.dashboard.rule: Host(`traefik.yourdomain.com`)
|
||||
traefik.http.routers.dashboard.tls: "true"
|
||||
traefik.http.routers.dashboard.tls.certresolver: myresolver
|
||||
traefik.http.routers.dashboard.service: "api@internal"
|
||||
traefik.http.routers.dashboard.middlewares: auth
|
||||
# 账号密码 admin/P@88w0rd 生成 echo $(htpasswd -nb user password) | sed -e s/\\$/\\$\\$/g
|
||||
traefik.http.middlewares.auth.basicauth.users: "admin:$$apr1$$q8q0qpzT$$lvzMP7VYd9EUcG/wkIsAN."
|
||||
```
|
||||
|
||||
## 配置 Halo 的反向代理
|
||||
|
||||
这里以最简配置(h2 数据库)Halo 服务的 Docker 配置举例。只需做以下调整:
|
||||
|
||||
1. 顶层 `networks` 中添加了外部网络 `traefik`
|
||||
2. `services.halo.networks` 中添加了 `traefik` 网络
|
||||
3. `services.halo.labels` 中声明了 Traefik 配置
|
||||
1. 路由规则为 `yourdomain.com`
|
||||
2. 开启 TLS
|
||||
3. 指定了服务端口为 8090
|
||||
|
||||
```yaml {4-5,16,20,25-31} showLineNumbers
|
||||
version: "3.8"
|
||||
|
||||
networks:
|
||||
traefik:
|
||||
external: true
|
||||
halo:
|
||||
|
||||
services:
|
||||
halo:
|
||||
image: halohub/halo:2.3.0
|
||||
container_name: halo
|
||||
restart: on-failure:3
|
||||
volumes:
|
||||
- ./:/root/.halo2
|
||||
networks:
|
||||
- traefik
|
||||
- halo
|
||||
command:
|
||||
# 外部访问地址,请根据实际需要修改
|
||||
- --halo.external-url=https://yourdomain.com
|
||||
# 初始化的超级管理员用户名
|
||||
- --halo.security.initializer.superadminusername=admin
|
||||
# 初始化的超级管理员密码
|
||||
- --halo.security.initializer.superadminpassword=P@88w0rd
|
||||
labels:
|
||||
traefik.enable: "true"
|
||||
traefik.docker.network: traefik
|
||||
traefik.http.routers.halo.rule: Host(`yourdomain.com`)
|
||||
traefik.http.routers.halo.tls: "true"
|
||||
traefik.http.routers.halo.tls.certresolver: myresolver
|
||||
traefik.http.services.halo.loadbalancer.server.port: 8090
|
||||
```
|
@@ -0,0 +1,17 @@
|
||||
| 参数名 | 描述 |
|
||||
| ---------------------------------------------- | -------------------------------------------------------------------------------- |
|
||||
| `spring.r2dbc.url` | 数据库连接地址,详细可查阅下方的 `数据库配置` |
|
||||
| `spring.r2dbc.username` | 数据库用户名 |
|
||||
| `spring.r2dbc.password` | 数据库密码 |
|
||||
| `spring.sql.init.platform` | 数据库平台名称,支持 `postgresql`、`mysql`、`h2`,需要与 `SPRING_R2DBC_URL` 对应 |
|
||||
| `halo.external-url` | 外部访问链接,如果需要再公网访问,需要配置为实际访问地址 |
|
||||
| `halo.security.initializer.superadminusername` | 初始超级管理员用户名 |
|
||||
| `halo.security.initializer.superadminpassword` | 初始超级管理员密码 |
|
||||
|
||||
数据库配置:
|
||||
|
||||
| 链接方式 | 链接地址格式 | `SPRING_SQL_INIT_PLATFORM` |
|
||||
| ----------- | ---------------------------------------------------------------------------------- | -------------------------- |
|
||||
| PostgreSQL | `r2dbc:pool:postgresql://{HOST}:{PORT}/{DATABASE}` | postgresql |
|
||||
| MySQL | `r2dbc:pool:mysql://{HOST}:{PORT}/{DATABASE}` | mysql |
|
||||
| H2 Database | `r2dbc:h2:file:///${halo.work-dir}/db/halo-next?MODE=MySQL&DB_CLOSE_ON_EXIT=FALSE` | h2 |
|
Reference in New Issue
Block a user