Solo 博客系统基于 Docker 的搭建

本贴最后更新于 1675 天前,其中的信息可能已经物是人非


环境

我自己购买了云主机,至于哪里有卖就不需要强调了吧. 顺手趁打折我就冲了个域名: reyren.cn. 如果想好好的去经营自己的点点滴滴, 这些几十一百的不要太在意, emmm 扯远了. 在我配置好服务器基础环境添加域名解析后(Ubuntu 16.04 LTS), 我就折腾的部署了 Solo. 索性就在几分钟后还是检测出来域名被用于了网站等性质的活动, 直接封掉要求备案了. 在经历一番流程备案后,审核耗时 10 个工作日, 终于重见天日了.
在官方的 README 中也不推荐用 war 发布包和源码的方式进行安装, 因为这样不利于 bug 的及时修复和系统的更新. 所以这里也懒得折腾,直接用最推荐的也是最方便的 docker 形式进行部署.
所需环境:

  • docker
  • docker-compose
  • solo-in-docker

Docker

Docker 是一个通过容器进行应用程序的部署的开源技术. 虽然岁数不大, 但是在主流的 linux 发行版上都是被装烂的. Docker 主要的创新点是可以"打包"一个应用程序或者是一系列的服务在容器中. 一个 Docker 容器其实就是包含了所有依赖库和组件的应用例程. 从时间工程的角度看(粗力度), 一个容器就像是减少了操作系统关联性的虚拟机. 一个 Docker 容器产生于 image, image 产生于打包的应用. image 可以包含完整的操作系统或者预装的应用. 官方 Docker 分为 CE(Community Edition)和 EE(Enterprise Edition). 我们这里就针对于 CE for Ubuntu 的安装. (如果你想要直接"Ubuntu 的默认源安装,比较陈旧吧,我一般都会添加官方源,便于安装也便于日后更新. 如果没有的话,推荐使用源码安装")

# Uninstall old versions
$sudo apt-get remove docker docker-engine docker.io
# Update the apt package index
$sudo apt-get update
# Install packages to allow apt to use a repository over HTTPS
$sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
# Add Docker's official GPG key
$curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Verify that you now have the key with the fingerprint 9DC8 5822 9FC7 DD38 854A E2DB 8D81 803C 0EBF CD88, by searching by last 8 characters
$sudo apt-key fingerprint 0EBFCD88
# Use the following command to set up the stable repository. You always need the stable one, 
#even if you want to install builds from the edge or test repo as well. To add the edge or test repo, add the word edge or test after the word stable (stable_release -cs获取到ubuntu版本)
$sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
#Update the apt package index
$sudo apt-get update
# Install the latest version of Docker CE, or go to the next step to install a specific version. 
$sudo apt-get install docker-ce
# List the available versions
$apt-cache madison docker-ce
$sudo apt-get install docker-ce=<VERSION>
# The docker daemon already running automatically 

这样的话要想升级 docker ce 只需要 sudo apt-get update 更新了源后找到最新的版本直接安装了就会覆盖之前的版本.

Docker-compose

这个就是如雷贯耳的容器编排工具. 编排工具就是定义和运行多个容器应用的工具. YAML 文件就是用来配置你的服务的. 然后一个命令就能启动所有的服务和应用.

# Download the current stable release of Docker Compose, to install a different version of Compose, subtitute 1.24.1 with the version of Compose you want to use.
$sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -a)-$(uname -m)" -o /usr/local/bin/docker-compose
# Apply executable permissions to the binary
$sudo chmod +x /usr/local/bin/docker-compose
# Upgrading
# If you're upgrading from Compose 1.2 or earlier, remove or migrate your existing containers after Compose. 
# This is because, as of version 1.3, Compose uses Docker labels to keep track of containers, and your containers need to be recreated to add the labels.
# 但是也是可以进行迁移的,因为确实存在一切情况,启动的容器中有很多数据或者服务不可中断的运行着. 但唯一的局限就是必须得用Compose 1.5.X进行标签的迁移
$ docker-compose migrate-to-labels
# Alternatively, if you're not worried about keeping the, you can remove them. Compose just creates new one.
$ docker container rm -f -v myapp_web_1 myapp_web_2....
# Uninstallation with curl installed
$sudo rm /usr/local/bin/docker-compose

solo-in-docker

摘抄自 solo-in-docker, 这个工具是一条命令在 docker 中启动 solo, 所有的配置全部都用 docker-compose 编排解决. 支持 HTTP/HTTPS, 同样的也支持 HTTP 向 HTTPS 的升级. 在这里, 我就先以 HTTP 进行部署然后升级到 HTTPS.

# clone repo
$git clone https://github.com/liumapp/solo-in-docker
# put it into the root directory and change the name as solo. Following operation would use the root permission or add your non-root roles into the root group. 
$sudo mv solo-in docker /root/solo

我不清楚现阶段的 solo-in-docker 有没有针对于之前的 issue7issue8 进行进一步探讨及讨论, 所以先就以我现阶段的问题进行搭建.
先简单介绍一下 solo-in-docker 的内部目录结构及功能:

  • https: 这个目录就是进行证书下载让网站可以走 https 协议,但核心内容同 http 一样,所以直接带入 http 目录.
  • http: 在这个目录中其实重要的文件就是 docker-compose.yml, 这个文件就是进行容器编排的配置文件,其中就是创建 mysql 数据库的用户名密码, 进行 JDBC 连接等. 至于作者原仓库中的 mysql 目录,现阶段我是不建议直接用. 这个目录就是数据库的映射文件. 也就是说每次 docker-compose 启动的时候, 都会自动拉取最新的 solo 镜像, 虽然这样更新非常简单, 但是在数据备份问题上, docker 容器死亡的时候, 容器内的数据会自动清除, 除非我们使用 volumes 构建映射关系, 这里只将最重要的 mysql 数据库文件映射到 mysql/data 下. 所以说如果你直接用的话,mysql.user 表中的 root 密码已经确定了,至于可以更改,但 issue8 中我向作者提了一下相关的问题. 最干净的做法就是:
# 删除solo中的mysql
$ sudo rm mysql
# 配置docker-complse.yml文件
version: "2"

services:
  mysql:
    container_name: mysql
    image: mysql:5.5.60
    restart: always
    volumes:
      - ./mysql/data:/var/lib/mysql //mysql的数据文件存放地址
      - ./mysql/conf/mysqld.conf:/etc/mysql/mysql.conf.d/mysqld.cnf //mysql的配置文件存放地址
    ports:
      - "6603:3306" //6603代表宿主机端口,3306代编容器的端口
    environment:
      - MYSQL_ROOT_PASSWORD=123456 //mysql的root账号密码
  solo:
    container_name: solo
    image: b3log/solo //直接使用最新版本的solo镜像
    restart: always
    ports:
      - "8080:8080" //如果要部署到线上的话,请改为"80:80",同时修改下面的--listen_port=80
    environment: //此处配置solo跟mysql的连接设置,来源为上面启动的mysql容器,如果要用自己的mysql服务,那么请将mysql的servcie去掉
      RUNTIME_DB: "MYSQL"
      JDBC_USERNAME: "root"
      JDBC_PASSWORD: "123456"
      JDBC_DRIVER: "com.mysql.jdbc.Driver"
      JDBC_URL: "jdbc:mysql://mysql:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" //此处,因为solo跟mysql同为docker容器,所以可以直接使用容器名 + 容器端口来访问
    command: --listen_port=8080 --server_scheme=http --server_host=www.reyren.cn //按照solo官方要求,在solo启动之初,配置solo的域名、端口,如果是本地测试的话,将host改为localhost即可

注意这里的 mysql 的密码最好改一下.
做完这些,就可以试着启动了:

# 在http目录下, 也就是说和.yml文件同级目录下. 
$ docker-compose up -d

如果出现 80 端口被占用的报错的话, 找到 nginx 配置文件把端口号改一下, 或者比如我就直接先 systemctl stop nginx; systemctl disable nginx.
OK,再启动后发现很漂亮的 done. 但是你会发现当你访问的时候确实找不到页面或者访问不到等错误. 查看日志 docker logs solo, 发现找不到表的问题. 这个问题出现的原因是: 在 mysql 中没有发现 solo 这个数据库,以至于无法向数据库中建立表. 本来 solo-in-docker 作者的仓库中的 mysql/data/solo 就是属于已经建立好的表项, 但是之前为了干净安装, 直接干掉了 mysql 目录,所以这里需要我们手动的创建 solo 数据库.

# 查看当前容器运行情况, 会发现有mysql和solo
$ docker ps
# 进入容器并且打开bash
$ docker exec -it mysql bash
# 进入mysql (用之前.yml设置的密码)
$ mysql -uroot -p XXX
mysql> CREATE DATABASE `solo` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> CREATE USER 'solouser'@'%' identified BY 'solo@pwd';
mysql> GRANT ALL ON solo.* TO 'solouser'@'%';
mysql> FLUSH PRIVILEGES;
$ docker-compose down
$ docker-compose up -d

这样就成功了,找到管理界面进入后台进行配置吧. 在其中有个配置项每隔 24 小时进行一次全量备份到自己的 github 仓库,建议打开,详情参考博文定时同步 GitHub 仓库.
到这里搭建工作就完成了.
但是呢有些人会想去搞这个 mysql 的东西,总是觉得不看看里面,不放心. ok, 用命令行形式是可以,但是列出来的表项格式着实让人恶心. 于是我用 DataGrip 进行了图形话界面操作服务器中起的 mysql 容器. 其实很简单, 只需要注意使用链接时候的端口是 6603 而不是 mysql 默认的 3306 哦.

HTTP 到 HTTPS 的迁移

在这里推荐两个我参考过的文章然后简单说一下坑和注意事项就行了, 具体重复的步骤就不再啰嗦:
首先关于证书可以参考# 从零开始安装 solo 博客, 但是我的建议是看到证书下载到本地并且上传到服务器就 ok 了, 因为之前我写的一直是容器编排进行整体化管理 solo 博客系统, 上面文章中是单独配置启动 Nginx 的. 问题不大, 可以参考看看是怎么映射和原理.
至于证书有了之后怎么去做, 继续参考 solo-in-docker 以及 https 数据库问题, 这离需要参考的就是直接从开始已经有了证书开始.

End

大功告成, 愉快的开始积累吧 👍

  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1424 引用 • 10041 回帖 • 469 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    475 引用 • 899 回帖 • 1 关注
  • 博客

    记录并分享人生的经历。

    270 引用 • 2386 回帖

相关帖子

欢迎来到这里!

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

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