docker-compose部署halo,使用nginx提供https访问
前言
看到halo论坛有很多部署相关的问题,故记录一下我的部署流程以供参考。
- 为何使用docker-compose部署
- 小白只需要将docker、docker-compose下载好即可,不需要安装其他软件
- 部署过程一个命令解决,只需要下面的docker-compose.yaml即可,你只需要修改很少的参数
- docker相关知识,感兴趣的可查看本站docker分类
部署过程
- 购买aliyun服务器
- 购买域名
- ICP认证 & 公安联网备案申请
- docker-compose部署halo(与上一步同时进行,因为ICP认证要14天起,先通过ip:port方式访问),点击查看详细命令
docker-compose部署halo记录
yaml文件内容如下,我会尽量解释其中的大部分参数,以及与官方文档的区别
services:
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:
- halo_db:/var/lib/mysql
expose:
- "3306"
healthcheck:
test: [ "CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent" ]
interval: 3s
retries: 5
start_period: 30s
environment:
TZ: Asia/Shanghai
MYSQL_DATABASE: halo
# 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
MYSQL_ROOT_PASSWORD: xxx
halo:
image: halohub/halo:2.6
container_name: halo
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
networks:
halo_network:
volumes:
- halo_data:/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=xxx
- --spring.sql.init.platform=mysql
# 外部访问地址,请根据实际需要修改
- --halo.external-url=https://www.xxx.com
# 初始化的超级管理员用户名
- --halo.security.initializer.superadminusername=aaa
# 初始化的超级管理员密码
- --halo.security.initializer.superadminpassword=xxx
environment:
TZ: Asia/Shanghai
links:
- halodb
nginx:
depends_on:
- halo
container_name: halo_nginx
image: nginx:latest
ports:
- 80:80
- 443:443
networks:
halo_network:
volumes:
- halo_nginx:/var/log/nginx
- ./nginx.conf:/etc/nginx/nginx.conf
- ./default.conf:/etc/nginx/conf.d/default.conf
- ../key:/etc/nginx/cert
privileged: true
environment:
- TZ=Asia/Shanghai
links:
- halo
networks:
halo_network:
name: halo_network
volumes:
halo_db:
name: halo_db
halo_data:
name: halo_data
halo_nginx:
name: halo_nginx
全局的变动
- volumes
我在最后定义了的docker的volumes,与官方不同的是,我的文件挂载在docker定义的volumes下,与直接挂载在本地无太大区别,可忽略,使用官方的定义即可,感兴趣的可百度docker volumes - networks
我定义了networks的name,强迫症相关,可忽略 - environment
统一设置了时区TZ=Asia/Shanghai,强迫症相关,可忽略
halodb的变动
- 端口
出于安全性的考虑,端口方式选择了expose,即只对docker容器间开放,外部是无法访问的。感兴趣的可自行搜索两者的区别ports: - "3306:3306"
expose: - "3306"
nginx
详细说一下nginx
部署参数
- 端口
端口应该不用解释吧,80http,443https - volumes
格式为a:b
,a是相对于docker-compose.yaml的相对路径,b是在容器中的绝对路径
halo_nginx:/var/log/nginx
这里是我自己要看nginx的日志,可忽略
./nginx.conf:/etc/nginx/nginx.conf
这个是nginx的默认配置,可忽略
./default.conf:/etc/nginx/conf.d/default.conf
这个在下面
../key:/etc/nginx/cert
这个是https的证书,我本地放在了../key文件夹下,挂载到nginx容器的/etc/nginx/cert文件夹下,你可以自己定义路径,若改变了后面的路径,下面的default.conf中也需要修改对应路径,证书请根据你的云服务器自行申请 - links
这里links到halo,作用是在nginx里面设置的时候,直接写halo就行,而不是写halo的ip
default.conf
以下说明看备注吧
upstream halo {
#这里因为前面部署的时候links了halo,所以直接写halo:8090就行
server halo:8090;
}
server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
#填写证书绑定的域名
server_name ez4leon.top www.ez4leon.top;
root html;
index index.html index.htm;
#填写证书文件名称
ssl_certificate /etc/nginx/cert/xx.pem;
#填写证书私钥文件名称
ssl_certificate_key /etc/nginx/cert/xx.key;
#表示使用的加密套件的类型
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#表示使用的TLS协议的类型,您需要自行评估是否配置TLSv1.1协议。
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
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;
#可以限制上传文件的大小
client_max_body_size 1024m;
#这里限制了http访问,所有的http都重定向到了https,可去掉
if ($ssl_protocol = "") { return 301 https://$host$request_uri; }
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
proxy_pass http://halo;
expires 3d;
access_log off;
}
location ~ .*\.(js|css)?$ {
proxy_pass http://halo;
expires 6h;
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;
}
# Access and error log files
access_log /var/log/nginx/ez4leon.access.log;
error_log /var/log/nginx/ez4leon.error.log;
}
docker-compose部署命令
以下命令请在docker-compose.yaml的目录使用,更多命令请自行查询
# 构建启动
docker-compose up -d
# 将会停止UP命令启动的容器,并删除容器
# 随便down,因为你的文件都挂载在本地,不会消失的
docker-compose down
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
小破站!
喜欢就支持一下吧