目 录CONTENT

文章目录

Halo 建站(个人博客)笔记

Nicholas
2023-04-25 / 1 评论 / 3 点赞 / 329 阅读 / 16219 字

版本说明:本文最后更新于2023-04-28,详细更新记录参见文末表格。

若链接或图片失效,对文中内容有任何疑义和勘误意见,欢迎留言反馈。

精选程度:★★★★★|博文状态:已完结|本地标签:是


Halo建站(个人博客)笔记

本笔记介绍了从零开始,搭建一个Halo个人博客的全部过程。包括服务器购买、Halo安装、域名注册、网站备案、安全证书安装等。

如果不需要通过域名访问,则只需要做到Halo安装即可。

搭建网站的总体流程如下所示。

20230428210237_718651.png

〇、本文概要

0.1、达成目标

从零开始实现Halo个人博客搭建。

0.2、前置知识

  • 服务器基础知识(非必须)
  • Linux系统概念和基础操作:发行版本、基本命令、Vim编辑器操作等(最好有)
  • 容器Docker基础知识(非必须)
  • 计网基础概念ip地址、端口、域名、DNS解析、代理、反向代理、SSL证书等(最好有)

推荐优先观看参考资料[2],理解网站搭建的基本概念。

一、Halo简介

Halo是一个开源建站工具,1.x版本主要用于博客搭建。2022年12月正式发布的2.x版本之后,Halo已经不仅仅满足用来搭建一个博客,而是可以搭建任何网站了。

从个人使用体验来说,具有界面美观、主题丰富、插件安装方便、前后台系统功能完善等优势。

20230428210237_213813.png

二、服务器购买

腾讯云购买轻量应用服务器,系统配置如下所示。

当然,任何厂商购买的服务器都是可以的。配置上内存至少1G,系统推荐使用Linux(例如UbuntuDebian等)。

此处我选的是Debian,但是下一步我将系统重装成了Ubuntu,你可以直接选择Ubuntu系统。

20230428210237_226837.png

重装系统,使用docker基础镜像,这样可以免去后续docker安装的操作。

如果是腾讯云可以按照这边操作,其他云厂商可能需要不同途径。或者可以直接跳过此步,后续手动安装Docker、Docker-compose。(参考Docker 安装文档Docker Compose 安装文档

【注】必须在运行环境安装好Docker环境,目前Halo的默认安装运行方式均使用容器。

20230428210237_242043.png

此时即可远程一键登录服务器。

20230428210237_257192.png

三、宝塔面板安装(可选)

宝塔面板是一款服务器运维面板。这里主要是为了后续SSL证书的部署和反向代理配置的便利。

如果不需要使用域名访问halo博客,则可以跳过此步。

进入宝塔官网,按照自己的系统类型选择安装脚本。

20230428210237_272550.png

复制到服务器命令行,即可进行安装。(注:最好在纯净的系统上进行安装)安装完成后会有如下提示。

20230428210237_288596.png

为了使20374端口能够被正常访问,在腾讯云控制台进入防火墙规则界面添加规则。

20230428210237_303790.png

自定义添加规则详情如下。

20230428210237_734738.png

此时,通过外网面板地址即可在浏览器访问到宝塔面板登录界面。

20230428210237_318857.png

首次登录会要求注册宝塔面板账号,并绑定账号。如果弹出推荐安装的软件,跳过即可。

20230428210237_334351.png

至此,宝塔面板安装完毕。

四、Halo安装

4.1、Halo安装

命令行验证dockerdocker-compose安装成功。

docker -v
docker-compose -v

20230428210237_350417.png

创建安装的目录,创建docker-compose配置文件。

mkdir ~/halo && cd ~/halo  # 后续操作中,Halo 产生的所有数据都会保存在这个目录,请妥善保存
vim docker-compose.yml

20230428210237_365680.png

按下i进入插入模式。拷贝官方文档配置文件(创建 Halo + MySQL 的实例),并修改关于密码的部分。

version: "3"

services:
  halo:
    image: halohub/halo:2.4
    container_name: halo
    restart: on-failure:3
    depends_on:
      halodb:
        condition: service_healthy
    networks:
      halo_network:
    volumes:
      - ./:/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
    command:
      - --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo
      - --spring.r2dbc.username=root
      # MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
      - --spring.r2dbc.password=xxxxxx
      - --spring.sql.init.platform=mysql
      # 外部访问地址,请根据实际需要修改(填写域名,或者服务器公网ip)
      - --halo.external-url=https://xxxxxx.com
      # 初始化的超级管理员用户名
      - --halo.security.initializer.superadminusername=admin
      # 初始化的超级管理员密码
      - --halo.security.initializer.superadminpassword=xxxxxx

  halodb:
    image: mysql:8.0.31
    container_name: halodb
    restart: on-failure:3
    networks:
      halo_network:
    command: 
      - --default-authentication-plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_general_ci
      - --explicit_defaults_for_timestamp=true
    volumes:
      - ./mysql:/var/lib/mysql
      - ./mysqlBackup:/data/mysqlBackup
    ports:
      # 不在公网暴露halo数据库的端口,一定程度保障博客的安全
      - "3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
      interval: 3s
      retries: 5
      start_period: 30s
    environment:
      # 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
      - MYSQL_ROOT_PASSWORD=xxxxxx
      - MYSQL_DATABASE=halo

networks:
  halo_network:

Esc退出插入模式,:进入末行模式,wq+Enter键保存并退出。

检查端口是否被占用,如果没有,则不需要其他操作。

lsof -i:8090

20230428210237_380821.png

为了使8090端口能够被正常访问,在腾讯云控制台进入防火墙规则界面添加规则。

20230428210237_303790.png

自定义添加规则详情如下。

20230428210237_749957.png

服务器安装并启动halo服务。

cd ~/halo
sudo docker-compose up -d

''' 或者可以使用如下命令,但请确保你熟悉相关Linux命令 '''
sudo -i   # 为了频繁的执行某些只有超级用户才能执行的权限,而不用每次输入密码,使用该命令
cd /home/lighthouse/halo/
docker-compose up -d

等待安装完成,此时即可在本机通过ip地址+端口的形式访问,网址为http://[服务器的公网ip]:8090

如果无法访问,请检查服务器是否使用了 Linux 面板,其是否还有安全组配置,需要同样将端口号添加到安全组。

20230428210237_411090.png

通过网址http://[服务器的公网ip]:8090/console进入后台界面(用户名密码是之前配置文档中设置的)。

20230428210237_426244.png

4.2、主题和插件安装

官方文档上目前支持的主题和插件等:https://github.com/halo-sigs/awesome-halo

例如,下载theme-butterfly主题,在halo系统后台直接拖拽安装。

20230428210237_441398.png

4.3、版本升级

sudo docker ps                    # 查看当前docker运行状态
sudo docker-compose down          # 停止运行中的容器组
cp -r ~/halo ~/halo.archive       # 备份数据(重要)

修改 docker-compose.yaml 中配置的镜像版本。

vim docker-compose.yaml    # image: halohub/halo:2.4

sudo docker-compose pull    # 拉取新版本镜像(或docker-compose pull halo)
sudo docker-compose up -d   # 重新运行,即可升级成功

4.4、常用操作

cd ~/halo
sudo docker-compose down    # 停止运行中的容器组
sudo docker-compose up -d   # 重新运行

20230428210237_456541.png

五、域名注册

5.1、域名购买

腾讯云域名和DNS解析服务购买。

此处我购买了DNS解析服务(因为感觉折扣很大),但是并不是必须的,腾讯云自带了免费版的域名解析服务。

如果购买专业版,后面需要按照它的提示手动配置一下解析服务器,比较麻烦,因此不建议购买。

20230428210237_471760.png

完成注册域名后,等待一段时间即可在控制台看到自己的域名。

20230428210237_487830.png

5.2、网站备案

根据提示,在腾讯云上对域名进行备案(https://console.cloud.tencent.com/beian/manage)。

这个阶段全流程大概需要10天到1个月左右,大致包括:域名实名认证、ICP备案信息提交、腾讯云初审和返回修改、管局审核通过、公安备案信息提交、公安备案通过。

【注意】网站备案成功后,需要在备案成功的网站底部悬挂工信部下发的网站备案号,并生成链接指向工信部网站https://beian.miit.gov.cn,供网站访问者查询核对。若未在网站底部添加网站备案号,将被备案所在省通信管理局责令改正,并处五千元以上一万元以下罚款。

如果你的服务器在国外,则不需要进行备案。如果服务器在国内,根据相关法规则必须进行备案,域名才能正常访问。

5.3、DNS域名解析配置

进入DNS解析 DNSPod控制台。

20230428210237_503117.png

添加解析记录,记录值为服务器公网ip地址。

20230428210237_518276.png

设置完成后,等待一段时间,即可通过域名+端口的形式访问个人博客。

20230428210237_534256.png

六、反向代理和SSL证书安装

我们怎么样才能把IP+端口变成域名来访问,答案是用反向代理。

6.1、使用宝塔面板设置反向代理

进入面板网站项目,点击添加站点。填写前面申请好的域名,其他配置信息如下图所示。

如果提示需要安装Ngnix,直接点击安装即可。

20230428210237_549258.png

进入网站的配置文件,将如下location两段内容注释,并添加一段配置内容如下。

    location / {
      proxy_pass http://127.0.0.1:8090/;       # 注意改成你实际使用的端口
      rewrite ^/(.*)$ /$1 break;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Upgrade-Insecure-Requests 1;
      proxy_set_header X-Forwarded-Proto https;
    }

20230428210237_564561.png

至此,反向代理配置成功。可以直接通过域名访问我们的halo博客。

安全起见,此时即可将先前服务器防火墙开放的8090端口撤销。

20230428210237_579834.png

6.2、使用宝塔面板部署SSL证书

首先通过腾讯云申请到免费的SSL证书。

20230428210237_595083.png

下载证书,选择Nginx版本。

20230428210237_765231.png

下载完成后打开证书压缩包,我们只需要用到key和pem后缀的两个文件。

20230428210237_611109.png

在宝塔面板的刚添加的站点中,设置SSL,将上述两个文件中内容分别粘贴至如下框中,并保存。同时打开强制HTTPS开关。

20230428210237_781233.png

至此,SSL证书部署完成,再次打开网站,链接已经变为安全。

20230428210237_626518.png

6.3、(附)通过Nginx proxy manager实现反向代理和SSL申请

Nginx proxy manager是一个很简单的反向代理工具。

官网:https://nginxproxymanager.com/

门槛极低,操作简单,不需要你掌握很复杂的Nginx配置知识,只需要几步就能很轻松完成反向代理的设置和SSL证书的部署。

6.3.1、安装Nginx Proxy Manager

创建一个安装目录。

mkdir -p ~/nginxproxymanager
cd ~/nginxproxymanager/

新建配置文件。

vim docker-compose.yml

英文输入法下,按i进入插入模式。根据官网文档输入配置文件内容。

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'              # 不建议修改端口
      - '81:81'              # 可以把冒号左边的 81 端口修改成你服务器上没有被占用的端口
      - '443:443'            # 不建议修改端口
    volumes:
      - ./data:/data         # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 data 目录,用于存放数据,如果不存在的话,会自动创建
      - ./letsencrypt:/etc/letsencrypt  # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 letsencrypt 目录,用于存放证书,如果不存在的话,会自动创建

注意:安装了 nginx-proxy-manager 之后,就不需要再安装 Nginx 了,否则会端口冲突(不建议修改 nginx-proxy-manager 的 80、443 端口)。如果你的服务器安装了宝塔面板,也可以和 nginx-proxy-manager 一起使用,只要你到软件后台把宝塔安装的 Nginx 关闭或者卸载即可。

打开服务器的81端口,如下所示。

20230428210237_796570.png

检查端口是否被占用。

lsof -i:81  #查看 81 端口是否被占用,如果被占用,重新自定义一个端口

运行并访问Nginx Proxy Manager

cd ~/nginxproxymanager/   # 来到 dockercompose 文件所在的文件夹下
sudo docker-compose up -d

理论上我们就可以输入http://ip:81访问了。默认登陆名和密码:

Email:    admin@example.com
Password: changeme

20230428210237_641830.png

至此,我们已经完成了Nginx Proxy Manager的搭建,之后就可以用它给我们的Halo或者其他Web应用做反向代理了。

6.3.2、配置反向代理

点击添加Proxy Hosts

20230428210237_657815.png

20230428210237_673040.png

查看Docker容器内部的IP

ip addr show docker0

20230428210237_688192.png

填写代理的详细信息,每个条目的解释如下。

20230428210237_811729.png
  • Domain Names :填我们 Halo 网站的域名,首先记得做好 DNS 解析,把域名绑定到我们的服务器的 IP
  • Scheme :默认 http 即可,除非你有自签名证书
  • Forward Hostname/IP :填入服务器的IP,或者Docker容器内部的IP(如果 NPM 和 Halo 搭建在同一台服务器上的话)
  • Forward Port:填入 Halo 映射出的端口,这边默认是 8090
  • Cache Assets :缓存,可以选择打开
  • Block Common Exploits: 阻止常见的漏洞,可以选择打开
  • Websockets SupportWS 支持,可以选择打开
  • Access List: 这个是 NPM 自带的一个限制访问功能,这边我们不管,后续可以自行研究

6.3.3、SSL证书申请添加

上述界面中打开SSL标签栏,选择申请一张新的SSL证书,保存即可。

20230428210237_703396.png

参考资料


Q & A

暂无

更新记录

时间修改内容
2023-04-26首次发布版本
2023-04-28修复了文中一张图片无法正常显示的问题
3

评论区