破产来了,你的系统怎么办?
上个月 Spirit Airlines 进入 Chapter 11 破产程序的消息在技术圈没引起多少波澜——毕竟大家更关注的是新模型、新框架。但作为一个经历过两次公司破产的全栈开发者,我要告诉你:系统下线才是最难啃的骨头。
工会反对高管奖金只是破产流程中的一个小插曲。对开发者来说,真正的噩梦是:
- 关停 API 时漏掉一个端点,导致合作方一直收到 500
- 数据导出不全,审计罚款百万
- 员工离职后系统账号没回收,被黑客利用
今天我把当时自己攒的一套“破产应急工具包”拿出来,直接给代码,跑通就能用。
Step 1:识别所有需要下线的系统
光靠人脑回忆肯定漏。先把所有部署清单拉出来。我用的是 AWS 的资源扫描脚本,关联 Tag 和最后一次访问时间:
import boto3
from datetime import datetime, timedelta
# 假设所有生产环境资源都打了 Tag: Environment=Production
client = boto3.client('resourcegroupstaggingapi')
response = client.get_resources(
TagFilters=[{'Key': 'Environment', 'Values': ['Production']}]
)
resources = []
for res in response['ResourceTagMappingList']:
arn = res['ResourceARN']
# 简单判断是否最近有请求(用 CloudTrail 更准,这里只示意)
resources.append({'arn': arn, 'last_active': 'unknown'})
print(f"找到资源: {arn}")
注意:破产流程中法律团队会要求保留所有数据至少3年。所以不是删除,而是“停服并封存”。
Step 2:批量导出关键数据
以航班数据为例,假设你的系统有一个 PostgreSQL 数据库。导出所有历史订单,并按法律要求格式输出 CSV:
# 使用 pg_dump 导出 schema + 数据,但只读副本分离
pg_dump -h production-db.example.com -U admin --no-owner --format=custom -f spirit_production.dump spirit_db
# 同时生成一份纯文本的 SQL 用于审计
gzip -d -c spirit_production.dump | strings | grep -E 'INSERT|COPY' > audit_log.txt
但法律团队往往要的是可读的表格。写一个 Python 脚本,直接从数据库查询并按月份归档:
import psycopg2
import pandas as pd
from datetime import date
conn = psycopg2.connect("dbname=spirit user=reader password=xxx host=...")
# 按天导出订单表
df = pd.read_sql("SELECT * FROM bookings WHERE status != 'cancelled'", conn)
df['export_time'] = date.today()
# 输出为 Parquet 节省空间
df.to_parquet('bookings_export.parquet', compression='snappy')
Step 3:自动化权限回收
破产消息一出,核心员工可能随时离职。不能等 HR 邮件,要主动触发权限回收。用 AWS Lambda + Step Functions 做一个自动化流程:
import boto3
def lambda_handler(event, context):
iam = boto3.client('iam')
# 从环境变量读取离职员工列表(HR系统推送)
users_to_deactivate = event['users']
for username in users_to_deactivate:
# 移除所有 IAM 组
groups = iam.list_groups_for_user(UserName=username)['Groups']
for group in groups:
iam.remove_user_from_group(GroupName=group['GroupName'], UserName=username)
# 生成访问密钥失效
keys = iam.list_access_keys(UserName=username)['AccessKeyMetadata']
for key in keys:
iam.update_access_key(UserName=username, AccessKeyId=key['AccessKeyId'], Status='Inactive')
# 最后登录记录
print(f"已禁用用户 {username}")
这个 Lambda 可以配置每日定时扫描所有生产环境用户,标记超过30天未登录的账号并自动禁用。Spirit 破产前就有员工“提前消失”,这套脚本能避免遗留隐患。
Step 4:关闭公开 API 但保留内部调试
千万不要一刀切。可能还有政府部门或者接手方需要访问历史数据。推荐方案:
- 前端 Nginx 直接返回 503
- 后端 API 路由加一个“维护模式”中间件,对来源 IP 白名单放行
# nginx 配置示例
server {
listen 443 ssl;
server_name api.spirit.com;
location / {
# 检查 X-Maintenance-Token 头,如果是破产团队留的 token 就通过
if ($http_x_maintenance_token != "SPIRIT_EXIT_2026") {
return 503;
}
proxy_pass http://backend;
}
}
后端也要做一层:
from functools import wraps
from flask import request, abort
MAINTENANCE_TOKEN = os.environ.get('MAINTENANCE_TOKEN', 'default')
def maintenance_check(f):
@wraps(f)
def decorated(*args, **kwargs):
if request.headers.get('X-Maintenance-Token') != MAINTENANCE_TOKEN:
abort(503, description="Service discontinued")
return f(*args, **kwargs)
return decorated
这样既封住了外部访问,内部团队(比如审计师)仍然可以调试。
上线前必须检查的坑
- DNS 记录不能立即删除 — 很多第三方依赖你的 API 域名,突然删除会导致他们系统中出现严重错误,甚至被告。保留 CNAME 指向一个静态页,说明服务终止日期。
- 数据库备份必须异地 — 不要跟生产环境在同一 AWS 账户。破产后账户可能被冻结。开一个全新的 S3 Bucket 并开启 Object Lock。
- 日志也要保留 — CloudWatch Logs 保留期限设置成“never expire”,成本不高但法律上能救命。
- 员工个人设备上的数据 — 如果员工用过 .env 文件、本地 SSH key,必须通过 MDM 远程擦除。否则后续数据泄露追责到公司。
我的判断
Spirit Airlines 的破产虽然目前只是法律新闻,但每一个用 SaaS 产品的开发者都应该提前准备“关停手册”。不要等到法务发邮件才动手——那时候你已经失去谈判筹码了。
我见过太多初创公司,被收购后才发现无法安全下线旧系统,最后花几倍成本请咨询公司擦屁股。今天分享的这套脚本和策略,你直接 clone 到自己的 dotfiles 里,下次遇到破产/收购/关停,3 小时就能跑完流程。
最后提醒:不要贪图方便在生产环境执行 rm -rf。正确的做法是“冻结”而非“摧毁”。保留只读快照,直到法律意见书明确允许删除。
本文所有代码基于 Python 3.10+ 和 AWS SDK,实际使用时请根据你的云服务商调整 SDK。生产环境执行前请先测试。