温馨提示:请务必前往云服务器的控制台(安全组/防火墙设置),放行 80 端口(HTTP)和 443 端口(HTTPS)。如果打算在配置 Nginx 前通过 IP 直接预览,还需要放行 8090 端口

一、操作系统需求

Ubuntu 22.04 (LTS)

二、卸载旧版本

在安装Docker Engine之前,你需要卸载所有冲突包。

你的 Linux 发行版可能会提供非官方的 Docker 包,这些包可能会和Docker提供的官方包冲突。你必须卸载这些包。

非官方的卸载包有:docker.io docker-compose docker-compose-v2 docker-doc podman-docker

执行以下命令卸载所有冲突包:

sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)

三、把服务器的软件源换成国内

通过OrcaTerm连接服务器(为了能复制粘贴代码)

打开本地终端: 在你的 Windows 电脑上,按下 Win + R 键,输入 cmdpowershell 然后回车。

连接虚拟机: 在弹出的 Windows 黑框中输入以下命令并回车(注意替换成你自己的信息):

ssh 你的Ubuntu用户名@你的服务器IP

以后的教程将在OrcaTerm服务器管理器进行

复制以下代码到服务器管理器里面

# 备份原文件
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak 2>/dev/null

# 使用正则表达式准确替换,忽略可能存在的地区前缀
sudo sed -i -E 's/([a-z0-9-]+\.)?archive\.ubuntu\.com/mirrors.aliyun.com/g' /etc/apt/sources.list
sudo sed -i -E 's/security\.ubuntu\.com/mirrors.aliyun.com/g' /etc/apt/sources.list
sudo sed -i -E 's/([a-z0-9-]+\.)?archive\.ubuntu\.com/mirrors.aliyun.com/g' /etc/apt/sources.list.d/ubuntu.sources 2>/dev/null
sudo sed -i -E 's/security\.ubuntu\.com/mirrors.aliyun.com/g' /etc/apt/sources.list.d/ubuntu.sources 2>/dev/null

四、安装Docker

将 Docker 源替换为阿里云镜像

在终端中复制并执行下面这行命令,这会把配置文件里的官方域名替换成阿里云的域名:

# 1. 安装必要的依赖并创建密钥存放目录
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings

# 2. 添加阿里云的 Docker GPG 密钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 3. 写入阿里云的 Docker 软件源(注意这里写到 docker.list,且网址使用的是 mirrors.aliyun.com)
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

刷新软件列表

替换完成后,让系统重新读取新的国内镜像源地址:

sudo apt update

执行安装命令

更新成功后,运行 Docker 安装命令:

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

验证是否安装成功

你可以直接在终端中运行以下命令来检查它是否正常工作:

docker compose version

五、安装Halo

创建容器

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

注意:后续操作中,Halo 产生的所有数据都会保存在这个目录,请妥善保存

创建 docker-compose.yaml

准备干净的工作目录

执行:

mkdir -p ~/halo && cd ~/halo
rm -f docker-compose.yaml

执行下面的命令打开编辑器:

nano docker-compose.yaml

把下面这段复制到编辑器里面:

services:
  halo:
    # 这里使用的是官方提供的国内加速镜像库,并且改为了开源免费的社区版
    image: registry.fit2cloud.com/halo/halo:2.25
    restart: on-failure:3
    depends_on:
      halodb:
        condition: service_healthy
    networks:
      halo_network:
    volumes:
      - ./halo2:/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
    environment:
      # JVM 参数,默认为 -Xmx256m -Xms256m
      - JVM_OPTS=-Xmx256m -Xms256m
    command:
      - --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/
  
  halodb:
    image: docker.m.daocloud.io/library/postgres:15.4
    restart: on-failure:3
    networks:
      halo_network:
    volumes:
      # 将数据库的数据挂载到宿主机的 ./db 目录,保证数据不丢失
      - ./db:/var/lib/postgresql/data
    healthcheck:
      test: [ "CMD", "pg_isready" ]
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      - POSTGRES_PASSWORD=openpostgresql
      - POSTGRES_USER=halo
      - POSTGRES_DB=halo
      - PGUSER=halo

networks:
  halo_network:

Ctrl + O,再按 Enter 确认,最后按 Ctrl + X 退出。

现在,你可以执行以下官方启动命令:

sudo docker compose up -d

启动成功后,浏览器输入:http://<你的服务器IP>:8090 就可以进入Halo管理面板了

六、配置Nginx反代

准备工作

在开始配置之前,需要在文档中提醒读者完成以下前置工作:

准备域名: 准备一个属于自己的域名。如果服务器在国内,需要完成域名备案。

域名解析: 在域名服务商(如阿里云、腾讯云)的控制台,添加一条 A 记录,将您的域名(例如 blog.yourdomain.com)解析到这台服务器的公网 IP。

第一步:安装 Nginx 和 Certbot

Certbot 是 Let's Encrypt 官方推荐的免费 HTTPS 证书签发工具,配合 Nginx 插件使用,可以实现全自动配置。

# 更新软件源并安装 nginx 和 certbot
sudo apt update
sudo apt install nginx certbot python3-certbot-nginx -y

第二步:配置 Nginx 反向代理

由于 Halo 是运行在 Docker 的 8090 端口上的,我们需要让 Nginx 监听默认的 80 (HTTP) 端口,并把访问您域名的流量转发到 8090 端口。

新建一个 Nginx 配置文件:

sudo nano /etc/nginx/sites-available/halo

填入基础配置,注意将其中的 yourdomain.com 替换为实际域名:

server {
    listen 80;
    server_name yourdomain.com;

    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;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # 针对上传大文件的配置优化
        client_max_body_size 1024m;
    }
}

启用配置并重启 Nginx:

# 创建软链接以启用配置
sudo ln -s /etc/nginx/sites-available/halo /etc/nginx/sites-enabled/

# 删除 Nginx 默认的欢迎页配置,防止与咱们的博客冲突(重要!)
sudo rm /etc/nginx/sites-enabled/default 

# 检查 Nginx 配置语法是否正确
sudo nginx -t  

# 重新加载 Nginx 让配置生效
sudo systemctl reload nginx

一键申请并配置 HTTPS 证书

sudo certbot --nginx -d yourdomain.com

执行命令后,Certbot 会进行几个简单的交互:

提示输入管理员邮箱(用于证书过期前的提醒)。

同意服务条款。

最重要的一步: 询问是否自动将 HTTP 流量重定向到 HTTPS(Redirect)。建议选择自动重定向,这样用户无论如何访问,都会跳转到安全的 HTTPS 页面。

配置完成后,Certbot 会自动修改您刚才写的 Nginx 配置文件,加上证书路径和 443 端口的监听。至此,网站就可以通过 [https://yourdomain.com](https://yourdomain.com) 安全访问了!