前言

相信你想建站的时候一定能在网上搜到很多的“免费搭建博客”、“零成本搭建博客”,但是这类教程通常都是奔着“免费”去的,实际体验并不好(单看域名就够),优化就更别说了。

而我不一样, 我的教程要成本 我的教程虽然要一定的成本,但是优化体验可能较好(至少相较于免费),属于性价比较高的一类了。

准备的东西

付费

域名(付费可选,强烈推荐。可以用免费域名,但是一定要一个域名,否则动态 IPv6 解析不了)

电脑( 这个应该不用说了吧 要 24 小时跑服务器,关机就相当于关服)

代理(可选,最好要,不然下载外国资源的时候没选镜像会慢到怀疑人生, 虽然选了镜像也好不到哪去 。以下教程默认你有新加坡和日本代理)

宽带(需要有公网 IP。现在服务商基本都给公网 IPv6,但 IPv4 可能要自己申请,或者有别的服务可以内网穿透过去)

免费

CF 解析(需要将域名的 DNS 解析商换成 CF 的)

Lucky(配合 CF 的 Token 进行 DDNS 动态域名)

FinalShell(SSH 连 Debian)

VMWare(跑虚拟机)

Debian13.iso 镜像(虚拟机选用 Debian13,轻量级)

30GB 左右的空间

2~4GB 的空余内存(要分配给虚拟机)

搭建虚拟机

打开 VMWare,选择新建虚拟机,新建一个虚拟机,镜像选择 Debian13 的 iso,硬盘存储分配 30GB,内存最低 2G,如果内存多建议 4G。

启动虚拟机,初始化。设置任何密码的时候都要记录下来,建议 root 和主账号用一个密码,这样不用区分。

选择地区以判断镜像站点的时候可以选择你代理有的地区,然后选当地的镜像源(具体选哪个比较快可以根据代理服务器具体位置和镜像具体位置、镜像限速决定)。下载速度很玄学,运气好的几分钟,运气差的可能十几个小时(这时就要考虑换一个镜像了)。

到选择要下载的系统工具页面时(我记不清具体名称了,是有几个复选框选择系统工具之类的),只选 SSH

配置 SSH

在虚拟机中输入 ip addr 查看该虚拟机的内网 IPv4,记下来。

在 FinalShell 中新建

PixPin_2026-03-12_20-08-57.png
PixPin_2026-03-12_20-09-19.png

然后主机填刚才记住的 IPv4

保存

双击连接管理器中刚才创建的,会打开一个蓝色的命令行,第一次打开会有弹窗,选择记住。

然后就可以用 FinalShell 直接在 Debian 中执行命令了

安装宝塔面板

进入虚拟机后,输入 su 回车进入 root(需要输入 root 密码)

依次输入以下命令

apt update # 更新软件包列表
apt install wget # 下载wget
wget -O install.sh http://download.bt.cn/install/install-ubuntu.sh && bash install.sh # 下载宝塔面板

然后可以输入 bt1 开启宝塔面板

控制台会输出内网链接和账号密码,账号密码建议找个地方存起来,以免忘记(登录的时候似乎不会触发浏览器自动记录密码的功能)

访问内网地址,登录。

安装 Docker 和 Halo

左侧列表选择 Docker,点击安装

PixPin_2026-03-12_20-05-48-EvaR.png

不要使用宝塔自带的应用管理,不好用

点击“容器编排”,添加容器编排,然后在 compose 文件内容中输入

services:
  halo:
    image: registry.fit2cloud.com/halo/halo:2.22
    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 参数
      - JVM_OPTS=-Xmx256m -Xms256m
    command:
      - --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
      - --spring.r2dbc.username=halo
      - --spring.r2dbc.password=openpostgresql
      - --spring.sql.init.platform=postgresql
      - --halo.external-url= # 这里写你的域名,带协议头
      - --server.forward-headers-strategy=native
      - --server.tomcat.remote-ip-header=X-Forwarded-For
      - --server.tomcat.internal-proxies=192\.168\.153\.1|127\.0\.0\.1|172\..*|10\..*

  halodb:
    image: postgres:15.4
    restart: on-failure:3
    networks:
      halo_network:
    volumes:
      - ./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:

并在这段配置的相应位置写上你的域名。

然后创建容器即可。

如果显示“创建失败,请检查 compose 文件格式是否正确,那就去 FinalShell 中输入

apt update
apt install locales -y
sed -i 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen
/usr/sbin/locale-gen en_US.UTF-8

然后重新试一次创建容器

未完待续

毕竟不怎么会有人看,拖更两天应该没事吧……

学业较繁忙,待更