图床从七牛迁移至腾讯COS

前言(吐槽):

之前收到邮件,七牛要回收什么测试域名,想着没啥影响。因为我绑定了备案域名。最近突然发现博客好多图片挂了。一看我备案了快五年的域名被取消备案了???而且七牛直接把测试域名删了…

我当初注册的就是个人性质博客类网站,五年时间网站一直正常运行,且内容性质从未改变。空壳网站?备案信息不准确?真是睿智 🖕

概览

以下操作在macOS下进行。所有命令的文档请参考qshell命令列表

主要流程: 下载七牛中的所有资源,上传至腾讯COS。由于七牛的测试域名已失效,原空间的资源无法直接下载,所以先新建一个空间(新空间测试域名30天有效期),将旧空间的资源全部转移至新空间,然后从新空间下载所有资源。

一、七牛资源从就空间转移至新空间

1、下载七牛的命令行工具qshell

2、解压、重命名、赋予qshell运行权限

前往目录

1
cd  /Users/ludis/Downloads/qshell-v2.3.4 && ll
1
2
3
4
5
6
7
8
➜  qshell-v2.3.4 ll
total 135824
-rwxr-xr-x@ 1 ludis staff 14M Dec 4 16:19 qshell_darwin_x64
-rwxr-xr-x@ 1 ludis staff 14M Dec 4 16:19 qshell_linux_x64
-rwxr-xr-x@ 1 ludis staff 12M Dec 4 16:19 qshell_linux_x86
-rwxr-xr-x@ 1 ludis staff 14M Dec 4 16:19 qshell_windows_x64.exe
-rwxr-xr-x@ 1 ludis staff 12M Dec 4 16:19 qshell_windows_x86.exe
➜ qshell-v2.3.4

重命名(可选)

1
mv qshell_darwin_x64 qshell

设置权限

1
chmod +x qshell

3、添加七牛账号

前往七牛 -> 个人中心 -> 密钥管理。查看AK、SK。

./qshell account [AK] [SK] [账户名(邮箱即可)]

4、导出已过期的bucket空间所有文件信息。

qshell listbucket A -o A.list.txt (A为空间名)

5、新建一个空间B,用于将已过期的A空间中的所有文件,转移至新的空间B。(新空间的域名30天有效)注意A、B空间需要在相同的地区才可以。

6、使用awk工具,将A空间的文件列表进行格式化。Mac下自带awk工具,其余平台自行安装。

此时A.list.txt中的内容格式如下:

1
2
3
4
5
6
...
images/react.png 340793 FoVpVxc12JXJawT0UdkRs7bHm3MS 15192693058673770 image/png 0
images/watermark.png 11567 FirWtot1NJVL-0bU-9VoN4yeQyLu 15192728052402421 image/png 0
postbg.jpg 105210 FlBqtLeiA1kTiQxRUSSapLep1utC 15185150032696840 image/jpeg 0
postcover.jpg 47446 Fltqi_cmpz09x8PV4y1yGYwqW_lr 15185152316033806 image/jpeg 0
...

使用awk命令格式化

1
2
touch list.txt
awk '{print $1}' A.list.txt > list.txt

这个命令意思是将A.list.txt文件中每行的第一个字段(文件名)分离出来,输出到list.txt文件中。

对应的list.txt格式如下:

1
2
3
4
5
6
7
...
images/postbg.jpg
images/react.png
images/watermark.png
postbg.jpg 105210
postcover.jpg
...

7、使用命令将A空间中的所有资源批量转移至新空间B中:

1
2
➜  qshell-v2.3.4 ./qshell batchcopy A B -i list.txt
<DANGER> Input hejhbd to confirm operation: hejhbd

根据提示输入字符串即可,次数刷新B空间即可看到,所有A空间的内容已经转移到B空间。

二、从七牛批量下载资源

1、创建下载用的配置文件batch_download.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
// dest_dir 文件储存路径-全路径
"dest_dir" : "/Users/ludis/Downloads/qshell-v2.3.4/downloads/B",
// 新建的空间名-B
"bucket" : "B",
"prefix" : "",
"suffixes" : "",
// B空间的测试域名
"cdn_domain" : "http://pji27eyb0.bkt.clouddn.com",
"referer" : "",
"log_file" : "download.log",
"log_level" : "info",
"log_rotate" : 1,
"log_stdout" : false
}

2、下载文件

执行./qshell qdownload -c 10 batch_download.conf。其中-c 10表示可以同时下载10个文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
➜  qshell-v2.3.4 ./qshell qdownload -c 10 batch_download.conf
Writing download log to file download.log

Downloading 2018-09-26-a0KAWoB.jpg [1/76, 1.3%] ...
Downloading 2018-10-14-15382027090950.jpg [2/76, 2.6%] ...
Downloading 2018-10-14-15394888949656.jpg [3/76, 3.9%] ...
Downloading 2018-10-14-15394889958531.jpg [4/76, 5.3%] ...
Downloading 2018-10-14-15394901705197.jpg [5/76, 6.6%] ...
...
Downloading postbg.jpg [75/76, 98.7%] ...
Downloading postcover.jpg [76/76, 100.0%] ...

See download log at path download.log
➜ qshell-v2.3.4

三、上传文件至腾讯COS

此处省略100字,自行注册腾讯云,创建存储空间。设置空间权限为“公有读私有写”

上传资源可以使用网页端或者下载工具

四、旧资源链接替换/重定向

将资源上传至腾讯COS后,需要将原博客中失效的七牛链接替换为腾讯COS中的链接。不同系统的博客请自行传泽替换方案。替换.md文件中的域名,或从数据库查询替换…

五、图片处理(水印)

七牛空间存储的图片,可以创建图片处理规则,添加水印、缩放等比较方便。然而在腾讯COS存储中没有找到相关配置项。

搜索发现,腾讯的图片处理,统一使用“数据万象”这个单独的应用。在COS创建完存储空间;然后在“数据万象”创建自定义的图片处理规则,并绑定COS存储空间的Bucket即可。且有个优点是可以使用别名代替处理规则,以及可以使用-(中划线) _(下划线) /(斜杠) !(感叹号)四中分割符号。

例如:

  • 图片链接: https://233.com/666.png

  • 如创建的图片规则为: imageMogr2/interlace/0|watermark/1/image/aHR0cDovL3dhdGVybWFyay1iai0xMjUyMTA2MjExLnBpY2JqLm15cWNsb3VkLmNvbS9sdWRpcy0...

  • 别名为: imgRule

以七牛的尿性图片添加完规则变成: https://233.com/666.png?imageMogr2/interlace/0|watermark/1/image/aHR0cDovL3dhdGVybWFyay1iai0xMjUyMTA2MjExLnBpY2JqLm15cWNsb3VkLmNvbS9sdWRpcy0... 👎

腾讯云则很优雅: https://233.com/666.png!imgRule 👏

参考

HTTPS:为 Ghost 设置 SSL 连接

HTTPS:超文本传输安全协议(Hypertext Transfer Protocol Secure)是一种网络安全传输协议。在计算机网络上,HTTPS经由超文本传输协议进行通信,但利用SSL/TLS来对数据包进行加密。HTTPS开发的主要目的,是提供对网络服务器的身份认证,保护交换数据的隐私与完整性。

HTTPS连接经常被用于万维网上的交易支付和企业信息系统中敏感信息的传输。

HTTPS 与 HTTP 的差异

  • 与HTTP的URL由**http://** 起始且默认使用端口 80 不同,HTTPS的URL由**https://** 起始且默认使用端口**443**。
  • HTTP是不安全的,且攻击者通过监听和中间人攻击等手段,可以获取网站帐户和敏感信息等。HTTPS被设计为可防止前述攻击,并(在没有使用旧版本的SSL时)被认为是安全的。

    Ghost设置SSL

    首先申请SSL证书,可选择startSSL(免费一年)或自行购买。

具体申请过程较为繁琐,自行search,得到crt证书及key

环境:centos、nginx、nodejs、ghost

ssh后执行:

  • mkdir /etc/nginx/ssl
  • cp server.crt /etc/nginx/ssl/server.crt
  • cp server.key /etc/nginx/ssl/server.key

将两个文件上传后,更新nginx配置:

  • 编辑配置文件,以自己实际位置为准 vim /etc/nginx/conf.d/myconf.conf
  • 修改server,监听443端口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80;
+ listen 443 ssl;
server_name ldsun.com www.ldsun.com;
+ ssl_certificate /etc/nginx/ssl/ldsun.com.crt;
+ ssl_certificate_key /etc/nginx/ssl/ldsun.com.key;
...
location / {
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:2368;
...
}
}

重启nginx:service nginx restart

注:

从startSSL生成的key为加密key,每次重启nginx都需要输入密码解密,较为麻烦,也比较安全。可以直接将key文件解密,不用每次重启输入密码,相应的修改key文件权限即可保证安全性。

解密命令:openssl rsa -in www.ldsun.com.key -out /etc/nginx/ssl/ldsun.com.key

设置文件权限:chmod 600 ldsun.com.key

Ghost 实现文章归档

Ghost系统目前暂不支持文章归档,遂手动实现。
方法:通过调用Ghost API实现

启用ghost测试功能

进入ghost后台,在实验功能->启用测试功能能中开启测试功能,这样就可以使用Ghost API获取数据。

新建自定义页面

  1. 首先创建一个静态页面:在ghost后台新建页面,发布为 独立页面 ,标题为archives,网址可以设置为域名/archives
  2. 接着创建一个自定义页面模板:该模板是第一步创建的静态页面的模板,创建一个page-url.hbs模板,如果第一步设置的页面网址为域名/archives,那么模板即为page-archives.hbs。将该模板上传至主题根目录下即可,此时访问域名/archives,即会调用自定义的page-archives.hbs这个模板。(由于新建的模板没有任何内容,所以页面会显示为空,可以赋值page.hbs中的内容测试查看)

    调用Ghost API实现文章归档

    所需工具:

    jQuery、momentjs
    文档:

    Ghost API文档:http://api.ghost.org/v0.1/docs
    Momentjs文档:http://momentjs.cn/docs/
    世界时区差计算:http://www.12sign.cn/htmls/help/worldtimezone.htm

在page-archives.hbs中调用Ghost API即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/**
* 调用ghost API,完成文章归档功能
* 所需组件:jQuery、moment.js
* @ldsun.com
*/
jQuery(document).ready(function() {
//获取所有文章数据,按照发表时间排列
$.get(ghost.url.api('posts', {
limit: 'all',
order: "published_at desc"
})).done(function(data) {
var posts = data.posts;
var count = posts.length;
for (var i = 0; i < count; i++) {
//调用comentjs对时间戳进行操作
//由于ghost默认是CST时区,所以日期会有出入,这里消除时区差
var time = moment(posts[i].published_at).utcOffset("-08:00");
var year = time.get('y');
var month = time.get('M')+1;
var date = time.get('D');
if( date<10 ) date = "0"+date;
var title = posts[i].title;
var url = "http://www.ldsun.com"+posts[i].url;
//首篇文章与其余文章分步操作
if (i > 0) {
var pre_month = moment(posts[i - 1].published_at).get('month')+1;
//如果当前文章的发表月份与前篇文章发表月份相同,则在该月份ul下插入该文章
if (month == pre_month) {
var html = "<li><time>"+date+"日</time><a href='"+url+"'>"+title+"</a></li>";
$(html).appendTo(".archives .list-"+year+"-"+month);
}
//当月份不同时,插入新的月份
else{
var html = "<div class='item'><h3><i class='fa fa-calendar fa-fw' aria-hidden='true'></i> "+year+"-"+month+"</h3><ul class='archives-list list-"+year+"-"+month+"'><li><time>"+date+"日</time><a href='"+url+"'>"+title+"</a></li></ul></div>";
$(html).appendTo('.archives');
}
}else{
var html = "<div class='item'><h3><i class='fa fa-calendar fa-fw' aria-hidden='true'></i> "+year+"-"+month+"</h3><ul class='archives-list list-"+year+"-"+month+"'><li><time>"+date+"日</time><a href='"+url+"'>"+title+"</a></li></ul></div>";
$(html).appendTo('.archives');
}
}
}).fail(function(err) {
console.log(err);
});
});

效果可以进入archives页面查看:Archives

完整代码已上传至Git:

Wordpress to Ghost

环境:

  • Centos-6、Ngnix
  • Nodejs:v0.10.40
  • Npm:1.4.28
  • MySQL:5.1.73

前期准备

yum update 更新yum源

yum pdate 更新yum源

yum groupinstall "Development Tools" 安装开发工具包

安装Nginx

先编辑下Nginx的仓储地址,新建nginx.repo文件:


vi /etc/yum.repos.d/nginx.repo
在文件中写入以下内容:

1
2
3
4
5
[nginx] 
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

保存退出,然后使用yum下载Nginx,并安装:


sudo yum install nginx -y

sudo service nginx start 开启nginx

sudo chkconfig nginx on 设置nginx为开机启动

这样Nginx的安装就完成了,在浏览器中输入VPS的IP或者域名就可以看见Nginx友好的提示:“Welcome to Nginx!”

使用Nginx配置反向代理

如果完成上一步并且在浏览器中看见Nginx的welcome,那么我们就可以开始配置反向代理,让代理从80端口指向2368端口
去到以下这个目录:

cd /etc/nginx/conf.d
删掉default.conf配置文件
rm default.conf
在此目录下新建一个.conf文件,文件名随意
vi myself.conf
在文件中写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
server {
listen 80;
server_name zyden.vicp.cc;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:2368;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

将server_name换成自己的域名,或者ip,保存退出,并重启nginx:
service nginx restart
ok,nginx的问题就close file了

安装配置Mysql

Ghost v0.7.4 full (zh) 集成了sqlite3,不喜欢用Mysql的话可以忽略此步骤 :
yum install mysql mysql-server

service mysqld start 启动mysql
mysql
 chkconfig mysqld on 设置为开机启动

mysql_secure_installation 配置mysql 如下:

1
2
3
4
5
Set root password? [Y/n] //设置root密码   -- 根据个人需求
anonymous users? [Y/n] //删除匿名用户 -- y
Disallow root login remotely? [Y/n] //禁止root用户远程登录 --n
Remove test database and access to it? [Y/n] //删除默认的 test 数据库 --y
Reload privilege tables now? [Y/n] //是否马上应用最新的设置 --y

为了支持中文,我们还要修改mysql的字符支持,编辑MySQL的配置文件:
vi /etc/my.cnf
在对应的位置加上对应的内容:

1
2
3
4
5
6
7
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

新建一个ghost专用的mysql用户和专用的database:

mysql -u root -p
//用root用户登录mysql

create database ghost;
//创建ghost数据库

GRANT ALL PRIVILEGES ON ghost.* To 'ghost'@'%' IDENTIFIED BY '密码';
//创建ghost database 和 用户名为ghost的用户

//%代表能被所有地址访问

安装Node.js

这里根据Ghost官方的建议,我们安装v0.10.40版本

1
2
3
4

wget http://nodejs.org/dist/v0.10.40/node-v0.10.40.tar.gz

tar zxvf node-v0.10.40.tar.gz
cd node-v0.10.40

./configure
m
make && make install

安装Ghost

将ghost安装在/var/www下

cd /var/www 没有就创建该目录

wget http://dl.ghostchina.com/Ghost-0.7.4-zh-full.zip下载中文版的Ghost(原生版goole font会被墙,需要自己优化)

解压:

unzip -d ghost ghost-latest.zip

进入ghost安装目录:

cd ghost

安装Ghost:

sudo npm install --production
安装完成后可以通过如下命令启动ghost的开发模式,测试安装是否成功:
npm start
3.7.此时ghost将会运行在127.0.0.1:2368上,在浏览器中输入此地址即可访问。
这里要将config.example.js重命名为config.js再对其进行修改配置
mv config.example.js config.js
vi config.js
我们找到生产环境的配置:production

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
production: {  
url: 'www.ldsun.com', //这里是你自己VPS主机的域名,或者IP
mail: {},
database: {
client: 'mysql'这里我选择使用mysql作为我博客的数据库
connection: {
host : '127.0.0.1',
user : 'ghost', //mysql用户名
password : '', //密码
database : 'ghost', //之前创建的ghost数据库名称
charset : 'utf8'
},
server: {
host: '127.0.0.1',
port: '2368'//若修改该端口记得在nginx中做相应改变
}
}

用命令npm start来试试启动开发者模式的Ghost,启动后在浏览器输入自己blog地址如果能看见Ghost。至此ghost安装成功!

使用PM2让Ghost永远在线

只要一断开ssh,Ghost的进程就会被关闭,这里使用PM2来守护Ghost服务进程,并让其运行在生产模式production上

1
2
3
4
5
6
7
8
9
10
//进到ghost的安装目录
cd /var/www/ghost
//安装pm2
npm install pm2 -g
//让ghost以production模式运作,指定程序的入口index.js,并且此进程命名为ghost
NODE_ENV=production pm2 start index.js --name "ghost"
//开机启动
pm2 startup centos
//保存设置
pm2 save

这样进程守护就完成了,ghost会永远在线,并且会伴随vps重启运行,几个常见命令如下:

pm2 restart 进程名 重启进程

pm2 listpm2 status 查看运行的进程

pm2 show 进程名/进程ID 查看进程详情

数据转移

wp搜索“Ghost”插件,或手动下载
经测试,1M左右的wp-posts数据表用该插件可以导出为ghost可用的json文件,我的wp-posts数据表接近3M,没有成功导出过,最后自己写个脚本跑出来即可。

图片处理

图片迁移我是选择将原wp的所有图片传到七牛,然后给nginx写rewrite规则。

wp的图片存在wp-content/uploads中,将所有图片下载下来。

注册七牛账号,新建一个Bucket仓库,下载上传所用命令行工具

切换到该工具的目录下,执行初始化:

./qrsboxcli init <AccessKey> <SecretKey> <SyncDir> <Bucket> [<KeyPrefix>]

  • AccessKey、SecretKey可进入个人中心查看
  • SyncDir 是本地的同步目录,该目录下的文件会随时同步上传值七牛云存储。
  • Bucket 是保存同步文件的资源空间名。
  • KeyPrefix 是文件前缀,可选。如果设置了该参数,那么上传的文件名前都会加上前缀。这个前缀主要用于在空间中区分不同上传来源的文件。

然后使用以下命令开始文件同步:

./qrsboxcli sync &

查看进程:

./qrsboxcli log

终止进程:

./qrsboxcli stop

设置Nginx Rewrite规则

图片上传到七牛之后,配置nginx.conf。打开之前创建的.conf文件:

vim /etc/nginx/conf.d/myself.conf

由于wp文章中的图片请求都是wp-content/uploads/year/month/*.(jpg|png|gif),所以可以按照如下规则rewrite图片地址:

1
2
3
4
5
6
location ^~ /wp-content/ {
if (!-e $request_filename) {
rewrite ^/wp-content/uploads/(.*)$ http://7xqpve.com1.z0.glb.clouddn.com/$1 last;
break;
}
}

保存,重启nginx服务即可。