VPS到手后的配置

前言

之前一直使用的搬瓦工(2018网络星期一)年付$27配置,2核 1G RAM + 40G SSD + 1000G/月 Bindwidth + 洛杉矶DC2机房,从2018年开始一共续费了6年。
最初的目的很简单,为了加速访问一些网站,比如Github等等。
随着对Linux的熟悉,陆续搭建了一些服务,其中也有重装过几次系统,然后学习了容器化,这简直是一把非常好用的工具。虽然docker已经逐渐式微,被K8S移除支持,但对于个人项目使用是完全够用的。
虽然Podman等也很优秀,解决了一些问题,但有一些项目支持的并不太友好,为了节约时间少走弯路,还是选择使用Docker。

2024年黑五看到RN的促销活动,加量还降价,果断入手了一台RackNerd的黑五套餐二,年付$18,配置:2核 2.5G RAM + 40G SSD + 3000G/月 Bindwidth。

配置

比较喜欢Debian系,下单时会让选择安装什么系统,我喜欢Debian系,就选了Debian12系统,非常稳定。

付款后,服务商会提供root密码,或者让你上传ssh key,然后通过ssh访问服务器。

基本配置

  1. ssh使用root账户+密码登录;
  2. 创建新用户,设置密码,把用户添加到sudoer;
1
useradd -m -G sudo -s /bin/bash 用户名
  1. 修改ssh端口为高位端口,禁止root用户密码登录,禁止用户密码登录,重启sshd服务;
  2. 尝试使用新用户+密钥登录,若无法登录则去检测上一步配置;
  3. 安装常用软件/配置UFW防火墙:
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
sudo apt update
sudo apt-get install -y curl vim ufw


sudo ufw default allow outgoing # 默认允许所有数据出站
sudo ufw default deny incoming # 默认禁止所有数据入站

sudo ufw allow 80,443/tcp # 开启80,443端口的tcp出/入站
sudo ufw allow 443/udp # 开启443端口的udp出/入站

# 开启刚才设置的ssh高位端口,例如54311
sudo ufw allow 54321

# 开启UFW防火墙
sudo ufw enable

# 把 Cloudflare的ip加入白名单
RULES=$(sudo ufw status numbered | grep 'Cloudflare IP' | awk -F"[][]" '{print $2}' | sort -nr)
for RULE in $RULES; do
echo "Deleting rule $RULE"
echo "y" | sudo ufw delete $RULE
done

for cfip in `curl -sw '\n' https://www.cloudflare.com/ips-v{4,6}`; do ufw allow proto tcp from $cfip to any port 443 comment 'Cloudflare IP'; done

ufw reload > /dev/null
  1. 开启BBR内核加速
    编辑/etc/sysctl.conf文件,添加以下两行以启用BBR:
1
2
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

应用更改,然后检测是否生效

1
2
sudo sysctl -p
sysctl net.ipv4.tcp_congestion_control
  1. 参考Docker官网文档,安装Docker:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
  1. 切换到刚创建的用户,给用户docker权限,并创建两个文件夹用来放容器数据:
1
2
3
4
5
6
7
8
# Add user to docker group
groupadd docker
usermod -aG docker $USER
newgrp docker

# Create 2 folder for docker
mkdir ~/docker
mkdir ~/compose
  1. 创建一个docker子网,例如创建名为npm_default的子网,并指定网段为172.20.0.0/24
1
2
3
4
5
docker network create \
--driver=bridge \
--subnet=172.20.0.0/24 \
--gateway=172.20.0.1 \
npm_default
  1. 在Cloudflare中使用A记录方式绑定一个子域名,例如host.yourdomain.com,不开云朵。后续所有新记录均使用CNAME方式添加,并开启云朵;
  2. 安装的第一个容器为Nginx Proxy Manager(下称npm),先用 http://ip:81 的方式登录npm的管理界面,修改用户名+密码,同时在CF中使用CNAME方式绑定子域名,例如npm.yourdomain.com,然后把81端口反代到这这个域名上。尝试通过 npm.yourdomain.com 访问npm,成功后进行下一步;
    compose.yml文件示例:
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
networks:
default:
external: true
name: ${DOCKER_MY_NETWORK}
services:
app:
image: jc21/nginx-proxy-manager:latest
container_name: npm
restart: unless-stopped
ports:
- 80:80
- 443:443
- 81:81
environment:
DISABLE_IPV6: "true"
volumes:
- ${DOCKER_HOME}/npm/data:/data
- ${DOCKER_HOME}/npm/letsencrypt:/etc/letsencrypt
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
networks:
default:
ipv4_address: 172.20.0.2
deploy:
resources:
limits:
cpus: "0.5"
memory: 300M

compose.yml同目录下的.env文件:

1
2
DOCKER_HOME=/home/username/docker
DOCKER_MY_NETWORK=npm_default

如果已经可以通过域名访问npm,则可以把81端口也注释掉,然后docker compose up -d 重新部署npm:

1
2
3
4
ports:
- 80:80
- 443:443
# - 81:81

补充

用户home目录结构,也就是 /home/username目录:
其中 ~/docker 用来存放容器运行产生的需要持久化的数据。个人不喜欢用volumn的方式,感觉管理不方便,所以采用目录方式来管理数据。

~/compose顾名思义,用来存放docker compose文件,可以很方便的统一化管理compose.yml,对每个容器的配置可以做到固定,方便更新,重启,迁移。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
~

│─ docker
│ ├── npm
│ │ ├──data
│ │ └──letsencrypt
│ └─── nexterm
│ └───data
├── compose
│ ├── npm
│ │ ├─compose.yml
│ │ └─.env
│ ├── nexterm
│ │ ├─compose.yml
│ │ └─.env
│ ├── ...
│ ├── ...

总结

上述步骤已经完成了VPS基本配置,所有服务皆通过Nginx反向代理,通过https443端口访问,开启Cloudflare的云朵,开启一切皆容器之旅吧。