Gustavo 98811a10b7 wp-init: fail fast on wrong DB password, strict theme activation
- The 'Waiting for database' loop spun forever when the .env password did
  not match the db_data volume; it now aborts with exit 1 and explains how
  to recover (put the old password back; README 'Passwords' for a real
  change), plus a 5-minute timeout for a dead database.
- Theme presence is checked on disk instead of via wp-cli (which needs the
  database), activation is always attempted and fatal on failure, so the
  script can no longer delete the active theme and report success.
- README gains a 'Passwords' section documenting the correct password-change
  procedure (ALTER USER in the running DB, then .env).
2026-11-02 13:57:31 -03:00

Gustavo Portfolio — Tema WordPress

Tema WordPress clássico para o portfólio e blog de Gustavo Oliveira — gustavoo.me

Screenshot

Theme Screenshot

Sobre

Tema WordPress clássico desenvolvido para o portfólio pessoal e blog de Gustavo Oliveira, desenvolvedor Full Stack Sênior. O tema foi construído com foco em performance, acessibilidade e experiência do usuário, utilizando as melhores práticas do WordPress moderno.

Características

  • Tema Clássico — Template hierarchy tradicional do WordPress
  • Theme.json — Configuração completa de estilos via theme.json (cores, tipografia, espaçamento, bordas)
  • Blocos Nativos — Suporte completo a blocos do Gutenberg
  • Fluent Forms + FluentCRM — Integração nativa para formulários e newsletter
  • Portfólio de Projetos — CPT customizado para exibição de projetos
  • Newsletter Widget — Widget personalizado para FluentCRM
  • SEO Ready — Estrutura semântica e meta tags otimizadas
  • Performance — Assets otimizados, fontes variáveis (Inter Variable), lazy loading nativo

Stack

  • WordPress 6.5+
  • PHP 8.1+
  • Theme.json v3
  • Inter Variable Font (local, self-hosted)
  • Fluent Forms + FluentCRM (integração via plugin complementar)
  • Docker Compose para desenvolvimento local

Estrutura do Tema

gustavoo-portfolio/
├── assets/
│   └── fonts/          # Inter Variable Font (woff2)
├── inc/
│   ├── customizer.php  # Personalizador do tema
│   ├── defaults.php    # Configurações padrão (theme.json fallback)
│   ├── enqueue.php     # Assets e estilos
│   ├── forms.php       # Integração Fluent Forms
│   ├── setup.php       # Configuração do tema
│   ├── template-tags.php  # Template tags auxiliares
│   └── widgets.php     # Widget Newsletter (FluentCRM)
├── template-parts/     # Partes de template reutilizáveis
├── 404.php
├── archive.php
├── category.php
├── comments.php
├── footer.php
├── front-page.php      # Página inicial customizada
├── functions.php       # Bootstrap do tema
├── header.php
├── home.php
├── index.php
├── page.php
├── search.php
├── searchform.php
├── sidebar.php
├── single.php
├── screenshot.png      # Screenshot do tema (theme.png)
├── style.css           # Stylesheet principal (metadados do tema)
└── theme.json          # Configuração global de estilos

Plugin Complementar

O tema funciona em conjunto com o plugin Gustavo Portfolio Core (wp-content/plugins/gustavoo-portfolio-core), que provê:

  • CPT Projetos — Post type customizado para portfólio
  • Configurações Globais — Opções de hero, sobre, projetos, blog, contato, newsletter e redes sociais
  • Seeder — Criação automática de páginas, formulários Fluent Forms e feeds FluentCRM
  • Widget Newsletter — Widget para exibir formulário de newsletter no sidebar

Desenvolvimento Local

Pré-requisitos

O tema e plugin dependem dos seguintes plugins WordPress (instalados e ativados):

  • Fluent Forms — Formulários de contato e newsletter
  • FluentCRM — Automação de marketing e newsletter
# Criar o arquivo de variáveis de ambiente (obrigatório)
cp .env.example .env
# Edite o .env com suas credenciais (senhas do banco, porta, etc.)

# Subir ambiente Docker (instala e configura tudo automaticamente)
docker compose up -d

# Acompanhar a instalação
docker compose logs -f wpcli

# Acessar WordPress
# http://localhost:8080
# Usuário: admin | Senha: admin (definido no .env)

# Instalar dependências (plugins obrigatórios)
# 1. Acesse http://localhost:8080/wp-admin
# 2. Plugins → Adicionar novo → Busque e instale:
#    - Fluent Forms
#    - FluentCRM
# 3. Ative ambos os plugins

# Logs
docker compose logs -f wordpress

O que acontece a cada docker compose up

O serviço wpcli roda o docker/wp-init.sh e detecta o estado do banco:

Primeira execução (banco vazio) — instalação

  1. wp core install com URL/título/admin definidos no .env
  2. Pacote de idioma pt_BR
  3. Instala do WordPress.org os plugins de WP_EXTRA_PLUGINS (Post Views Counter, Rank Math SEO, Site Kit) — só se faltarem
  4. Ativa todos os plugins de wp-content/plugins/ e remove os que o WordPress traz (akismet, hello)
  5. Redis: constantes no wp-config.php, plugin, drop-in object-cache.php e verificação de conexão
  6. Configura o Post Views Counter: conta posts e páginas, posição Manual only
  7. Ativa o tema gustavoo-portfolio e remove os temas padrão
  8. Executa o seeder do plugin (páginas, formulários, feeds, permalinks, avatar)

Rank Math SEO e Site Kit são apenas instalados e ativados: o wizard e a conexão com o Google são feitos manualmente no painel.

Execuções seguintes (site já instalado) — atualização

  1. Nada é reinstalado e nenhum dado é apagado
  2. Atualiza o core e os plugins ativos que tiverem versão nova
  3. Ativa plugins novos adicionados à pasta wp-content/plugins/
  4. Reaplica só o que estiver faltando (idioma, Redis, tema, seeder idempotente)

A configuração do Post Views Counter roda uma única vez, na instalação. Se você mudar a posição no painel, ela não é sobrescrita nos próximos boots.

O seeder também aplica, apenas enquanto os valores ainda forem os de instalação nova:

Ajuste Valor aplicado
Links permanentes Dia e nome — /ano/mês/dia/slug/
Avatar padrão Iniciais

Depois de criar permalinks, o .htaccess do Apache é regravado na hora — sem isso as URLs novas dariam 404. Se você já tiver escolhido outro permalink ou avatar, sua escolha é mantida.

Tudo o que é do usuário fica em volumes, não no container:

Volume Conteúdo
db_data banco MariaDB — posts, páginas, usuários, opções, formulários
wordpress_data core, uploads, plugins e temas instalados
redis_data cache de objetos

docker compose down (sem -v) preserva tudo; só down -v recria do zero. Para pular atualizações numa reinicialização, use WP_SKIP_UPDATES=1 no .env.

Senhas

A senha do banco é gravada dentro do volume db_data na primeira instalação. Trocar WORDPRESS_DB_PASSWORD ou MARIADB_ROOT_PASSWORD no .env depois disso não atualiza o banco — o WordPress perde a conexão (Error establishing a database connection) e o setup aborta com erro em vez de reinstalar por cima.

Para voltar ao normal, devolva a senha original no .env e reinicie (docker compose up -d).

Para trocar a senha de verdade, altere-a nos dois lugares, nessa ordem:

# 1. No banco em execução (troque NOVA_SENHA pela senha nova):
docker compose exec db mariadb -u root -p"$MARIADB_ROOT_PASSWORD" \
  -e "ALTER USER 'wordpress'@'%' IDENTIFIED BY 'NOVA_SENHA'; FLUSH PRIVILEGES;"

# 2. No .env:
WORDPRESS_DB_PASSWORD=NOVA_SENHA

# 3. Reinicie:
docker compose up -d

Deploy

O tema está preparado para deploy em ambientes WordPress padrão (VPS, shared hosting, WP Engine, Kinsta, etc.).

  1. Faça o build dos assets se necessário
  2. Faça deploy da pasta wp-content/themes/gustavoo-portfolio/
  3. Ative o tema no painel WordPress
  4. Ative o plugin Gustavo Portfolio Core
  5. Execute o seeder (Configurações → Portfólio → "Executar Seeder") para criar páginas e formulários padrão

Licença

GNU General Public License v2 ou posterior — mesmo licença do WordPress.


Desenvolvido por Gustavo Oliveira — Desenvolvedor Full Stack Sênior

S
Description
No description provided
Readme
11 MiB
0 Stars 1 Watchers 0 Forks
Languages
PHP 66.8%
CSS 23.2%
JavaScript 7%
Shell 3%