分类 技术 Technology 下的文章

本文原来拟定的标题为:《墙,墙,又是墙!》,以显示我的愤怒。

故事背景是由于 Google Workspace 放弃了白嫖用户,我转付费了其中若干套,放弃了若干套。放弃的订阅可以导出全部数据到 GCP 存储桶。

大概是这样的:

在 gsutil 工具主页上看到安装方式的文档链接,文档首选通过自定义 repo 的方式安装:

sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM
[google-cloud-cli]
name=Google Cloud CLI
baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el8-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
       https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOM

sudo dnf install google-cloud-cli

经测试,由于众所周知的原因,这个方案在国内主机上是行不通的。

知天朝者,Google 也。他们还提供了通过归档包的方式进行安装的方案。目前可以下载到的最新的版本归档是:google-cloud-sdk-377.0.0-linux-x86_64.tar.gz。

这里要感谢仁慈的 TG,没有赶尽杀绝,留了 dl.google.com 活口:

# wget -c https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-377.0.0-linux-x86_64.tar.gz
# tar xzf google-cloud-sdk-377.0.0-linux-x86_64.tar.gz
# cd google-cloud-sdk
# ./install.sh

安装完成后提示:

To update your SDK installation to the latest version [381.0.0], run:
  $ gcloud components update

作为精神强迫症患者,必须来一波:

# gcloud components update

到这里身心还较为愉悦,尝试列出 GCP 存储桶的文件:

# gsutil ls gs://takeout-export-xxxx

我就猜到会报错:

ServiceException: 401 Anonymous caller does not have storage.objects.list access to the Google Cloud Storage bucket.

- 阅读剩余部分 -

穷人的孩子早当家是有一定道理的。由于用不起某里云的 OSS (对象存储)服务,自己折腾了一番。期间踩坑若干,故自行记录聊以慰籍。

技术选型是采用 MinIO 与 Thumbor 无疑,网上相关的文章也很多。我的故事分为 5 个节点:

0x00、最初的记忆——Docker 安装

是的,我一开始打算以 Docker 方式部署。

MinIO 的 Docker 部署方式可以完全参照官方文档进行:

docker run \
  -d \
  -p 9000:9000 \
  -p 9001:9001 \
  --name minio \
  -e MINIO_ROOT_USER='xxx' \
  -e MINIO_ROOT_PASSWORD='xxx' \
  minio/minio server /data --console-address ':9001'

MINIO_ROOT_USER 与 MINIO_ROOT_PASSWORD 是登录 MinIO Console 的账号密码,记得替换。

而 Thumbor 则是选择了一个叫做 Minimal Compact Thumbor 的镜像,真的是简单:

docker run -p 8888:80 minimalcompact/thumbor

一行搞定。

搞到这里,MinIO 已通过 Docker 方式跑起来了,本地测试 Thumbor 发现无法处理 MinIO 提供的私有地址,比如以下这种情况。

通过调用 MinIO 的 getPresignedObjectUrl 接口获取的私有地址:

http://127.0.0.1:9000/test/test.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=348201GIYPQI49I606RF%2F20210713%2Fxxx%2Fs3%2Faws4_request&X-Amz-Date=20210713T042509Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=xxx

Thumbor 处理的地址:

http://127.0.0.1:8888/unsafe/500x0/http://127.0.0.1:9000/test/test.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=348201GIYPQI49I606RF%2F20210713%2Fxxx%2Fs3%2Faws4_request&X-Amz-Date=20210713T042509Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=xxx

结果报 400 错误。

- 阅读剩余部分 -

今天通过 acme.sh 给新域名申请 SSL 证书,遇到报错:

[Mon Jul 12 15:53:31 CST 2021] Using CA: https://acme.zerossl.com/v2/DV90
[Mon Jul 12 15:53:31 CST 2021] No EAB credentials found for ZeroSSL, let's get one
[Mon Jul 12 15:53:31 CST 2021] acme.sh is using ZeroSSL as default CA now.
[Mon Jul 12 15:53:31 CST 2021] Please update your account with an email address first.
[Mon Jul 12 15:53:31 CST 2021] acme.sh --register-account -m [email protected]
[Mon Jul 12 15:53:31 CST 2021] See: https://github.com/acmesh-official/acme.sh/wiki/ZeroSSL.com-CA
[Mon Jul 12 15:53:31 CST 2021] Please add '--debug' or '--log' to check more details.
[Mon Jul 12 15:53:31 CST 2021] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh
Error: Create Let's Encrypt SSL Certificate failed!

有人说需要在 ~/.acme.sh/account.conf 中添加:

ACCOUNT_EMAIL='[email protected]'

但是需要邮箱地址终究是麻烦,希望切换回 Let's Encrypt,可以这样:

# .acme.sh/acme.sh --set-default-ca --server letsencrypt
[Mon Jul 12 15:54:19 CST 2021] Changed default CA to: https://acme-v02.api.letsencrypt.org/directory

官方文档上也都写了,可以猛戳此处

不过据说 ZeroSSL 支持泛域名比较爽,有空再折腾一下,先学党国维稳。

我们的宣传口号是:与墙斗,其乐无穷。

1、墙内服务器

1.1、需求与掣肘

需要对服务器数据进行异地备份,数据量级:GB 级。收费的阿里云 OSS 等用不起,土豪请自便。免费的 Google Drive 连不上。

1.2、方案选型

一番折腾后最终选定七牛云免费 10G 对象存储。不够用就建多个账号,用不同的 butket 来备份。

1.3、准备工具

  • 七牛云账号一枚
  • 安装 qshell
  • 本地备份脚本,若无可参考本文 2.4 部分

1.4、实施细节

下载并设置脚本:

wget -c http://devtools.qiniu.com/qshell-linux-x64-v2.4.1.zip
unzip qshell-linux-x64-v2.4.1.zip
mv qshell-linux-x64-v2.4.1 qshell
chmod +x qshell

前往七牛云密钥管理,找到 AccessKey 与 SecretKey:

添加七牛云账号鉴权:

/path/to/qshell account <AccessKey> <SecretKey> <账户标识>

确认一下:

/path/to/qshell user ls
Name: xxxx
AccessKey: xxxx
SecretKey: xxxx

七牛官方建议大于 100MB 的文件使用 rput 来代替 fput 来实现上传。由于备份文件普通较大,这里统一使用 rput:

/path/to/qshell rput xxxx qshell-linux-x64-v2.4.1.zip /root/qshell-linux-x64-v2.4.1.zip
Uploading /root/qshell-linux-x64-v2.4.1.zip => xxxx : qshell-linux-x64-v2.4.1.zip ...

Put file /root/qshell-linux-x64-v2.4.1.zip => xxxx : qshell-linux-x64-v2.4.1.zip success!
Hash: lhKbzJ8255w0m4BKgtYpPthvU5Mc
Fsize: 9739680 ( 9.29 MB )
MimeType: application/zip
Last time: 23.54 s, Average Speed: 413.8 KB/s

上传多个备份文件,我的思路是:

  • 用 bash 脚本跑批
  • 事先 tar 到一个文件中,再用 qshell 上传

- 阅读剩余部分 -

不知道有多少同学遇到过类似反人类的需求:在 Web 上对 MongoDB 进行可视化管理。之前在服务器上用 node 跑了一套 adminMongo,甚是不稳定。用户端一些随机操作容易导致这个服务宕掉,查日志是这个样子的:

/adminMongo/node_modules/nedb/lib/datastore.js:77
    if (err) { throw err; }
               ^

Error: "toString()" failed
    at Buffer.toString (buffer.js:495:11)
    at tryToString (fs.js:453:15)
    at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:444:12)

Google 半天资料也较少,遂欲弃之。

期间也折腾了一下 phpmoadmin,说实话距离我美好的想象相去甚远。

后来重新折腾了一遍 admin-mongo,感觉是我以前的打开方式不对。记录之,用于自我马克。

操作系统 CentOS 7,以 yum 方式安装 node:

yum install nodejs -y

理论上会为您安装好 node 与 npm。确认一下:

node --version
npm --version

我这里的情况是:

node --version
v6.17.1

npm --version
3.10.10

继续安装 pm2:

npm install -g pm2

确认一下:

pm2 --version

我这边是:

pm2 --version
3.3.1

然后就可以直接安装 admin-mongo:

npm install -g admin-mongo

安装目录是 /usr/lib/node_modules/admin-mongo,因此:

cd /usr/lib/node_modules/admin-mongo
pm2 start app.js --name admin-mongo

看到类似这样的信息:

[PM2] Starting /usr/lib/node_modules/admin-mongo/app.js in fork_mode (1 instance)
[PM2] Done.
┌─────────────┬────┬─────────┬──────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐
│ App name    │ id │ version │ mode │ pid   │ status │ restart │ uptime │ cpu │ mem       │ user │ watching │
├─────────────┼────┼─────────┼──────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤
│ admin-mongo │ 0  │ 0.0.23  │ fork │ 18021 │ online │ 0       │ 0s     │ 0%  │ 13.3 MB   │ root │ disabled │
└─────────────┴────┴─────────┴──────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘

到这里 admin-mongo 就开始提供服务了,监听端口 TCP 1234。验证一下:

netstat -antlp | grep 1234
tcp        0      0 0.0.0.0:1234            0.0.0.0:*               LISTEN      18021/node /usr/lib

好,完美。赶紧做个反代用起来,不想被直接访问到的话,我用了比较猥琐的办法:

echo 用户名:密码 > /usr/local/nginx/conf/vhost/xxx.passwd
vim /usr/local/nginx/conf/vhost/xxx.conf

在 location / 中增加:

auth_basic "请替换成您的登录提示";
auth_basic_user_file /usr/local/nginx/conf/vhost/xxx.passwd;

最后 server nginx reload 一下完事儿。