Ubuntu 24.04 服务器初始化与 Docker 部署实战
一台新 VPS 到手,先别急着跑业务。系统更新、SSH 加固、防火墙、Docker 环境这几步没做好,后面所有服务都裸奔在公网上。本文是本服务器实际执行过的初始化清单,按顺序做一遍,大约二十分钟。
一、系统基础配置
先以 root 登录,把系统更新到最新,装上后面会用到的工具,再设置时区——服务器时区错了,日志时间戳、定时任务全跟着乱。
apt update && apt upgrade -y
apt install -y curl wget git ca-certificates ufw
timedatectl set-timezone Asia/Shanghai
timedatectl status
容器内的时间靠环境变量控制,之后每个 compose 服务记得加 TZ=Asia/Shanghai,否则容器默认 UTC,和宿主机差八小时。
二、SSH 安全加固
默认的 root + 密码登录是暴力破解的重灾区。先把自己的公钥放上去,确认密钥能登录后,再关掉密码登录。顺序反了会把自己锁在门外。
# 1. 把本地公钥写到服务器
mkdir -p ~/.ssh
echo "ssh-ed25519 AAAA... your-key" >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
# 2. 新开一个终端,用密钥登录验证通过
ssh user@server-ip
# 3. 确认无误后,禁用密码登录
cat > /etc/ssh/sshd_config.d/hardening.conf <<'EOF'
PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes
EOF
systemctl restart sshd
三、防火墙:UFW
公网服务只需要开三个口:SSH(22)、HTTP(80)、HTTPS(443)。其他全部拒绝。443 是为后面的 Caddy 自动 HTTPS 准备的。
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
ufw status verbose
UFW 与 Docker 的经典坑
这里有个所有人都踩过的坑:UFW 挡不住 Docker 发布的端口。Docker 用 iptables 的 DOCKER 链做端口转发,规则加在 UFW 之前,所以即使 UFW 默认 deny,docker run -p 8080:8080 映射出来的端口照样能从外网访问。
# 验证:UFW 明明没放行 8765,但外网能通
ufw status # 8765 不在 allow 列表里
curl http://服务器IP:8765 # 居然通了 ⚠️
解决思路不是去硬刚 UFW,而是别把业务端口发布到公网。正确的部署形态是:
- 所有容器端口只映射到宿主机内部(
127.0.0.1:8765:8765),外网直接访问不到; - 唯一对外的是反向代理(Caddy/Nginx),只开 80/443 两个端口,由它按域名转发到内部端口;
- 配合 HTTPS,业务接口不裸奔、不暴露。
四、安装 Docker
推荐用官方 apt 源安装,版本受控、方便升级,别用一键脚本装完就忘。Ubuntu 24.04 的代号是 noble:
# 添加 Docker 官方源
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/ubuntu noble stable" \
> /etc/apt/sources.list.d/docker.list
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl enable --now docker
docker --version # Docker version 29.6.1
docker compose version
如果服务器在国外,官方源速度没问题;国内服务器可以换成清华或阿里镜像源,把 download.docker.com 替换成 mirrors 地址即可。
五、镜像加速与日志限额
国内服务器拉 Docker Hub 镜像经常超时,配置 registry mirror 能大幅提速。顺手把容器日志限制加上,写在 /etc/docker/daemon.json:
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
max-size/max-file 把每个容器日志限制在 30MB 以内,这是本服务器最值得的一条配置。systemctl restart docker
docker info | grep -A3 "Registry Mirrors"
六、部署布局:systemd + Docker Compose 混合
不是所有东西都得装进容器。本服务器的分工很明确:
- systemd 直接托管:系统级中间件(Valkey、Hermes Agent),不参与容器编排,避免被 compose 重启波及;
- Docker Compose 管理:应用类服务(WebUI、机器人、工具面板),统一网络、卷、环境变量;
- 静态站点:HTML 直接挂载到容器/目录,改文件即时生效,零构建;
- Caddy:唯一对外开放的入口,80/443 反向代理 + 自动 HTTPS。
验证部署结果的命令:
# 容器状态
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}"
# systemd 服务
systemctl list-units --type=service --state=running | grep -E "valkey|caddy"
# 磁盘与内存水位
df -h / && free -h
七、初始化检查清单
✅ 系统更新 + 时区
✅ SSH 密钥登录,密码登录已禁用
✅ UFW:只放行 22/80/443
✅ Docker 官方源安装,镜像加速生效
✅ 容器日志限额(max-size 10m)
✅ 业务端口不直接暴露公网,统一走反向代理
← 返回首页