VPS能做什么(总结几个我正在用的服务的配置过程)

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证书)

  1. 我的域名托管在cloudflare故以它为例,先添加一个DNS的A记录,名称我设置的是bitwarden,以后就通过bitwarden.yourdomain.com访问bitwarden服务。

  2. 之后在SSL/TLS选项中的边缘证书可以申请一个,保存好cert.pemcert.key文件。

  3. 安装nginx,并进入配置文件夹,将之前获得的cert.pemcert.key复制到/etc/nginx中。

sudo apt-get install nginx;
cd  /etc/nginx;
  1. /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 定时备份数据

  1. 需要先配置好github环境,用私钥免密码登录github(我把这一步写成了一个脚本,方便自己在别的机器上配置。)由于github配置因人而异、比较个性化,需要参考的话可以在My_vimrc仓库找到。
    我习惯保管好一对密钥,免得每次都要重新生成;关于非对称加密知识可以参考我之前的post

  2. 先建立远程备份仓库并和本地绑定。

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
  1. 建立定时上传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;
  1. 定时任务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软件设置

  1. 运行sudo docker-compose up -d后访问http://vps_ip:8082,应该会跳出如下弹窗,说明配置成功。

  1. 打开Zotero,编辑-首选项-同步-文件同步-使用WebDAV,填入地址、用户名和密码,点击验证服务器,会提示创建zotero文件夹,之后验证成功后就可以愉快地同步了~

  2. 注意,这个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.confweb/Dockerfile

nextcloud直接在docker里配置了nginx代理,不需要再在/etc/nginx中加,而且对新手来说内容比较复杂,故照搬example里的就行了。

4.2 个人建议

  1. 建立好上面的几个文件就可以构建了(国内的vps下载速度慢、可能要花很久)。
sudo docker-compose build --pull;
sudo docker-compose up -d;
  1. 访问http://vps_ip:8083,不出意外应该能显示登录页面了。

  2. 如果不是对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-ProDocker镜像,安装很简单:
由于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文件,连接上服务端就可以开始用了。
AriaNg的Web界面

7 Zdir,目录列表

Zdir是一款使用PHP开发的目录列表程序,无需数据库,体积小巧,功能完善。

我一般用它直接访问Aria2下载好的文件,部署也很简单:

  1. 下载一键安装脚本,按照说明来配置。

  2. zdir文件夹里修改相关模板文件。(懂一点html知识就行)
    我的Zdir,图为Aria2下载文件夹

  3. 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. 路由器1改成桥接模式,并设置端口转发;这种方式要求要有公网IP、并且路由器改模式可能需要向运营商申请,总的来说很麻烦。
  2. 内网穿透,需要一个VPS和域名,利用VPS作为中转服务器将两个客户端相连。比较常用的内网穿透工具是国人开发的frp

8.2 内网访问NAS

在win10中通过cmdipconfig获取到本机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这款软件能很好解决我的需求:

  1. 可以搜索书籍的元数据,整理起来很方便轻松。
  2. DeDRM插件能去除版权限制,可以将书籍转为epub等主流格式方便非kindle阅读器查看。
  3. 结合Calibre-web,搭建线上图书馆(相比于桌面版增加了一些功能,也更便于分享)。

10.2 VPS中用docker-compose安装

  1. 建一个books(名称随意)文件夹并进入;

  2. 建立一个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
  1. 运行sudo docker-compose up -d,访问http://vps_ip:8085,在web中初始化、路径输入/books

  2. 若输入后报错则是文件夹权限的问题,我一般用sudo chmod -R 777 *这种粗暴的方式解决。

10.3 群晖NAS中用docker安装

  1. 映像中搜索calibre-web,找到technosoft2000/calibre-web并下载;

  2. 创建容器-高级设置-启动自动重新启动卷-添加文件夹如下:

  1. 运行状态可在详情-终端机中查看(拉去github资源需要一段时间);

  2. 进入web配置,出错则检查http用户是否对文件夹具有完全控制权限。

10.4 备份

书籍的所有数据都在docker内的/books文件夹下(即外部的pathTo/books/calibre),其中metadata.dbmetadata_db_prefs_backup.json以及书籍文件夹是和桌面版calibre软件互通的,也就是可以互相拷贝覆盖。app.dbgdrive.db记录了calibre-web上的一些操作(如书架设置、用户名和密码、googleDrive设置),需要将服务迁移到另一台机器上时记得备份这些文件。

11 待发现

后续发现了对自己有帮助的良心服务再更新...

Author: zcp
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source zcp !
评论
Valine utteranc.es
 Current
VPS能做什么(总结几个我正在用的服务的配置过程)
1 写在前面 VPS, Virtual Private Servers,中文即虚拟专用服务器 虽说入坑vps也有两年了,说来惭愧我至今仍分不清VPS、虚拟主机、云主机等一些专有名词的关系。最近感觉自己对VPS的需求越来越高,
Next 
总结下最近看的几部生存题材的漫画
1 近况最近一直处在很咸鱼的状态,一方面是因为疫情的原因、处在一个几乎没有人督促的环境下,学习效率非常低;但说到底这也是个借口,有点迷茫、对今后的生活缺乏考量、逃避现实这类词语比较合适吧。当然并不是很闲没事做,毕业设计还有大块要做
  TOC