写在前面

迁移这小站还是花了一些时间和精力,目前只是做了最基础的配置,后续我还会进行一些DIY魔改。当然,也会和之前一样,一些改动的地方和代码也会进行记录,所以这篇文章也会是Halo博客的魔改笔记。

基础环境搭建

搭建的前提是:有一台自己的服务器

这里我采用的是官方推荐的docker-compose配置方案:halo+mysql的配置方案,在此基础上,我还配置了waline评论。不是说自带的评论解决方案不够好,而是waline可玩度更高。这样所有的数据都部署在我的服务器里了。

创建 Halo & MySQL & Waline 的实例

docker-compose.yaml文件如下:

version: "3"

services:
  halo:
    image: halohub/halo:2.10
    container_name: Halo
    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
    command:
      - --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo
      - --spring.r2dbc.username=root
      # MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
      - --spring.r2dbc.password=password #记得换密码
      - --spring.sql.init.platform=mysql
      # 外部访问地址,请根据实际需要修改
      - --halo.external-url=http://localhost:8090/

  halodb:
    image: mysql:8.1.0
    container_name: halodb
    restart: on-failure:3
    networks:
      halo_network:
    command:
      - --default-authentication-plugin=caching_sha2_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --explicit_defaults_for_timestamp=true
    volumes:
      - ./mysql:/var/lib/mysql
      - ./mysqlBackup:/data/mysqlBackup
    ports:
      - "3306: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=password #记得换密码
      - MYSQL_DATABASE=halo

  waline:
    container_name: waline
    image: lizheming/waline:latest
    restart: always
    depends_on:
      halodb:
        condition: service_healthy
    networks:
      halo_network:
    ports:
      - "8360:8360"
    volumes:
      - ./waline:/app/data
    environment:
      TZ: 'Asia/Shanghai'
      SITE_NAME: 'Asteri5m'
      SITE_URL: 'https://asteri5m.icu'
      SECURE_DOMAINS: 'asteri5m.icu'
      AUTHOR_EMAIL: 'asteri5m@qq.com'
      MYSQL_HOST: 'halodb'
      MYSQL_DB: #数据库名
      MYSQL_USER: #用户名
      MYSQL_PASSWORD: #数据库密码
      # 以下为邮箱提醒的参数,可以不要
      SMTP_SERVICE: 'QQ'
      SMTP_USER: 'asteri5m@qq.com'
      SMTP_PASS: #smtp密码,邮箱网页版申请
      SENDER_NAME: 'Asteri5m的小破站--评论提醒'

networks:
  halo_network:

这样做的好处:

  • 一建搭建,操作快捷方便。

  • 数据库由内网访问,不用暴露公网端口,安全

配置Mysql

当然,不是配置了就完事大吉了,还需要修改数据库。参考文章:使用Docker部署waline | 理想的彼岸 (zdynb.cn)

进入mysql容器:

docker exec -it halodb bash

修改时区:

date -R                                    # 查看当前时区
cp /usr/share/zoneinfo/PRC /etc/localtime  # 修改为当地时区

在容器内部连接到数据库:

mysql -u root -p # 接着输入密码,即可登录Docker容器内的mysql

创建一个新用户和数据库单独给waline使用,这样数据不会混乱,也更安全。


CREATE USER '数据库用户名'@'%' IDENTIFIED BY '密码'; # 创建新的用户
CREATE DATABASE waline #最后的zdy是库名,修改为自己的,下面同理
GRANT ALL PRIVILEGES ON waline.* TO 'waline'@'%'; # 授予数据库管理权限
FLUSH PRIVILEGES; #最后刷新权限, 使设置生效
alter user 数据库用户名 identified with mysql_native_password by '密码'; #因为mysql8的加密方式和Navicat不一样, 如果Navicat链接出错,请执行这句修改加密方式

然后选择创建的库,

use waline;

执行官方脚本配置表文件。

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
SET NAMES utf8mb4;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;


# Dump of table wl_Comment
# ------------------------------------------------------------

CREATE TABLE `wl_Comment` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `comment` text,
  `insertedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `ip` varchar(100) DEFAULT '',
  `link` varchar(255) DEFAULT NULL,
  `mail` varchar(255) DEFAULT NULL,
  `nick` varchar(255) DEFAULT NULL,
  `pid` int(11) DEFAULT NULL,
  `rid` int(11) DEFAULT NULL,
  `sticky` boolean DEFAULT NULL,
  `status` varchar(50) NOT NULL DEFAULT '',
  `like` int(11) DEFAULT NULL,
  `ua` text,
  `url` varchar(255) DEFAULT NULL,
  `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;



# Dump of table wl_Counter
# ------------------------------------------------------------

CREATE TABLE `wl_Counter` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `time` int(11) DEFAULT NULL,
  `reaction0` int(11) DEFAULT NULL,
  `reaction1` int(11) DEFAULT NULL,
  `reaction2` int(11) DEFAULT NULL,
  `reaction3` int(11) DEFAULT NULL,
  `reaction4` int(11) DEFAULT NULL,
  `reaction5` int(11) DEFAULT NULL,
  `reaction6` int(11) DEFAULT NULL,
  `reaction7` int(11) DEFAULT NULL,
  `reaction8` int(11) DEFAULT NULL,
  `url` varchar(255) NOT NULL DEFAULT '',
  `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;



# Dump of table wl_Users
# ------------------------------------------------------------

CREATE TABLE `wl_Users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `display_name` varchar(255) NOT NULL DEFAULT '',
  `email` varchar(255) NOT NULL DEFAULT '',
  `password` varchar(255) NOT NULL DEFAULT '',
  `type` varchar(50) NOT NULL DEFAULT '',
  `label` varchar(255) DEFAULT NULL,
  `url` varchar(255) DEFAULT NULL,
  `avatar` varchar(255) DEFAULT NULL,
  `github` varchar(255) DEFAULT NULL,
  `twitter` varchar(255) DEFAULT NULL,
  `facebook` varchar(255) DEFAULT NULL,
  `google` varchar(255) DEFAULT NULL,
  `weibo` varchar(255) DEFAULT NULL,
  `qq` varchar(255) DEFAULT NULL,
  `2fa` varchar(32) DEFAULT NULL,
  `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;




/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

然后使用exit命令退出myql和docker容器,重启环境。

docker-compose restart

享用你的博客

通过ip+端口方式即可访问你的博客,除此访问需要创建账号密码,它会自己跳转到后台哒,更多好玩的,自己探索吧。

Waline后台管理

访问:域名+ip+ '/ui/register'

优化&主题美化

图标

当前使用Dreams主题,图标参考地址:Remix Icon - Open source icon library