Arquitetura

Como uma requisição chega ao WordPress de cursos, o que roda dentro do pod e quais comportamentos da imagem e dos plugins não são óbvios para quem for operar o site.

Caminho de uma requisição

wp-cursos-fluxo
  1. A Cloudflare termina o TLS do visitante e repassa para a origem (OKE).

  2. O ingress-nginx do cluster termina o TLS de origem e roteia pelo Host para o Service wp-cursos.

  3. O nginx do pod responde direto os arquivos estáticos (imagens, CSS, JS, uploads) a partir do volume. Requisições .php, e tudo que cai no index.php, vão para o PHP-FPM.

  4. O PHP-FPM carrega o WordPress com os ~70 plugins ativos a cada requisição dinâmica: não há cache de objetos, então cada página não cacheada custa um worker inteiro.

  5. O WordPress usa o MariaDB do mesmo namespace pelo Service mariadb.

Componentes da aplicação

Camada Componente

Tema

Eduma 3.4.3 (ThimPress), usado pelo tema filho eduma-child, com o plugin Thim Core. A cópia instalada é pirata; ver Plugins e temas.

Construção de páginas

WPBakery Page Builder (js_composer), Slider Revolution, SiteOrigin Panels

LMS

LearnPress 3.0 e 13 add-ons (certificados, gradebook, tarefas, pré-requisitos…)

Venda e assinatura

Paid Memberships Pro (integrado ao LearnPress) e WooCommerce. Há 4.271 pedidos LearnPress (lp_order) no banco.

Contas

Cadastro aberto (users_can_register = 1, papel padrão subscriber), login social pelo miniOrange, LoginPress e Peter’s Login Redirect

Integrações externas

Google Tag Manager (GTM-KPLVMMW), Google reCAPTCHA, Mailchimp, SMTP (WP Mail SMTP), ManageWP (gestão remota)

Cache

WP Fastest Cache (cache de página em disco)

Banco de dados

Uma única instância MariaDB atende todos os WordPress legados:

Banco Prefixo Uso

enj

iuxcl_

cursos.artesmarciaisonline.com.br (ativo)

enj_fuji

csmjw_

sistemafuji.com.br (desligado)

enj_root

—

antigo WordPress do apex, sem uso

O usuário de aplicação (WORDPRESS_DB_USER) tem acesso aos três bancos. Um comprometimento de qualquer site expõe os outros. Ao atualizar, crie um usuário por banco.

Comportamento do entrypoint da imagem

A imagem oficial wordpress:4.9.8-php7.2-fpm (de 2018) tem um comportamento que já causou incidente:

A cada inicialização do container, o entrypoint reescreve DB_HOST, DB_NAME, DB_USER e DB_PASSWORD dentro do wp-config.php existente usando as variáveis WORDPRESS_DB_*, que vêm do Secret wp-cursos-db. O Secret é a fonte da verdade: editar esses valores à mão no wp-config.php só dura até o próximo restart.
  • Em 21/09/2026, um rollout (ajuste do PHP-FPM) reiniciou o pod e o entrypoint gravou um DB_NAME errado que estava no Secret desde a criação. O site passou a redirecionar para /wp-admin/install.php. O Secret foi corrigido em 24/09/2026.

  • O entrypoint não mexe em $table_prefix (iuxcl_) nem nos salts (AUTH_KEY…), que ficam só no arquivo.

  • O wp-config.php vive no PVC, não na imagem. Trocar a imagem não descarta a configuração.

Cache e tarefas agendadas

  • Cache de página: o WP Fastest Cache grava o HTML pronto em wp-content/cache/all/ e o CSS/JS minificado em wp-content/cache/wpfc-minified/, ambos no PVC. Depois de qualquer mudança de conteúdo, tema ou plugin, limpe o cache (painel do plugin ou apagando wp-content/cache/all/). Durante o incidente, o cache servia páginas de spam.

  • WP-Cron: não há cron de sistema. As tarefas agendadas do WordPress rodam quando um visitante dispara o wp-cron.php. Com pouco tráfego elas atrasam; com muito tráfego, cada disparo ocupa um worker.

IP real do visitante

Dentro do cluster, o nginx do pod enxerga o IP interno do ingress-nginx, não o do visitante. O IP real chega nos cabeçalhos X-Forwarded-For e CF-Connecting-IP (Cloudflare). Plugins que bloqueiam por IP (All In One WP Security, limites de login) só funcionam se estiverem configurados para ler esses cabeçalhos. Caso contrário, bloqueiam o próprio ingress ou não bloqueiam ninguém.

Diferenças em relação ao ambiente anterior

Aspecto VM Azure (até 10/2026) OKE (atual)

Execução

docker-compose numa VM única, junto com o PostgreSQL do FUJI

Pods no cluster compartilhado com a produção do FUJI

TLS

certbot + nginx na VM

Cloudflare na borda + cert-manager na origem

Limites

Sem limite de memória por container

Limites rígidos por container (OOMKill ao estourar)

Senha do banco

No .env, visível como variável de ambiente para os containers WordPress

Só em Secrets

Admin do banco

phpMyAdmin publicado na porta 8080

Sem interface; kubectl exec/port-forward sob demanda

Outros sites

WordPress do apex, do sistemafuji e FTP no mesmo compose

Apex estático; sistemafuji desligado; sem FTP

O desenho anterior e as opções de escala vertical/horizontal estão em Arquitetura.