从零开始:搭建基于 Solo 的动态博客

本贴最后更新于 308 天前,其中的信息可能已经事过景迁

摘要

为什么要搭建个人博客

最近由于有些本地写的笔记想要输出给朋友、家人看,但是目前的在线文档、平台的使用体验都不是太好,于是想着利用自己的两台服务器,把个人博客建起来,也能督促自己沉淀一些文档,在学习过程中讲究有输入有输出;在生活中也讲究记录有趣的瞬间。

为什么要选择 Solo

今年开始,把个人的笔记软件由 obsidian 转移到了思源笔记,由此接触到了 b3log 社区,很喜欢这种分布式社区的理念。而 Solo 将个人博客与社区结合起来,有更好的使用体验。除此之外,Solo 还有以下几个我比较关注的优点:

  • 版本升级简单,使用 docker 部署的博客后续更新只需要重新拉取最新镜像重启即可,也可以通过配置 cron 脚本每天定时完成这一操作以保持版本的最新。
  • 内置 HTTPS+CDN 文件存储,无需个人折腾配置图床
  • 发布文章支持同步至链滴社区

目前网上搭建 Solo 博客的文章也有一些,但在我实践的过程中踩了不少坑,因此把个人搭建的过程记录下来,给后来者做参考。

上手搭建

Solo 博客提供了多种搭建方式,本文选择的是基于 docker 部署的方式:

  • 动态博客:在服务器上搭建,进程常驻内存,在线使用

    • 本地运行,通过源码构建运行
    • docker 部署
  • 静态博客:在本地电脑运行,写作完成后生成导出静态站点

docker 安装

docker 部署 mysql

  • 创建初始化 mysql 容器,并将容器中的文件夹复制到本地,再移除初始化容器,基于复制的文件夹挂载到新的 mysql 容器

    docker pull mysql
    docker run -id --name mysql -p 3306:3306  -e MYSQL_ROOT_PASSWORD=123456 mysql
    docker cp mysql:/var/lib/mysql /opt/mysql
    docker cp mysql:/etc/mysql/conf.d /opt/mysql
    docker cp mysql:/etc/my.cnf /opt/mysql
    docker rm -f mysql
    docker run -id --name mysql -p 3306:3306 -v /opt/mysql/mysql:/var/lib/mysql -v /opt/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 mysql
    
    docker exec -it mysql /bin/bash
    
  • 进入 mysql 容器,创建 solo 的数据库

    create database solo default character set utf8mb4 collate utf8mb4_general_ci;
    create user 'root'@'127.0.0.1' identified by '123456';
    grant all privileges on *.* to 'root'@'127.0.0.1';
    flush privileges;
    

docker 部署 solo

#拉取solo镜像
docker pull b3log/solo
#启动solo容器
docker run --detach --name solo --network=host \
    --env RUNTIME_DB="MYSQL" \
    --env JDBC_USERNAME="mysql" \
    --env JDBC_PASSWORD="123456" \
    --env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
    --env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" \
    b3log/solo --listen_port=8080 --server_scheme=http --server_host=localhost --server_port=

启动参数说明:

  • --listen_port:进程监听端口
  • --server_scheme:最终访问协议,如果反代服务启用了 HTTPS 这里也需要改为 https
  • --server_host:最终访问域名或公网 IP,不要带端口
  • --server_port:最终访问端口,使用浏览器默认的 80 或者 443 的话值留空即可

完整启动参数的说明可以使用 -h 来查看。

docker 部署 Nginx

这一步参考了 docker 安装 Nginx 详细教程和基本配置 - 掘金 (juejin.cn),但这篇文章中创建文件夹部分有问题,会导致启动容器失败,下文解决了这个报错。

  • 下载并运行最新版 Nginx 镜像

    docker pull nginx:latest
    docker run --name nginx -p 80:80 -d nginx
    
    • 参数详解

      • --name nginx 指定容器的名称
      • -p 80:80 映射端口
      • -d 守护进程运行
  • 从 nginx 容器中复制核心的文件,挂载至新的 nginx 容器

    • 本地创建文件目录,拷贝容器对应的文件

      mkdir -p /opt/docker/nginx
      mkdir -p /opt/docker/nginx/conf
      docker cp nginx:/etc/nginx/nginx.conf /opt/docker/nginx/conf/nginx.conf
      docker cp nginx:/etc/nginx/conf.d /opt/docker/nginx/conf.d
      docker cp nginx:/usr/share/nginx/html /opt/docker/nginx/html
      
    • 停止并删除 nginx 容器,再重新启动 nginx 镜像新容器

      docker run  -p 80:80 --name nginx --restart=always \
      -v /opt/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
      -v /opt/docker/nginx/conf.d:/etc/nginx/conf.d \
      -v /opt/docker/nginx/html:/usr/share/nginx/html \ 
      -v /opt/docker/nginx/logs:/var/log/nginx \ 
      -d  nginx
      
  • 配置 nginx 参数文件

    server {
        listen       80;
        server_name  ; # 博客域名或公网IP
    
        access_log off;
    
        location / {
            proxy_pass http://backend$request_uri;
            proxy_set_header  Host $http_host;
            proxy_set_header  X-Real-IP $remote_addr;
            client_max_body_size  10m;
        }
    

访问博客

以上步骤完成之后,就可以通过 nginx 配置的公网 IP 或域名来访问自己的博客了。首次访问会有一小段时间用于初始化,打开首页之后登录链滴账号,进入管理后台,配置 b3key 等需要配置的东西,即可以在发布文章的时候选择同步到社区中。

可能遇到的问题

  • docker 移除容器重新启动新容器的时候提示端口被占用

    • 使用 netstat -tunlp |grep port 查看当前占用端口的进程
    • 使用 kill -9 PID 终止该进程
    • 重新启动容器即可
  • 配置 nginx 反向代理之后无法通过公网 ip 和域名进行访问

    • 查看防火墙是否放行端口
    • 查看 iptables 是否放行端口
    • 查看服务器安全组是否放行端口

参考文献

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • xflcx1991

    有一个比较新的部署教程了