官方的反代的教程有点复杂了,且暴露了halo和数据库容器端口给公网,不是很安全,稍稍小改一下,不在公网暴露halo和数据库的端口,这样也能一定程度保障博客的安全。

  • 使用 Docker Compose 部署

1.创建文件夹

在系统任意位置创建一个文件夹,此文档以 ~/halo 为例。

mkdir ~/halo && cd ~/halo

2.编写docker-compose.yaml

  • 以Halo + PostgreSQL为例

服务器只开启80和443,由于Docker会在UFW上打洞,所以halo端口映射为127.0.0.1:8090:8090,同一个Bridge网络下,数据库postgres不需要映射端口的。

创建:nano docker-compose.yaml

根据官方的教程修改为如下:

version: "3"
services:
  halo:
    image: halohub/halo:2.4
    container_name: halo
    restart: on-failure:3
    depends_on:
      halodb:
        condition: service_healthy
    networks:
      halo:
    volumes:
      - ./:/root/.halo2
    ports:
      - "127.0.0.1:8090:8090"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1: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=92fe91b4893841879348c973e3925a10
      - --spring.sql.init.platform=postgresql
      # 外部访问地址,请根据实际需要修改
      - --halo.external-url=https://yourdomain.com
      # 初始化的超级管理员用户名
      - --halo.security.initializer.superadminusername=admain
      # 初始化的超级管理员密码
      - --halo.security.initializer.superadminpassword=92fe91b4893841879348c973e3925a10
  halodb:
    image: postgres:latest
    container_name: halodb
    restart: on-failure:3
    networks:
      halo:
    volumes:
      - ./db:/var/lib/postgresql/data
    healthcheck:
      test: [ "CMD", "pg_isready" ]
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      - POSTGRES_PASSWORD=92fe91b4893841879348c973e3925a10
      - POSTGRES_USER=halo
      - POSTGRES_DB=halo
      - PGUSER=halo

networks:
  halo:

3.启动 Halo 服务

# 启动 Halo 服务
docker-compose up -d

# 实时查看日志:
docker-compose logs -f

4.nginx 反代

最后nginx反代内网127.0.0.1:8090即可:

server {
    listen 80;
    listen [::]:80; #无IPv6,此项可以删除。
    return 301 https://$host$request_uri; #HTTP自动跳转HTTPS,让网站看起来更真实。
}
server {
    listen 80;
    listen [::]:80; #无IPv6,此项可以删除。
    server_name _;
    return 400;
} #限定域名访问(禁止以IP方式访问网站)并返回400
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name yourdomain.com;
    # ssl 证书存放路径
    ssl_certificate /etc/nginx/cert/fullchain.crt;
    ssl_certificate_key /etc/nginx/cert/private.key;
    client_max_body_size 30M; #防止上传主题文件失败
  
    location / {
       proxy_pass http://127.0.0.1:8090;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
}

配置https请参照acme申请证书

使用 https://yourdomain.com 就能愉快的访问Blog啦!

5. 致谢