Configuração e Segredos em Produção
Serviços Rust seguem a configuração do doze-fator: armazene configurações no ambiente, carregue uma vez na inicialização e nunca cometa segredos no git ou os incorpore em imagens.
Receita
[dependencies]
config = "0.14"
serde = { version = "1.0", features = ["derive"] }use serde::Deserialize;
#[derive(Debug, Deserialize)]
struct Settings {
database_url: String,
port: u16,
}
impl Settings {
fn from_env() -> Result<Self, config::ConfigError> {
config::Config::builder()
.add_source(config::Environment::default().separator("__"))
.build()?
.try_deserialize()
}
}Quando usar isto:
- Todo binário implantável ou serviço Axum
- Rotacionar chaves de API sem reconstruir
- Promoção multi-ambiente (dev, staging, prod)
Exemplo de Trabalho
# Segredo do Kubernetes -> env
# env:
# - name: DATABASE_URL
# valueFrom:
# secretKeyRef:
# name: db-credentials
# key: url
export PORT=8080
export DATABASE_URL=postgres://user:pass@host/db
./my-service// Nunca registre segredos
tracing::info!(port = settings.port, "escutando");
// RUIM: tracing::info!(?settings.database_url);O que isto demonstra:
- Chaves de ambiente aninhadas via separadores no estilo
APP__DATABASE__URL - Segredos apenas em armazenadores de segredos do orquestrador
- Logs que ocultam campos sensíveis
Mergulho Profundo
Camadas
- Padrões no código (apenas não-segredos)
- Arquivos de configuração para alternâncias não-segredos (ConfigMap montado)
- Sobrescrições de ambiente para produção
- Segredos do Vault / AWS SM / Segredos K8s em tempo de execução
Crates Rust
| Crate | Papel |
|---|---|
config | Arquivo em camadas + env |
figment | Fontes flexíveis |
dotenvy | Apenas desenvolvimento local (não carregador de produção) |
Armadilhas
.envem produção - risco de vazamento de arquivo. Correção: dotenvy para dev; ambiente do orquestrador em produção.- Segredos em dumps de depuração
RUST_LOG- exposição acidental. Correção: logging estruturado com listas de permissão. - Imprimir configuração na inicialização - senhas no journald. Correção: registrar apenas chaves, ocultar valores.
- Configuração imutável em voo - corrida na recarga. Correção: reiniciar pods ou API de observação explícita.
- Mesmo segredo em todos os ambientes - raio de explosão. Correção: credenciais e rotação por ambiente.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Agente HashiCorp Vault | Credenciais de banco de dados dinâmicas | Chaves de API estáticas simples |
| Arquivos criptografados com SOPS | Implantações não-K8s armazenadas em Git | K8s puro 12-fator |
| Padrões codificados | Ergonomia de desenvolvimento local | Segredos de produção |
FAQs
Onde colocar `SQLX_OFFLINE`?
Apenas CI. O tempo de execução usa DATABASE_URL ativo.
Como validar a configuração cedo?
Analisar em main antes de vincular soquetes; sair com código não-zero e mensagem clara.
Certificados TLS como segredos?
Montar como arquivos; ler caminhos do env (TLS_CERT_PATH). Não incorporar PEM em variáveis de ambiente.
Flags de recursos?
Flags não-segredos podem viver no ConfigMap; chaves de rollout sensíveis permanecem no armazenamento de segredos.
Relacionado
- Gerenciamento de segredos
- Noções básicas de implantação
- Observabilidade
- Design de configuração e recursos
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.