从一台全新的云服务器(阿里云 ECS)开始,从 0 到 1 完整搭建 Halo 个人独立博客的标准全流程如下:

一、 服务器基础环境与前置准备

1. 云厂商安全组放行端口

在阿里云 ECS 控制台的【安全组】入方向规则中,确保放行以下端口:

  • 22:远程 SSH 连接。

  • 80:HTTP Web 服务(Certbot 申请 SSL 证书必须)。

  • 443:HTTPS Web 服务。

  • 8090(可选):Halo 默认端口(若全部走 Nginx/OpenResty 反向代理,可不必对公网开放)。

2. 域名解析

在域名控制台(如阿里云 DNS / Cloudflare)添加解析记录:

  • 记录类型:A

  • 主机记录:@ 或 www(例如 originspace.work)

  • 记录值:云服务器的公网 IP

3. 配置虚拟内存(Swap,低配主机必做)

防止 Java 21 与容器服务在内存紧张时触发 OOM 导致 SSH 假死:

Bash

fallocate -l 2G /swapfile || dd if=/dev/zero of=/swapfile bs=1M count=2048
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab

二、 安装 Docker 与 Docker Compose

以 CentOS / RHEL / Alibaba Cloud Linux 为例:

Bash

# 1. 安装基础依赖与 Docker 官方仓库
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 2. 安装 Docker Engine 及 Compose 插件
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 3. 启动 Docker 并设置开机自启
systemctl start docker
systemctl enable docker

三、 部署 Halo 博客(Docker Compose 方式)

1. 创建工作目录与专用桥接网络

Bash

# 创建站点目录及持久化数据目录
mkdir -p /opt/halo/data
cd /opt/halo

# 给持久化工作目录赋予容器运行写入权限
chmod -R 777 /opt/halo/data

# 创建供 Web 反代与应用容器互相通信的桥接网络
docker network create web-net

2. 编写 docker-compose.yml

Bash

nano /opt/halo/docker-compose.yml

写入 Halo 服务的编排文件(默认使用内嵌 H2 模式快速起步):

YAML

services:
  halo:
    image: ghcr.io/halo-dev/halo:2.24.2
    container_name: halo
    restart: unless-stopped
    ports:
      - "8090:8090"
    volumes:
      - ./data:/root/.halo2
    command:
      - --halo.external-url=https://originspace.work
    networks:
      - default

networks:
  default:
    name: web-net
    external: true

3. 启动 Halo 容器

Bash

docker compose up -d

检查启动状态:

Bash

docker logs -f halo

输出 Started HaloApplication in ... seconds 时按 Ctrl + C,说明服务已在本地 8090 端口就绪。

四:使用NPM进行反向代理于ssl配置

1. 寻找部署目录

在服务器上,NPM 通常部署在独立目录中,你可以通过以下命令找到当初放置 docker-compose.yml 的位置:

Bash

docker inspect npm-app-1 --format '{{ index .Config.Labels "com.docker.compose.project.working_dir" }}'

(一般输出会是 /opt/npm、/root/npm 或 /data/npm 等路径)

2. 当时创建的目录与配置文件

当时你进入了该目录,并创建了数据挂载文件夹:

Bash

mkdir -p /opt/npm && cd /opt/npm
mkdir -p data letsencrypt

然后编写了 docker-compose.yml:

YAML

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'      # HTTP 访问与证书验证
      - '81:81'      # NPM 管理后台面板
      - '443:443'    # HTTPS 加密访问
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    networks:
      - default

networks:
  default:
    name: web-net
    external: true

说明:挂载的 data 存放了 NPM 的配置与内置 SQLite 数据库,letsencrypt 存放申请的 SSL 证书。

3. 当时的启动命令

在编写好配置后,直接执行了拉起命令:

Bash

docker compose up -d

Docker 自动将服务命名为了 <项目目录名>-app-1(即 npm-app-1),并自动映射了 80、81、443 端口。

4. 初始登录凭据(默认初始账号)

首次通过 http://<IP>:81 访问时,使用的是 NPM 官方默认账号:

  • Email: admin@example.com

  • Password: changeme 首次登录后系统会强制要求修改邮箱与密码。

五、 反向代理与 SSL 证书配置(Nginx / OpenResty)

为博客绑定域名并启用 HTTPS 加密访问。

1. Nginx 站点配置

在你的 Nginx 或 OpenResty(若使用 1Panel / NPM 则在面板操作)的配置文件中配置反向代理规则:

Nginx

server {
    listen 80;
    server_name originspace.work;

    # 强制跳转 HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name originspace.work;

    ssl_certificate     /etc/nginx/ssl/originspace.work.pem;
    ssl_certificate_key /etc/nginx/ssl/originspace.work.key;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    # 解除客户端请求体上传大小限制(保证大图片和备份包能正常上传)
    client_max_body_size 1024m;

    location / {
        proxy_pass http://halo:8090; # 若 Nginx 也在容器中并加入同一网络,可直接用容器名
        # 若 Nginx 安装在宿主机,可改为: 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;

        # 支持 WebSocket(Halo 控制台通知需要)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

重新加载 Nginx 配置:

Bash

nginx -t && nginx -s reload

六、 站点初始化与正式使用

  1. 打开浏览器访问域名:[https://originspace.work](https://originspace.work)。

  2. 页面会自动进入 【系统初始化】 引导向导:

    • 确认外部访问地址为 [https://originspace.work](https://originspace.work)。

    • 填写站点标题、管理员用户名、邮箱和管理密码。

  3. 点击 【完成初始化】,系统写入初始化设置并跳转至后台登录面板(/console)。

  4. 在应用市场中安装并启用喜欢的主题(如 Dream、Joe 等)和插件,即可正式开始发布博客。