利用solo搭建个人博客 置顶!

2019-11-26/2022-01-15
3 评论 1,841 浏览

参考链接:
Solo 用户指南
从零开始安装 solo 博客


2021.04.16 ,当时留了太多坑了,现在重写一遍

2021.09.04,修复下 nginx 配置留下的坑

搭建前提

  • 购买服务器
  • 购买域名(可不买)
  • 域名解析与备案
  • 为服务器安装系统

安装 docker

我的系统,Centos7.3

 1#使用yum更新仓库
 2yum update
 3
 4#安装docker
 5yum -y install docker
 6
 7#启动 Docker 后台服务
 8service docker start
 9
10#测试运行 hello-world
11docker run hello-world

出现 hello world 就证明安装正常了

安装 MySQL

版本随意,我这里选择的 5.6,你可以选择更高版本的,这个没关系,不影响使用

提供两种方式

直接安装 mysql(方式一,推荐)

根据自己的系统环境直接百度吧。

安装完成之后新建 solo 数据库

1create database solo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

docker 安装 mysql(方式二)

 1# 安装mysql:5.6,直接docker run 他会自动去官方镜想下载
 2# MYSQL_ROOT_PASSWORD=你的数据库密码
 3docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
 4
 5# docker安装的mysql默认允许远程连接,可以使用xshell等软件连接数据库
 6# 进入容器mysql
 7docker exec -it mysql bash
 8
 9# 进入数据库 p后面跟你的密码
10mysql -uroot -p123456
11
12# 创建数据库(数据库名:solo;字符集utf8mb4;排序规则utf8mb4_general_ci)
13create database solo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
14# 出现Query OK, 1 row affected (0.00 sec)表示成功
15#退出数据库
16exit
17#退出容器
18exit

备份 SQL 文件的时候,可以通过 sqlyog 远程连接来备份。

当需要挂载本地目录(数据卷)到 docker 容器的时候,运行下面语句创建 MySQL 容器,这样可以使数据持久化,当将容器删除时,数据不会丢失。

1docker run --name mysql -p 3306:3306 \
2-v /dockerData/mysql/data:/var/lib/mysql \
3-v /dockerData/mysql/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
4-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
  • -v /dockerData/mysql/data:/var/lib/mysql:将本地数据卷挂载到 MySQL 容器
  • -v /dockerData/mysql/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf:将本地配置挂载到 MySQL 容器(配置中添加了 MySQL 内存优化的语句)

关于远程无法连接 mysql

先打开防火墙 3306 端口。

给 root 用户授权,允许远程链接。

1# 授权
2grant all privileges on *.* to 'root'@'%';
3# 刷新授权
4flush privileges;

安装 solo

直接运行以下命令

1docker run --detach --name solo --network=host \
2--env RUNTIME_DB="MYSQL" \
3--env JDBC_USERNAME="root" \
4--env JDBC_PASSWORD="123456" \
5--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
6--env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
7--rm \
8b3log/solo --listen_port=8080 --server_scheme=http --server_host=www.rainsheep.cn

上面的命令建议手敲,免得出错,参数说明

  • --network=host 让 solo 容器使用 docker 的 host 网络模式,使容器之间网络互通
  • --env JDBC_PASSWORD="123456" 将 123456 换成你的密码
  • --listen_port=8080 监听的端口
  • --server_scheme=http 请求方式,暂时使用 http,后面我们会换成 https
  • --server_host=www.rainsheep.cn 你的域名,如果你没有域名可以写 ip 地址
  • --rm 因为这个容器后面要删掉,带上 rm 会省很多事。

命令成功执行没有报错的话,通过 docker ps 查看执行的容器列表中是否存在 solo,存在这表示启动成功,直接访问你的域名加:8080 即可访问你的博客,http://www.rainsheep.cn:8080
如果你尚在备案中,你可以收藏本帖,后面等备案通过了在研究后面的部分。
如果你不想使用 nginx 也不想升级 https,那么你可以先执行 docker stop solo ,然后将上面 --listen_port=80808080 换成 80 ,然后去掉 --rm ,再执行一次就 ok。

进入网页可能会出现 Latke 配置错误,如果要配置 nginx 反代理的话不需要管,配完就好了
如果不配置反代理的话,在后面加上参数 --server_port=8080 或者 --server_port=80 ,与前面监听端口一致

安装 nginx

直接安装(方式一,推荐)

根据自己系统环境百度安装即可。

docker 安装(方式二)

1# 切换到服务器根目录
2cd /
3# 创建主目录
4mkdir dockerData
5# 创建文件
6mkdir dockerData/nginx dockerData/nginx/conf dockerData/nginx/logs dockerData/nginx/www dockerData/nginx/ssl

上面的 dockerData 可以换成自己喜欢的名字

  • dockerData/nginx 用于存放 docker 下 nginx 自定义文件
  • dockerData/nginx/conf 存放 nginx 配置文件
  • dockerData/nginx/log 存放 nginx 日志文件
  • dockerData/nginx/www 存放 nginx 访问的资源文件
  • dockerData/nginx/ssl 存放 ssl 证书

启动 nginx
docker run --name nginx -d --rm --network=host nginx

因为这个东西一会儿也要删掉,所以加上 --rm 参数,命令执行玩后通过 docker ps 查看 nginx 是否在运行,在运行的情况下访问你的域名加端口号查看是否正常安装, 80 直接省略。访问出现 Welcome to nginx!表示成功。

导出配置文件

  • docker cp nginx:/etc/nginx/nginx.conf /dockerData/nginx/conf/nginx.conf 导出配置文件 nginx.conf

执行 docker stop nginx ,会自动删除现在的 nginx 容器,然后执行如下命令重新启动一个 nginx 容器

1docker run -dit --name nginx --network=host \
2-v /dockerData/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
3-v /dockerData/nginx/www:/usr/share/nginx/html \
4-v /dockerData/nginx/logs:/var/log/nginx nginx
  • -v /dockerData/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ 挂载配置文件nginx.conf
  • -v /dockerData/nginx/www:/usr/share/nginx/html 挂载项目文件
  • -v /dockerData/nginx/logs:/var/log/nginx 挂载配置文件
  • -dit 可以防止 nginx 容器自动关闭

新建欢迎界面

1# 打开项目文件 
2cd /dockerData/nginx/www 
3# 使用vim 创建并编辑文件
4vim index.html 
5# 此时我们会进入vim界面,按 i 插入,然后输入 
6<h1>Hello Docker-Nginx</h1> 
7# 输入完后,按 esc,然后输入 :wq

访问域名,可看到 Hello Docker-Nginx

申请 ssl 证书,将 http 升级为 https(可跳过)

直接安装 nginx

在 nginx 安装目录下新建 ssl 文件夹

docker 方式安装 nginx

申请完 ssl 证书以后,下载证书
最后把 Nginx 下的两个文件上传至服务器 /dockerDat/nginx/ssl 目录下

我的两个证书名字为 3118615_rainsheep.cn.pem3118615_rainsheep.cn.key

配置 nginx 配置文件

使用 docker 安装的话:

1cd /dockerData/nginx/conf
2vim nginx.conf

自己直接安装的话:找到 nginx 的配置文件 nginx.conf 进行修改

参考我的配置,配置自己的 nginx.conf 文件

 1user  nginx;
 2worker_processes  1;
 3
 4error_log  /var/log/nginx/error.log warn;
 5pid        /var/run/nginx.pid;
 6
 7
 8events {
 9    worker_connections  1024;
10}
11
12
13http {
14    include       /etc/nginx/mime.types;
15    default_type  application/octet-stream;
16
17    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
18                      '$status $body_bytes_sent "$http_referer" '
19                      '"$http_user_agent" "$http_x_forwarded_for"';
20
21    access_log  /var/log/nginx/access.log  main;
22
23    sendfile        on;
24    #tcp_nopush     on;
25
26    keepalive_timeout  65;
27
28    #gzip  on;
29
30    include /etc/nginx/conf.d/*.conf;
31
32    # http跳转https
33    server {
34        listen       80;
35        rewrite ^(.*)$ https://$host$1 permanent;
36    }
37
38    # solo blog
39    server {
40        listen 443 ssl;
41        server_name  www.rainsheep.cn;
42        access_log on;
43        access_log /var/log/nginx/access.log  main;
44        
45        ssl_certificate /ssl/5484441_www.rainsheep.cn.pem;
46        ssl_certificate_key /ssl/5484441_www.rainsheep.cn.key;
47        ssl_session_timeout 5m;
48        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
49        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
50        ssl_prefer_server_ciphers on;
51
52        location / {
53            proxy_pass http://localhost:8080;
54            proxy_set_header  Host $http_host;
55            proxy_set_header  X-Real-IP  $remote_addr;
56            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
57            proxy_set_header  Upgrade $http_upgrade;
58            proxy_set_header  Connection "upgrade";
59            client_max_body_size  100m;
60        }
61    }
62}

直接安装 nginx 则不需要进行下列步骤

我们需要删除现在的容器,重新启动一个新的 nginx 容器

1docker stop nginx  # 停止容器
2docker rm nginx # 删除容器
3# 启动新的
4docker run -d --name nginx --network=host \
5-v /dockerData/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
6-v /dockerData/nginx/ssl:/ssl/ \
7-v /dockerData/nginx/www:/usr/share/nginx/html \
8-v /dockerData/nginx/logs:/var/log/nginx nginx
  • -v /dockerData/nginx/ssl:/ssl/ 挂载 ssl 证书目录

访问查看,正常访问

访问不到的话,可能是配置文件错了,仔细核对, docker logs nginx 查看日志, docker ps 查看是否运行。

将 solo 通过 nginx 方向代理实现 https 访问

让 solo 还是跑在 8080 端口上,通过 nginx 代理到 443 端口即可,由于我们上面启动 solo 时添加了 --rm 参数,只需要 docker stop solo 即可自动删除 solo 容器,然后我们重新启动一个 solo 容器

1docker run --detach --name solo --network=host \
2--env RUNTIME_DB="MYSQL" \
3--env JDBC_USERNAME="root" \
4--env JDBC_PASSWORD="123456" \
5--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
6--env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
7b3log/solo --listen_port=8080 --server_scheme=https --server_host=www.rainsheep.cn --server_port=
  • --server_scheme=http 换成--server_scheme=https 即可
  • --server_port :最终访问端口,使用浏览器默认的 80 或者 443 的话值留空即可

重启 nginx, docker restart nginx
访问成功。

启用 Lute

  • 获取最新镜像 docker pull b3log/lute-http
  • 启动容器docker run --detach --rm --network=host --name="lute" b3log/lute-http
  • 停止 solo, docker stop solo
  • 删除 solo,docker rm solo
  • 运行下列命令,重启 solo,注意最后添加--lute_http=http://127.0.0.1:8249
1docker run --detach --name solo --network=host \
2--env RUNTIME_DB="MYSQL" \
3--env JDBC_USERNAME="root" \
4--env JDBC_PASSWORD="123456" \
5--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
6--env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
7b3log/solo --listen_port=8080 --server_scheme=https --server_host=www.rainsheep.cn --server_port= --lute_http=http://127.0.0.1:8249
  • 容器启动成功后再启动 Solo、Pipe、Sym 即可,如果成功的话 Solo 等的启动日志中docker logs solo 会输出luteAvailable=true

测试代码是否高亮。
教程结束。

启用 jsDelivr CDN 加速

 1docker run --detach --name solo --network=host \
 2--env RUNTIME_DB="MYSQL" \
 3--env JDBC_USERNAME="root" \
 4--env JDBC_PASSWORD="123456" \
 5--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
 6--env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
 7b3log/solo --listen_port=8080 --server_scheme=https --server_host=www.rainsheep.cn --server_port= --lute_http=http://127.0.0.1:8249 \
 8--static_server_scheme=https \
 9--static_server_host=cdn.jsdelivr.net \
10--static_server_port= \
11--static_path=/gh/88250/solo/src/main/resources

查看方法:打开开发者工具,查看 NetWork 中的请求链接地址。

仅支持内置皮肤

solo 自动更新脚本

利用 crontab 运行脚本自动更新,脚本名 docker-solo-update.sh

如果不想自动更新的话,自行运行脚本即可手动更新,建议手动更新

 1#!/bin/bash
 2echo -e "\n"
 3echo `date "+%Y-%m-%d %H:%M:%S"`
 4isUpdate=$(docker pull b3log/solo|grep "Downloaded")
 5if [ -z  $isUpdate ]
 6then
 7    echo This is the latest version
 8else
 9    docker stop solo
10    docker rm solo
11    docker run --detach --name solo --network=host \
12    --env RUNTIME_DB="MYSQL" \
13    --env JDBC_USERNAME="root" \
14    --env JDBC_PASSWORD="123456" \
15    --env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
16    --env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
17    b3log/solo --listen_port=8080 --server_scheme=https --server_host=www.rainsheep.cn --server_port= --lute_http=http://127.0.0.1:8249 \
18    --static_server_scheme=https \
19    --static_server_host=cdn.jsdelivr.net \
20    --static_server_port= \
21    --static_path=/gh/88250/solo/src/main/resources
22    echo Success!
23fi

使用方法:
chmod 777 docker-solo-update.sh
crontab -e
写入
0 3 * * * bash /root/docker-solo-update.sh
需要打印日志信息的话
0 3 * * * bash /root/docker-solo-update.sh >> /root/sololog.log 2>&1
运行
crontab -l
查看是否插入成功

Lute 自动更新脚本

利用 crontab 运行脚本自动更新,脚本名 docker-lute-update.sh

 1#!/bin/bash
 2echo -e "\n"
 3echo `date "+%Y-%m-%d %H:%M:%S"`
 4isUpdate=$(docker pull b3log/lute-http|grep "Downloaded")
 5if [ -z  $isUpdate ]
 6then
 7    echo This is the latest version
 8else
 9    docker stop lute
10    docker run --detach --rm --network=host --name="lute" b3log/lute-http
11    echo Success!
12fi

使用方法:
chmod 777 docker-lute-update.sh
crontab -e
写入
0 4 * * * bash /root/docker-lute-update.sh
需要打印日志信息的话
0 4 * * * bash /root/docker-lute-update.sh >> /root/lutelog.log 2>&1
运行
crontab -l
查看是否插入成功

导入 .md 文件

参考链接:
Solo 支持 Hexo/Jekyll 数据导入

--volume 待导入目录/:/opt/solo/markdowns/ 这样应该就可以了,其中 待导入目录 是你寄主机上的绝对路径。

例如:

1docker stop solo
2docker rm solo
3docker run --detach --volume /root/solo-markdown/:/opt/solo/markdowns/ --name solo --network=host \
4--env RUNTIME_DB="MYSQL" \
5--env JDBC_USERNAME="root" \
6--env JDBC_PASSWORD="123456" \
7--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
8--env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
9b3log/solo --listen_port=8080 --server_scheme=https --server_host=www.rainsheep.cn --server_port= --lute_http=http://127.0.0.1:8249

过程中需要用到的 docker 命令
docker ps 查看运行的容器
docker ps -a 查看所有容器
docker stop id||name 停止容器
docker rm id||name 移除容器
docker logs 容器名 查看容器日志

MySQL 的内存优化

直接安装的话

找到配置文件,尾部添加

1performance_schema_max_table_instances=400
2table_definition_cache=400
3table_open_cache=256

docker 安装的话

输入命令 top 可以查看内存使用情况。

优化 MySQL 所占内存:

创建文件夹

1cd /dockerDate
2mkdir mysql

从容器中复制配置文件到服务器
docker cp mysql:/etc/mysql/mysql.conf.d/mysqld.cnf /dockerData/mysql

编辑配置文件
vim mysqld.cnf

末尾添加

1performance_schema_max_table_instances=400
2table_definition_cache=400
3table_open_cache=256

从服务器复制到容器
docker cp /dockerData/mysql/mysqld.cnf mysql:/etc/mysql/mysql.conf.d/mysqld.cnf

改完之后记得重启 MySQL
docker restart mysql

双博客

如果想在一个服务器搭建两个博客。

 1docker run --detach --name solo2 -p 8090:8090 \
 2--env RUNTIME_DB="MYSQL" \
 3--env JDBC_USERNAME="root" \
 4--env JDBC_PASSWORD="123456" \
 5--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
 6--env JDBC_URL="jdbc:mysql://39.105.149.231:3306/solo2?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
 7b3log/solo --listen_port=8090 --server_scheme=https --server_host=seeker.rainsheep.cn --server_port= --lute_http=http://39.105.149.231:8249 \
 8--static_server_scheme=https \
 9--static_server_host=cdn.jsdelivr.net \
10--static_server_port= \
11--static_path=/gh/88250/solo/src/main/resources

迁移至 bolo 记录

参考文献 : 欢迎使用 Bolo

由于某些问题,solo 不再满足本人需求,决定迁移到 bolo。

克隆源代码:

1// github 国外
2git clone https://github.com/adlered/bolo-solo
3// gitee 国内
4git clone https://gitee.com/AdlerED/bolo-solo

如果要使用 HTTPS, 请前往项目根目录下 src/main/resources 目录,编辑 latkes.properties 文件,将 http 修改为 https,否则会无法正常访问哦!

构建镜像:

再进入到 Bolo 项目的根目录,构建 Docker 镜像

1docker build -t "bolo" .

docker 运行

1docker run -it -d -p8080:8080 --name bolo \
2--env RUNTIME_DB="MYSQL" \
3--env JDBC_USERNAME="root" \
4--env JDBC_PASSWORD="123456" \
5--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
6--env JDBC_URL="jdbc:mysql://localhost:3306/bolo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
7bolo --listen_port=8080 --server_scheme=https --server_host=www.rainsheep.cn --lute_http=http://39.105.149.231:8249

此容器没有使用 host 网络,主要更换 mysql 和 lute ip 地址

docker-compose 运行

 1version: "3"
 2services:
 3  bolo:
 4    image: bolo
 5    restart: always
 6    container_name: bolo
 7    environment:
 8      - RUNTIME_DB=MYSQL
 9      - JDBC_DRIVER=com.mysql.cj.jdbc.Driver
10      - JDBC_URL=jdbc:mysql://bj-cdb-btxm9nje.sql.tencentcdb.com:60234/bolo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
11      - JDBC_USERNAME=root
12      - JDBC_PASSWORD=Xiaoyang1@
13      - TZ=Asia/Shanghai
14    ports:
15      - 8179:8080
16    dns: 8.8.8.8
17    command: --listen_port=8080 --server_scheme=https --server_host=www.rainsheep.cn --server_port=443

nginx 配置

 1location / {
 2    // 这里填写反向代理的地址,注意!如果你的 Nginx 在 Docker 中运行,不要填写 127.0.0.1,请填写你的内网或公网地址(如果你是云主机,使用公网地址,请记得在安全组放行该端口)
 3    proxy_pass http://localhost:8080;
 4    proxy_set_header HOST $host;
 5    proxy_set_header X-Real-IP $remote_addr;
 6    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 7    proxy_set_header Upgrade $http_upgrade;
 8    proxy_set_header Connection "upgrade";
 9    client_max_body_size 100m;
10}

遇到的问题

在服务端镜像构建失败,转换为在本地构建

然后

1// 在本地导出镜像到文件
2docker save -o bolo.tar bolo
3// 在服务端解析文件到镜像
4docker load < bolo.tar

图床设置如下

image-20210815223442474

2021.09.05,发现备份至 github 出错,发现 github 为 main 分支,修改 main -> master 解决,此 bug 已反馈给官方


标题:利用solo搭建个人博客
作者:Rainsheep
地址:https://www.rainsheep.cn/articles/2019/11/26/1574768448759.html

评论
  • 对呀,这个评论系统,有点垃圾

    回复»
  • 河南的兄弟?

    回复»
  • 谢谢你

    回复»
  • 这里面是以前的,你可以进我博客查看我现在改进的教程

    回复»
  • 这里面是以前的,你可以进我博客查看我现在改进的教程

    回复»
  • 你可以先备案,或者不用域名 通过 IP 来访问博客

    回复»
  • 请问,域名备案还没完成怎么搞

    回复»
  • 额 我今天刚配完 留个教程......主要自己看

    回复»
  • 🤔 🤔 🤔 亲,按你的nginx配置真的能访问到你的博客咩

    回复»
发表评论
       
       
取消