[图片] 环境 我自己购买了云主机,至于哪里有卖就不需要强调了吧. 顺手趁打折我就冲了个域名: reyren.cn. 如果想好好的去经营自己的点点滴滴, 这些几十一百的不要太在意, emmm 扯远了. 在我配置好服务器基础环境添加域名解析后 (Ubuntu 16.04 LTS), 我就折腾的部署了 Solo. 索性就在 ..

Solo 博客系统基于 Docker 的搭建

环境

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

# 删除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 的迁移

待续..........

End

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

  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。

    Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!
    具体细节请浏览 B3log 构思

    724 引用 • 5469 回帖 • 695 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销, 可以很容易地在机器和数据中心中运行。最重要的是, 他们不依赖于任何语言、框架或包括系统。

    210 引用 • 389 回帖 • 650 关注
  • 博客

    记录并分享人生的经历。

    175 引用 • 1967 回帖
回帖   
请输入回帖内容...