Voltar ao blog Self-Hosting

Planejamento de fusos horários para aplicações auto-hospedadas: uma checklist antes da implantação

A configuração de fuso horário afeta mais do que a exibição. Use esta checklist pré-implantação para mapear todos os relógios, definir regras de timestamps, testar limites do horário de verão e documentar como agendas, relatórios e integrações devem se comportar.

Equipe de operações revisando uma checklist de configuração de fuso horário na infraestrutura da aplicação e em localidades globais

O desenho de fusos horários é um requisito operacional, não uma preferência de exibição

Uma decisão sobre fuso horário muda a forma como as pessoas interpretam prazos, quando trabalhos agendados são executados, quais registros pertencem a um período de relatório e quão seguramente um investigador pode reconstruir uma sequência de eventos. Trate-a como parte do projeto da aplicação antes da implantação, sobretudo para cargas de trabalho de colaboração, CRM, publicação, análise, agendamento e automação.

Um único “fuso horário da aplicação” pode ser útil, mas não constitui automaticamente uma política completa. Uma equipe global pode precisar de uma convenção estável de relatórios em todo o sistema, compromissos em horário local para clientes, preferências individuais de exibição para usuários e agendas sensíveis ao fuso horário para um espaço de trabalho específico. Essas são necessidades distintas e podem pertencer a camadas diferentes.

A pergunta importante não é simplesmente “Qual fuso horário devemos definir?”. Em vez disso, pergunte: quais eventos de negócio representam um instante preciso, quais representam um compromisso em horário civil local e quais se destinam apenas a uma data? A resposta determina os campos, as configurações, as integrações e os testes necessários.

  • Um instante: um trabalho foi executado, um login ocorreu ou uma mensagem foi enviada em um momento específico em todo o mundo.
  • Um compromisso em horário civil local: uma consulta às 09:00 em uma localidade identificada, à qual podem se aplicar regras de horário de verão.
  • Um fato de negócio apenas de data: uma data de publicação, dia de licença ou período de fatura que não deve mudar inesperadamente quando visto em outro lugar.
  • Uma preferência de exibição: como um usuário individual deseja que registros que já são inequívocos sejam apresentados.
O desenho de fusos horários é um requisito operacional, não uma preferência de exibição

Identifique todos os relógios da pilha

Comece o levantamento desenhando o caminho percorrido por cada evento sensível ao tempo. Um navegador pode criar um timestamp, uma aplicação pode interpretá-lo, um contêiner pode executar um worker, um banco de dados pode armazená-lo e um calendário externo ou API pode recebê-lo. Uma incompatibilidade em qualquer ponto pode gerar um resultado que parece correto em uma interface e incorreto em outra.

Registre as configurações e o comportamento observado, em vez de presumir que um contêiner herda o comportamento do host. Imagens Docker podem definir variáveis de ambiente persistentes com Dockerfile ENV, enquanto valores fornecidos no momento da implantação por meio de docker run --env ou configuração equivalente podem substituí-las. Inspecione a documentação da aplicação e a configuração do runtime implantado para verificar variáveis ou configurações documentadas relacionadas a fuso horário.

Para aplicações implantadas por meio do Airbip, a aplicação é executada como uma carga de trabalho Docker em servidores de nuvem do Airbip. Isso torna a configuração no nível da aplicação e as configurações documentadas do contêiner itens importantes a registrar no registro de implantação. O Airbip cuida da infraestrutura ao redor, como roteamento e automação de certificados TLS, mas a semântica de fuso horário dentro de uma aplicação, de seus dados e de suas integrações ainda requer uma decisão de responsável.

  • Sistema operacional do host: relógio local, fuso horário e abordagem de sincronização de tempo.
  • Imagem do contêiner e configuração de runtime: variáveis de ambiente, dados de fuso horário montados quando aplicável e configuração de workers.
  • Aplicação: padrões globais, configurações de organização ou espaço de trabalho, preferências do usuário e configurações do agendador.
  • Banco de dados: tipos de coluna, fuso horário da sessão, comportamento de importação/exportação e consultas de relatórios.
  • Navegador e cliente móvel: renderização local, seletores de data e valores enviados.
  • Serviços conectados: calendários, webhooks, consumidores de API, data warehouses, ferramentas de notificação e sistemas de identidade.
Identifique todos os relógios da pilha

Mapeie os eventos de negócio que dependem de tempo

Liste os eventos que sua aplicação cria, consome, calcula ou exibe. Faça isso com os responsáveis pelo negócio e também com os administradores: um padrão tecnicamente válido ainda pode resultar em um processo operacional inutilizável se uma equipe regional fecha o mês em uma data local diferente ou um cliente recebe uma consulta no horário errado.

Para cada evento, identifique o responsável pelo negócio, a fonte da verdade, o modelo de tempo pretendido, o identificador de fuso horário ou deslocamento transportado, o local de armazenamento, a regra de exibição e todos os destinos posteriores. Esse inventário se torna a base para a configuração e os testes de aceitação.

  • Consultas e disponibilidade: horários de reserva, lembretes, reagendamentos, cancelamentos e reuniões recorrentes.
  • Prazos: tarefas, compromissos de serviço, datas-limite de aprovação, janelas de publicação e lançamentos de campanhas.
  • Automação agendada: fluxos de trabalho recorrentes, importações, exportações, resumos, backups iniciados pela aplicação e trabalhos de retenção.
  • Análises e relatórios: consolidações diárias, limites de fechamento mensal, definições de coorte e filtros de painéis.
  • Retenção e conformidade: expiração, elegibilidade para exclusão, eventos relacionados a retenção legal e janelas de política.
  • Eventos de auditoria e segurança: autenticação, alterações de permissões, exportações de dados, ações administrativas e erros.

Mantenha um registro inequívoco e apresente o horário local de forma adequada

Para eventos ocorridos em um momento específico, preserve uma representação inequívoca desse momento e aplique a exibição local na ponta em que uma pessoa precisa lê-lo. Timestamps RFC 3339 com um deslocamento numérico em relação ao UTC comunicam uma relação conhecida com o UTC. Não use uma abreviação de fuso horário como CST ou IST como identificador: a IANA observa que tais abreviações são ambíguas na prática.

Quando o comportamento deve seguir o horário civil de uma localidade, use um identificador da IANA baseado em localização, como America/Denver, em vez de um deslocamento numérico fixo. Uma zona nomeada representa regras que podem incluir o comportamento de horário de verão, enquanto um deslocamento numérico isolado não expressa essas futuras mudanças de regra. O Banco de Dados de Fusos Horários da IANA é atualizado periodicamente em razão de alterações políticas de limites, deslocamentos e regras de horário de verão; portanto, é uma dependência que vale manter atualizada por meio do ambiente operacional e do modelo de suporte da aplicação.

Não presuma que o tipo de armazenamento de um timestamp responde a todas as questões de negócio. No PostgreSQL, valores timestamp with time zone são armazenados internamente em UTC e exibidos de acordo com o TimeZone da sessão; o fuso horário originalmente informado ou presumido não é mantido. Em contraste, timestamp without time zone é um valor civil de data e hora, não um instante, e uma indicação de fuso horário em uma entrada tipada dessa maneira é ignorada. Revise os tipos efetivamente usados pela aplicação antes de criar relatórios ou procedimentos de investigação com base neles.

  • Use um instante preciso para ordenação de eventos, evidências de auditoria, histórico de execução e atividade de sistema entre regiões.
  • Armazene ou retenha separadamente a zona nomeada relevante quando a localização e suas regras de horário civil forem dados de negócio significativos.
  • Use uma representação explícita apenas de data para obrigações apenas de data; não crie timestamps à meia-noite, a menos que a semântica da aplicação exija isso explicitamente.
  • Especifique o fuso horário usado pelos períodos de relatório e rotule relatórios e exportações com essa convenção.
  • Evite tratar o deslocamento UTC atual como uma política permanente de fuso horário.

Defina padrões no nível certo

Escolha a configuração mais específica que atenda ao requisito de negócio. Um padrão de sistema pode oferecer comportamento consistente para processos sem supervisão e usuários sem preferência. Ele não deve substituir uma necessidade legítima de que um espaço de trabalho, recurso, localização de cliente ou usuário individual opere com base em outro horário local.

Antes de escolher um padrão, descubra quais configurações afetam apenas a exibição, quais afetam o armazenamento ou a interpretação e quais controlam trabalhos agendados. Essas distinções são específicas de cada aplicação. Confirme-as na documentação oficial da aplicação e, então, teste o comportamento implantado em vez de extrapolar a partir de uma configuração com nome semelhante.

Uma base prática para muitas implantações é uma convenção de sistema claramente documentada para operações e relatórios, combinada com configurações de zona nomeada para agendas vinculadas a localizações e preferências de exibição no nível do usuário, quando a aplicação as suporta. Não apresente isso como um modelo universal: uma equipe de uma única região, sem agendamento de clientes, pode escolher deliberadamente uma política mais simples.

  • Padrão do sistema: defina sua finalidade e quais serviços ou workers o utilizam.
  • Fuso horário da organização ou do espaço de trabalho: use quando o calendário compartilhado, o limite de relatório ou o horário operacional de uma equipe precisar de um contexto local comum.
  • Fuso horário do usuário: use para exibição e notificações personalizadas quando usuários trabalham em várias regiões.
  • Fuso horário de recurso ou localização: use para salas, filiais, territórios de serviço e consultas de clientes.
  • Fuso horário da agenda: registre-o separadamente para cada automação ou trabalho recorrente quando a aplicação oferecer suporte.

Trate limites do horário de verão e equipes globais como casos de primeira classe

As transições do horário de verão expõem pressupostos ocultos em datas comuns. Em uma mudança de avanço de relógio, alguns horários locais simplesmente não existem. Em uma mudança de atraso de relógio, um horário local pode ocorrer duas vezes. Se um calendário ou API aceita horário local mais um fuso horário, teste ambos os casos e defina o que os usuários devem esperar.

O comportamento do calendário deve usar um modelo de tempo explícito. A RFC 5545 especifica que um valor DATE-TIME sem designador UTC nem TZID é um horário flutuante. Ele pode ocorrer em momentos reais diferentes para destinatários em fusos horários distintos e só deve ser usado quando esse comportamento for genuinamente apropriado. Para um horário fixo, use UTC ou horário local com uma referência de fuso horário.

Agendas recorrentes exigem análise específica. A RFC 5545 especifica que instâncias de recorrência em horários locais inexistentes são ignoradas. Isso pode estar correto de acordo com o padrão, mas ainda entrar em conflito com uma expectativa de negócio como “envie este lembrete todos os dias às 02:30”. Decida se a política desejada é ignorar, mover, executar em um horário alternativo ou exigir revisão de um operador, com base nas capacidades documentadas pela aplicação ou pelo agendador conectado.

  • Teste um horário dentro da lacuna do avanço de relógio em cada zona nomeada compatível.
  • Teste ambas as ocorrências de um horário local repetido no atraso de relógio e verifique a ordenação na interface do usuário, nas exportações e nos logs.
  • Teste uma consulta ou trabalho recorrente que atravesse cada transição.
  • Teste usuários visualizando a mesma consulta a partir de pelo menos duas zonas diferentes.
  • Teste campos apenas de data próximos à meia-noite para usuários a leste e a oeste do fuso horário padrão do negócio.

Verifique tarefas agendadas e integrações de ponta a ponta

A expressão nominal de um agendador não informa tudo. O Cron pode ter um fuso horário CRON_TZ para um crontab, enquanto os timestamps dos logs do daemon usam o fuso horário local da máquina. Isso significa que a agenda de um trabalho e os logs usados para provar sua execução podem usar contextos de fuso horário diferentes. Registre ambos durante a validação.

O tratamento do Cron em torno de alterações de relógio também é um comportamento operacional que deve ser testado, e não presumido. O manual de cron mencionado descreve um tratamento especial para mudanças de horário local inferiores a três horas, incluindo o tratamento de trabalhos da hora ignorada e a prevenção de execução duplicada de trabalhos afetados durante um ajuste para trás. Outros agendadores e workers no nível da aplicação podem se comportar de maneira diferente; portanto, valide o componente exato em uso.

Para cada integração, documente se a carga útil transmite UTC, um timestamp RFC 3339 com deslocamento, horário local mais uma zona nomeada, horário flutuante ou dados apenas de data. Documente também o que o serviço receptor faz com esses dados. Um contrato de integração deve indicar quem é responsável por conversão, validação e tratamento de erros, e não apenas mostrar um exemplo de timestamp.

  • Para cada agenda: expressão, zona pretendida, executor, zona dos logs, política de repetição e expectativa para horário de verão.
  • Para cada campo de API: tipo, exemplo de representação, se identifica um instante ou horário civil e comportamento de validação.
  • Para cada conexão de calendário: referência de fuso horário, tratamento de recorrência, expectativa de exibição do convidado e comportamento de reagendamento.
  • Para webhooks e exportações: formato de timestamp, presença de fuso horário/deslocamento, pressupostos de ordenação e regras de interpretação no destino.
  • Para sistemas externos: identifique o responsável que deve aprovar qualquer conversão de fuso horário ou alteração de esquema.

Revise banco de dados, exportações e logs de auditoria antes de confiar neles

Os procedimentos de relatório e investigação devem ser projetados com base no comportamento observado dos dados, e não apenas no rótulo de uma tela. Inspecione registros representativos na aplicação, no banco de dados e nos formatos de exportação. Confirme se a filtragem ocorre na aplicação, na sessão do banco de dados ou no cliente; se as datas são convertidas antes do agrupamento; e se uma exportação informa sua convenção de fuso horário.

Para uso em auditoria, registre tanto a hora do evento quanto a hora em que o log foi gravado quando elas puderem ser diferentes. A OWASP recomenda sincronizar o horário entre servidores e dispositivos sempre que possível, além de incluir logs nos testes da aplicação e na verificação de segurança. Um processo de auditoria confiável também precisa de uma convenção declarada de fuso horário para as pessoas que leem os logs, especialmente quando vários sistemas estão envolvidos.

Não altere diretamente dados de produção da aplicação apenas para padronizar timestamps sem um plano de migração específico para a aplicação. Primeiro, determine como a aplicação interpreta seus campos, obtenha um backup recuperável, teste em uma cópia não produtiva e valide os relatórios, agendas, integrações e visualizações de auditoria afetados.

  • Verifique os tipos brutos de coluna do banco de dados e o modelo de dados documentado da aplicação.
  • Compare um evento na interface, no banco de dados, no log da aplicação, no log do proxy reverso ou do host, quando disponível, e nos dados exportados.
  • Verifique a ordenação e os filtros de intervalo em torno da meia-noite local e de um limite de horário de verão.
  • Confirme se a zona de entrada original, a zona de exibição atual e o instante UTC estão disponíveis separadamente quando o negócio precisar deles.
  • Mantenha evidências das entradas de teste, dos resultados esperados, dos resultados reais e das versões de configuração.

Perguntas frequentes

Todas as aplicações auto-hospedadas devem operar em UTC?

O UTC costuma ser uma convenção forte para registrar eventos de sistema e coordenar infraestrutura, mas não é uma política de negócio completa. Consultas, horários operacionais e prazos regionais podem precisar de um fuso horário IANA nomeado que siga regras de horário civil local. Decida separadamente como cada evento é armazenado, agendado e exibido.

Por que um deslocamento UTC fixo não é suficiente para agendamento?

Um deslocamento fixo identifica uma relação com o UTC em determinado momento. Ele não expressa o comportamento futuro do horário de verão nem alterações políticas nas regras de horário local. Use um identificador IANA baseado em localização quando uma agenda precisar seguir o horário civil de uma localidade.

Qual é o teste mínimo de fuso horário antes do lançamento?

Teste usuários representativos em zonas diferentes; um item apenas de data próximo à meia-noite; um trabalho agendado; uma integração de API ou calendário; um limite de exportação ou relatório; e, quando aplicável, tanto um horário local inexistente no avanço de relógio quanto um horário local repetido no atraso de relógio. Valide o resultado na aplicação, no serviço posterior e nos logs.

Podemos deduzir o comportamento de fuso horário pela configuração do host do contêiner?

Não. Inspecione a imagem, a configuração de runtime, as configurações da aplicação, a configuração dos workers e o comportamento do banco de dados. O Docker oferece suporte a variáveis de ambiente definidas em uma imagem e a valores fornecidos no runtime; portanto, o comportamento do contêiner implantado deve ser registrado e testado, não presumido.

Quando uma aplicação SaaS gerenciada centralmente pode ser mais adequada?

Considere-a quando o agendamento global for central para a operação e sua equipe não puder assumir a validação contínua das configurações de fuso horário, do comportamento de calendários, das integrações, da interpretação de auditoria e das regras de horário civil em mudança. Trata-se de uma decisão de modelo de implantação, não de um defeito da auto-hospedagem. A auto-hospedagem pode continuar adequada quando há responsáveis claros, contratos de integração testados e governança para a aplicação e seus dados.

Fontes e leituras adicionais

  1. Docker: docker container run reference — Docker
  2. Docker: Dockerfile ENV reference — Docker
  3. IANA Time Zone Database overview — Internet Assigned Numbers Authority (IANA)
  4. IANA tz database theory and pragmatics — Internet Assigned Numbers Authority (IANA)
  5. RFC 3339: Date and Time on the Internet: Timestamps — IETF
  6. RFC 5545: Internet Calendaring and Scheduling Core Object Specification (iCalendar) — IETF
  7. PostgreSQL date/time types documentation — PostgreSQL Global Development Group
  8. crontab(5) manual — Cronie project / Linux man-pages
  9. cron(8) manual — Cronie project / Linux man-pages
  10. OWASP Logging Cheat Sheet — Open Worldwide Application Security Project (OWASP)