谢晋杰
发布于 2025-07-21 / 9 阅读
0
0

使用halo搭建自己的个人博客

最近使用halo重新搭建了自己的个人博客。相比之前使用hexo搭建的静态博客,自己的体验是类似halo的动态博客日常维护会更加方便,不过动态博客对资源要求会相对高一些。

Halo是基于Java开发的开源建站工具,这里介绍一下使用halo搭建博客的过程,有需要的同志可以自行取用。

这是我搭建好的博客效果:https://xiejinjie.com

博客所需资源

搭建博客需要一台云服务器和一个域名。

最后博客部署的结构如下图:

云服务器选购

云服务器可以选择阿里云、腾讯云或者其它云服务厂商。

这边使用的是阿里云的服务器,阿里云服务器选购。阿里云有每年99元限购一台的服务器,资源配置不是很高2核2GB,但对于个人博客已经足够,而且后续续费依然是这个价格。

注:服务器构建的时候使用阿里云的Linux镜像构建,镜像自带了docker,后续也是使用docker进行构建,会更加方便。

博客搭建

服务器选购好,就可以搭建博客了。

这边使用docker compose进行搭建。docker compose是使用docker容器化技术,通过定义好服务的资源配置文件compose.yaml,然后docker根据配置文件进行服务构建。

根据如下步骤进行搭建:

  1. 登录服务器创建博客目录

我们连接到服务器终端,执行下面命令,创建博客目录halo2。

mkdir -p /opt/docker/halo2
  1. 创建compose.yaml文件

在创建的目录下创建compose.yaml文件,执行以下命令创建compose.yaml文件。

cd /opt/docker/halo2
vim compose.yaml

compose.yaml内容如下,其中halo定义了博客服务的配置,pg_db定义了数据库文件。

services:
  halo:
    image: registry.fit2cloud.com/halo/halo:2.21
    restart: on-failure:3
    container_name: halo
    depends_on:
      pg_db:
        condition: service_healthy
    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 参数
      - JVM_OPTS=-Xmx256m -Xms256m
    command:
      - --spring.r2dbc.url=r2dbc:pool:postgresql://pg_db/halo
      - --spring.r2dbc.username=halo
      # PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。
      - --spring.r2dbc.password=openpostgresql
      - --spring.sql.init.platform=postgresql
      # 外部访问地址,请根据实际需要修改
      - --halo.external-url=http://localhost:8090/
  pg_db:
    image: postgres:15.4
    restart: on-failure:3
    container_name: pg_db
    volumes:
      - ./postgresql:/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
  1. 启动博客服务

在halo2目录中执行下面命令,拉取halo镜像,并启动服务。

cd /opt/docker/halo2
docker compose up -d

命令执行成功后,halo2目录下会多出两个目录halo2和postgresql,这两个目录下是前面compose.yaml中定义的服务和数据库挂载目录,用来存放博客服务的数据文件。

  1. 访问博客服务

服务成功启动后,云服务厂商服务器的配置安全组规则页面,配置允许8090端口访问。

如下是阿里云配置安全组的操作过程:

  1. 博客初始化

使用「服务器ip+端口」直接访问博客了,我这边是 http://8.155.42.30:8090/

成功访问可以看到系统初始化的提示,填写博客标题和登录用户名密码进行初始化。

初始化成功后,使用「服务器ip+端口」重新访问就可以看到成功部署的博客,右上角登录控制台可以修改博客主题配置和发布新的文章。

域名选购

部署好的博客虽然可以通过「服务器ip+端口」直接访问,但是方便记忆。我们还需要购买一个域名,比如我选择的域名是xiejinjie.com

域名购买建议使用和服务器一致的云服务厂商,搜索喜欢的域名和后缀进行选购。

阿里云注册域名的链接:阿里云域名注册

需要注意的是部分域名首年很便宜,但是续费价格会相对高一些。

  • 域名绑定服务器IP

选购好域名后,需要配置DNS服务,让域名绑定服务器IP,才可以使用域名访问博客。

在云服务厂商的域名管理菜单,添加两条A解析记录 「@」 和「www」指向服务器ip。

dns解析生效后,在服务器终端中使用ping命令向域名发起请求,可以获取到服务器的应答。

ping xiejinjie.com -c 3

SSL证书申请

浏览器会对不支持https的站点添加不安全的标识,使用https访问,需要我们为域名申请配置SSL证书。

推荐使用Certbot工具 直接申请 Let's Encrypt 的免费证书。阿里云和腾讯云的免费证书现在一次只能申请三个月,到期后需要手动续签,服务器需要重新配置新的证书。

Certbot工具 可以在终端直接执行命令进行续签,也可以配置定时任务自动续签。

  • Certbot 申请配置SSL证书

执行以下命令申请证书,域名换成自己的。

yum install certbot -y
certbot --version
certbot certonly --standalone -d example.com -d www.example.com

命令执行成功后,会在服务器上生成SSL证书的凭证和密钥。

Nginx服务

我们通过Nginx作服务代理,配置SSL证书。

  1. 登录服务器创建Nginx目录

mkdir -p /opt/docker/nginx
  1. 配置compose.yaml文件

服务器终端执行以下命令,创建compose.yaml文件。

cd /opt/docker/nginx
vim compose.yaml

compose.yaml内容如下,其中挂载目录添加了上面Certbot 生成的SSL证书。

services:
  nginx:
    container_name: nginx
    image: nginx:latest
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./conf/nginx.conf:/etc/nginx/nginx.conf
      - ./conf.d:/etc/nginx/conf.d
      - ./html:/usr/share/nginx/html
      - ./logs:/var/log/nginx
      - ./ssl/crt:/etc/ssl/crt
      # 挂载Certbot生成SSL证书
      - /etc/letsencrypt/:/etc/letsencrypt/
    extra_hosts:
      - "host.docker.internal:host-gateway
  1. 配置Nginx

服务器终端执行以下命令,创建nginx配置文件。

mkdir -p /opt/docker/nginx/conf
cd /opt/docker/nginx/conf
vim nginx.conf

nginx.conf内容如下,其中配置的域名替换为自己的:

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        rewrite ^(.*)$ https://$host$1;
    }

    server {
        listen       443 ssl;

        # 域名替换为自己的
        server_name  example.com;
        ssl_certificate      /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;

        location / {
            proxy_pass http://host.docker.internal:8090;
            proxy_set_header Host $host;
        }
    }
}
  1. 启动Nginx服务

cd /opt/docker/nginx
docker compose up -d

服务启动成功后可以使用域名直接访问博客了,我这边是 https://xiejinjie.com

ICP备案

在国内服务器运行的站点需要进行ICP备案后才可以正常访问,没有进行备案的域名访问时会被运营商拦截,如果服务器使用的是海外服务器可以跳过这一步。

在云服务厂商ICP备案专栏,按照要求填写相关信息提交备案申请至工信局审核即可,需要七个工作日左右可以通过。

结束

至此,我们博客的搭建工作就全部完成了,接下来就可以自定义博客的主题风格和发布文章了。

  • halo控制台中的应用市场有丰富的主题和插件,可以选择自己喜欢的主题或者插件直接安装使用。

快使用halo搭建你的个人博客吧,记录自己的生活和成长过程,随着时间的积累你的博客会成为你的一张个人名片。

❤️ 感谢您的耐心阅读 ❤️

⭐️ 欢迎我的微信公众号【晋杰创业拼图】⭐️

🥰 期待与您一同成长进步 🥰

参考资料

使用 Docker Compose 部署 | Halo 文档


评论