博客搭建总结

halo博客终于搭建完成,整个过程包括:

  • 前期看代码,发现它的一些技术特点,对这些特点进行了简单的了解
  • 然后运行起来,这里主要是数据库方便的变动大一点
  • 接着部署到容器中,运行到服务器上,这里涉及到nginx、mysql、java镜像等内容
  • 移植自己的博客,这里根据需要对导入、导出md进行了一些调整
  • 最后对备份策略进行了定制,并使用安装了https

本篇文章对这个过程进行梳理

1. 代码

  • 博客的逻辑关系

    这里的逻辑关系指的是基本数据之间的关系

    User、Post、Comment、categories、attachment(图片为主的附件)、tag等、Link

  • 前后端一体的架构系统特点及使用

    对于admin使用的是vue2,对于业务系统,使用的freemarker,最有趣的是可以在freemarker中先引用vue.min.js再引用自己的vue组件来使用的,业务系统中的comment就是如此处理的。

    在freemarker中引用vue、进而引用相关组件的方式,在组件中通过rest进行数据的获取。

  • 后端控制前端page与menu的方式

    menu是对业务系统的控制,是对主菜单的几个menu,增加menu后,需要增加其相对应的page,page本身是一个sheet(其实就是post),然后设置一个router与其对应,然后将这个router与menu关联。

  • 评论的审核

    评论的审核通过status来控制的

  • 事件驱动的方式

    这里用了很多的listener

    1. 启动事件初始化

    2. mail,comment之后的处理

    3. 访问之后的处理

      这里如何进行的线程处理,需要研究一下

      在这里通过并发实现了对访问数的增加,这一块需要学习一下才能看懂。

  • task

    用task进行删除操作,定期扫描,进行删除

  • 对file的封装

    上传图片的封装

  • 如何初始化数据库

    通过JPA自己初始化的

    有通过watch启动事件来进行相关的初始化:theme、directory、migration等

  • 数据是如何存储的

    存的标签内容如何渲染到了template上

    这种方式对md而言有何意义?

    博客是一种明显写少而读多的应用,这里将md通过markdownUtils进行parse成Node然后render成相应html,将render之后的数据也存储在数据库中,这样可以增加读取的效率。

  • 日志处理

    这里边有2种日志:操作日志与系统日志。

    操作日志是写到数据库中,也是通过Event的方式来做的,别处发,listen进行处理。

    系统日志是通过配置,写到对应的文件夹下:

    logging:
      level:
        run.halo.app: INFO
        org.eclipse.jetty.server.HttpChannel: ERROR
      file:
        path: ${halo.work-dir}/logs
    
  • 备份处理

    备份的处理有3种:

    1. 导出文章成md
    2. 导出很多数据成json
    3. 将静态的文件导出到目录下

2. 启动程序

  • 数据库

    halo默认使用的h2内存数据库,调试起来不太方便故改成了mysql

    有h2 -> mysql

  • theme

    启动时,会发现由于没有主题而运行失败的情况,在项目目录下执行如下命令即可

    git submodule init
    git submodule update
    
  • 创建库

    在调试过程中发现中文存储会出现问题,如下建库即可

    create database halo character set utf8mb4 collate utf8mb4_bin;
    
  • druid

    想将数据库的密码加密,于是引入了druid,同时去掉了filter中的wall,因为它的migration时会有问题。

    引入依赖、配置

  • gradle

    以前用的都是maven,这个用的是gradle

    • 依赖
    • repo
    • plugin
    • 多modle
    • task概念

3. 服务器部署

  • 镜像

    docker login --username=sunyanfeng1987 registry.cn-qingdao.aliyuncs.com
    
    docker build -t registry.cn-qingdao.aliyuncs.com/fridayplus/halo:0.2.0 .
    docker push registry.cn-qingdao.aliyuncs.com/fridayplus/halo:0.1.0
    
  • nginx配置

    halo自己使用的是docker-gen的工具,看介绍可以动态的生成nginx.config;

    这里使用原始的自己配置的方式来做

    nginx的思路是使用官方镜像,然后将nginx.conf、certs等通过volume映射进去。

  • mysql配置

    mysql的思路与nginx类似,这里需要注意的是mysql的username与password,我们在代码中将它们做了加密,这里也想着不要暴露出来。

    采用了环境变量的方式,这样配置文件中就不会存在了。

    这个我记得也可以不用环境变量,具体的忘记了。

  • 整体思路

    docker-compose.yml思路:

    • nginx共享
    • blog模块放在blog下
    • 以后有其他模块放在其他模块中
    • 模块本身包含着mysql、业务导出的文件等等

    这样docker-compose.yml放在跟目录下,并创建blog与nginx文件夹。

4. 运维相关

  • 迁移
    迁移主要是图片与markdown,这里对自己的markdown写了两个正则,将图片转化成从附件库中取最新的图片。这样大大加快了迁移的效率。

  • 备份
    起初准备用mark的备份方式,并且处理了zip对中文的支持问题。后来觉得markdown的方式,还需要备份数据库,而数据库备份的方式,是基于mysqldump的,对docker及应用支持都存在难度,权衡之后采用自带的数据库JSON备份方式+工作目录备份,并通过定时任务来触发,最后保存到自己的oss上,这样就造成了自动备份。

  • https
    申请证书
    挂载到Nginx下,并配置nginx.conf注意listen的端口80与443,以及80得重定向。

5. 总结

综上,整个搭建需要:

  • 程序镜像
  • 目录结构
    |- docker-compose.yml
    |- nginx
    		|- nginx.conf
    		|- certs
    			|-  xxxx.pem
    			|-  xxxx.key  
    |- halo
    		|- halo_data
    		|- mysql_data
    		|- halo_backup
    
  • nginx.conf
  • https的ssl证书,放到certs下
  • 数据库创建,注意字符集
  • docker-compose.yml

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×