CChunHo教程
VPS · 初始化 5 件套

VPS 初始化

新机器到手 15 分钟:密钥登录、Swap、防火墙、Docker 日志、定时任务。Ubuntu 22.04 / 24.04 / 26.04 通用。

1. Ed25519 密钥 + 禁密码

本地生成、公钥上机、验证通过后再禁密码。顺序错了会被锁外面。

# 本地生成(空密码回车即可)
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ''

# 公钥拷到服务器(二选一)
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@YOUR_IP
# 或手动:cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys

# 先新开一个终端验证密钥能进,再禁密码
sudo nano /etc/ssh/sshd_config
# PasswordAuthentication no
# PermitRootLogin prohibit-password
sudo systemctl restart sshd
务必保留一个已登录的 SSH 窗口不动,另开窗口测试新登录,成功后再关旧窗口。

2. Swap:1G 小鸡先开再说

Java / Docker 动不动 OOM,先看 swap 是不是 0。

free -h && swapon --show
# 若 Swap 为 0,建 2G:
fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
free -h
swap 是兜底不是内存:长期 si/so 很高就该加内存或砍进程,SSD 也怕频繁换页。

3. UFW:只开 22 / 80 / 443

sudo apt update && sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp && sudo ufw allow 80/tcp && sudo ufw allow 443/tcp
sudo ufw enable && sudo ufw status verbose

4. Docker 日志限大小

默认 json-file 无限涨,半年能吃几十 G。本站 Caddy 已按此限制。

sudo mkdir -p /etc/docker
cat | sudo tee /etc/docker/daemon.json >/dev/null <<'EOF'
{
  "log-driver": "json-file",
  "log-opts": { "max-size": "20m", "max-file": "3" }
}
EOF
sudo systemctl restart docker
# 存量容器不会自动生效,重建才行;先看谁最胖:
docker system df
du -sh /var/lib/docker/containers/* 2>/dev/null | sort -rh | head

5. systemd timer 替代 cron

cron 错过就错过,timer + Persistent=true 开机补跑,日志走 journalctl。

# /etc/systemd/system/backup.service
cat | sudo tee /etc/systemd/system/backup.service >/dev/null <<'EOF'
[Unit]
Description=Daily backup

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
EOF

# /etc/systemd/system/backup.timer
cat | sudo tee /etc/systemd/system/backup.timer >/dev/null <<'EOF'
[Unit]
Description=Run backup daily

[Timer]
OnCalendar=*-*-* 04:00
RandomizedDelaySec=300
Persistent=true

[Install]
WantedBy=timers.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers --all | grep backup
journalctl -u backup.service -n 20 --no-pager

6. 常见问题