一个新服务器, 一些折腾

本文最后更新于:2023年11月2日 下午

最近两周在云服务器上部署了一些小插件, 这里对这段时间不多不少的折腾做一个小小的总结, 不会对配置做很详细的介绍, 主要是一些碎碎念.

1 - 动机: 自建bitwarden服务

最初买这台阿里云的服务器的动机其实是出于希望方便的有一个全平台密码管理工具

在一个下午我登录github的时候, 发现github强制要求2FA认证了

目前免费的2FA totp authenticator有:

  1. Google Authenticator
  2. Microsoft Authenticator

然而这些authenticator不仅具有不方便的特性, 而且服务器大多位于国外, 通信/备份都具有十足的问题.

之前我一直再用一个叫Bitwarden的密码管理软件, 其在各大浏览器上都有插件, 并且具有安卓/ios的app适配, 几乎可以在所有设备上无缝使用, 而且代码开源, 具有比较高的安全性, 在我没有自建服务器时就已经几乎把所有的密码管理从google转移到bitwarden了

然而bitwarden的totp是收费项目:

但是收费还是比较良心的, 只是我觉得没有必要为了一个feature去额外付几十块/年的费用

在很早之前调研密码管理工具的时候就了解到bitwarden可以自建服务器, 并且有一个开源的rust后端实现Bitwarden_RS (后面改名为vaultwarden):

This is the Rust implementation backend, not the official server backend, but fully compatible with the Client apps.

Bitwarden is a self-hosted password manager. It allows you to store and manage your passwords, credit cards, and other private information in a secure way while still allowing you to access it from your browser, phone, or desktop.

vaultwarden实现了与bitwarden完全兼容的绝大多数api, 可以直接作为bitwarden客户端的上游, 支持所有的高级会员的功能, 同时具有多方面的优化, 并且更加的轻量:

Vaultwarden 比官方版更轻量。官方版使用 .Net 开发,使用 MSSQL 数据库,要求至少 2GB 内存;Vaultwarden 使用 Rust 编写,改用 SQLite 数据库(现在也支持 MySQL 和 PostgreSQL),运行时只需要 10M 内存,可以说对硬件基本没有要求。Vaultwarden 比官方版更轻量。官方版使用 .Net 开发,使用 MSSQL 数据库,要求至少 2GB 内存;Vaultwarden 使用 Rust 编写,改用 SQLite 数据库(现在也支持 MySQL 和 PostgreSQL),运行时只需要 10M 内存,可以说对硬件基本没有要求。

于是乎我直接开始搜寻一个轻量的服务器来部署vaultwarden服务:

  1. 腾讯云国内: 老用户与狗不得入内系列
  2. 阿里云国内: 同上
  3. 国内其他云服务厂商: 不太放心, 并且价格也不便宜, 且几乎所有国内服务器都是小水管, 干不了什么东西
  4. vultr / 搬瓦工等国外服务器: 延迟过高

于是最后把眼光瞄准了阿里云轻量海外/腾讯云轻量海外

最后入手了阿里云的新加坡轻量服务器

价格还是比较良心, 同时30Mbps带宽也基本够用, 测了一下延迟大概70ms左右, 对比其他的海外服务器已经是绝佳的表现了

海外服务器在延迟低的情况下优势是很明显的:

  1. 各种包管理不用配一大堆镜像
  2. github可以直接访问, 拉代码很方便, 国内经常抽风
  3. 在把阿里云盾删除的情况下, 可以干点你懂得

同时这次服务器部署希望全采用docker的方式, 这样迁移非常方便, 然后用rclone备份数据卷到google drive / one drive即可, 下面简单介绍下这一周来折腾的一些东西(2G内存还是能干很多事的!):

2 - 基础建设(反代): caddy

caddy相比nginx除了配置方便外很吸引我的一个点就是: 自动部署证书

实际使用下来真是太方便了, 配置一个简单的反向代理 + https只需要:

1
2
3
4
{$DOMAIN} {
tls {$EMAIL}
reverse_proxy localhost:{$PORT}
}

就搞定了, 结合docker-compose:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3'
services:
caddy:
image: caddy:2
container_name: caddy
restart: always
network_mode: host
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy-config:/config
- ./caddy-data:/data
environment:
DOMAIN: "https://helloworld.com" // 域名,以 http https 作为前缀
PORT: "80"
EMAIL: "whatever@helloworld.com"

原理就是自动用你的$EMAIL进行acme的自动续签(基于let’s encrypt)

之后如果需要使用证书的话直接到./caddy-data中找就好了

3 - vaultwarden

在搞完基础建设后直接开始部署vaultwarden

其实单纯配置vaultwarden非常的简单(直接上docker-compose):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: '3'

services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: always
ports:
- 80:80
- 3012:3012
environment:
WEBSOCKET_ENABLED:
ADMIN_TOKEN:
SIGNUPS_ALLOWED:
SMTP_HOST:
SMTP_FROM:
SMTP_PORT:
SMTP_SECURITY:
SMTP_USERNAME:
SMTP_PASSWORD:
DOMAIN:
volumes:
- vaultwarden-data:/data

然后直接在各个bitwarden的插件里填上服务器地址就可以用了

然而这样一个密码管理服务数据备份是相当重要的, 我直接采用了一个项目的备份方案:

https://github.com/ttionya/vaultwarden-backup

我自己在配置的是保留5天的数据, 并且中途多次尝试从备份中恢复, 还是相当稳的:

在搭建完vaultwarden后我发现我1GB(后面升级到2GB了)的服务器还剩下大几百兆, 如果我只用来做一个密码管理那不是浪费钱吗, 必经一年也要好几百, 那还不如直接去买bitwarden的服务, 后面越想越气, 就开始发觉服务器其他的用途:

4 - nps

一个内网穿透服务

一款轻量级、高性能、功能强大的内网穿透代理服务器。支持tcp、udp、socks5、http等几乎所有流量转发,可用来访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析、内网socks5代理等等……,并带有功能强大的web管理端。a lightweight, high-performance, powerful intranet penetration proxy server, with a powerful web management terminal.

nps比frp好的一点就是提供了非常方便的web ui, 不需要登录服务器搞配置了

docker: https://hub.docker.com/r/ffdfgdfg/nps

基本写一个这样的compose:

1
2
3
4
5
6
7
8
9
10
version: '3'

services:
nps:
image: "ffdfgdfg/nps"
container_name: nps
restart: always
network_mode: "host"
volumes:
- ./conf:/conf

然后复制config: https://github.com/ehang-io/nps/tree/master/conf

就可用了.

感觉nps的用处还是很大的, 只是现在我校园网基本全是内网, 用不太上就闲置了, 之后在家里想连接实验室的服务器之类的还是很有用的 (遵纪守法)

5 - chatgpt

那自然是要跟随潮流(:

几个典型的项目:

  1. https://github.com/binary-husky/chatgpt_academic
  2. https://github.com/Chanzhaoyu/chatgpt-web

这里基本都不需要任何配置, 填个api-key开箱即用, 并且内存占用都很小

这里就不得不说新加坡节点的另一个好处了:

服务器IP几乎不会被openai ban掉, 同时新加坡又不属于管制范围, 总之就是不用开代理畅享API

6 - proxy

这是能说的吗

反正搭了三天还没被封, 后面再看

7 - rss-bot

这几天高强度看别人的博客, 又想部署一个简单的rss通知服务, 之前一直用的feedly, 但是不知道为什么总是挂图片/样式很烂/收不到通知

于是这次直接顺手部署了一个rss的bot:

https://github.com/Rongronggg9/RSS-to-Telegram-Bot

直接推送rss到tg, 并且还可以自动渲染, 还是挺方便的

8 - 总结

这几天在服务器上的折腾大概就总结成了这几点, 期间服务器经过了一次从1G到2G的升级, 多次重启, 但是用docker的好处就是, 一切服务器重启几乎都是无感的(记得配置restart: alwaysrestart: unless-stopped)

然后同时利用tmux, 运行着docker compose logs -f监控每一个服务, 基本登录服务器看日志可以做到一键化

然后让chatgpt帮我写了个一键备份的脚本:

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
46
47
48
49
#!/bin/bash

# 定义变量
CURRENT_DIR=
BACKUP_DIR= # 需要备份的目录
RCLONE_REMOTE= # rclone远程服务名
DAYS_TO_KEEP=3 # 保留备份文件的天数

# 生成备份文件名
BACKUP_FILE=docker-$(date +%Y-%m-%d).zip

# 打包备份文件
echo "开始打包备份文件..."
cd $BACKUP_DIR && zip -r $CURRENT_DIR/$BACKUP_FILE .
if [ $? -eq 0 ]; then
echo "备份文件打包成功!"
else
echo "备份文件打包失败,请检查备份目录是否存在!"
exit 1
fi

# 上传备份文件到rclone远程服务
echo "开始上传备份文件到rclone远程服务(onedrive)..."
rclone copy $CURRENT_DIR/$BACKUP_FILE $RCLONE_REMOTE > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "备份文件上传成功!"
else
echo "备份文件上传失败,请检查rclone配置是否正确!"
exit 1
fi

# 删除历史备份文件
FILE_NAME=docker-$(date -d "$DAYS_TO_KEEP days ago" +"%Y-%m-%d").zip
echo "开始删除历史备份文件(onedrive): $FILE_NAME"
if rclone ls $RCLONE_REMOTE/$FILE_NAME > /dev/null 2>&1; then
rclone delete $RCLONE_REMOTE/$FILE_NAME > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "历史备份文件删除成功!"
else
echo "历史备份文件删除失败,请检查rclone配置是否正确!"
exit 1
fi
else
echo "历史备份文件不存在!"
fi


echo "备份完成!"
exit 0

整体感觉就是: 服务器非常的清爽, 几乎在不用快照的情况下也可以做到快速迁移

目前内存还剩将近1个G, 感觉还可以折腾进好几个服务…


一个新服务器, 一些折腾
https://moreality.net/posts/22665/
作者
Moreality
发布于
2023年4月14日
许可协议