1 折腾下闲置的VPS
本科时同学推荐搬瓦工的VPS,当然那时我连VPS是什么都不知道,听说能够翻过围墙所以就买了。对Linux一窍不通的我在曾经的doubi根据地上的文章指引下,也能够搭建一个比较舒服的上网环境,当时感到十分愉快(用的当然是那些一键脚本)。
过了一年除了IP被封过两次、换了几个机房、换了几个一键脚本以外,倒也还没觉得有啥不满;毕竟如果是买市面上那些服务每个月的钱也差不多。
人总是在不断学习进步的,我总算学会了一些linux基本操作,可以用XShell登一登我的VPS没事ls
一下。但看到大佬们用自己的VPS搭各种服务器到时候,还是非常羡慕的,于是忍不住也尝试下,顺便学习下后端相关知识。
由于时间有限,以能用为唯一目的,多余的知识没时间更没必要去掌握(毕竟专业和这个毫不相关),操作全部记录在这方便以后换VPS时再搭一遍。
2 Bitwarden_rs部署
2.1 前言
好用的密码管理软件之一,_rs
版本相对于官方版精简了不少,部署也比较简单。网上大多数bitwarden_rs部署教程的文章我基本上都过了一遍,我遇到的主要问题有:
- 部署后用Chrome浏览器无法登录与注册账号,IOS系统无法登录 (——后确定为未用https的原因)
- 网上关于申请https这部分往往一笔带过,什么Nginx反向代理啦….看得我这样的零基础玩家云里雾里。
结果大量时间都花在如何启用https上了,真让人头大。
2.2 步骤
2.2.1 VPS初始配置
经过几次重装OS后学乖了,把初始配置做成一个脚本。
sudo -i
apt-get install curl -y
apt-get install git -y
apt-get install vim -y
#=========================
#Vim配置
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://cdn.jsdelivr.net/gh/junegunn/vim-plug/plug.vim
#=========================
git clone https://github.com/chengpengzhao/My_vimrc.git
cd My_vimrc
git checkout dev-WSL
cp ./'.vimrc(ssh)' ~/.vimrc
#=========================
#安装Docker、docker-compose
sudo curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
systemctl start docker
systemctl enable docker
#=========================
# 安装acme.sh
apt-get install cron socat -y
curl https://get.acme.sh | sh
source ~/.bashrc
export Namesilo_Key="xxxxxxxxxxxxx"(我的域名提供商)
apt install firewalld -y
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
service docker restart
步骤因人而异,大致都差不多。
2.2.2 一般部署
mkdir -p /opt/bitwarden && cd /opt/bitwarden
cat >> docker-compose.yml << EOF
version: "3"
services:
bitwarden:
image: bitwardenrs/server
restart: always
ports:
- "8080:80"
- "8081:3012"
volumes:
- ./bw-data:/data
environment:
WEBSOCKET_ENABLED: "true"
SIGNUPS_ALLOWED: "true"
WEB_VAULT_ENABLED: "true"
EOF
docker-compose up -d
端口相关知识我真的一窍不通…反正能用ip:8081
访问就行。
2.2.3 启用https
稀里糊涂的装了个acme.sh脚本、在NameSilo申请了个API key;
acme.sh --issue --dns dns_namesilo --dnssleep 900 -d my_domain_name.com
看到没有报错的时候真的松了口气,然而证书是申请了,怎么绑到之前的bitwarden_rs的domain里我还是不会。
后面发现这篇教程和其他的都有些不一样,于是抱着一丝希望试了下…总算是解决了问题。
cat >> docker-compose.yml << EOF
version: "3"
services:
bitwarden:
image: bitwardenrs/server
restart: always
volumes:
- ./bw-data:/data
environment:
WEBSOCKET_ENABLED: "true"
SIGNUPS_ALLOWED: "true"
caddy:
image: abiosoft/caddy
restart: always
volumes:
- ./Caddyfile:/etc/Caddyfile:ro
- caddycerts:/root/.caddy
ports:
- 80:80
- 443:443
environment:
ACME_AGREE: "true"
DOMAIN: "bitwarden.koko.cat"
EMAIL: "[email protected]"
volumes:
caddycerts:
EOF
cat >> Caddyfile << EOF
{$DOMAIN} {
tls {$EMAIL}
header / {
Strict-Transport-Security "max-age=31536000;"
X-XSS-Protection "1; mode=block"
X-Frame-Options "DENY"
}
proxy /notifications/hub/negotiate bitwarden:80 {
transparent
}
# Notifications redirected to the websockets server
proxy /notifications/hub bitwarden:3012 {
websocket
}
# Proxy the Root directory to Rocket
proxy / bitwarden:80 {
transparent
}
}
EOF
docker-compose down && docker-compose up -d
2.2.4 定时备份
直接用github备份算了,或者定时手动导出到你觉得安全的位置。
cd ~
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub
#之后在github上导入,新建私人repository
cd /opt/bitwarden/bw-data
git init
git remote add origin [email protected]:xxxx/xxxx.git
git add -A
git commit -m "first push"
git push -u origin master
建立脚本并定时运行:
cd ~
cat >> backup.sh << EOF
#!/bin/bash
date=$(date '+%Y-%m-%d %H:%M')
cd /opt/bitwarden/bw-data
git add -A
git commit -m "backup at $date"
git push
EOF
bash ~/gitback.sh
试运行,设置定时任务
echo "15 05 * * * bash ~/gitback.sh > ~/siteback.log 2>&1 &" > bt.cron
crontab bt.cron
rm -rf bt.cron
自动备份部分白嫖的Rat’s Blog。
查看定时任务可通过crontab -l
3 Sharelist分享云盘
项目地址
这个搭起来就简单多了,dockerr都给你准备好了,只需要注意安装完成后配置云盘可能比较复杂;我选用的是链接分享的方式,可以自己指定文件夹且不需要获取API之类的复杂操作。
wget --no-check-certificate -qO- https://cdn.jsdelivr.net/gh/reruin/sharelist/netinstall.sh | bash
cd sharelist
docker-compose up
以下内容更新于2020-06-23 13:48:33
4 更新:加入Nginx学习与使用 (推荐从这部分看起)
之前配置好的bitwarden用了几个月,昨天忽然发现移动端没法同步了,因为刚开始配置的时候就出现过这个问题所以一下子就定位到是https的问题。ping了一下域名竟然没ping通,不知道又是不是DNS服务器抽风了。正好对namesilo
不太了解,干脆直接把域名转移到了cloudflare
下。选择cloudflare
是因为它的种种优点,而且设置起来比较方便。
4.1 namesilo域名转移到cloudflare
- 在
cloudflare
中添加要转移的域名,在namesilo
中将DNS解析改为cloudflare
(会提示你怎么做)。 cloudflare
里要有付款方式;我之前已经用过很久cloudflare
了,所以这步略过。- 在
namesilo
里将域名解锁(unlock图标),之后在cloudflare
中申请转移,会要求输入一个授权码; namesilo
里找到send email
,授权码会发到邮箱里,在cloudflare
输入后会提示正在转移中(这步会付款)。- 过一会儿
namesilo
会再发邮件提示正在转移域名,点进相关网址可以立即通过转移(省时间)。
4.2 cloudflare的ssl-tls设置
一般将加密模式设置为完全(cloudflare
前一阵子出了简体中文版网页,更香了有没有),之后再到源服务器选项下创建源证书,之后要放到VPS上的。(我直接创了个15年有效期的),将公钥和私钥保存为cert.pem
和cert.key
。
4.3 cloudflare的DNS设置
虽然对这些方面一窍不通,但在用的过程中还是有点心得之类的东西:
比如在解析像Github Page
这种时可以只用CNAME
记录,而在解析ip地址
时一般只用A
记录就行了。另外通常会设置多条记录,一条给根域名(@表示或直接输入完整域名)、另一条给www
(名称)的前缀,之后可以根据喜好随便加几条(如0
、000
…)。
这些记录的内容都是指向同一个ip地址
、即VPS的ip,在没有用Nginx
配置时,无论是用www.yoursite
还是yoursite
、0.yoursite
、000.yoursitez
访问,页面应该都是相同的。
4.4 VPS上启动docker-compose容器
先以bitwarden为例讲下吧:
去网上学习下常用的几个命令如
docker ps
、docker-compose down && docker-compose up -d
、docker-compose restart
,大概了解下怎么使用;按照一般部署这部分创建好
docker-compose.yml
文件,这里8080
和8081
可以改成别的,后面访问网页就是通过8080端口。部署成功后用
docker ps
应该能看到运行状态,并且通过VPS的ip地址:8080
的方式能够访问bitwarden网页,这时已经完成了一大半。(浏览器会提示不安全,因为还没有SSL证书)最后用
Nginx
将VPS的ip地址:8080
和准备好的域名
“绑在一起”就好了。
4.5 Nginx学习与使用
之前看别人教程的时候都是“接下来用Nginx弄个反代…完”、这种节奏,看来是默认大家都会Nginx
了(哭了出来)。
本着原理可以不弄太懂,关键不影响使用的懒人态度,直到今天我也终于开始Google搜索Nginx入门 了。
安装,想当然的输入
sudo apt-get install nginx
,嗯?能行,好、下一步。命令,检测配置
nginx -t
、 重载配置nginx -s reload
、启动nginx
,暂时先记这几个了。文件位置,输入
whereis nginx
查一查再说;- 噢?
/usr/share/nginx
目录下放有个html目录,打开VPS的ip地址
显示的Welcome to nginx!
原来就是这个index.html
。 /etc/nginx
下的nginx.conf
应该就是配置文件了,用vim
打开看下吧,里面有一行include /etc/nginx/conf.d/*.conf;
,也就是说我在/etc/nginx/conf.d
目录下建的.conf
文件也会当做配置文件读入。
- 噢?
随便到网上找一个配置文件例子,比如我找了个
default.conf
,放在conf.d
目录下的:- 注意这里用到了之前申请的源证书
cert.pem
和cert.key
。 - 从配置文件可以发现可以有多个
server
,之后我们只需为bitwarden、sharelist等各配置一个server就行了。
- 注意这里用到了之前申请的源证书
#设定虚拟主机配置
server {
#侦听443端口,这个是ssl访问端口
listen 443;
#定义使用 访问域名
server_name yoursite.com
#定义服务器的默认网站根目录位置,这里的html指的是/usr/share/nginx/html目录
root html;
# 这些都是腾讯云推荐的配置,直接拿来用就行了,只是修改证书的路径,注意这些路径是相对于/etc/nginx
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 / {
root html;
index index.html;
}
#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
#过期30天,静态文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
expires 30d;
}
#禁止访问 .htxxx 文件
# location ~ /.ht {
# deny all;
#}
}
server
{
# 80端口是http正常访问的接口
listen 80;
server_name yoursite.com;
# 在这里,我做了https全加密处理,在访问http的时候自动跳转到https
rewrite ^(.*) https://$host$1 permanent;
}
- 为
bitwarden
配置server:
在Bitwarden_rs的github可以找到相应的例子,只需要粘贴到default.conf
上再稍作修改,最后运行nginx -s reload
就行了。下面是我的配置:
server {
listen 443 ssl http2;
server_name 0.yoursite.com; #这里改成自己的域名,可以加前缀(之前DNS解析了的)
# Specify SSL config if using a shared one.
#include conf.d/ssl/ssl.conf;
# Allow large attachments
client_max_body_size 128M;
location / {
proxy_pass http://127.0.0.1:8080; #这里8080对应前面的设置,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对应前面的设置
}
}
- 顺便附上
sharelist
的Nginx设置:
server {
listen 443 ssl http2;
server_name www.yoursite.com;
# Specify SSL config if using a shared one.
#include conf.d/ssl/ssl.conf;
# Allow large attachments
location / {
proxy_pass http://127.0.0.1:33001;
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;
}
}