记录一套在客户的 Linux 服务器上反复验证过的环境搭建流程。目标不是"能跑",是交付四个属性:可解释、可重建、可交接、可恢复。全程以一台典型的"Web 应用 + 数据库"业务机为例。
1. 规划阶段:五列规划表
动手前先落一张表,五列足够:跑什么(应用与用途)、依赖什么(运行时/数据库/缓存)、占哪个端口(对外还是仅内网)、数据放哪(数据目录/日志目录)、怎么起(服务/容器/脚本)。
这张表后面会直接派生三样东西:防火墙清单(端口列)、分区方案(数据列)、开机自启配置(起法列)。规划阶段还要定调一个数:停机容忍度。它决定备份与恢复预案的配置深度。
2. 系统安装:最小化 + 分区定型
发行版选维护期内的简洁款:Rocky/AlmaLinux(RHEL 系)或 Ubuntu LTS Server(Debian 系),熟练团队可用 Arch。安装选 minimal,不带任何桌面环境;个别只提供图形配置界面的软件,再按需加 XFCE4。
分区要点:
- 系统盘与数据盘分离,重装系统时数据盘摘下即走;
- /var 独立分区------日志、数据库默认目录、容器镜像全在它底下,写满不拖死根分区;
- 容量按三年后估:增长最快的是图片附件、日志、备份文件;
- 上 LVM,在线扩容;
- swap 取内存的 1/4~1/2,避免内存打满时 OOM killer 直接杀进程。
装完第一小时的初始化序列:设置时区 Asia/Shanghai + 启用 NTP;换国内镜像源后全量更新;创建日常用户并配 sudo(禁用 root 日常登录);设置可辨识的 hostname;列出运行服务做减法------与业务无关的(打印、蓝牙、本地 MTA 等)全部 stop + disable。
口令策略:所有口令由随机密码生成器产生,长度 ≥12,大小写/数字/符号四类至少各一;生成即入密码管理器或密码信封;跨机器不复用。每装一样软件记两笔:为什么装、什么版本------这份记录就是后面版本清单的原料。
3. 安全基线:当日工作量,不是"以后再说"
SSH:PasswordAuthentication no + 密钥登录 + fail2ban 防爆破。改端口只降低日志噪音(扫描器全端口秒扫),不作为安全手段。首次改配置时保持一个已登录会话,防止把自己锁外面。
防火墙:默认全关,按需开放并记录(开的口、给谁用、能否限源)。数据库端口任何情况下不对公网开放。云主机留意:安全组和系统防火墙是串联的两组闸,任何一组全开都算白配。
日志:确认 rsyslog/应用日志落盘,logrotate 配好,命令历史带时间戳(HISTTIMEFORMAT),sudo 日志开启。
账号:系统/数据库/应用三层分账,权限最小化,僵尸账号定期清理。
4. 运行环境:目录约定与 Compose 编排
目录约定(/opt 下):
/opt/myapp/
├── compose/ # docker-compose.yml 与 .env
├── data/ # 容器卷挂载的数据(或宿主机独立数据盘)
├── backup/ # 备份输出
├── scripts/ # 运维脚本(续期、巡检、备份)
└── CHANGELOG.txt # 变更记录
docker-compose.yml 结构要点(示意):
services:
app:
image: myapp:1.8.3 # 版本写死,禁用 latest
ports: ["127.0.0.1:8000:8000"] # 只绑本机,对外走反代
volumes: ["./data:/var/lib/myapp"]
restart: unless-stopped
db:
image: postgres:16.4
ports: ["127.0.0.1:5432:5432"] # 绝不绑 0.0.0.0
volumes: ["./data/db:/var/lib/postgresql/data"]
纪律三条:版本 tag 写死;数据一律落宿主机卷;容器与宿主机散装服务不混用。迁移 = 拷 compose 文件和数据卷 → 新机 up -d → 改解析。
反代统一入口:Nginx 只对外暴露 80/443,其余应用按 server_name/path 转发到 127.0.0.1,证书集中在这层配。
数据库收口三步:改默认口令(走生成器)、只监听 127.0.0.1 或内网、业务账号最小权限(查询账号不给 DDL)。
5. 证书:自动续期 + 结果邮件
certbot 或 acme 客户端均可,免费/商业按需选。关键在续期自动化后加结果通知------续期失败的静默周期决定故障发现时间,脚本执行结果(成功/失败都发)通过 mailx/smtp 发到运维邮箱。部署后手动触发一次,验证证书落位与邮件送达两条链路。
6. 上线检查与交付
上线前逐项过:公网端口扫描结果与规划表端口列完全一致;全部服务 enabled;整机重启一次,业务自愈、日志正常滚动、无报错刷屏;数据在数据盘且重启完好;备份任务至少成功跑一次且恢复流程演练过;磁盘水位/关键进程的最低限度告警能送到人。
交付物四样:一页环境说明(服务清单/版本/配置位置/口令存放处/端口清单/重启方法);口令存放位置;编排文件与运维脚本;端口清单 + 变更记录。每次配置修改前,先复制带日期的原件------这是最低成本的回滚方案。
7. 常见翻车点(第一个月实测高频)
服务未自启或配置未落盘导致重启后失联------systemctl enable 与配置变更后 daemon-reload 要形成肌肉记忆;日志/备份/镜像把盘写满------du -x --max-depth=1 / 先定位增长源再动手,删文件前确认用途;时区或 NTP 未配导致证书校验失败、定时任务错峰,timedatectl 两分钟解决但事后补账代价极高;第三个应用部署时端口冲突------规划表端口列就是为此而设;续期脚本静默失败(没有结果邮件),cron 之外务必有输出回传。
云上机器两条补充:安全组那一层和系统内防火墙这一层是串联的两道闸,哪一层全开都等于白配;磁盘快照回滚的是整机,替代不了文件级备份------单条记录误删时它无能为力。
换机一致性问题,答案收敛为两件套:版本钉死的清单(或 compose 文件)+ 一套从数据盘/备份恢复的流程。满足这两条,迁机动作是"装同版本、挂数据、切解析";缺了任何一条,就只能守着旧机器考古。这也是"装一样记两笔"纪律的最终回报。
8. 什么时候外包这一步
流程本身一两天可以落地。三种情况建议交给专业团队做一次性项目:停机已有实际损失、会弄的人即将休假且无人可替、存量环境乱到重建比整改便宜。以摩杰斯的交付口径为例,验收三招是:现场重启、现场演练一次恢复、现场对着文档点一遍清单------三关都过,环境才算交割。
小结
环境搭建的全部要点可以压成三句话:机器上做减法(最小化、端口最小化、无桌面);知识留在机器外(规划表、版本记录、编排文件、变更记录、一页说明);故障消灭在上线前(真重启一次、演练一次恢复、验证一次续期)。开局就照此办理,是这台机器一生里最划算的一次投入。