这两天想起来以前总说着要搭建一个Blog个人网站。毕竟是一个计算机出生的学生,在学校里面学习这么多年了,连个博客都没有,实在有点说不过去,于是决定立刻开始搭建一个。一开始想着要自己完完全全手搓一个,但是发现无从下手。于是还是打算先基于目前最便捷的框架来直接设计一个。

经过我前期的调研,发现有这么几个wordpress、Halo、solo、poitize。在我的既要又要下,我选择了这个Halo简洁又美观又开源免费的框架。下面简单写一下我的配置过程。

安装docker

基于官方文档,采用docker compose的方式来进行安装。首先要安装docker与docker compose,我的云服务器是腾讯云的轻量级服务器,由于我之前我在服务器上运行了泰拉瑞亚的游戏服务,使用的系统版本为ubuntu 20.04。但是在docker安装文档中提示系统最少要使用22.04的版本,害得我得先重置一下系统。

重置完成后就可以开始安装了,按照一下命令安装一下

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# install docker engine
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

运行一个简单的容器,检查一下docker是否安装好

sudo docker run hello-world

这里我提示了网络错误,主要原因是docker的源在国内目前很难使用,于是必须先更新一下docker国内源。我们需要在/etc/docker目录下面创建文件daemon.json

sudo mkdir /etc/docker
sudo touch daemon.json
sudo vim daemon.json
{
    "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://docker.imgdb.de",
        "https://docker-0.unsee.tech",
        "https://docker.hlmirror.com"
    ]
}
systemctl daemon-reload
systemctl restart docker

执行完成后在运行之前docker run hello-world应该就能提示成功了。然后是安装docker compose

sudo apt-get update
sudo apt-get install docker-compose-plugin
docker compose version

如果提示正常就安装成功了

安装Halo

接下来我们就可以安装Halo框架,首先创建一个文件夹

mkdir ~/halo && cd ~/halo

创建 docker-compose.yaml ,并输入一下配置文件

touch docker-compose.yaml
vim docker-compose.yaml
##配置文件
version: "3"

services:
  halo:
    image: registry.fit2cloud.com/halo/halo:2.21
    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 参数
      - 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: 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:

然后启动服务,这里注意一下,因为我使用的是基于docker rep安装的compose,所以命令中,docker和compose之间不要加-

docker compose up -d

然后使用ip+/console 即可进入 Halo 管理页面,首次启动会进入初始化页面。

额外配置项

由于后续需要使用域名来访问我的博客,并且现在网站不使用https协议就会报不安全的问题,所以还需要配置443协议,并为我的域名配置协议证书

首先安装在服务器本机上安装nginx与协议配置软件

sudo apt-get update
sudo apt-get install -y nginx
# 安装 certbot(Let's Encrypt)
sudo apt-get install -y certbot python3-certbot-nginx

然后我们为我们的域名和www.域名配置https协议证书

sudo certbot --nginx -d natsukiz.site -d www.natsukiz.site --expand

然后关闭nginx的默认站点

ls -l /etc/nginx/sites-enabled
# 若看到 default -> /etc/nginx/sites-available/default
sudo rm -f /etc/nginx/sites-enabled/default

添加网站的配置xxx.site

sudo touch xxx.site
sudo vim xxx.site

upstream halo {
    server 127.0.0.1:8090;
    keepalive 32;
}

# 443:主站(裸域)提供服务
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name natsukiz.site;

    ssl_certificate     /etc/letsencrypt/live/natsukiz.site/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/natsukiz.site/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam         /etc/letsencrypt/ssl-dhparams.pem;

    client_max_body_size 1024m;

    location / {
        proxy_http_version 1.1;
        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;
        proxy_set_header Connection "";
        proxy_buffering off;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
        proxy_pass http://halo;
    }
}

# 443:www -> 裸域 301(先完成 TLS,避免默认页)
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name www.natsukiz.site;

    ssl_certificate     /etc/letsencrypt/live/natsukiz.site/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/natsukiz.site/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam         /etc/letsencrypt/ssl-dhparams.pem;

    return 301 https://natsukiz.site$request_uri;
}

# 80:所有 http 请求统一跳到 https 裸域
server {
    listen 80;
    listen [::]:80;
    server_name natsukiz.site www.natsukiz.site;
    return 301 https://natsukiz.site$request_uri;
}

将新配置更新到nginx中

sudo nginx -t
sudo systemctl reload nginx

然后使用域名访问即可!目前我使用的主题是Hao,具体配置可以再控制台中修改