You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
docs/versioned_docs/version-1.5.2/getting-started/install/other/docker-compose.md

295 lines
7.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
title: 使用 Docker-Compose 部署 Halo
description: 使用 Docker-Compose 部署 Halo
---
:::info
在继续操作之前,我们推荐您先阅读[《写在前面》](../../prepare),这可以快速帮助你了解 Halo。
:::
## 使用 Docker-Compose 部署
1. 创建[工作目录](../../prepare#工作目录)
```bash
mkdir ~/.halo && cd ~/.halo
```
2. 下载示例配置文件到[工作目录](../../prepare#工作目录)
```bash
wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml
```
3. 编辑配置文件,配置数据库或者端口等,如需配置请参考[配置参考](../../config)
```bash
vim application.yaml
```
4. 创建 `docker-compose.yaml`
仅创建 Halo 实例:
```yaml
version: "3"
services:
server:
image: halohub/halo:1.5.0
container_name: halo
restart: on-failure:3
volumes:
- ~/.halo:/root/.halo
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "8090:8090"
```
:::info
您可以前往 <https://hub.docker.com/r/halohub/halo> 查看最新版本镜像,我们推荐使用具体版本号的镜像,但也提供了 `latest` 标签的镜像,它始终是最新的。
:::
创建 Halo + MySQL + Redis 的实例:
如果您需要使用自部署的 `MySQL``Redis`,可参考如下的 `docker-compose.yaml`
```yaml
version: "3"
services:
halo_server:
depends_on:
- mysql_db
- redis_db
image: halohub/halo:1.5.0
container_name: halo-self
restart: on-failure:3
networks:
halo_net:
ipv4_address: 172.19.0.4
volumes:
- ~/.halo:/root/.halo
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "8090:8090"
mysql_db:
image: mysql:8.0.27
restart: on-failure:3
networks:
halo_net:
ipv4_address: 172.19.0.2
container_name: halo-mysql
command: --default_authentication_plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
ports:
- "3306:3306"
volumes:
- /etc/localtime:/etc/localtime:ro
- ~/.halo/init:/docker-entrypoint-initdb.d/
- ~/.halo/mysql/var/lib/mysql:/var/lib/mysql
- ~/.halo/mysql/mysqlBackup:/data/mysqlBackup
environment:
## 此处需要输入自定义 MySQL 密码
- MYSQL_ROOT_PASSWORD=mysqlpass
redis_db:
image: redis
restart: on-failure:3
networks:
halo_net:
ipv4_address: 172.19.0.3
container_name: halo-redis
volumes:
- ~/.halo/redis/data:/data
- ~/.halo/redis/logs:/logs
## 此处需要输入自定义 Redis 密码
command: redis-server --requirepass redispass
ports:
- "6379:6379"
networks:
halo_net:
driver: bridge
ipam:
config:
- subnet: 172.19.0.0/16
```
:::info
注意,如果您使用了自部署的 `MySQL``Redis`,由于 `Halo` 启动时并不会主动创建数据库或者 `schema` ,所以您应该提前创建好 `init.sql` 并且同步更改 `application.yaml` 中的数据源地址和 `cache` 选项。
:::
创建 init.sql :
```bash
mkdir init && touch ~/.halo/init/init.sql
echo 'create database halodb character set utf8mb4 collate utf8mb4_bin;' > ~/.halo/init/init.sql
```
修改数据源配置 :
```yaml
spring:
datasource:
# MySQL database configuration.
driver-class-name: com.mysql.cj.jdbc.Driver
# 此处的地址应该使用 docker-compose.yaml 中配置的 MySQL 地址和密码
url: jdbc:mysql://mysql_db:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: mysqlpass
redis:
# Redis cache configuration.
port: 6379
database: 0
# 此处的地址应该使用 docker-compose.yaml 中配置的 Redis 地址和密码
host: redis_db
password: redispass
halo:
# Your admin client path is https://your-domain/{admin-path}
admin-path: admin
# memory or level or redis
cache: redis
```
5. 启动 Halo 服务
```bash
docker-compose up -d
```
:::info
注意:如果您未在 `application.yaml` 中修改数据源配置,使用此命令启动则会默认使用自带的 `H2 Database` 数据库。如需使用 `MySQL`,请参考:[使用 Docker 部署 Halo 和 MySQL](./docker-mysql) 的内容将 `datasource` 配置更改为 `MySQL` 的配置。
:::
- **image** 容器镜像版本,默认为 `halohub/halo:1.5.0`。如果需要使用最新版本请使用 `halohub/halo:latest`
- **container_name** 为容器指定一个名称。
- **ports** 端口映射,格式为 `主机(宿主)端口:容器端口` ,可在 `application.yaml` 配置。
- **volumes** 工作目录映射。形式为:`宿主机路径:/root/.halo`,后者不能修改。
- **restart** 建议设置为 `unless-stopped`,在 Docker 启动的时候自动启动 Halo 容器。
6. 打开 `http://ip:端口号` 即可看到安装引导界面。
:::tip
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
:::
## 反向代理
你可以在下面的反向代理软件中任选一项,我们假设你已经安装好了其中一项,并对其的基本操作有一定了解。如果你对 Nginx 不熟悉,我们推荐使用 [OneinStack](./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
```
以上配置都可以在 <https://github.com/halo-dev/halo-common> 找到。
## 更新容器组
:::info
我们假设您的 Halo 服务容器是按照 [使用 Docker-Compose 部署 Halo](docker-compose.md) 中的方式启动的。如有不同,请根据实际情况修改。
:::
1. 停止运行中的容器
```bash
docker-compose stop
```
:::info
此操作会停止所有使用当前 `docker-compose.yaml` 启动的容器,如果需要单独更新镜像,请参考上文。
:::
2. 备份数据(重要)
```bash
cp -r ~/.halo ~/.halo.archive
```
> 需要注意的是,`.halo.archive` 文件名不一定要根据此文档命名,这里仅仅是个示例。
3. 清空 [leveldb](../../config.md#缓存) 缓存(如果有使用 leveldb 作为缓存策略)
```bash
rm -rf ~/.halo/.leveldb
```
4. 更新 Halo 服务
:::info
注意,当您的 `Docker` 镜像源非官方源时,执行 `docker-compose pull` 命令时可能无法获取到最新的 `latest` 标签的镜像。
:::
针对使用 `latest` 标签镜像的更新:
```bash
docker-compose pull && docker-compose up -d
```
针对使用具体版本标签镜像的更新:
修改 `docker-compose.yaml` 中配置的镜像版本。
```diff
services:
halo_server:
depends_on:
- mysql_db
- redis_db
- image: halohub/halo:1.5.0
+ image: halohub/halo:1.5.2
container_name: halo-self
```
5. 启动容器组:
```bash
docker-compose up -d
```