Linux 服务器环境搭建实战笔记:最小化安装、Docker Compose 编排与上线检查全流程

记录一套在客户的 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. 什么时候外包这一步

流程本身一两天可以落地。三种情况建议交给专业团队做一次性项目:停机已有实际损失、会弄的人即将休假且无人可替、存量环境乱到重建比整改便宜。以摩杰斯的交付口径为例,验收三招是:现场重启、现场演练一次恢复、现场对着文档点一遍清单------三关都过,环境才算交割。

小结

环境搭建的全部要点可以压成三句话:机器上做减法(最小化、端口最小化、无桌面);知识留在机器外(规划表、版本记录、编排文件、变更记录、一页说明);故障消灭在上线前(真重启一次、演练一次恢复、验证一次续期)。开局就照此办理,是这台机器一生里最划算的一次投入。

相关推荐
Android系统攻城狮7 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
上火的金鱼妹7 小时前
k8s生产实际问题排查(网关,数据库读写等)
运维·服务器
只愿云淡风清7 小时前
正则表达式学习笔记 02:基础语法
笔记·学习·正则表达式
希和202718 小时前
考研英语阅读词汇笔记|城市野径、抄近道步道(非正式小路)
笔记·考研
Linux-lucky19 小时前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu
禁默19 小时前
启元 Q1 二次开发实践:Ubuntu 部署与仿真验证,从 PrimeConsole 到 ROS 2 Humble + RViz
linux·运维·ubuntu
skywalk816319 小时前
把 去也网站 从 Ubuntu 搬到 FreeBSD:一次 Service Jail + nginx 的部署实录
linux·运维·nginx·ubuntu·freebsd
一个人旅程~21 小时前
关于imac27inch因改短用户名导致混合硬盘和系统崩溃的问题分析与故障解决
经验分享·笔记·macos·新浪微博
心祭丫丫21 小时前
【每天一个 Python 小案例17】Python 实现通讯录
开发语言·人工智能·笔记·python·学习
爱莉希雅&&&21 小时前
GitLab 完整学习笔记
linux·运维·服务器