摘要
为什么要搭建个人博客
最近由于有些本地写的笔记想要输出给朋友、家人看,但是目前的在线文档、平台的使用体验都不是太好,于是想着利用自己的两台服务器,把个人博客建起来,也能督促自己沉淀一些文档,在学习过程中讲究有输入有输出;在生活中也讲究记录有趣的瞬间。
为什么要选择 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 是否放行端口
- 查看服务器安全组是否放行端口
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于