Solo 博客搭建之路

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

  •   首先,Solo 是一款小而美的博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动。这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!更多详细介绍可以访问在 github 上的项目主页

  开始正题

一、搭建方式概述

  本文介绍两种搭建方式,基于阿里云服务器通过 tomcat 使用 war 包实现部署跟 Docker 部署(作者推荐)。为了方便部署和提高效率,我还使用了 Xshell 和 winScp 工具,基本所有的操作任务在这两个工具中都可以完成。下面将对两种方式分别介绍。

二、部署步骤概述

  1. 购买服务器
  2. 购买域名及备案
  3. 本地安装 XshellwinScp 工具;(部分网友推荐的 Xftp 也可以,我推荐使用 winScp 主要是免费)
  4. 安装依赖程序
  5. 安装博客程序
  6. 通过 github 登录博客后台设置网站信息

三、具体内容

  1.购买云服务器并配置

  本人使用的是阿里云的服务器,相对来说维护比较方便,也无须自己去安装系统云服务器都是提供系统的,购买的时候选择需要的系统即可。因为云服务器的选择比较多此处就不在赘述具体购买过程,大家可以去详细咨询云服务商。假设你已经有服务器了并且系统为 Ubuntu18.04 那么请继续看下面。
  需要注意的是云服务器需要添加安全组规则,就是添加外部可以访问的端口。默认只开启了 22 端口。对于搭建网站,你必须要开通 80 端口,否则网站将无法访问。你可以开通其他端口,比如 MySQL 的端口,以便以后远程登录数据库查看数据。

  2.购买域名及备案

  服务器购买好后,你需要选择一个域名。这个不用多说,去阿里云旗下万网或者去腾讯旗下 DNSPod 购买一个。
  购买后,你需要进行备案。备案对于中国大陆的服务器是必须的,否则就算你域名解析成功了,也是会被和谐掉的,所以去阿里或者腾讯备案吧!建议谁家买服务器在谁家买域名!

  3.本地电脑安装 XShell 和 winScp 软件

  本地安装软件过程省略
  这里简单说一下工具的使用,这两个工具都是需要服务器打开 22 端口的,本人使用的阿里云服务器默认是打开的所以不需要在配置,如果是物理服务器则需要进行相关的配置点击查看具体操作方法
  首次连接时,建议记住密码,否则后期使用时,会经常让输入密码,很麻烦。

  4.安装依赖软件

  由于 Solo 是基于 Java 的开源博客系统,安装 Solo 之前,我们需要先安装如下依赖软件:

  1. Java

  2. MySQL

  3. Nginx

  4.1 安装 java

  Java JDK 在 linux 系统有两个版本,一个开源版本 Openjdk,还有一个 oracle 官方版本 jdk,oracle JDK 既可以通过添加 ppa 源命令行安装,也可以去官网下载 jdk 压缩包安装。本文不着重介绍,只介绍手动下载压缩包安装 oracle Java JDK。
  因为 Solo 是用 Java 开发的,我们要运行 Solo 必须的安装 Java 运行环境。在 Oracle 官网下载页面下载 Linux 版的 JDK 压缩包,然后上传到服务器。

  • 创建文件夹(以下操作以 jdk-8u241-linux-x64.tar.gz,请注意对应文件名):
	#此处我是在根目录下创建的文件夹你也可以选择其他目录创建
	sudo mkdir java

  将下载好的 jdk 压缩包用 winScp 上传到新创建的文件夹下

  • 解压缩到该目录:
	sudo tar -zxvf jdk-8u241-linux-x64.tar.gz -C java
  • 修改环境变量
	sudo vi ~/.bashrc

  在文件末尾追加下面内容:

	#set oracle jdk environment
	export JAVA_HOME=/root/java/jdk1.8.0_241  #这里要注意目录要换成自		己解压的jdk 目录
	export JRE_HOME=${JAVA_HOME}/jre  
	export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib  
	export PATH=${JAVA_HOME}/bin:$PATH  
  • 系统注册此 jdk
	sudo update-alternatives --install /usr/bin/java java /root/java/jdk1.8.0_241/bin/java 300
  • 查看 java 版本确定是否安装成功:
	java -version
  • 如果看到下图类似的提示说明安装成功:
    QQ 截图 20200405150256.png
  4.2 安装 MySQL

  Solo 使用两种持久层数据源 H2 内存 DB 跟 MySQL 个人建议使用 MySQL 数据库。如要使用 H2 内存 DB 请参考此处
  MySQL 建议使用 8.0 以上版本,当然 5.7-8.0 以上的版本都是是可以的。我个人使用 5.7 版本安装的时候出现了密码不正确的问题,经过确认是驱动类的问题,所以建议使用 8.0 避免出现驱动类的问题,因为 Solo 驱动类版本使用的较高低版本数据库可能因为驱动类的问题导致无法连接数据库。此问题在 docker 中的 5.7 数据库版本中未出现,问题比较玄学,以下介绍以 8.0 版本为主,稍后在 docker 安装数据库中再介绍 5.7 版本。

  4.2.1 进入官网下载

  进入官网点击 Downloads 进入下载页面,截止目前最新的版本为:mysql-apt-config_0.8.15-1_all.deb 。然后点如下图所示,就可以免登陆下载。
QQ 截图 20200405154545.png

  4.2.2 开始安装

将下载好的文件通过 winScp 上传到服务器任意目录下,使用命令进入文件存放的目录。

  • 执行命令
	sudo dpkg -i mysql-apt-config_0.8.15-1_all.deb
  • 选择 8.0 回车
    QQ 截图 20200405155354.png
  • 继续选择 8.0 回车

QQ 截图 20200405155638.png

  • 选择 OK 回车

QQ 截图 20200405155802.png

  • 执行命令
	sudo apt update
	sudo apt-get upgrade
  • 安装 MySQL8.0
      上面的步骤是确保系统里面的 mysql 默认是 8.0 版本。因为调用命令“sudo apt install mysql-server”执行安装时,默认安装的是 mysql5.7 版本,所以需要上面的步骤进行系统配置修改,更改为 8.0。此时调用命令“sudo apt install mysql-server”安装的即为 8.0 版本。
	sudo apt install mysql-server
	#中间会进行一次选择,输入“Y”即可继续。
  • 执行完之后会有两次输入密码
    20181217185501419 副本.png
  • 选择 5.x 的加密方式
      此处选择 5.x 的加密方式,会解决很多不兼容的问题。
    QQ 截图 20200405161137.png
  • 登录验证
	mysql -u root -p #输入密码进行验证

至此 MySQL 安装完成。

  4.2.3MySQL 配置远程访问
  • 执行以下命令
	mysql -uroot -p  #登录MySQL
	use mysql;
	select host from user where user='root';
	update user set host = '%' where user ='root';
	flush privileges;
	quit;
  4.3 安装 nginx

  Solo 会在自带的 Jetty 中运行,并默认监听 8080 端口,然而我们希望通过默认的 80 访问我们的网站,所以我们需要安装一个 web server 来做请求转发。如果不想通过 nginx 反代想直接运行可以跳过此步骤,然后通过 docker 的端口映射实现 80 端口的访问。

  • 使用 apt 命令安装 nginx
	sudo apt install nginx
  • 安装好后文件的位置

    /usr/sbin/nginx:主程序
    /etc/nginx:存放配置文件
    /usr/share/nginx:存放静态文件
    /var/log/nginx:存放日志

  • 启动并验证

	service nginx start	#启动nginx
	service nginx reload	#重新加载nginx配置文件
	nginx -s reopen		#重启 Nginx
	nginx -s stop		#停止 Nginx
  • 测试
      在浏览器输入你的 ip 地址,如果出现 Wellcome to nginx 那么就是配置成功。
  • 配置 https
      配置 https 非必须配置的,不想折腾可以略过此步骤。https 认证的网站在浏览器地址栏会出现一把绿色的小锁,不会被抓包,比 http 安全。
      配置 https 需要 ssl 证书,自签名证书没用,需要先去申请,阿里云和腾讯云都有免费的证书申请,下载后解压会出现几个文件夹:
    QQ 截图 20200405170542.png
    需要拿到 Nginx 文件夹内的文件,这是公钥和私钥:
    QQ 截图 20200405170642.png
    把这些文件放到/etc/nginx/conf.d 文件夹内,同时在这个文件夹新建一个 ssl.conf 文件,写入:
server {
    listen 443;
    server_name www.taosugar.com; # 改为绑定证书的域名
    # ssl 配置
    ssl on;
    ssl_certificate /etc/nginx/conf.d/taosugar.com.crt; # 改为自己申请得到的 crt 文件的路径
    ssl_certificate_key /etc/nginx/conf.d/taosugar.com.key; # 改为自己申请得到的 key 文件的路径
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://localhost:8080; # 做端口转发
    }
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
}

  这样就把 https 配置好了,但访问网站加 www 和不加 www 是存在跨域的,还需要做一些重定向,这样不管怎么访问都是 https://www 打头,在 ssl.conf 里再追加:

server {
    listen 80;
    server_name www.taosugar.com;
    rewrite ^(.*)$ https://${server_name}$1 permanent; 
}
server {
    listen 80;
    server_name taosugar.com;
    rewrite ^(.*)$ https://www.${server_name}$1 permanent; 
}
server {
    listen 443;
    server_name taosugar.com;
    rewrite ^(.*)$ https://www.${server_name}$1 permanent; 
}

这样不管访问以下哪个域名

  http://www.taosugar.com

  http://taosugar.com

  https://taosugar.com

都会跳转到 https://www.taosugar.com

最后重加载一下 nginx 的配置,大功告成...

	sudo service nginx reload

此处需要注意请务必配置

	proxy_set_header  Host $http_host;
	proxy_set_header  X-Real-IP $remote_addr;

不然访问会出现 502。此处可参考这篇文章至此 nginx 的配置就完成了。

  5.安装 Solo 主程序

  千呼万唤始出来,现在开始安装此次的主角 Solo 博客。之前也自己造过轮子但终究没成就大业,这次在众多的开源博客程序中选择了一款 Java 开源博客系统:Solo
  前面谈到过 Solo 开源博客在本文中会介绍两种部署方式下面进行分别介绍。

  5.1 部署到 Tomcat
  • 去 Solo 的 github 下载 war 包,将其传上服务器;
  • ubuntu 安装 tomcat,官网下载最新的 tomcat9,或者通过 wget 下载:
    wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.17/bin/apache-tomcat-9.0.17.tar.gz
    创建 tomcat 文件夹并进入
	cd /usr/local/
	mkdir tomcat/
	cd tomcat/

或者通过 winScp 将在官网下载的压缩包文件上传到服务器刚刚创建的 Tomcat 文件夹。

  • 安装 Tomcat
   cd /usr/local/tomcat/
   tar -zxvf apache-tomcat-9.0.17.tar.gz

安装包会被解压到/usr/local/tomcat/apache-tomcat-9.0.17,执行命令将目录重命名为 tomcat9

	 mv /usr/local/tomcat/apache-tomcat-9.0.17 /usr/local/tomcat/tomcat9
  • 开启 Tomcat 服务
	 cd /usr/local/tomcat/tomcat/bin/
	 ./startup.sh
  • 验证 Tomcat 是否安装成功
      用本地浏览器访问 tomcat 务器 IP:8080/ 如果能出现熟悉的 Tomcat 主页,就表示安装成功了,如果是云服务器则需要去服务器的控制台去开启 8080 端口,如果属于本地物理服务器需要在防火墙开放 8080 端口。执行以下命令开放防火墙端口:
	#一般情况下,ubuntu安装好的时候,iptables会被安装上,如果没有的话先安装
	sudo apt-get install iptables
	#添加开放端口
	# sudo iptables -I INPUT -p tcp --dport [端口号] -j ACCEPT
	sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
	# 临时保存配置,重启后失效
	sudo iptables-save
	#安装 iptables-persistent工具,持久化开放端口配置
	sudo apt-get install iptables-persistent
	sudo netfilter-persistent save
	sudo netfilter-persistent reload

  Tomcat 服务默认开机不自启,系统重启后需手动开启服务。如需要开机自启 Tomcat 服务请自行度娘、Google 或者参考此篇文章

  • 在 Tomcat 中运行系统
      在 tomcat9 目录下的 webapps/ROOT 是 Tomcat 容器的网站根目录,也就是我们熟悉的 Tomcat 主页文件的目录,将在 Solo 的 github 主页下载的压缩包先在本地进行解压然后通过 winScp 上传到 wenapps 目录下。
      程序上传完成之后,我们需要先将项目中的数据库连接地址跟密码改成自己的否则会运行失败。我们可以在本地的解压的目录 solo 下找到 local.properties 配置文件,然后右键用记事本打开,此处我使用的是 notpad++,打开之后找到 MySQL runtime 如下图所示:
    QQ 图片 20200405182958.png
    jdbc.username 设置成你数据库的用户名 jdbc.password 设置成你数据库的密码。修改完之后我们在同级目录下再找到 latke.properties 按照实际情况进行修改,如下图所示:
    QQ 图片 20200405182958.png

否则会出现配置错误的页面,具体可以看这里
  配置完成之后进入 tomcat 的 bin 目录下重新启动 tomcat 服务,然后我们就可以通过访问 ip:8080/solo 就能访问到博客的主页了,如果你想直接设置 ip:8080 访问的话,那么接下在我们要把 Tomcat 的访问目录换为 solo,最简单的办法就是将原来的 ROOT 文件夹删除或者重命名,再将 solo 文件夹重命名为 ROOT,这样我们通过服务器 ip:8080 就能访问 Solo 了。如果想通过不加端口的方式访问就需要修改 tomcat 的配置文件。找到 tomcat 的 conf 目录下,找到 service.xml 文件如下图所示:
QQ 图片 20200405185012.png
邮件用记事本或者使用 notpad++ 来打开找到下图所示的代码:
QQ 截图 20200405185303.png
port 改为 80 即可,然后重启 tomcat 就可以直接通过域名访问不需要加端口,或者使用上面 nginx 配置,安装 nginx 使用 nginx 反向代理。

  • 验证 Solo 博客是否部署成功
      先打开 Tomcat 服务,然后通过本地浏览器访问服务器 IP:808 如果配置了域名修改了端口那就直接通过域名访问,没有配置域名就直接通过 IP 访问。
	#运行命令开启服务
	cd /usr/local/tomcat/tomcat9/bin/
	./startup.sh

  本地浏览器访问出现 Solo 的开始界面说明你的 Solo 博客就部署成功了,你就可以登录绑定你的 GitHub 账号开始写文章了。

  5.2Dcoker 部署

  Docker 部署的话是 solo 博客系统最推荐的方式,而且作者也是希望部署博客的用户都使用这种方式,因为对于后续的更新比较方便。使用 Docker 部署的话主要是以下的步骤:

  • java 环境配置前面已经谈到过不在赘述。
  • 安装 Docker
      Docker 要求 Ubuntu 系统的内核版本高于 3.10,通过下面的命令查看内核版本安装,本篇文章在 Ubuntu18.04 的环境下进行的操作,如果跟我采用的是同样的操作系统或者更高版本的就不需要再确认系统内核是否支持。如果不能确认执行命令 uname -r 查看系统内核版本。确保你的内核版本要高于 3.10,没有的话自己去更新内核。安装 docker 的话也有两种方式:
  • 直接安装,不过这种方式安装的 docker 可能不是最新版本,不是很推荐,通过命令:apt-get install docker-io 来安装,通过命令 service start docker 启动 dockers,之后可以敲命令 docker run hello-world 来去官方仓库下载 hello-world 镜像并运行,如果出现以下页面就表示成功:
    QQ 截图 20200405191259.png
  • 通过添加官方源来安装最新版本的 docker
    (1)、首先卸载旧版本的 docker,docker 的旧版本名称为:docker 、 docker-engine 或者 docekr-io。如果安装过旧版本的需要先卸载:
    sudo apt-get remove docker docker-engine docker.io
    (2)、安装最新版本的 Docker
    最新版本的 Docker 分两个版本,docker-ce(Community Edition)和 docker-ee(Enterprise Edition)。CE 版本是免费的,如果我们学习或者一般应用,CE 足够。我们安装社区版:由于 docker 安装需要使用 https,所以需要使 apt 支持 https 的拉取方式。
    (3)、安装 https 相关的软件包
	sudo apt-get update # 先更新一下软件源库信息
	sudo apt-get install \
	apt-transport-https \
	ca-certificates \
	curl \
	software-properties-common

  (4)、 设置 apt 仓库地址
  鉴于国内网络问题,强烈建议使用国内地址,添加 Docker 官方 apt 仓库(使用国外源)执行该命令时,如遇到长时间没有响应说明网络连接不到 docker 网站,需要使用国内的。

	#添加 Docker 官方的 GPG 密钥(为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥)
 	curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
	#设置稳定版本的apt仓库地址
	sudo add-apt-repository \
  	 "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \stable"
  • 添加 阿里云 的 apt 仓库(使用国内源)
 	curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
	 	sudo add-apt-repository \
     		"deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
     		$(lsb_release -cs) \
     		stable"

  ( 5)、安装 Docker 软件

	sudo apt-get update
	sudo apt-get install docker-ce # 安装最新版的docker

如果要安装指定版本的 docker,则使用下面的命令:

	apt-cache policy docker-ce # 查看可供安装的所有docker版本
	sudo apt-get install docker-ce=18.03.0~ce-0~ubuntu # 安装指定版本的docker

  安装完了 docker 之后,我们下一步需要的是安装数据库了,可能你就会有疑问了,我在服务器上安装了 mysql 啊,怎么又要安装了,这么说吧,服务器上的 mysql 是服务器上的,而 docker 中不使用服务器上的 mysql,我们需要在 docker 上从官方仓库拉取 mysql 下来,这两个地方的 mysql 是不一样的,当然如果你选择用 docker 的方式安装 mysql 的话,那么服务器上可以不装 mysql,下面就是在 docker 上安装 mysql:(我装的是 mysql5.7)
  (1)、拉取镜像 mysql:5.7
docker pull mysql:5.7
  (2)、新建目录 date,logs,conf 用来映射 docker 上的 mysql 容器的一些配置,防止 mysql 容器占用内存过大。
mkdir -p /opt/mysql/data /opt/mysql/logs /opt/mysql/conf
  data 目录将映射为 mysql 容器配置的数据文件存放路径
  logs 目录将映射为 mysql 容器的日志目录
  conf 目录里的配置文件将映射为 mysql 容器的配置文件
  (3)、运行镜像创建容器

	cd /opt/mysql
	docker run -p 3306:3306 --name mysql -v $PWD/conf: /opt/mysql/conf -v $PWD/logs:/opt/mysql/logs -v PWD/data:/opt/mysql/data -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.16

命令说明:

 	-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。

  	-v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。

  	-v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。

  	-v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。

  	-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。

  (4)、查看正在运行的容器

	#通过命令检查mysql是否安装成功
	docker images   #这个命令会显示你docker上的所有镜像,比如现在估计你只有mysql和hello-world
	#通过命令检查mysql是否在后台运行
	docker ps       #可以查看当前在运行的镜像

  (5)、进入数据库,创建 solo 库

	# docker安装的mysql默认允许远程连接,可以使用Navicat等软件连接数据库
	# 进入容器mysql
	docker exec -it mysql bash

	# 进入数据库 p后面跟你的密码
	mysql -uroot -pXXX

	# 创建数据库(数据库名:solo;字符集utf8mb4;排序规则utf8mb4_general_ci)
	create database solo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
	# 出现Query OK, 1 row affected (0.00 sec)表示成功
	#退出数据库
	exit
	#退出容器
	exit
  • 部署 solo 博客执行以下命令
	docker run --detach --name solo --network=host \
	--env RUNTIME_DB="MYSQL" \
	--env JDBC_USERNAME="你的用户名" \
	--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" \
	b3log/solo --listen_port=8080 --server_scheme=http --server_host=你的域名 --server_port=

上面的命令仔细检查,免得出错,参数说明:

  --env JDBC_PASSWORD=“123456” 将 123456 换成你的密码
  --listen_port=8080 监听的端口
  --server_scheme=http 请求方式,如果使用 nginx 需要将请求方式换成 https
  --server_host= 你的域名,如果你没有域名可以写 ip 地址
  --server_port= 这里填你想映射的端口,http 的话 80 和 https 的 443 可以不填,但不能注释,否则会导致静态资源无法加载。
  --rm 因为这个容器后面要删掉,带上 rm 会省很多事,如果不带 rm 的话,那么后面你要删除这个镜像的话,首先你要删除它的容器,然后通过命令删除镜像:

	docker rm 容器id  #删除容器
	docker rmi 镜像id  #删除镜像

  镜像 id 可以通过命令 docker images 查看到。带上了 rm 的话,那么后面执行命令 docker stop 镜像名就会自动删除镜像,便于要修改配置。
  命令成功执行没有报错的话,通过 docker ps 查看执行的容器列表中是否存在 Solo,存在这表示启动成功,直接访问你的域名加:8080 即可访问你的博客。
  如果使用 nginx 的话建议先安装 nginx 然后再运行 Solo 博客,避免重复启动关闭 Solo。

  6. 登录博客后台设置网站信息

  最后可以输入你的公网 ip 访问你的网站了。首次访问时,需要初始化网站。你需要设置你的管理员帐号,然后开始初始化,Solo 会自动在 MySQL 中建立数据库表。初始化成功后就自动进入你的网站了。
  进入 Solo 后台管理控制台,进入"工具"->“偏好设定”,你可以修改你的网站名称等其他基本网站信息。
  就这样,属于你的博客网站就已经基本搭建完成了。

  更多关于 Solo 博客系统的可以访问开源社区点击了解更多

欢迎一起讨论

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • 这起码写了几个小时吧!厉害了。辛苦辛苦,加油!👍

    1 回复
  • 其他回帖
  • someone9891 1 评论

    @88250 语音预览的时候,像这样的连接直接跳过了,算不算 BUG?image.png

    感谢反馈,稍后尝试修复 :)
    88250
  • Eli

    方便的话 把你报错跟输入的命令截图一下 帮你看一下 😳

  • codenow

    你好,我用 docker 搭建到第三步运行镜像创建容器时报错 docker: invalid reference format. See 'docker run --help'.,查了很长时间没找出原因,请问怎么解决呢

    1 回复
  • 查看全部回帖