前言

看到halo论坛有很多部署相关的问题,故记录一下我的部署流程以供参考。

  • 为何使用docker-compose部署
  1. 小白只需要将docker、docker-compose下载好即可,不需要安装其他软件
  2. 部署过程一个命令解决,只需要下面的docker-compose.yaml即可,你只需要修改很少的参数
  3. docker相关知识,感兴趣的可查看本站docker分类

部署过程

  1. 购买aliyun服务器
  2. 购买域名
  3. ICP认证 & 公安联网备案申请
  4. 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 许可协议。转载请注明来自 小破站
部署 容器 Halo docker
喜欢就支持一下吧