From 89fb87557c1f1037ea3ba1ebd2997341d57984a0 Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Thu, 1 Dec 2022 09:33:51 +0800 Subject: [PATCH] docs: update documentation for Halo 2.0.0 (#125) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为 Halo 2.0 正式版更新文档。 /kind documentation ```release-note None ``` --- docs/developer-guide/core/run.md | 7 - .../getting-started/install/docker-compose.md | 226 +++++++------ docs/getting-started/install/docker.md | 78 +---- docs/getting-started/install/linux.md | 271 ---------------- .../getting-started/install/other/bt-panel.md | 149 --------- .../install/other/docker-mysql.md | 202 ------------ .../install/other/oneinstack.md | 300 +++++++++--------- .../install/other/tencent-cloudbase.md | 85 ----- docs/getting-started/install/third-party.md | 2 + docs/getting-started/install/windows.md | 79 ----- docs/getting-started/upgrade.md | 119 ------- docs/intro.md | 19 +- sidebars.js | 9 +- static/img/ali-pay.png | Bin 8850 -> 0 bytes static/img/wechat-pay.png | Bin 8708 -> 0 bytes 15 files changed, 315 insertions(+), 1231 deletions(-) delete mode 100644 docs/getting-started/install/linux.md delete mode 100644 docs/getting-started/install/other/bt-panel.md delete mode 100644 docs/getting-started/install/other/docker-mysql.md delete mode 100644 docs/getting-started/install/other/tencent-cloudbase.md delete mode 100644 docs/getting-started/install/windows.md delete mode 100644 docs/getting-started/upgrade.md delete mode 100644 static/img/ali-pay.png delete mode 100644 static/img/wechat-pay.png diff --git a/docs/developer-guide/core/run.md b/docs/developer-guide/core/run.md index ee425d3..540761e 100644 --- a/docs/developer-guide/core/run.md +++ b/docs/developer-guide/core/run.md @@ -103,10 +103,3 @@ VITE v3.1.6 ready in 638 ms ``` 6. 最终访问 `http://localhost:8090/console` 即可进入控制台。访问 `http://localhost:8090` 即可进入站点首页。 - -:::info 注意 -目前 RC 版本有以下几个使用注意事项: -::: - -1. 由于目前评论组件被插件化且暂不支持提供默认插件,所以如果要体验完整的评论功能,需要手动在后台安装 评论组件插件。 -2. 目前 2.0 已支持的主题和插件会同步到 ,你可以在对应仓库的 release 下载最新的主题或插件。 diff --git a/docs/getting-started/install/docker-compose.md b/docs/getting-started/install/docker-compose.md index c84b767..813245e 100644 --- a/docs/getting-started/install/docker-compose.md +++ b/docs/getting-started/install/docker-compose.md @@ -9,23 +9,23 @@ description: 使用 Docker Compose 部署 ## 创建容器组 -可用的 Halo 2.0.0-rc.1 的 Docker 镜像: +可用的 Halo 2.0.0 的 Docker 镜像: -- [halohub/halo-dev](https://hub.docker.com/r/halohub/halo-dev) -- [ghcr.io/halo-dev/halo-dev](https://github.com/halo-dev/halo/pkgs/container/halo-dev) +- [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.0 测试期间的镜像,正式发布之后会更改为 `halohub/halo` 和 `ghcr.io/halo-dev/halo`。 +目前 Halo 2.0 并未更新 Docker 的 latest 标签镜像,主要因为 2.0 不兼容 1.x 版本,防止使用者误操作。我们推荐使用固定版本的标签,比如 `halohub/halo:2.0.0`。 ::: -1. 在系统任意位置创建一个文件夹,此文档以 `~/halo-next` 为例。 +1. 在系统任意位置创建一个文件夹,此文档以 `~/halo` 为例。 ```bash - mkdir ~/halo-next && cd ~/halo-next + mkdir ~/halo && cd ~/halo ``` :::info - 注意:后续操作中,Halo 的所有相关数据都会保存在这个目录,请妥善保存。 + 注意:后续操作中,Halo 产生的所有数据都会保存在这个目录,请妥善保存。 ::: 2. 创建 `docker-compose.yaml` @@ -36,41 +36,74 @@ description: 使用 Docker Compose 部署 需要注意的是,此文档为了更加方便的管理配置,所有与 Halo 相关的配置都使用 Docker 环境变量代替,所以无需创建 application.yaml 文件。 ::: - 1. 仅创建 Halo 实例(使用默认的 H2 数据库): + 1. 创建 Halo + PostgreSQL 的实例: - ```yaml {13-20} + ```yaml {18-28,46} title="~/halo/docker-compose.yaml" version: "3" services: - halo_next: - image: halohub/halo-dev:2.0.0-rc.1 - container_name: halo_next + halo: + image: halohub/halo:2.0.0 + container_name: halo restart: on-failure:3 + depends_on: + halodb: + condition: service_healthy + networks: + halo_network: volumes: - ./:/root/.halo2 ports: - "8090:8090" environment: + - 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 + + networks: + halo_network: ``` - 2. 创建 Halo + PostgreSQL 的实例: + 2. 创建 Halo + MySQL 的实例: - ```yaml {18-28,46} + ```yaml version: "3" services: - halo_next: - image: halohub/halo-dev:2.0.0-rc.1 - container_name: halo_next + halo: + image: halohub/halo:2.0.0 + container_name: halo restart: on-failure:3 depends_on: - halo_db: + halodb: condition: service_healthy networks: halo_network: @@ -79,11 +112,11 @@ description: 使用 Docker Compose 部署 ports: - "8090:8090" environment: - - SPRING_R2DBC_URL=r2dbc:pool:postgresql://halo_db/halo - - SPRING_R2DBC_USERNAME=halo - # PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。 - - SPRING_R2DBC_PASSWORD=openpostgresql - - SPRING_SQL_INIT_PLATFORM=postgresql + - 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/ # 初始化的超级管理员用户名 @@ -91,48 +124,110 @@ description: 使用 Docker Compose 部署 # 初始化的超级管理员密码 - HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD=P@88w0rd - halo_db: - image: postgres:latest - container_name: halo_db + halodb: + image: mysql:8.0.27 + 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: - - ./db:/var/lib/postgresql/data + - ./mysql:/var/lib/mysql + - ./mysqlBackup:/data/mysqlBackup ports: - - "5432:5432" + - "3306:3306" healthcheck: - test: [ "CMD", "pg_isready" ] - interval: 10s - timeout: 5s + test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"] + interval: 3s retries: 5 + start_period: 30s environment: - - POSTGRES_PASSWORD=openpostgresql - - POSTGRES_USER=halo - - POSTGRES_DB=halo + # 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值 + - MYSQL_ROOT_PASSWORD=o#DwN&JSa56 + - MYSQL_DATABASE=halo networks: halo_network: ``` + 3. 仅创建 Halo 实例(使用默认的 H2 数据库,**不推荐用于生产环境,建议体验和测试的时候使用**): + + ```yaml {13-20} title="~/halo/docker-compose.yaml" + version: "3" + + services: + halo: + image: halohub/halo:2.0.0 + container_name: halo + restart: on-failure:3 + volumes: + - ./:/root/.halo2 + ports: + - "8090:8090" + environment: + # 外部访问地址,请根据实际需要修改 + - HALO_EXTERNAL_URL=http://localhost:8090/ + # 初始化的超级管理员用户名 + - HALO_SECURITY_INITIALIZER_SUPERADMINUSERNAME=admin + # 初始化的超级管理员密码 + - HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD=P@88w0rd + ``` + 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` 文件名不一定要根据此文档命名,这里仅仅是个示例。 -目前 RC 版本有以下几个使用注意事项: +3. 更新 Halo 服务 + + 修改 `docker-compose.yaml` 中配置的镜像版本。 -1. 由于目前评论组件被插件化且暂不支持提供默认插件,所以如果要体验完整的评论功能,需要手动在后台安装 评论组件插件。 -2. 目前 2.0 已支持的主题和插件会同步到 ,你可以在对应仓库的 release 下载最新的主题或插件。 + ```yaml {3} + services: + halo: + image: halohub/halo:2.0.0 + container_name: halo + ``` + + ```bash + docker-compose pull + ``` + + ```bash + docker-compose up -d + ``` ## 反向代理 @@ -140,7 +235,7 @@ description: 使用 Docker Compose 部署 ### Nginx -```nginx +```nginx {2,7,10} upstream halo { server 127.0.0.1:8090; } @@ -159,61 +254,12 @@ server { } ``` -### Caddy 1.x - -```txt -https://www.yourdomain.com { - gzip - tls your@email.com - proxy / localhost:8090 { - transparent - } -} -``` - -### Caddy 2.x +### Caddy 2 -```txt +```txt {1,5} www.yourdomain.com encode gzip reverse_proxy 127.0.0.1:8090 ``` - -以上配置都可以在 找到。 - -## 更新容器组 - -:::info -我们假设您的 Halo 服务容器是按照 [使用 Docker Compose 部署 Halo](docker-compose.md) 中的方式启动的。如有不同,请根据实际情况修改。 -::: - -1. 停止运行中的容器组 - - ```bash - cd ~/halo-next && docker-compose stop - ``` - -2. 备份数据(重要) - - ```bash - cp -r ~/halo-next ~/halo-next.archive - ``` - - > 需要注意的是,`halo-next.archive` 文件名不一定要根据此文档命名,这里仅仅是个示例。 - -3. 更新 Halo 服务 - - 修改 `docker-compose.yaml` 中配置的镜像版本。 - - ```yaml {3} - services: - halo_next: - image: halohub/halo-dev:2.0.0-rc.1 - container_name: halo_next - ``` - - ```bash - docker-compose pull && docker-compose up -d - ``` diff --git a/docs/getting-started/install/docker.md b/docs/getting-started/install/docker.md index 5fde393..c338271 100644 --- a/docs/getting-started/install/docker.md +++ b/docs/getting-started/install/docker.md @@ -4,29 +4,37 @@ description: 使用 Docker 部署 --- :::info -暂时我们仅提供使用 Docker 运行的文档。在继续操作之前,我们推荐您先阅读[《写在前面》](../prepare),这可以快速帮助你了解 Halo。 +在继续操作之前,我们推荐您先阅读[《写在前面》](../prepare),这可以快速帮助你了解 Halo。 +::: + +:::tip +此文档仅提供使用默认 H2 数据库的 Docker 运行方式,主要用于体验和测试,在生产环境我们不推荐使用 H2 数据库。 + +如果需要使用其他数据库部署,我们推荐使用 Docker Compose 部署:[使用 Docker Compose 部署](./docker-compose) ::: ## 使用 Docker 镜像 -可用的 Halo 2.0.0-rc.1 的 Docker 镜像: +可用的 Halo 2.0.0 的 Docker 镜像: -- [halohub/halo-dev](https://hub.docker.com/r/halohub/halo-dev) -- [ghcr.io/halo-dev/halo-dev](https://github.com/halo-dev/halo/pkgs/container/halo-dev) +- [halohub/halo](https://hub.docker.com/r/halohub/halo) +- [ghcr.io/halo-dev/halo](https://github.com/halo-dev/halo/pkgs/container/halo) -> 注意:以上两个镜像仅作为 Halo 2.0 测试期间的镜像,正式发布之后会更改为 `halohub/halo` 和 `ghcr.io/halo-dev/halo`。 +:::info 注意 +目前 Halo 2.0 并未更新 Docker 的 latest 标签镜像,主要因为 2.0 不兼容 1.x 版本,防止使用者误操作。我们推荐使用固定版本的标签,比如 `halohub/halo:2.0.0`。 +::: 1. 创建容器 ```bash docker run \ -it -d \ - --name halo-next \ + --name halo \ -p 8090:8090 \ -v ~/.halo2:/root/.halo2 \ -e HALO_EXTERNAL_URL=http://localhost:8090/ \ -e HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD=P@88w0rd \ - halohub/halo-dev:2.0.0-rc.1 + halohub/halo:2.0.0 ``` :::info @@ -47,59 +55,3 @@ description: 使用 Docker 部署 :::tip 如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。 ::: - -## 使用 - -目前 RC 版本有以下几个使用注意事项: - -1. 由于目前评论组件被插件化且暂不支持提供默认插件,所以如果要体验完整的评论功能,需要手动在后台安装 评论组件插件。 -2. 目前 2.0 已支持的主题和插件会同步到 ,你可以在对应仓库的 release 下载最新的主题或插件。 - -## 反向代理 - -你可以在下面的反向代理软件中任选一项,我们假设你已经安装好了其中一项,并对其的基本操作有一定了解。如果你对 Nginx 不熟悉,我们推荐使用 [OneinStack](./other/oneinstack) 来管理 Nginx。 - -### Nginx - -```nginx -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 1.x - -```txt -https://www.yourdomain.com { - gzip - tls your@email.com - proxy / localhost:8090 { - transparent - } -} -``` - -### Caddy 2.x - -```txt -www.yourdomain.com - -encode gzip - -reverse_proxy 127.0.0.1:8090 -``` - -以上配置都可以在 找到。 diff --git a/docs/getting-started/install/linux.md b/docs/getting-started/install/linux.md deleted file mode 100644 index 0f2db9b..0000000 --- a/docs/getting-started/install/linux.md +++ /dev/null @@ -1,271 +0,0 @@ ---- -title: 在 Linux 环境部署 -description: 在 Linux 上快速安装 Halo ---- - -:::info -在继续操作之前,我们推荐您先阅读[《写在前面》](../prepare),这可以快速帮助你了解 Halo。 -::: - -## 依赖检查 - -目前运行 Halo 的最低依赖要求为 JRE 11,请务必确保在进行下面操作之前已经正确安装了 JRE。 - -目前介绍两种 Linux 发行版的安装方式,均为 OpenJRE,不推荐 Oracle 版本。 - -### CentOS - -```bash -sudo yum install java-17-openjdk -y -``` - -检查版本: - -```bash -java -version -``` - -如果输出以下类似内容即代表成功 - -```bash -openjdk version "17.0.4.1" 2022-08-12 -OpenJDK Runtime Environment Homebrew (build 17.0.4.1+1) -OpenJDK 64-Bit Server VM Homebrew (build 17.0.4.1+1, mixed mode, sharing) -``` - -### Ubuntu - -```bash -sudo apt-get install openjdk-17-jre -y -``` - -检查版本: - -```bash -java -version -``` - -如果输出以下类似内容即代表成功 - -```bash -openjdk version "17.0.4.1" 2022-08-12 -OpenJDK Runtime Environment Homebrew (build 17.0.4.1+1) -OpenJDK 64-Bit Server VM Homebrew (build 17.0.4.1+1, mixed mode, sharing) -``` - -## 安装 - -1. 创建新的系统用户 - - :::info - 我们不推荐直接使用系统 root 用户来运行 Halo。如果您需要直接使用 root 用户,请跳过这一步。 - ::: - - 创建一个名为 halo 的用户(名字可以随意) - - ```bash - useradd -m halo - ``` - - 给予 sudo 权限 - - ```bash - usermod -aG wheel halo - ``` - - 为 halo 用户创建密码 - - ```bash - passwd halo - ``` - - 登录到 halo 账户 - - ```bash - su - halo - ``` - -2. 创建存放 [运行包](../prepare#运行包) 的目录,这里以 `~/app` 为例 - - ```bash - mkdir ~/app && cd ~/app - ``` - -3. 下载运行包 - - ```bash - wget https://dl.halo.run/prerelease/halo-2.0-alpha.1.jar -O halo.jar - ``` - - :::info - 如果下载速度不理想,可以 [在这里](../downloads) 选择其他下载地址。 - ::: - -4. 创建 [工作目录](../prepare#工作目录) - - ```bash - mkdir ~/halo-next && cd ~/halo-next - ``` - -5. 下载示例配置文件到 [工作目录](../prepare#工作目录) - - ```bash - wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml - ``` - -6. 编辑配置文件,配置数据库或者端口等,如需配置请参考 [配置参考](../config) - - ```bash - vim application.yaml - ``` - -7. 测试运行 Halo - - ```bash - cd ~/app && java -jar halo.jar - ``` - -8. 如看到类似以下日志输出,则代表启动成功。 - - ```bash - run.halo.app.listener.StartedListener : Halo started at http://127.0.0.1:8090 - run.halo.app.listener.StartedListener : Halo admin started at http://127.0.0.1:8090/admin - run.halo.app.listener.StartedListener : Halo has started successfully! - ``` - - 打开 `http://ip:端口号` 即可看到安装引导界面。 - - :::info - 如测试启动正常,请继续看`作为服务运行`部分,第 8 步仅仅作为测试。当你关闭 ssh 连接之后,服务会停止。你可使用 CTRL+C 停止运行测试进程。 - ::: - - :::tip - 如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip: 端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。 - ::: - -## 作为服务运行 - -1. 退出 halo 账户,登录到 root 账户 - - > 如果当前就是 root 账户,请略过此步骤。 - - ```bash - exit - ``` - -2. 下载 Halo 官方的 halo.service 模板 - - ```bash - wget https://dl.halo.run/config/halo.service -O /etc/systemd/system/halo.service - ``` - -3. 修改 halo.service - - ```bash - vim /etc/systemd/system/halo.service - ``` - -4. 修改配置 - - - **YOUR_JAR_PATH**:Halo 运行包的绝对路径,例如 `/home/halo/app/halo.jar`,注意:此路径不支持 `~` 符号。 - - **USER**:运行 Halo 的系统用户,如果有按照上方教程创建新的用户来运行 Halo,修改为你创建的用户名称即可。反之请删除 `User=USER`。 - - ```ini - [Unit] - Description=Halo Service - Documentation=https://halo.run - After=network-online.target - Wants=network-online.target - - [Service] - Type=simple - User=USER - ExecStart=/usr/bin/java -server -Xms256m -Xmx256m -jar YOUR_JAR_PATH - ExecStop=/bin/kill -s QUIT $MAINPID - Restart=always - StandOutput=syslog - - StandError=inherit - - [Install] - WantedBy=multi-user.target - ``` - - :::tip - 请确保 `/usr/bin/java` 是正确无误的。建议将 `ExecStart` 中的命令复制出来运行一下,保证命令有效。 - ::: - -5. 重新加载 systemd - - ```bash - systemctl daemon-reload - ``` - -6. 运行服务 - - ```bash - systemctl start halo - ``` - -7. 在系统启动时启动服务 - - ```bash - systemctl enable halo - ``` - - 您可以查看服务日志检查启动状态 - - ```bash - journalctl -n 20 -u halo - ``` - -## 反向代理 - -你可以在下面的反向代理软件中任选一项,我们假设你已经安装好了其中一项,并对其基本操作有一定了解。如果你对 Nginx 不熟悉,我们推荐使用 [OneinStack](./other/oneinstack) 来管理 Nginx。 - -### Nginx - -```nginx -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; - } -} -``` - -注意:Nginx 默认的 `client_max_body_size` 配置大小为 1m,可能会导致你在 Halo 后台上传文件被 Nginx 限制,所以此示例配置文件加上了 `client_max_body_size 1024m;` 这行配置。当然,1024m 可根据你的需要自行修改。 - -### Caddy 1.x - -```txt -https://www.yourdomain.com { - gzip - tls your@email.com - proxy / localhost:8090 { - transparent - } -} -``` - -### Caddy 2.x - -```txt -www.yourdomain.com - -encode gzip - -reverse_proxy 127.0.0.1:8090 -``` - -以上配置都可以在 找到。 diff --git a/docs/getting-started/install/other/bt-panel.md b/docs/getting-started/install/other/bt-panel.md deleted file mode 100644 index a403fda..0000000 --- a/docs/getting-started/install/other/bt-panel.md +++ /dev/null @@ -1,149 +0,0 @@ ---- -title: 与宝塔面板配合使用 -description: 与宝塔面板配合使用的指南 ---- - -## 声明 - -1. 本组织与宝塔面板官方无任何合作和利益关系。 -2. 您在使用期间如果有宝塔面板所带来的问题,均与我们无关。 -3. 开始之前,我们默认认为您已经安装好了宝塔面板,以及熟悉宝塔面板的使用。 -4. 建议使用宝塔面板最新版本,截止到撰写指南的时刻,宝塔面板的版本为 `7.4.7`。 - -## Halo 部署 - -参见 [在 Linux 环境部署](/getting-started/install/linux) - -:::info -`「作为服务运行」` 部分可以不进行操作,只需测试启动无误即可,后面将使用宝塔面板软件包中的 `Supervisor` 托管 Halo 进程。 -::: - -## 宝塔面板所需软件包下载 - -需要在宝塔面板的软件商店安装的软件包有: - -1. Nginx -2. Supervisor - -## 使用 Supervisor 托管 Halo 进程 - -打开 Supervisor 管理器的设置,点击 `添加守护进程` 按钮。 - -需要填写的表单信息如下: - -- **名称**:随意 -- **启动用户**:如果您按照 [在 Linux 环境部署](/getting-started/install/linux) 创建了用于运行 Halo 的用户,则选择您创建的用户即可。否则选择默认的 root。 -- **运行目录**:运行包的存放目录,按照实际情况填写,需要保证你所选的目录包含运行包。 -- **启动命令**:`java -server -Xms256m -Xmx256m -jar halo.jar` - -填写完成之后点击 `确定` 按钮即可。 - -## 添加站点并配置 Nginx - -1. 点击左侧的 `网站` 菜单项,点击 `添加站点` 按钮。 - -需要填写的表单信息如下: - -- **域名**:填写您已经解析到当前服务器公网 IP 的域名。 -- **PHP版本**:纯静态 - -填写完成之后点击 `提交` 按钮即可。 - -2. 设置 SSL - -:::info -在配置反向代理之前,我们推荐先设置好 SSL 证书。 -::: - -- 可选择 `宝塔 SSL` 或者 `Let's Encrypt` 进行证书申请。 -- 需要开启右上角的 `强制 HTTPS`。 - -3. 修改配置文件 - -在根节点添加: - -```nginx -upstream halo { - server 127.0.0.1:8090; -} -``` - -> 其中的 8090 为 Halo 的运行端口,请按需修改。 - -在 server 节点添加: - -```nginx -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; -} -``` - -修改 server 节点中的 `location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$` 节点: - -```nginx -location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ -{ - proxy_pass http://halo; - expires 30d; - error_log /dev/null; - access_log off; -} -``` - -修改 server 节点中的 `location ~ .*\.(js|css)?$` 节点: - -```nginx -location ~ .*\.(js|css)?$ -{ - proxy_pass http://halo; - expires 12h; - error_log /dev/null; - access_log off; -} -``` - -完整配置文件示例(仅包含关键部分): - -```nginx -upstream halo { - server 127.0.0.1:8090; -} -server -{ - ... - - location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ - { - proxy_pass http://halo; - expires 30d; - error_log /dev/null; - access_log off; - } - - location ~ .*\.(js|css)?$ - { - proxy_pass http://halo; - expires 12h; - error_log /dev/null; - access_log off; - } - - 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; - } - - ... -} -``` - -随后点击保存即可。如果配置不生效,请重载 Nginx 或者 重启 Nginx。 - -最后,访问域名即可进行 Halo 的初始化。 diff --git a/docs/getting-started/install/other/docker-mysql.md b/docs/getting-started/install/other/docker-mysql.md deleted file mode 100644 index 606da69..0000000 --- a/docs/getting-started/install/other/docker-mysql.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -title: 使用 Docker 部署 Halo 和 MySQL -description: Halo 与 MySQL 在 Docker 中的部署方案 ---- - -### 简介 - -该章节我们将分三种情况为您说明该如何同时使用 Docker + MySQL 来部署 Halo - -前提条件: 我们默认您的机器上已经安装好 `Docker` - -- 如果你想完全通过 `Docker` 运行 `MySQL` 和 `Halo` 请参考小节《统一使用 Docker 安装》 -- 如果你已经有 `Docker`部署的 `MySQL`,想安装 `Halo` 请参考小节《MySQL 部署在 Docker 如何使用 Docker 安装 Halo》 -- 如果你已有 `MySQL` 但部署在宿主机,想通过 `Docker` 安装 `Halo` 请参考小节《MySQL 在宿主机如何通过 Docker 安装 Halo》 - -### 统一使用 Docker 安装 - -如果你的机器上没有现成的 `MySQL` 可供使用,那么您可以选择使用 `Docker` 来运行 `MySQL` 和 `Halo` - -1. 创建 Docker 自定义桥接网络 - -```shell -docker network create halo-net -``` - -:::tip -如果你之前有 Docker 使用经验,你可能已经习惯了使用 `--link` 参数来使容器互联。 - -但随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 --link 参数。 -Docker 官方文档中称:该--link 标志是 Docker 的遗留功能。它可能最终会被删除。除非您确定需要继续使用它,否则我们建议您使用用户定义的网络来促进两个容器之间的通信,而不是使用 --link。 -::: - -2. 拉取 `MySQL` 镜像 - -```shell -docker pull mysql:8.0.27 -``` - -3. 创建 `MySQL` 数据目录 - -```shell -mkdir -p ~/.halo/mysql -``` - -3. 启动 `MySQL` 实例 - -```shell -docker run --name some-mysql -v ~/.halo/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw --net halo-net --restart=unless-stopped -d mysql:8.0.27 -``` - -注意: 请将 `my-secret-pw` 修改为自己需要的密码后再执行,密码尽量包含小写字母、大写字母、数字和特殊字符且长度超过 8 位。 - -:::tip 释意 - -`-e MYSQL_ROOT_PASSWORD=my-secret-pw`: 指定`MySQL`的登录密码为 `my-secret-pw` - -`-v ~/.halo/mysql:/var/lib/mysql` 命令: 将宿主机的目录 `~/.halo/mysql` 挂载到容器内部的目录 `/var/lib/mysql`,默认情况下 MySQL 将向 `~/.halo/mysql` 写入其数据文件。 - -`--net halo-net`: 将该容器加入到 `halo-net` 网络,连接到 `halo-net` 网络的任何其他容器都可以访问 `some-mysql`容器上的所有端口。 - -::: - -4. 进入 MySQL 容器中登录 MySQL 并创建 Halo 需要的数据库 - -- (1) some-mysql 为 MySQL 实例的容器名称 - - ```shell - docker exec -it some-mysql /bin/bash - ``` - -- (2) 登录 MySQL - - ```shell - mysql -u root -p - ``` - -- (3) 输入 MySQL 数据库密码 - -- (4) 创建数据库 - - ```shell - create database halodb character set utf8mb4 collate utf8mb4_bin; - ``` - -- (5) 使用 `exit`退出`MySQL` 并退出容器 - -5. 创建 `Halo` 工作目录 - -```bash -mkdir ~/.halo && cd ~/.halo -``` - -6. 下载示例配置文件到[工作目录](https://docs.halo.run/getting-started/prepare#工作目录) - -```shell -wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml -``` - -7. 编辑配置文件,配置数据库,其他配置请参考[参考配置](https://docs.halo.run/getting-started/config) - -```shell -vim application.yaml -``` - -你需要做如下几个步骤: - -- 注释 H2 database configuration.部分 -- 启用 MySQL database configuration.部分 -- 修改 datasource 下的 url 中的 ip 地址部分为容器名称并修改密码为您设定的 `MySQL` 密码 - -修改后的内容如下: - -```yaml -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://some-mysql:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true - username: root - password: my-secret-pw -``` - -8. 创建 Halo 容器实例 - -```shell -docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --net halo-net --restart=unless-stopped halohub/halo:1.5.4 -``` - -9. 打开 `http://ip:端口号` 即可看到安装引导界面。 - -### MySQL 部署在 Docker 如何使用 Docker 安装 Halo - -如果您已有 `Docker` 部署的 `MySQL` 实例,那么为了保证 `Halo` 和 `MySQL` 两个容器的网络可以互通,和上文同样的思路可以创建一个网络让 `MySQL` 和 `Halo` 都加入进来。 - -1. 使用 `docker ps` 来查看的你 `MySQL` 容器实例的名称或 `container id`, 例如 `some-mysql` -2. 创建一个桥接网络,让 `MySQL` 加入,首先使用 `docker network ls` 来查看一下都有哪些网络名称,起一个不会冲突的网络名称,例如 `halo-net`,其次让已经存在的 MySQL 容器实例加入到该网络中 - -```shell -docker network connect halo-net some-mysql -``` - -3. 同之前一样创建 `Halo` 工作目录 - -```bash -mkdir ~/.halo && cd ~/.halo -``` - -4. 下载示例配置文件到[工作目录](https://docs.halo.run/getting-started/prepare#工作目录) - -```shell -wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml -``` - -5. 编辑配置文件,修改 `MySQL` 的数据库连接和密码 - -```shell -vim application.yaml -``` - -你需要做如下几个步骤: - -- 注释 H2 database configuration.部分 -- 启用 MySQL database configuration.部分 -- 修改 datasource 下的 url 中的 ip 地址部分为容器名称并修改密码为您设定的 `MySQL` 密码 - -修改后的内容如下: - -```yaml -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://some-mysql:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true - username: root - password: my-secret-pw -``` - -6. 创建 `Halo` 容器实例,并使用 `--net` 指定网络为刚才创建的`halo-net` - -```shell -docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --net halo-net --restart=unless-stopped halohub/halo:1.5.4 -``` - -### MySQL 在宿主机如何通过 Docker 安装 Halo - -如果你已有 `MySQL` 但安装在宿主机,你想使用 `Docker` 安装 `Halo` 那么此时为了保证 `MySQL` 和 `Halo` 能网络互通,可以使用 `host` 网络模式即 `--net host`。 - -1. 创建 `Halo` 的工作目录 - -```shell -mkdir ~/.halo && cd ~/.halo -``` - -2. 拉取配置 - -```shell -wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml -``` - -3. 使用 `Docker` 启动 `Halo` 实例并指定网络模式为 `host` - -```shell -docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --net host --restart=unless-stopped halohub/halo:1.5.4 -``` diff --git a/docs/getting-started/install/other/oneinstack.md b/docs/getting-started/install/other/oneinstack.md index df3a688..c2bfb93 100644 --- a/docs/getting-started/install/other/oneinstack.md +++ b/docs/getting-started/install/other/oneinstack.md @@ -1,11 +1,11 @@ --- title: 与 OneinStack 配合使用 -description: 使用 OneinStack 的 vhost 脚本创建 Halo 站点的 Nginx 配置文件 +description: 使用 OneinStack 管理 Halo 服务的反向代理 --- ## Halo 部署 -参见 [在 Linux 环境部署](../linux.md) +参见 [使用 Docker Compose 部署](../docker-compose.md) :::info `「反向代理」` 部分不进行操作,保证 Halo 服务运行无误即可。 @@ -45,73 +45,73 @@ Nginx install dir: /usr/local/nginx 1. 进入到 oneinstack 目录,执行 vhost 创建命令 -```bash -cd oneinstack -``` + ```bash + cd oneinstack + ``` -```bash -sh vhost.sh -``` + ```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: -``` + ```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: + ``` -这一步是选择证书配置方式,如果你有自己的证书,输入 2 即可。如果需要使用 `Let's Encrypt` 申请证书,选择 3 即可。 + 这一步是选择证书配置方式,如果你有自己的证书,输入 2 即可。如果需要使用 `Let's Encrypt` 申请证书,选择 3 即可。 -```bash -Please input domain(example: www.example.com): -``` + ```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): -``` + ```bash + Please input the directory for the domain:demo.halo.run : + (Default directory: /data/wwwroot/demo.halo.run): + ``` -提示输入站点根目录,因为我们是使用 Nginx 的反向代理,所以这个目录是没有必要配置的,我们直接使用默认的即可(直接回车)。 + 提示输入站点根目录,因为我们是使用 Nginx 的反向代理,所以这个目录是没有必要配置的,我们直接使用默认的即可(直接回车)。 -```bash -Do you want to add more domain name? [y/n]: -``` + ```bash + Do you want to add more domain name? [y/n]: + ``` -是否需要添加其他域名,按照需要选择即可,如果不需要,输入 n 并回车确认。 + 是否需要添加其他域名,按照需要选择即可,如果不需要,输入 n 并回车确认。 -```bash -Do you want to add hotlink protection? [y/n]: -``` + ```bash + Do you want to add hotlink protection? [y/n]: + ``` -是否需要做防盗链处理,按照需要选择即可。 + 是否需要做防盗链处理,按照需要选择即可。 -```bash -Allow Rewrite rule? [y/n]: -``` + ```bash + Allow Rewrite rule? [y/n]: + ``` -路径重写配置,我们不需要,选择 n 回车确定即可。 + 路径重写配置,我们不需要,选择 n 回车确定即可。 -```bash -Allow Nginx/Tengine/OpenResty access_log? [y/n]: -``` + ```bash + Allow Nginx/Tengine/OpenResty access_log? [y/n]: + ``` -Nginx 的请求日志,建议选择 y。 + Nginx 的请求日志,建议选择 y。 -这样就完成了 vhost 站点的创建,最终会输出站点的相关信息: + 这样就完成了 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 -``` + ```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 的配置文件即 `/usr/local/nginx/conf/vhost/demo.halo.run.conf`。 ## 修改 Nginx 配置文件 @@ -119,136 +119,136 @@ Nginx 的配置文件即 `/usr/local/nginx/conf/vhost/demo.halo.run.conf`。 1. 使用你熟悉的工具打开配置文件,此教程使用 vim。 -```bash -vim /usr/local/nginx/conf/vhost/demo.halo.run.conf -``` + ```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; -} -``` + ```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 应用的,所以可以删掉。 + 此段配置是针对 php 应用的,所以可以删掉。 3. 添加 `upstream` 配置 -在 `server` 的同级节点添加如下配置: + 在 `server` 的同级节点添加如下配置: -```nginx -upstream halo { - server 127.0.0.1:8090; -} -``` + ```nginx {2} + upstream halo { + server 127.0.0.1:8090; + } + ``` 4. 在 `server` 节点添加如下配置 -```nginx -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; -} -``` + ```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 -location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ { - proxy_pass http://halo; - expires 30d; - access_log off; -} -``` - -6. 修改 `location ~ .*\.(js|css)?$` 节点 - -```nginx -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 -location ^~ /.well-known/acme-challenge/ { - default_type "text/plain"; - allow all; - root /data/wwwroot/demo.halo.run/; -} -``` - -至此,配置修改完毕,保存即可。最终你的配置文件可能如下面配置一样: - -```nginx -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; + ```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; } - 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; - } + ``` + + 如果不按照第 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 使配置生效 diff --git a/docs/getting-started/install/other/tencent-cloudbase.md b/docs/getting-started/install/other/tencent-cloudbase.md deleted file mode 100644 index 681f4b2..0000000 --- a/docs/getting-started/install/other/tencent-cloudbase.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: 腾讯云 CloudBase -description: 使用腾讯云 CloudBase 一键部署 ---- - -## 声明 - -1. 本组织与腾讯云官方无任何合作和利益关系。 -2. 您在使用期间如果有腾讯云所带来的问题,均与我们无关。 -3. 开始之前,我们默认认为您已经了解过 [腾讯云云开发](https://cloud.tencent.com/product/tcb)。 - -## 注意事项 - -1. 系统使用内置的 H2 Database,暂不支持使用 MySQL。 -1. 工作目录保存在腾讯云提供的 CFS 上,在使用此方式创建应用的时候会要求创建 CFS。 -1. 目前使用该方式部署,不支持修改 [配置文件](/getting-started/config)。 -1. 费用相关请参考 - -## 进入云开发页面 - -点击下方按钮即可进入到腾讯云云开发 CloudBase 创建应用界面,此按钮可在云开发页面自动选择 Halo 的配置模板。 - -### GitHub - -[![CloudBase](https://main.qcloudimg.com/raw/67f5a389f1ac6f3b4d04c7256438e44f.svg)](https://console.cloud.tencent.com/tcb/env/index?action=CreateAndDeployCloudBaseProject&appUrl=https%3A%2F%2Fgithub.com%2Fhalo-dev%2Ftencent-cloudbase-halo&branch=master) - -### Gitee - -[![CloudBase](https://main.qcloudimg.com/raw/67f5a389f1ac6f3b4d04c7256438e44f.svg)](https://console.cloud.tencent.com/tcb/env/index?action=CreateAndDeployCloudBaseProject&appUrl=https%3A%2F%2Fgitee.com%2Fhalo-dev%2Ftencent-cloudbase-halo&branch=master) - -## 配置并部署 - -**填写环境名称**,这里建议把 `开启免费额度` 打开,然后点击下一步。 - -![tencent-cloudbase-1.png](/img/tencent-cloudbase/tencent-cloudbase-1.png) - -**应用配置**,需要注意:这里需要开通 CFS,用于存储 Halo 的工作目录。 - -![tencent-cloudbase-2.png](/img/tencent-cloudbase/tencent-cloudbase-2.png) - -**提交授权**,点击 `授权并开通`。 - -![tencent-cloudbase-3.png](/img/tencent-cloudbase/tencent-cloudbase-3.png) - -**创建环境中**,完成之后,点击 `环境` 下面的卡片,即可进入详细配置页面。 - -![tencent-cloudbase-4.png](/img/tencent-cloudbase/tencent-cloudbase-4.png) - -**构建应用中**,这里可能会等待较长时间。 - -![tencent-cloudbase-5.png](/img/tencent-cloudbase/tencent-cloudbase-5.png) - -**构建应用完成**,需要注意的是,构建完成之后可能还需要等待一小段时间才能正常访问,这个期间是在等待 Halo 应用启动完毕。点击 `访问` 按钮即可进入 Halo 初始化页面。 - -![tencent-cloudbase-6.png](/img/tencent-cloudbase/tencent-cloudbase-6.png) - -**Halo 初始化页面**: - -![tencent-cloudbase-7.png](/img/tencent-cloudbase/tencent-cloudbase-7.png) - -**CFS 管理页面**:[https://console.cloud.tencent.com/cfs/fs](https://console.cloud.tencent.com/cfs/fs) - -![tencent-cloudbase-8.png](/img/tencent-cloudbase/tencent-cloudbase-8.png) - -## 更新 Halo - -> 当 Halo 有新版本更新的时候,你可以采用下面的方式进行版本升级。 - -### 删除旧版本 - -前往 [云托管](https://console.cloud.tencent.com/tcb/service) 页面,点击服务名称进入版本列表,然后删除当前使用的版本。 - -![tencent-cloudbase-10.png](/img/tencent-cloudbase/tencent-cloudbase-10.png) - -### 重新部署 - -回到 [我的应用](https://console.cloud.tencent.com/tcb/apps/index) 页面,点击 `部署` 按钮并确定。 - -![tencent-cloudbase-11.png](/img/tencent-cloudbase/tencent-cloudbase-11.png) - -## 相关链接 - -- [Halo 配置文件仓库](https://github.com/halo-dev/tencent-cloudbase-halo) -- [腾讯云 CloudBase](https://console.cloud.tencent.com/tcb/env/index) -- [云开发使用指南](https://cloud.tencent.com/document/product/876) diff --git a/docs/getting-started/install/third-party.md b/docs/getting-started/install/third-party.md index 1a3f65c..a7f1a96 100644 --- a/docs/getting-started/install/third-party.md +++ b/docs/getting-started/install/third-party.md @@ -6,6 +6,8 @@ title: 三方指南 此类指南或教程均来自第三方或者网友提供,我们不能一直保证其具有有效性,请参考的时候仔细甄别。另外,如果您有写类似的教程,也可以[联系我们](mailto:hi@halo.run)放在下方。 ::: +## Halo 1.0 + - [Halo 博客安装教程,一款优秀的 Java 开源博客系统](https://www.cnblogs.com/bronya0/p/14198512.html) - [如何用服务器优雅地搭建一个博客—Hello,Halo!](https://www.bilibili.com/video/BV1JN411Q7Na/) - [Halo+云服务器+Nginx反向代理实现个人博客搭建](https://yusart.xyz/archives/halo%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA) diff --git a/docs/getting-started/install/windows.md b/docs/getting-started/install/windows.md deleted file mode 100644 index 72cab80..0000000 --- a/docs/getting-started/install/windows.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: 在 Windows 服务器上部署 ---- - -:::info -在继续操作之前,我们推荐您先阅读[《写在前面》](/getting-started/prepare),这可以快速帮助你了解 Halo。 -::: - -## 系统要求 - -目前运行 Halo 的最低依赖要求为 JRE 11,而 Java9 之后将不再提供 32 位系统的环境,因此请确保您的服务器属于 64 位 CPU。 - -## 依赖检查 - -如下将介绍在 Windows 下安装 OpenJRE 11 的方式。如果您的服务器已经安装过 OpenJRE 11,则可以直接跳过本节。 - -1. 使用浏览器前往 下载 OpenJRE 11 的可执行程序。 - -2. 下载时会提示登录“红帽”,任意注册账号登录即可。登录完成之后会自动下载 JRE。 - -3. 双击 MSI 安装程序,安装 JRE 至服务器,注意到安装程序第三步时,勾选 `JAVA_HOME Variable`,其余直接 `next` 即可 - -![img2.png](/img/img2.png) - -4. 安装完成之后, 使用 Win+R 打开运行窗口并输入 `CMD` 后,回车打开 CMD 窗口。之后键入 `java -version`。显示如下所示内容即代表安装成功。 - -```bash -openjdk version "11.0.10" 2021-01-19 LTS -OpenJDK Runtime Environment 18.9 (build 11.0.10+9-LTS) -OpenJDK 64-Bit Server VM 18.9 (build 11.0.10+9-LTS, mixed mode) -``` - -![1615618595.jpg](/img/1615618595.jpg) - -## 安装 Halo - -1. 下载运行包 - -使用浏览器前往 下载最新版本 Halo 运行包,**并保存至桌面**。修改 Jar 包名称为 `halo.jar` - -:::info -如果下载速度不理想,可以[在这里](/getting-started/downloads)选择其他下载地址。 -::: - -2. 下载示例配置文件 - -使用浏览器前往 下载示例配置文件,**并保存至桌面**。修改示例配置文件名字为 `application.yaml`。 - -:::tip -IE 浏览器下,配置文件可能会以文本的形式直接打开,因此推荐使用其他浏览器或下载器下载。 -::: - -3. 使用记事本编辑配置文件,配置数据库或者端口等,如需配置请参考[参考配置](/getting-started/config) - -4. 测试运行 Halo - -使用 Win+R 打开运行窗口并输入 `CMD` 后,回车打开 CMD 窗口,并键入如下命令。 - -```bash -cd Desktop && java -jar halo.jar -``` - -5. 如看到类似以下日志输出,则代表启动成功。 - -```bash -run.halo.app.listener.StartedListener : Halo started at http://127.0.0.1:8090 -run.halo.app.listener.StartedListener : Halo admin started at http://127.0.0.1:8090/admin -run.halo.app.listener.StartedListener : Halo has started successfully! -``` - -浏览器打开 `http://ip:端口号` 即可看到安装引导界面。 - -:::info -如测试启动正常,请继续看`作为服务运行`部分,第 4 ~ 5 步仅仅作为测试。当你关闭 CMD 窗口之后,服务会停止。你可使用 CTRL+C 停止运行测试进程。 -::: - -:::tip -如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。 -::: diff --git a/docs/getting-started/upgrade.md b/docs/getting-started/upgrade.md deleted file mode 100644 index 618d0c4..0000000 --- a/docs/getting-started/upgrade.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: 版本升级 -description: 版本升级指南 ---- - -当前最新版本为:1.5.4。在更新之前建议先查阅变更日志: - -## Linux - -:::info -我们假设你存放运行包的路径为 `~/app`,运行包的文件名为 `halo.jar`,且使用了 systemd 进行进程管理,如有不同,下列命令请按需修改。 -::: - -1. 停止正在运行的服务 - - ```bash - service halo stop - ``` - -2. 备份数据以及旧的运行包(**重要**) - - ```bash - cp -r ~/.halo ~/.halo.archive - ``` - - ```bash - mv ~/app/halo.jar ~/app/halo.jar.archive - ``` - - > 需要注意的是,`.halo.archive` 和 `halo.jar.archive` 文件名不一定要根据此文档命名,这里仅仅是个示例。 - -3. 清空 [leveldb](./config.md#缓存) 缓存(如果有使用 leveldb 作为缓存策略) - - ```bash - rm -rf ~/.halo/.leveldb - ``` - -4. 下载最新版本的运行包 - - ```bash - cd ~/app && wget https://dl.halo.run/release/halo-1.5.4.jar -O halo.jar - ``` - - :::info - 如果下载速度不理想,可以[在这里](/getting-started/downloads)选择其他下载地址。 - ::: - -5. 启动测试 - - ```bash - java -jar halo.jar - ``` - - :::info - 如测试启动正常,请继续下一步。使用 CTRL+C 停止运行测试进程。 - ::: - -6. 重启服务 - - ```bash - service halo start - ``` - -## Docker - -:::info -我们假设您的容器是按照 [使用 Docker 部署 Halo](/getting-started/install/docker) 中的命令构建的。如有不同,请根据实际情况修改。 -::: - -1. 停止并删除当前运行中的容器 - - ```bash - docker stop halo - ``` - - ```bash - docker rm -f halo - ``` - - :::info - 你的容器名称不一定为 `halo`,在执行前可以先执行 `docker ps -a` 查看一下。 - ::: - -2. 备份数据(重要) - - ```bash - cp -r ~/.halo ~/.halo.archive - ``` - - > 需要注意的是,`.halo.archive` 文件名不一定要根据此文档命名,这里仅仅是个示例。 - -3. 清空 [leveldb](./config.md#缓存) 缓存(如果有使用 leveldb 作为缓存策略) - - ```bash - rm -rf ~/.halo/.leveldb - ``` - -4. 拉取最新的 Halo 镜像 - - ```bash - docker pull halohub/halo:1.5.4 - ``` - - :::info - 查看最新版本镜像: ,我们推荐使用具体版本号的镜像,但也提供了 `latest` 标签的镜像,它始终是最新的。 - ::: - -5. 创建容器 - - ```bash - docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --restart=unless-stopped halohub/halo:1.5.4 - ``` - - - **-it:** 开启输入功能并连接伪终端 - - **-d:** 后台运行容器 - - **--name:** 为容器指定一个名称 - - **-p:** 端口映射,格式为 `主机(宿主)端口:容器端口` ,可在 `application.yaml` 配置。 - - **-v:** 工作目录映射。形式为:-v 宿主机路径:/root/.halo,后者不能修改。 - - **--restart:** 建议设置为 `unless-stopped`,在 Docker 启动的时候自动启动 Halo 容器。 diff --git a/docs/intro.md b/docs/intro.md index 19f1d8a..7b6faef 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -23,7 +23,7 @@ slug: / GitHub Workflow Status
官网 -文档(2.0 RC) +文档 社区 Gitee Telegram 频道 @@ -31,23 +31,13 @@ slug: / ------------------------------ -## 注意 - -当前分支为 Halo 2.0 的开发分支,目前 Halo 2.0 处于 RC 阶段,暂时无法从 1.5 直接升级,不建议在生产环境使用。稳定版本(Halo 1.x)请查阅以下地址: - -- 1.5 分支: -- 1.6 分支: -- 1.6 文档: - ## 快速开始 -### Docker - ```bash -docker run -it -d --name halo-next -p 8090:8090 -v ~/.halo2:/root/.halo2 --restart=unless-stopped halohub/halo-dev:2.0.0-rc.1 +docker run -it -d --name halo-next -p 8090:8090 -v ~/.halo2:/root/.halo2 --restart=unless-stopped halohub/halo:2.0.0 ``` -详细部署文档请查阅: +详细部署文档请查阅: ## 在线体验 @@ -58,7 +48,8 @@ docker run -it -d --name halo-next -p 8090:8090 -v ~/.halo2:/root/.halo2 --resta ## 生态 -可访问 [awesome-halo](https://github.com/halo-sigs/awesome-halo) 查看已经适用于 Halo 2.0 的主题和插件,以及适用于 Halo 1.x 的相关仓库。 +可访问 [awesome-halo](https://github.com/halo-sigs/awesome-halo) 查看已经适用于 Halo 2.0 的主题和插件,以及适用于 Halo +1.x 的相关仓库。 ## 许可证 diff --git a/sidebars.js b/sidebars.js index a77de2a..9e4b75c 100644 --- a/sidebars.js +++ b/sidebars.js @@ -32,9 +32,14 @@ module.exports = { type: "generated-index", }, items: [ - // "getting-started/install/linux", - "getting-started/install/docker", "getting-started/install/docker-compose", + "getting-started/install/docker", + { + type: "category", + label: "其他指南", + items: ["getting-started/install/other/oneinstack"], + }, + "getting-started/install/third-party", ], }, "getting-started/migrate-from-1.x", diff --git a/static/img/ali-pay.png b/static/img/ali-pay.png deleted file mode 100644 index 170abffd6d1f3a083b6e0de9b0d672a774bf5ab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8850 zcmd6NXH-+|x2F<8g#gkC3MvqkW+9142`ELHfV2=nASk`5G^t{gj(`F|U-*O6P!cdm z0BI6MK;e}DA@rgsy(mqJfb+!n-kG^~&CHs$WFi`9reBTDx`D1HY%-m8toR_Fi*-)ka!xoH)-&}nhw!fo$3<1IC?O>Z zlq^I%$~6fSUY%7eg(`ppSH@^I^=GbUa>B42eM8duw-1LKJ%{ImD?6*aTKOFsUFF;1 zV0;NmuB@zdjEMNnL@JO@+YwCq9ntFQ(A6zh?hBWI7NX@5KkRj6zHT=o2Qm5?!=my_I3@X7MD{Eja2`4nl?<146f|32`f=m46j+@+a0UHZWe|#EBHu$+4 z_zF)5b^r5;C^l6+@6=Ijtp!Iqp5PjXM}3qE0n2L6|4++SJY?*0xSwCDp0Hqrev-mk z*v68$eWGc5f?Q8jq+$K7x3?y9-xKZ4N7vU;_OoMt;(cBhwAJ`-64dNwO~(0}YHF*r`H*pHB2@)x=w;)=WoL@3 za^wA!I~S;D>&DX=QI(W00i6qYJ6S2=elM6lJBM2t*f#kvmFfr%Whot`+y)fc&axWs^@`+z=Ye{_weeP(%r?i z_5422+U-yvv7&f3VHk~|;&-$a#V?Wv)40kb;8(9?;&tz)&4WzqpoL65c;PtNHB)kq z0{)*DVoT7NoG_fKKF7%KS8TRpaP)dTeOgw$z$b>&ty0cn*KU!DaT)n7LO|y9g zp`h6;nSUD}ZGYE&xxMT_;wYOK6|H#lC>ErnuHNV0GpCVm%N&@cG*;b0v3CriIt__01K@NlDR~dz(`7EAB$d!EYrS72_W)JI0NUjv}j- zIu0wU1 zKPUw)Hm5UY6#c2k-52_M#;Isdq}yM;e(-8=KZ^b|nwTjRBHxydw|b^+A4B+-3Ep^Z zb@d6pf&abxXLl4X2ow(%16f$H~EtlArL{^1DgKygJNc)*jgj7 zYiHc#SEt;EJQ6kypbT}<8!sbkpRuCtm<@je|JS#t_^MU}c`HogZBoxu-pIAfgqRWertVmn*PEpI5af0 z`RC8TQY#k~cSlWjG+yY|dEd%5zFX&8odQo+uC2f@nA(7?2oxnPaQ(5}E}~{-$%u)qH=R>se zUA^d(R>W10(^*+n)wRD4b;@-3w_vuTtj|{Z zou`mL@lbrrN2mBQ)SJaNKGZ}8^W=)W*FB%@n3xF~8>lT-W0Q{0u5m`+`juOMyv|fY zy@fp}njN}$I5E2dJZ&y$GQkk4fV*evw)WT?9FGekTlO5l%6q>RW6!5k1R1ku)z@5o zCRO;^F$saznjN!)OZsLZUrKy7#JH0Q*6c5vZGu1bN#hdmo;c>;zECm>CM{2n#uJ`< zM*Noa*4a`_kfUGTxw+&X3V)kttnBmRW4m#bj8{Qp+s4k?TlN` zrSqGCdt)u8U($PF@u%LEDBE4Gam9a*fMJbt^69ew_C9>3Qm3~pH8u6S(Z4oaOyUS% zmY<0O4B5N|^^Zc@;YxRI>UMZ_``DP;=-JrMoH=tQ8sr7}Xkm@tdy@mc?_)G49>E6r z>fsagwhkVzaO+piCg~S1;dLW!T354oS6zd1@4nCq@!`r_%*|%3kVyeFTIsp~0pQ25 zPHyf4v4E@j8!x&C`X+fmp6X3IMMUiFGyrIhe<2?+_8S6{ZbLoRA)m;}T>DBo|<{`i8Xh6b^y>xK~vPAY64 z4>vY8I);X-m6a<6+PB!h6E@KKeAI+7&@Or9_8C#S1oZT`(yT*4-x?Y7> zOAG7e(kgD@;7g1Hn5)WQhq^pnH}YwR#G?w$Wtd{vUfG;gDA)5|g9#WW3v{onXRix{ zttB8_!%e=qcq`Xhywx=P%tzWgjCW)gt#tkhgw$ztBLyE-HgpKA_b2{2MH<3oTg9gZ zA(bBmT;}Xu0}kP852;8Fj2#GZfc-=YRKbgRqTB*$}SRBbbe*_o%cuIl3!maT>Q(^kmn0wiP}u~ z%+VJV^7E>s>YcPbB0xH`jd_2xpYg|&5K=K+h~fSr+dyZ&m^w_$D=)Y2NA#y1Q=-KC zYM;-FUieFgnq*kdtuQw?7w~VVoK_b6FL+8Ws3L(izIe)$hP5To179~Z=p?nVUH0u_ zC)U^3&*XFSt*))5MM}(cY!L$We4j{FTfKKkmP&~YE7o>bX2-lw`Uh`nG2&{Z;nm*} zyW0V;o0_am462YZJrD15rrjV(sQHI!o}W>(+!#sieYkhv4YkrroO(mC+H%~lO2s?Y z*O^Gms}QnFs9+#sO52iN6?W3hm0s!(BL>|BpbB%AHv zM+b%(9SX@A@;|cT5Qi^(4PeVR$Cbw_SscRkIL3o=b)~xuFY@XUX~jl9E9EM*ZN=7t&y(N zsY_`>_N}Em3x~Mv_#Cpdua9Q`ZVFk@afsO4fm!9wzw6E>O5Ho~bVa?eZq(2#*I=|j z(WO^WOq+K6?yOv>GsZScTX84XSq_joGi!mYn;`+OWGfOfhN+?u`I;Kln3dQ?LBl;U ztnO~kbNehW!-c%53yQ6@_QkT!T=ko3Q7KIv7&Fb&MC((T{Po4P#tG*szM&+))5!xS zx!+#mt$KOmXPF;~@6UMnFm6K0BV%*N+NG*3{;P?hDN88 z>F*+=9l(sb`i{Xblzu+~aq-YLN_>>@tws?+V;-`$6~RBj&S z9(*Hc>$kW0HJSQBl-^imCQ@ZQm0EymCFem*%`B+ew#gyx4rcs44oTx~Q~QpP1wQgaRl9 z1&J!;$xRkIdL|m=J2!%o61f7EKYkY(HzU-KAdjr}=YYmbjhf0ZC%R(eZRPtyqN{E; zx7_)MF5rbB)_;FGvm(4mv_^-ttV2mg9%%;)cgqeCYl&&Iu=I((_$rRRcy5vAV8A#) ziO`Roqv$*&V|@S;0c5SZxu9^o695rQ*9AW$Z(fCvAQT`%SF+X+cKb(41wO`4VJhM@ z%a8@5H8nMERw2DlH4Y`hB?0;_@5gWIA5v+!<3CdPBlG^i!}3?BcKOAI#&gkVv~Ei) z4`EK6%eLaz0o@qMNoy(Ww@VRk-S{&5Dx#9AZR3pbg=q%h=3ZMEMr<@(Oieib>9Cb6 zt|Y1K+DqwkWq|!=wFfY}u5H(=296E=76cSpcu}8DS)n2*zRAUTVq!>o{(Zn_Gqqj+ zkdABo&t?AgAI`F&Qz&{=DRgtYBI>`NgKo}4AMjVqxvcg|*Q@KB3;&Q$AsYvX)ayQ4 z>1s;)x0t2g5*}3u>Cvo~KE&u8N#6q}1RKl~g^;310nRMs=>fQ=;NCfXWh%YSG4*oN2yH&^_QIvEgdTx zj-pI=KvgdsMdIDPbo>22_k{G^$e)B^<1K3YXol*b-%96kLK0N1 zitz? z2xWl=Yn2ZY@LO=eo}A)3v;(04caU-C2C7>z;1#|q&6{De0`(lxq*I8K{i~Jk<+6OC z4~J;xA*K38srshB+@aytq(3bb_ z-@bd8Um0npSEn1bb}QjVzDS!xO-R8ab+mx&kkQ<%EuDN{ddp~4{b7&y<;p=X00sv0 zC2LT3ZNH%_k?zO zfWQD{A$wgZ4@HT8ESQrkty-4#C%Zu*n6Zd_R#9gJXNC@tQ{^Gis3pEnsL6L zy607h-nzDvd&1c~B2T?;u5KDC@0(cuO=fSWE3${)pk`#(io^`S;`Mj&qYof+6x7hh)>Kh)G^f?eA#-zYi7 z#BAgP{dpTVDRDANDX3IH+^UOa?xi&}cOOad9R_Dg6`Z5^W|q3%i=Pf&^pC=$mi~I- z2v;eTz7z0j{c#zz$^$&5vY_(bR1Xr%4H*drkx71{1yg6nCCSa$YPHA|lr8B2WFDop zqqR7}o05>gqM+=46KhfI8~BZxeRcu`|J$o=0gc-5V(VqoUb_@;^O3`PNm%FO5rcf+ z3-@-m{A5D6HSNk0IFCjbZMZN7{86hw6NemEF1s}|fnIc)Ty1G#zpts07!eqF;n=Zb z1uGBau6vgUWpnJxUQ_>mSRq53I=YNL@G2GFE)_0Nr}=wFppju$`y&mKASS5lti~l< zGtJ=yzu?|+wzzfS)k;p&h-Ir~M;;<^EPLZX`kXtl=-&D3DjhrHG`8~fNOZg`#NNo6Az$huC)?JeU}p zos~_|TNp4;5od|7Fbz73QB=(83Ewn2SaR#VhPt{=KmqTI{69YC-(AtBR(f77s+yX5 zEuUNvR4b_l>EReby1Un0F!H&NnLFQ6*qPXyo+dj_A5Go%Y8e_IH%%BB8@p0>`cTBP zCq5a*o*P#$iHyk_=zL{>R_(rgbmtJe_q~J{8@AN?knYk6l|*B7(OzV^t5;#RrBR!S zfXn-I4fAf9w+RQ&xVN3OgKPrrg%2z z^p=O|t)tklOY$OzAqg(N<@tbUPTJpOM`Z~YgD)KhOu}ui%v^7^pC-2;n8RoFC5L1ZDwW$&Qmx?i--)Mje(^Fx>lCiv`LLs7f_QzKOv~BXi!^4;L*s_Q|`9( zef)UXCPs+#`fK6uK|Yf6*|TR6gN)y^^AQjZrvODef<(n^-@i85m*(c=yiLh<#N)X+ zpy7}F_*Ynglo+4tN(COgojKwAu>40dD1iWvP1F62Ki=!1-0BU=b%VA~3Jfj%$P5CP zF-a6wvn-xAcEOI%eu#qguAU0Sww!`_2h!0PL9Ai@tU?h`zS%m%YW;3JPpgYF%DWzL zz2R1IX&Q;^p7 zJ>ADL#9X_#-oO=nnKU`2m1%9e?FZRc))D_MdpwltSG70pGJv&u{B@&XHovOc&G^&8zZ|ij}GqHr1$$E zgpAdTct>ZM-3T)C)C=IUk2(Di#pbsvFOLALFc36A(QE9DGiLPAM?-W<-=?)zhF7*@ z_ZQoudGsB3BR3uxwzqq|FF2Z+8!_{F_8LmFdHW}K` zTR%XtZ}O|aYOe=(IUJ^UcDA=2@NV;Ee zLP$g1+_H39yIK$EucaUfnMpqS!NAgg`X^HFXr+Pv+U*F+N)jlu1GyN>fPMy=~5~&i4#u{$Y)eaVJ6z-e1RztLq%JP1mq`R@;?=fauz#4C^K@uex%$d zWC9j1Zrl2yn+=P+Fltp%S@|f?N++~NGRB~Jyp-5tuf<6g&St#TzI9uSGLvToC{OXU zq1WU)zkq;3OJyde4HKv!iZ$2}#eU_0VP`jiXPN*dtH)5@fj)BQRl|ujz!Wb-JUyb( zYUAJ|A~6-%WX7LPhP?r=U!0bq^U4QjAQ6B|x;%Hq4qVm*+-Bt;ZW9kY)Zl0oiojAf z9z0)G0gdH4mB1QRT|`|cX5R+IXaP_eAO&&ihz9HOcU}cWS7{&=LI}@?YDuau$}imB zPqwPMYj~_~&Sonrrf(Ycp6Gqpj$WZ1QDQM<(b!`bmuOwLfwXf!0!**3CXF0!Ymx9z z2nZ?A_6eTg1kCOL`tg|)5!{plZx#Zl=M~ap6h>1PetWOD0wn0)1T#+!mu6OCn26H<1$&Sf55@oA80n6H3qK#2)U6X zz(@U`Prbm&N_pV?*>}c?bmkquJ}^9dw3ALZTQFuzpV%549HcZgy$I2X7z3(g^v<0- zPtrx$hLS-dH}CF-+qfhQtmR9Y)iyUbQ8Ea9N(lp7XN7#@mRODlCZ=Ys;m5QB!4jvxZJ=8&ndWVeZd(+)~ zj_RiT2?dYfCQE0gB`px18^$oCf%q6h0@Ek2mI$ndf2Ipc6nozXKpq(S0^@t@M81I& zfSVqC=CfXh+!2GWK*kN=Gp=c(>}K_kRLAMe-pSAb*=~i5SxMQJPg5^i1UmTJOV&dN zox_!fD*Af&Zd!kiF7WBb`Oo-Ys@3Y2W(n?Z{=}!?nvS@D83;%sV`Xq39_R0@+Rwgp z>-Nd;Y-jJUiDb{Aj6rZUm)7eHvLc+bft{17UKnmLu3;@Rs*r^LHp+o|b+7sHbZ z9%RUO}hOE=)}?T^(r{S zm}Y3XO^oe7Vtc*gA4#6m+lt``GF|k15ItdvQs7qjtbxihVF)p1?X|idyYO>z zgNDWi26a--3#_pSFez00WMo-on+s`Yj)B1=ctoE3`S;ZZ!H%Hhy5(;$%q`Y#J7^y2 zAAlo>82G9PT7tGy2B&@uC(9adC9Gbc_s_|Gs@}#;o50L>_zJb~>h& z7%t%4lU&@zi(6P&_z}q4{3A=WcS7#+M0HOWPXvieujG4so~DfqQ?>(Z6ZRP2mpbQG zt{aSu0E%2sM8kqkxUb-Fu@u=*1X99S()n`_&-YngFj~w^HwZAyW3|(ouI?KM%7b65 z5l{j2282uc*b`AKt$>3+qiIbtcP-x)YY@{z%EmKsPSUz^aV7`pbGFM4IvJkXj(Gb& z4N{lqbPk8Ri~&^PW4Tg=E7lpa@^A;55Q-uqDIQ^u&4Eg6{FCjg3NSF3OI`T22y$wp z=l`5joRIm21+R-2FX|gvV*VyZ?Fv#)BkrRl4;o8O_Qh&YrPsNP7tZ96UY9(xycZsh z1`0dBw6%18An}QKMabUXo<=HnyY>cl)+7+uHQ+v(ex&P0Lf$N5z=JMz;giF52e~I% z6l=8E#8=cMJ$G0E9!NLIZ9+CN6Z?TQ#aV^=;MR{_K5@ZVl3i?#lf869+UzDn$#$mn zU@|bA7jr2Eld`HAp1|#yJId&hHqUXyC7$Ao0&^_h*13d8Fa(~q69Th`UFM@UTKg~J zkRRA{0}0?}Wm5>?F~Q@O;43Dx?^%gr1AbcbvM6?@2OYrmYB@mP&b_&}pen*G7He6| z#|r!qW6%K|1Q7jpDO#E0ORtxMl2w0^4kqIX8^%@B0F;BR0nEEbtbaaFS$R|Pvq71% b$1CYi(>&7!SpdH^*=L|@qEoJgd-&e~Wx)~j diff --git a/static/img/wechat-pay.png b/static/img/wechat-pay.png deleted file mode 100644 index 735cfb4ca60e952e03ce61ea7f59e6c4d3c0b984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8708 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 S6!7m38ckJQl@cZNlm7uNq`21r