破产来了,你的系统怎么办?

上个月 Spirit Airlines 进入 Chapter 11 破产程序的消息在技术圈没引起多少波澜——毕竟大家更关注的是新模型、新框架。但作为一个经历过两次公司破产的全栈开发者,我要告诉你:系统下线才是最难啃的骨头

工会反对高管奖金只是破产流程中的一个小插曲。对开发者来说,真正的噩梦是:

  • 关停 API 时漏掉一个端点,导致合作方一直收到 500
  • 数据导出不全,审计罚款百万
  • 员工离职后系统账号没回收,被黑客利用

今天我把当时自己攒的一套“破产应急工具包”拿出来,直接给代码,跑通就能用。

Step 1:识别所有需要下线的系统

光靠人脑回忆肯定漏。先把所有部署清单拉出来。我用的是 AWS 的资源扫描脚本,关联 Tag 和最后一次访问时间:

python
1 2 3 4 5 6 7 8 9 10 11 12 13 14
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:

bash
1 2 3 4
# 使用 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 脚本,直接从数据库查询并按月份归档:

python
1 2 3 4 5 6 7 8 9 10
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 做一个自动化流程:

python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
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
1 2 3 4 5 6 7 8 9 10 11 12
# 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;
    }
}

后端也要做一层:

python
1 2 3 4 5 6 7 8 9 10 11 12
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

这样既封住了外部访问,内部团队(比如审计师)仍然可以调试。

上线前必须检查的坑

  1. DNS 记录不能立即删除 — 很多第三方依赖你的 API 域名,突然删除会导致他们系统中出现严重错误,甚至被告。保留 CNAME 指向一个静态页,说明服务终止日期。
  2. 数据库备份必须异地 — 不要跟生产环境在同一 AWS 账户。破产后账户可能被冻结。开一个全新的 S3 Bucket 并开启 Object Lock。
  3. 日志也要保留 — CloudWatch Logs 保留期限设置成“never expire”,成本不高但法律上能救命。
  4. 员工个人设备上的数据 — 如果员工用过 .env 文件、本地 SSH key,必须通过 MDM 远程擦除。否则后续数据泄露追责到公司。

我的判断

Spirit Airlines 的破产虽然目前只是法律新闻,但每一个用 SaaS 产品的开发者都应该提前准备“关停手册”。不要等到法务发邮件才动手——那时候你已经失去谈判筹码了。

airline it systems shutdown checklist

我见过太多初创公司,被收购后才发现无法安全下线旧系统,最后花几倍成本请咨询公司擦屁股。今天分享的这套脚本和策略,你直接 clone 到自己的 dotfiles 里,下次遇到破产/收购/关停,3 小时就能跑完流程。

最后提醒:不要贪图方便在生产环境执行 rm -rf。正确的做法是“冻结”而非“摧毁”。保留只读快照,直到法律意见书明确允许删除。


本文所有代码基于 Python 3.10+ 和 AWS SDK,实际使用时请根据你的云服务商调整 SDK。生产环境执行前请先测试。