mcpField
P
phoenix-ops

phoenix-ops

github.com/bobmatnyc云与 DevOps78335 次安装15 周前更新
代码仓库

关于 phoenix-ops

面向 Elixir/Phoenix 开发者的生产部署运维指南,涵盖发布配置、集群、可观测性与安全加固。还涉及后台任务、健康检查和常见部署模式。

主要功能

  1. 01配置生产发布与运行时设置
  2. 02规划集群、PubSub 与 Presence
  3. 03设置遥测、日志和指标
  4. 04加固 HTTP 端点与网络
  5. 05配置后台任务及部署模式

适用场景

  1. 01准备 Phoenix 应用的生产发布
  2. 02排查集群 Presence 不一致
  3. 03为服务添加指标与健康检查

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/bobmatnyc/claude-mpm-skills --skill phoenix-ops

安装后在 Claude Code 中输入/phoenix-ops确认已加载。

附带文件metadata.json

详细介绍

Phoenix 运维与部署(Elixir/BEAM)

生产就绪的 Phoenix 应用依赖发布版本、运行时配置、遥测、集群和安全端点。正确配置后,BEAM 可支持滚动重启,并通过监督机制增强韧性。

发布版本与运行时配置

MIX_ENV=prod PHX_SERVER=true mix assets.deploy
MIX_ENV=prod mix release
_build/prod/rel/my_app/bin/my_app eval "IO.puts(:os.type())"
_build/prod/rel/my_app/bin/my_app start

通过环境变量驱动设置的 config/runtime.exs:

config :my_app, MyApp.Repo,
  url: System.fetch_env!("DATABASE_URL"),
  pool_size: String.to_integer(System.get_env("POOL_SIZE", "10")),
  ssl: true

config :my_app, MyAppWeb.Endpoint,
  url: [host: System.fetch_env!("PHX_HOST"), port: 443, scheme: "https"],
  http: [ip: {0,0,0,0}, port: String.to_integer(System.get_env("PORT", "4000"))],
  secret_key_base: System.fetch_env!("SECRET_KEY_BASE"),
  server: true

密钥

  • 优先使用环境变量或密钥存储(AWS/GCP KMS、Vault);避免将密钥写入配置。
  • 使用 mix phx.gen.secret 生成 SECRET_KEY_BASE。

集群与 PubSub/Presence

添加 libcluster 以自动发现节点:

# mix.exs deps
{:libcluster, "~> 3.3"},
{:phoenix_pubsub, "~> 2.1"},

# application.ex
topologies = [
  dns_poll: [
    strategy: Cluster.Strategy.DNSPoll,
    config: [poll_interval: 5_000, query: "my-app.internal"],
    connect: {:net_adm, :ping}
  ]
]

children = [
  {Cluster.Supervisor, [topologies, [name: MyApp.ClusterSupervisor]]},
  {Phoenix.PubSub, name: MyApp.PubSub},
  MyAppWeb.Endpoint
]

指南

  • 在各节点间共享 secret_key_base,以确保会话签名一致。
  • 对 Presence 使用分布式 PubSub;启用依赖 Presence 的功能前,确保节点已连通。
  • 对于蓝绿部署,确保不同版本的 Cookie 兼容。

遥测、日志与指标

  • 安装 opentelemetry_phoenix 和 opentelemetry_ecto,用于追踪和指标。
  • 添加 Plug.Telemetry 和 LoggerJSON,或使用结构化日志。
  • 通过 :telemetry_poller 导出指标(Prometheus/OpenTelemetry),获取 VM 统计信息(归约次数、内存、调度器)。
  • 在生产环境中将 LOGGER_LEVEL=info;仅在排查问题时使用 :debug。

HTTP 与网络加固

  • 强制使用 HTTPS(force_ssl)、HSTS、安全 Cookie(same_site、secure)和恰当的 content_security_policy。
  • CORS:为 API 源配置 cors_plug。
  • 速率限制:使用 Plug(ETS/Cachex 令牌桶)或边缘服务(NGINX/Cloudflare)进行限制。
  • 上传:优先使用预签名 URL;限制请求正文大小(:max_request_line_length、:max_header_value_length)。

资源与静态内容交付

  • mix assets.deploy 会运行 npm/tailwind/esbuild 并为资源生成摘要。
  • 通过 CDN/反向代理提供静态文件;确保在 Endpoint 中设置 cache-control 标头。
  • 在生产环境中禁用不需要的 watcher,以缩减镜像体积。

后台作业

  • 推荐使用 Oban 来实现重试/退避、计划作业和隔离;在 application.ex 中监督其进程。
  • 通过运行时环境配置队列;使用 Oban Web/Pro 或遥测进行监控。
  • 对于 CPU 密集型任务,可考虑使用进程池或外部工作进程,避免阻塞调度器。

部署模式

  • 容器:使用多阶段构建;运行 mix deps.get --only prod、mix compile、mix assets.deploy,然后运行 mix release。
  • Systemd:将发布二进制文件作为服务运行,并通过 Environment= 设置密钥;添加 Restart=on-failure。
  • Fly/Gigalixir/Render:提供环境变量、连接 Postgres/Redis,并开放长连接 WebSocket 端口。
  • 蓝绿或金丝雀部署:确保数据库迁移兼容;先部署代码,再运行迁移;对架构变更使用功能标志。

可观测性与健康检查

  • 添加 /health 和 /ready 端点(检查 Repo 以及 PubSub/Presence)。
  • 导出 VM 指标:运行 :telemetry_poller,监控调度器利用率和内存。
  • 针对错误率、数据库超时、队列深度和 VM 内存设置告警。

常见问题

  • 构建发布版本时未设置 PHX_SERVER=true(Endpoint 不会启动)。
  • config/runtime.exs 中缺少运行时配置;依赖编译时配置保存密钥。
  • 未配置集群发现 → 各节点间的 Presence 状态不一致。
  • 保留默认 secret_key_base 或为每个节点单独设置密钥 → 部署后会话失效。
  • 大型资源未生成摘要或未使用 CDN → 冷启动加载缓慢。

评论

支持 Markdown