阿里云折腾记

起源

博客挂在Github上不要钱,但是总感觉访问有些慢。而且有时候会想跑一些脚本和服务,就一直考虑过买一台服务器。在大学里对Linux用的不多,唯一一次就是在阿里云上买了一个学生主机,玩了几天以后感觉没什么用不会玩,就没有再续费了。前几天逛阿里云的时候,居然看到了一个叫云上浙江的活动。西湖区的公司,没用过阿里云的话可以免费领2000无任何限制的代金券。简直是天上掉了馅饼。因为我刚好有一个杭州的公司,所以就新注册了一个账户。中间虽然有一些小波折,但是最终还是成功领到了钱。千挑万选之下选了ECS香港 2核4G 1M 带宽 100G 硬盘。虽然带宽1M有点小,不过只需要1980就能买这个配置的服务器三年。还是非常划算的。更何况也不需要我自己出钱。

SSH相关设定

为了不用输入密码和安全考虑,肯定是要用SHH key登录,阿里云控制面板的云服务器 ECS-绑定密钥对-创建密钥,输入名字例如test就可以直接生成密钥对,生成完成以后会自动下载一个test.pem的私钥,然后选择之前已经买好的ECS。绑定之后不需要重启就可以利用这个私钥登录了。用阿里云的服务生成和绑定只要是和自己写的项目FastAirport 有关。

安装docker

假如我们服务的IP是aaa.bbb.ccc.ddd SSH的接口是1234

1
ssh root@aaa.bbb.ccc.ddd -i test.pem -p 1234

部署hexo

原先的博客是放在Github pages上的。分成了blogGeorgeYuen.github.io,虽然这样不要钱,也比较方便,不过既然搬家到了自己的服务器上,那肯定是要折腾一下的。后来用 Daocloud 做了持续部署。

其他放在另外的文章里面说吧,一下子也说不完。

如何在自己电脑上搭建一个电子书网站

搭建了一个个人的电子书网站

作为一个松鼠党,从高中逛E-INK开始就收集各类电子书,这么多年下来也积攒了一大笔积蓄。下书入流水,看书如抽丝。那么这些书的管理就成了一个问题。最后选了半天还是决定用calibre来管理自己的电子书。

calibre虽然速度有些慢,不过应该是目前为止能找到的最好的电子书管理工具了。和kindle的结合也很好。考虑数据的备份,除了在自己的Mac上存放了书库以外,还利用Resilio Sync把书库存到了群晖上。这样就算是电脑被偷数据也不会丢了。不过calibre的数据库有一个缺点,他在电脑上储存文件的目录结构是/calibre/author/books

而且会把全部的汉字转换成拼音。直接用Mac上的calibre看的话挺方便的,但是远程用手机访问群晖的话看到的都是类似于拼音文件。找书很不方便。所以就想找一下有没有calibre的web版本。

搜了一下果然有人已经早好轮子了calibre-web 一个用Python写的一个Web app。

官方介绍是这样的:Calibre Web is a web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre database.

直接利用calibre的数据库,然后支持下载,上传,在线阅读,数据修改,发送到kindle。而且手机端和web端都支持,真是完美符合我的需求。不过要吐槽一点,这个源码居然不打tag,程序更新完全是靠git拉取来更新。真的是大开眼界。

既然调研好了,那么就开始搭建吧。

网站搭建

背景说明

  • 群晖216+Ⅱ
  • Calibre
  • Resilio
  • docker

其实上面啥都不需要,只需要一台能运行docker的设备就可以了。内存大约100m 不知道树莓派能不能撑得住。 Python的效率真低呀。

首先先是电脑上安装calibre,然后同步自己的书库到群晖。这一步网上教程太多,就不详细介绍了。

同步完之后,我们的群晖上就有了数据库。例如我的目录是 /Backup/书库 里面有一个数据库文件 metadata.db

数据库有了,就开始安装程序。程序安装很简单,只需要一个python环境就可以了。

1
2
3
4
5
6
# 1.下载源码
git clone https://github.com/janeczku/calibre-web/
# 2.利用pip安装依赖
pip install --target vendor -r requirements.txt
# 3.运行程序
python cps.py

执行命令以后你就把网站搭好了,访问http://localhost:8083就可以看到自己搭建的网站了。

不过妈妈说了,能用docker解决的问题都用docker解决。

Dockerfile如下。

1
2
3
4
5
6
7
8
9
10
11

FROM python:2.7.13
MAINTAINER FandiYuan <georgeyuan@diamondyuan.com>

RUN git clone https://github.com/janeczku/calibre-web/ && \
cd calibre-web && \
pip install --target vendor -r requirements.txt

EXPOSE 8083

CMD ["python","/calibre-web/cps.py"]

项目的主页有一个镜像了,但是我个人有点没看懂,而且镜像里面是不带项目本身的,在第一次启动镜像的时候会从git上面拉取最新的源码,然后重启。其实挺符合这个开源项目的风格的,利用git进行版本更新。写得其实比我好。有需要的小伙伴可以自己研究安装。

安装说明

说了半天废话,那么图文教大家如何安装吧。

  • 首先安装群晖的docker 点开注册表 双击选择阿里云。

    搜索calibre,找到我写好的的镜像后双击下载。因为在国内,所以挺快的。感谢阿里爸爸。

安装完双击启动容器


配置一下本地目录和装载目录。本地目录就是你电子说所在的位置。

如果你需要电子书编辑的功能,那么不要勾选只读。英文我只想浏览和下载,所以选择了只读。

设置完成以后点击确认 应用。你的个人服务器就布置好了。
举个例子
例如我群晖的路由访问页面是192.168.3.101:6001,那么192.168.3.101:8083就可以看到自己部署的网站了。

利用Daocloud完成Hexo的持续部署

本文不仅限于hexo,可以适用于任何项目。

因为买了阿里云的服务器,而且受不了Github的速度,就准备把自己的博客迁移到国内的网站。而且把网站放在docker里以后,无论在哪台服务器,只要安装了docker,都可以很快捷得部署自己的博客。之前先说一下

思路,一开始我是把blog的源码(不含node_modules)直接copy到hexo的镜像中,然后下载npm的模块,再执行generate。执行完以后把public目录下的文件全部复制到一个nginx的镜像下面。需要部署的时候,只需要拉取那个nginx镜像就可以了。

但是这样有一个缺点,每次更新博客,都要重新下载一遍node_modules。如果不换国内源的话,发布一次要等很久。于是就换了一个思路。因为博客的依赖基本上是不变的,package-lock.json与package.json基本上不更新,所以可以先把这两个文件复制到hexo里面,预先下载好,生成一个新的base镜像。每次发布的时候,都从这个镜像开始动手。只需要hexo g。然后就可以把public文件提取了。build速度从原来的7分钟提升到了40秒。等依赖或者插件更新的时候,可以手动更新一下base镜像。

思路有了,那就开始动手布置吧。详细文件可以看我的Github 希望大家喜欢的话可以star。

首先是base镜像,除非添加新的插件或者hexo更新,不然基本上不会替换。

1
2
3
4
5
6
7
FROM emitting/hexo
MAINTAINER FandiYuan <georgeyuan@diamondyuan.com>
ADD package-lock.json /temp/
ADD package.json /temp/
RUN cd /temp && \
npm install
CMD ["bash"]

构建镜像,主要基于base镜像是把博客源码复制进去,然后生成public文件。

1
2
3
4
5
6
FROM daocloud.io/diamondyuan/blog-base:latest
MAINTAINER FandiYuan <georgeyuan@diamondyuan.com>
ADD / /blog
RUN mv /temp/node_modules /blog/node_modules && \
hexo g
CMD ["bash"]

发布镜像 把博客的html文件复制到nginx镜像中。

如果是部署在github,那么可以把这个文件替换成一个有git的镜像,把代码提交到git中。

1
2
3
FROM nginx:stable-alpine
MAINTAINER FandiYuan <georgeyuan@diamondyuan.com>
copy /blog/public/ /usr/share/nginx/html/

本来这样就可以了,原本是准备自己造一套轮子的,但是后来实在是嫌麻烦,就直接用了daocloud的服务,反正也不要钱,还可以为自己服务器节约一些硬盘。如果用docker官方的hub,我不是很清楚提取文件和打包应该如何,可能需要自己在本机写一下脚本吧。其他的博客生成器使用思路都差不多,只需要改一下dockerfile的命令就好了。

窝在daocloud上建了两个项目。blog和blog-base。都关联了github。还有两个ymal文件,直接贴出来。

第一个是blog-base的流程,只有装新的插件而且打tag以后,才会触发这项目,更新base。

1
2
3
4
5
6
7
8
9
10
11
12
13
version: 3
stages:
- 构建阶段
默认构建任务:
label: release-image
stage: 构建阶段
job_type: image_build
only:
tags:
- .*
build_dir: /
cache: true
dockerfile_path: /Dockerfile/Dockerfile.base.build

第二个上blog项目,用了两个dockerfile。每次更新代码会先临时生成一个镜像,提取出public文件后复制到nginx的镜像中。这些操作都在daocloud的服务器上完成,不需要占用自己电脑的空间。我一个空的hexo博客+nginx大约是15mb。而一个node+hexo的镜像在700mb左右。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: 3
stages:
- build
lite-build:
stage: build
job_type: lite_image_build
only:
branches:
- ^master$
compile:
build_dir: /
dockerfile_path: /Dockerfile/Dockerfile.build
extract:
- /blog
package:
build_dir: /
dockerfile_path: /Dockerfile/Dockerfile.deploy

最后只需要拉取最终生成的镜像,就可以在任何电脑上布置自己的博客了。更新博客的话只需要往hexo/source/_posts 里添加一篇文件并且push到github,就会自动触发daocloud,构建一个新的博客镜像。基于这个镜像,窝在daocloud上发布了一个应用,并且设置为自动更新。每次有新的镜像出来就会自动拉取镜像到我的阿里云上,并且发布。

这个思路可以用在任何的项目上,比如我司的JAVA项目,就是把源码拷贝到一个gradle的镜像里,构建好以后提取jar出来,再放到一个只有jre的镜像中。可以缩小最终生成的docker镜像的大小。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×