1 写在前面
VPS, Virtual Private Servers,中文即虚拟专用服务器
虽说入坑vps也有两年了,说来惭愧我至今仍分不清VPS、虚拟主机、云主机等一些专有名词的关系。
最近感觉自己对VPS的需求越来越高,入门级的小鸡已经空间不足了,故决定放弃续费几年前入手的bandwagon祖传vps。(翻出了最开始的账单,这种价位的搬瓦工现在也很少了、经常缺货中)
这段时间试了试阿里云(国内的话网站要备份,很多推荐国际站香港的服务器)、cloudcone(便宜,但感觉不稳),最终选择了大厂Vultr的产品;一个月$10
(我选的硅谷机房)还是有点心痛的,但至少方便管理些、所有服务都能放在一台机器上。
说到VPS、很多情况下还要牵涉到域名,我现在有两个域名:一个专门做博客、一个配置各种服务,都转移到了cloudflare上管理,域名续费一年的开支是$8.18+$8.03
,累计起来每年要花近1000块,也算的上一笔不小的开支了(但相对于各种手游手一抖就是518,似乎也不算什么)。
那么回归正题,VPS能为我带来些什么呢? 记得最开始是fq、到后来的密码管理、网盘分享、webdv存文献、bt下载、NAS外网访问、qq机器人…
下面系统地记录一下自己用VPS搭建这些服务的步骤:(fq除外、我怕ip被封影响其他服务)
2 Bitwarden,密码管理服务
之前的一篇post有讲过具体搭建步骤,但废话比较多,我也懒得改了。新手还可以一看,和大佬一比也只能是班门弄斧了;
这次还是也顺便回顾下。
2.1 安装docker、docker-compose
推荐去网上找一个一键安装脚本、省时省力,我在My_vimrc(最初用来记录vim个人配置)这个仓库整理了一些折腾vps时用到的脚本,接下来讲到的一些配置文件也有放里面。
2.2 配置文件(docker-compose.yml)
文件目录如下,其中bw-data
中存放密码数据,最好及时备份,迁移到另一台vps时将这个文件夹拷贝覆盖就行。
~/bitwarden
├── bw-data
│ ├── db.sqlite3
│ ├── icon_cache
│ ├── rsa_key.der
│ ├── rsa_key.pem
│ └── rsa_key.pub.der
└── docker-compose.yml
docker-compose.yml
文件如下:
version: "3"
services:
bitwarden:
image: bitwardenrs/server
restart: always
ports:
- "8080:80"
- "8081:3012"
volumes:
- ./bw-data:/data
environment:
WEBSOCKET_ENABLED: "true"
SIGNUPS_ALLOWED: "false" #允许注册,配置的时候打开,之后关闭就行
WEB_VAULT_ENABLED: "true" #允许网页访问,配置好了可以关闭
其中左侧的8080
端口(之后访问bitwarden的web页面所用端口)和8081
端口(忘了啥用)可以随意改动,不过注意不要和其他服务端口冲突了(说个常识:http默认80端口、https默认443端口)。
2.3 运行服务
在 docker-compose.yml
目录下运行 sudo docker-compose up -d
。 若未报错则访问http://vps_ip:8080
应该能打开如下页面,但要正常使用还需配置https。
常用命令:
sudo docker ps #列出当前的containers
sudo docker-compose down&&sudo docker-compose up -d #先停止并移除,再创建并启用
sudo docker-compose build --pull # build、rebuild,有些情况下不需要用这步
2.4 设置nginx代理(需要域名,并在托管商处申请到SSL证书)
我的域名托管在
cloudflare
故以它为例,先添加一个DNS的A记录,名称我设置的是bitwarden
,以后就通过bitwarden.yourdomain.com
访问bitwarden服务。之后在
SSL/TLS
选项中的边缘证书
可以申请一个,保存好cert.pem
和cert.key
文件。安装nginx,并进入配置文件夹,将之前获得的
cert.pem
和cert.key
复制到/etc/nginx
中。
sudo apt-get install nginx;
cd /etc/nginx;
- 在
/etc/nginx/conf.d/
中新建default.conf
,并编辑:
sudo vim /etc/nginx/conf.d/default.conf;
加入如下内容:(更多配置请参考官方文档)
# bitwarden
# 需要改的地方已用注释标出
server {
listen 443 ssl http2;
server_name yourdomain.com; #这里改成自己的域名(之前DNS解析了的)
client_max_body_size 128M;
ssl on;
ssl_certificate cert.pem; #之前获得的SSL证书
ssl_certificate_key cert.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8080; #这里8080对应前面docker-compose里的设置,127.0.0.1代表本机ip
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /notifications/hub {
proxy_pass http://127.0.0.1:8081; #8081也对应前面设置
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /notifications/hub/negotiate {
proxy_pass http://127.0.0.1:8080; #8080对应前面设置
}
# Optionally add extra authentication besides the AUTH_TOKEN
# If you don't want this, leave this part out
location /admin {
# See: https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/
auth_basic "Private";
auth_basic_user_file /path/to/htpasswd_file;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:8080; #8080对应前面设置
}
}
2.5 定时备份数据
需要先配置好github环境,用私钥免密码登录github(我把这一步写成了一个脚本,方便自己在别的机器上配置。)由于github配置因人而异、比较个性化,需要参考的话可以在My_vimrc仓库找到。
我习惯保管好一对密钥,免得每次都要重新生成;关于非对称加密知识可以参考我之前的post。先建立远程备份仓库并和本地绑定。
cd ~/bitwarden/bw-data #改成自己bitwarden所在位置
git init
git remote add origin [email protected]:xxxx/xxxx.git #自己在github建的空仓库,这里用SSH进行clone
git add -A
git commit -m "first push"
git push -u origin master
- 建立定时上传github的脚本,备份
bw-data
文件夹。
cd ~
sudo timedatectl set-timezone Asia/Shanghai; #修改系统时区
cat >> backUp_Bitwarden.sh << EOF
#!/bin/sh
date=\$(date '+%Y-%m-%d %H:%M')
cd ~/bitwarden/bw-data
git add -A
git commit -m "backup at $date"
git push
EOF
chmod +x backUp_Bitwarden.sh;
- 定时任务crontab建立。
# 每天13:00备份一次
echo "00 13 * * * bash ~/backUp_Bitwarden.sh> ~/backup.log 2>&1 &">bt.cron;
crontab bt.cron;
rm -rf bt.cron;
crontab -l; #查看是否设置成功
3 Webdav,同步Zotero文献
以前都是用坚果云存Zotero里的文献,方便在多设备同步。但随着文献数量越来越多,自己又经常做一些标注、修改,坚果云的免费空间已经完全不够用了,遂在VPS上搭一个webdav服务来存文献。
3.1 docker-compose文件配置
Webcam搭建起来很简单,只需要一个docker-compose.yml
文件就行了,我选择在~/webdav
建立服务:
version: '3'
services:
webdav:
image: bytemark/webdav
restart: always
ports:
- "8082:80"
environment:
AUTH_TYPE: Digest
USERNAME: yourname #用户名
PASSWORD: yourpasswd #密码
volumes:
# :左边为数据保存路径
- /srv/dav:/var/lib/dav
3.2 Zotero软件设置
- 运行
sudo docker-compose up -d
后访问http://vps_ip:8082
,应该会跳出如下弹窗,说明配置成功。
打开Zotero,
编辑-首选项-同步-文件同步-使用WebDAV
,填入地址、用户名和密码,点击验证服务器,会提示创建zotero文件夹,之后验证成功后就可以愉快地同步了~注意,这个webdav是为内存比较小的VPS准备的,如果还要装
nextcloud
的话就没必要用这个了(nextcloud自带webdav,主页面左下角点击就是地址,账号密码输入nextcloud设置的admin用户就行)。
4 Nextcloud,私人网盘
Nextcloud是一套用于创建网络硬盘的客户端-服务器软件。其功能与Dropbox相近,但Nextcloud是自由及开放源代码软件,每个人都可以在私人服务器上安装并运行它。
4.1 docker-compose文件配置
文件夹结构如下:
~/nextcloud
├── app
│ └── Dockerfile
├── db.env
├── docker-compose.yml
└── web
├── Dockerfile
└── nginx.conf
下面贴出每个文件的内容:
docker-compose.yml
version: '3'
# 运行后数据储存在/var/lib/docker/volumes下的nextcloud_db和nextcloud_nextcloud文件夹下
services:
db:
image: mariadb
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
restart: always
volumes:
- db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD= #这里需要填入要设定的初始密码
env_file:
- db.env
redis:
image: redis:alpine
restart: always
# command: redis-server --requirepass 123456 #这里的123456和后面redis密码对应,没啥用(为了解决部署后日志中一个bug);
# 这一项设置后会拖慢上传速度,故取消
app:
#image: nextcloud:fpm-alpine
build: ./app
restart: always
volumes:
- nextcloud:/var/www/html
environment:
REDIS_HOST: redis
# REDIS_HOST_PASSWORD: 123456 #和前面对应,值不重要
# 这一项设置后会拖慢上传速度,故取消
MYSQL_HOST: db
env_file:
- db.env
depends_on:
- db
- redis
web:
build: ./web
restart: always
ports:
- 8083:80 #设置访问端口
volumes:
- nextcloud:/var/www/html:ro
depends_on:
- app
cron:
image: nextcloud:fpm-alpine
restart: always
volumes:
- nextcloud:/var/www/html
entrypoint: /cron.sh
depends_on:
- db
- redis
volumes:
db:
nextcloud:
db.env
:
MYSQL_PASSWORD=
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud
NEXTCLOUD_TRUSTED_DOMAINS=nextcloud.tdbrywwwcg.xyz
这里的密码和docker-compose.yml
里要一致,USER
随便起,NEXTCLOUD_TRUSTED_DOMAINS
填自己的域名,后面配置代理。
app/Dockerfile
FROM nextcloud:fpm-alpine
RUN set -ex; \
\
apk add --no-cache \
ffmpeg \
imagemagick \
procps \
samba-client \
# libreoffice \
;
RUN set -ex; \
\
apk add --no-cache --virtual .build-deps \
$PHPIZE_DEPS \
imap-dev \
krb5-dev \
openssl-dev \
samba-dev \
bzip2-dev \
; \
\
docker-php-ext-configure imap --with-kerberos --with-imap-ssl; \
docker-php-ext-install \
bz2 \
imap \
; \
pecl install smbclient; \
docker-php-ext-enable smbclient; \
\
runDeps="$( \
scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \
| tr ',' '\n' \
| sort -u \
| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
)"; \
apk add --virtual .nextcloud-phpext-rundeps $runDeps; \
apk del .build-deps
配置这部分是为了之后在nextcloud里挂载Onedrive、GoogleDrive这些外部储存,需要用到smbclient
等套件;很多教程没有这部分,而是通过安装好后再输入几个命令去配置、显得比较麻烦。
web/nginx.conf
和web/Dockerfile
nextcloud直接在docker里配置了nginx代理,不需要再在/etc/nginx
中加,而且对新手来说内容比较复杂,故照搬example里的就行了。
4.2 个人建议
- 建立好上面的几个文件就可以构建了(国内的vps下载速度慢、可能要花很久)。
sudo docker-compose build --pull;
sudo docker-compose up -d;
访问
http://vps_ip:8083
,不出意外应该能显示登录页面了。如果不是对nginx很熟悉,非常不推荐设置nextcloud的反向代理。因为自己设置好后虽然能访问,很经常出现各种bug:上传错误、图标不显示、网址链接错误…
踩了上面说的这些坑之后我也看了很多别人的设置,但仍未找到比较完美的解决方案,但一想不配置http、https也能用,只是网址比较难看而已,最终选择了妥协。
5 Sharelist,分享工具
ShareList 是一个易用的网盘工具,支持快速挂载 GoogleDrive、OneDrive ,可通过插件扩展功能。
它的优点体现在支持的网盘种类比较多,而且配置一次后只要拷贝配置文件就可以很方便在不同机器上部署。
5.1 部署服务
cd ~
git clone https://github.com/reruin/sharelist && cd sharelist
vim docker-compose.yml
docker-compose.yml
中可修改端口,之后一样运行sudo docker-compose up -d
version: "3"
services:
sharelist:
image: reruin/sharelist
volumes:
- $HOME/sharelist:/sharelist/cache
ports:
- "8084:33001" #我把sharelist放在8084端口
- 覆盖配置文件(可选)。
如果之前用过sharelist、现在只是换了个机器部署的话,只需要拷贝覆盖目录中的config.json
5.2 nginx代理配置
在/etc/nginx/conf.d/default.conf
中加入如下内容:
# sharelist
server {
listen 443 ssl http2;
server_name yourdomain.com; #填入自己的域名
# Specify SSL config if using a shared one.
#include conf.d/ssl/ssl.conf;
# Allow large attachments
ssl on;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8084; #设置的sharelist端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_no_cache $http_range $http_if_range;
}
}
6 Aria2,下载利器
Aria2是一款自由、跨平台命令行界面的下载管理器,该软件根据GPLv2许可证进行分发。支持的下载协议有:HTTP、HTTPS、FTP、Bittorrent和Metalink。
我用的是P3TERX大佬的Aria2-Pro
Docker镜像,安装很简单:
由于Aria2只是个命令行,是否安装好了没法直接看出来,需要配置服务端并能连接成功才算成功了第一步;接着下载一个种子试试就知道了。
6.1 服务端安装
cd ~
git clone https://github.com/P3TERX/Docker-Aria2-Pro && cd Docker-Aria2-Pro;
# 把<TOKEN>改成要设置的密码
sudo docker run -d \
--name aria2-pro \
--restart unless-stopped \
--log-opt max-size=1m \
-e PUID=$UID \
-e PGID=$GID \
-e RPC_SECRET=<TOKEN> \
-e RPC_PORT=6800 \
-p 6800:6800 \
-e LISTEN_PORT=6888 \
-p 6888:6888 \
-p 6888:6888/udp \
-v ~/aria2-config:/config \
-v ~/downloads:/downloads \
p3terx/aria2-pro
安装好后可以在~/aria2-config
文件夹修改配置。
6.2 AriaNg, web客户端
下载一个AriaNg的html文件,连接上服务端就可以开始用了。
7 Zdir,目录列表
Zdir是一款使用PHP开发的目录列表程序,无需数据库,体积小巧,功能完善。
我一般用它直接访问Aria2下载好的文件,部署也很简单:
下载一键安装脚本,按照说明来配置。
zdir
文件夹里修改相关模板文件。(懂一点html知识就行)nginx代理配置:
#zdir
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://127.0.0.1:1080; #zdir端口,可以通过改脚本修改
proxy_redirect off;
proxy_set_header Host $host;
client_max_body_size 50m;
client_body_buffer_size 256k;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_max_temp_file_size 200m;
}
location ~ .*\.(js|css|woff|woff2|gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)?$ {
proxy_pass http://127.0.0.1:1080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
expires 7d;
access_log off;
}
}
8 frp,NAS内网穿透
8.1 win10虚拟机上安装黑群晖
具体安装步骤和文件我传到了Nextcloud里,这里注意虚拟机的网络一定要设置成桥接模式,原理可以参照这张路由器的图来说明:
当选择非桥接模式时虚拟机相当于上面的路由器2,其处在win10主机派生出的局域网下,而win10主机和其他同一WIFI下的设备处于同一个上级局域网中,上级网络无法访问下级网络。
同样外网设备(不在路由器1的局域网下)也无法直接访问到NAS,常见的解决方法有两个:
- 路由器1改成桥接模式,并设置端口转发;这种方式要求要有公网IP、并且路由器改模式可能需要向运营商申请,总的来说很麻烦。
- 内网穿透,需要一个VPS和域名,利用VPS作为中转服务器将两个客户端相连。比较常用的内网穿透工具是国人开发的frp。
8.2 内网访问NAS
在win10中通过cmd
的ipconfig
获取到本机ip,如果前面设置正确,同一局域网下的其他设备应该能通过http://win10_ip:5000
访问到NAS主页(具体端口参考群晖官网)。
## client(客户端)frpc配置## server(服务端)frps配置 ~
8.3 内网穿透从入坑到放弃
frp的配置分为客户端和服务端,客户端(也就是黑群晖)可以开一个docker运行frpc
,服务端(VPS)开一个screen
运行frps
,当然前提是写好配置文件。
说下我踩到的坑吧,第一天配置挺好可以正常访问、Nginx代理文件都写好了。结果第二天不知怎么的各种http proxy EOF
错误,怎么改都弄不好,折腾了一个下午最终放弃了。
9 yobot,手游机器人
yobot 是为公主连接公会战设计的辅助机器人,能够帮助公会战管理者提供自动化管理服务。 yobot 提供了群聊、web 页面两套用户交互方式,具有操作便捷、通知及时、数据详细的特点。 基于 QQ 的部分已不再支持,本项目正在向其他平台迁移
按照官网上的Linux-Mirai部署方式一步步来就行,注意QQ号必须先在VPS上登录并挂几天、不然容易被封或被屏蔽消息。
以下内容更新于2020-08-07 14:19:12
10 Calibre-web,个人书库
10.1 介绍
最近开始用Calibre整理书籍了,之前都是下载一本、往ipad里一丢、看完就不管了(有时随手就删了),导致想翻一翻之前看过的书都找不到地方; 并且因为自己在日亚买的正版书有版权限制,只能用注册过的kindle看,不方便管理。Calibre
这款软件能很好解决我的需求:
- 可以搜索书籍的元数据,整理起来很方便轻松。
DeDRM
插件能去除版权限制,可以将书籍转为epub
等主流格式方便非kindle
阅读器查看。- 结合Calibre-web,搭建线上图书馆(相比于桌面版增加了一些功能,也更便于分享)。
10.2 VPS中用docker-compose安装
建一个
books
(名称随意)文件夹并进入;建立一个
docker-compose.yml
文件,内容如下:
version: "3"
services:
calibre-web:
# 体验后还是这个image最好用
image: technosoft2000/calibre-web
container_name: calibre-web
environment:
- PUID= 1000 #run `id` in shell to get id for a user
- PGID= 1000
- SET_CONTAINER_TIMEZONE= true
- CONTAINER_TIMEZONE= Asia/Shanghai
volumes:
- ./calibre:/books #存放书籍和app.db等数据库
# 我喜欢全放一个文件夹,方便管理
- ./calibre-web/app:/calibre-web/app
- ./calibre-web/kindlegen:/calibre-web/kindlegen
- ./calibre-web/config:/calibre-web/config
ports:
# 左边为外部端口,不要和其他服务冲突就行
- "8085:8083"
restart: always
运行
sudo docker-compose up -d
,访问http://vps_ip:8085
,在web中初始化、路径输入/books
。若输入后报错则是文件夹权限的问题,我一般用
sudo chmod -R 777 *
这种粗暴的方式解决。
10.3 群晖NAS中用docker安装
映像中搜索
calibre-web
,找到technosoft2000/calibre-web
并下载;创建容器-高级设置-启动自动重新启动
、卷-添加文件夹
如下:
运行状态可在
详情-终端机
中查看(拉去github资源需要一段时间);进入
web
配置,出错则检查http
用户是否对文件夹具有完全控制权限。
10.4 备份
书籍的所有数据都在docker内的/books
文件夹下(即外部的pathTo/books/calibre
),其中metadata.db
、metadata_db_prefs_backup.json
以及书籍文件夹是和桌面版calibre
软件互通的,也就是可以互相拷贝覆盖。app.db
、gdrive.db
记录了calibre-web
上的一些操作(如书架设置、用户名和密码、googleDrive设置),需要将服务迁移到另一台机器上时记得备份这些文件。
以下内容更新于2020-11-13 23:22:02
11 Leanote,私有云笔记
蚂蚁笔记虽然几年前就已经没更新了,但基本的功能挺全的,作为私有云笔记用起来没啥问题。我尝试了一个多月感觉还行,支持markdown、可以传图片、IOS下也有app、网页就能直接访问、备份方便…总之个人强力推荐吧,看了一些其他支持私人部署的笔记平台也都差不多的样。
我用的是docker部署的方式,比较无脑,而且这个仓库是大佬整合制作的镜像,有不同版本可供选择(视vps配置),反正我512M内存祖传vps运行完全版Leanote也毫无压力。
12 FileRun,私人网盘
与之前的Nextcloud相比,FileRun私人网盘体积更加轻盈,部署起来没有那么多糟心的坑,也支持Webdav,适合部署在低配的机器上,只是传一传小文件(抱歉、低配硬盘根本不够用)、用webdav同步下一些app的数据(如OmniFocus之类的)。
配置过程及其简单,官网https://docs.filerun.com/docker里说的明明白白,顶多改一改volumes
方便换vps时同步数据、或者改一改文件夹权限之类的,不像nextcloud真的是各种错误(虽然nextcloud的功能确实强大、加上各种插件、社区也很活跃)。
13 删去一些不必要的服务
用了一段时间后清理了一些平时基本不怎么用的服务,最后只留下Bitwarden、Leanote、和FileRun,别的比如nextcloud、Aria2、Calibre-web放到了我的群晖NAS(越用越香)上,最近手头有点紧,能省则省吧(最终还是不肯放弃bandwagon的祖传小鸡、被自己啪啪打脸)。