﻿# Guia de Deploy e Seguranca do Tikáh em AlmaLinux

Este roteiro prepara o Tikáh para rodar em `tikah.com.br` com Node.js, PM2, reverse proxy e deploy automatico via GitHub Actions self-hosted runner. Ele segue o modelo do servidor AlmaLinux com acesso root e evita fazer build dentro de `/home` quando houver `noexec`.

## 1. O que ja foi preparado no codigo

- Workflow `.github/workflows/deploy.yml` para build em runner self-hosted, audit de producao, `prisma generate`, build Next.js, sincronizacao por `rsync`, restart PM2 e healthcheck pos-deploy.
- Workflow `.github/workflows/backup.yml` para backup agendado do banco, `.env` e uploads.
- `ecosystem.config.cjs` para rodar o Next.js com PM2.
- `/api/health` para healthcheck com consulta ao banco e resposta `503` em falha.
- Trava temporaria por Basic Auth no `proxy.ts`, ativada quando `TIKAH_SITE_PASSWORD` estiver definida.
- Headers de seguranca no `next.config.ts` e CSP dinamica com nonce no `proxy.ts`: HSTS em producao, `X-Frame-Options`, `nosniff`, `Referrer-Policy`, `Permissions-Policy`, `COOP` e `X-Robots-Tag`.
- `npm run security:readiness` e painel `/tikah-admin/configuracoes/seguranca` para validar secrets, 2FA, SMTP, backup, WAF e hardening antes de producao.
- Validacao reforcada de uploads por extensao, MIME e assinatura real nos comprovantes, propostas e fotos.

## 2. DNS e Cloudflare

1. Aponte `tikah.com.br` e `www.tikah.com.br` para o servidor.
2. Se usar Cloudflare, deixe SSL/TLS em `Full (strict)` quando o certificado do servidor estiver ativo.
3. Configure regras de WAF/rate limit para:
   - `/login`
   - `/api/auth/*`
   - `/api/participants/register`
   - `/api/congressista/inscricao/comprovante`
   - `/api/congressista/propostas`
   - `/api/organizador/speakers/upload`
   - `/tikah-admin/*`
4. Enquanto a landing estiver fechada, mantenha `TIKAH_SITE_PASSWORD` ativa e desafie bots/paises fora do publico esperado, se fizer sentido.

## 3. Preparar o servidor

Execute como `root`:

```bash
dnf update -y
dnf install -y git rsync sqlite cronie
```

Instale Node.js 22, PM2 e dependencias:

```bash
curl -fsSL https://rpm.nodesource.com/setup_22.x | bash -
dnf install -y nodejs
npm install -g pm2
pm2 startup systemd
```

Crie a pasta final:

```bash
mkdir -p /home/SEU_USUARIO/tikah.com.br/app
chown -R SEU_USUARIO:SEU_USUARIO /home/SEU_USUARIO/tikah.com.br
```

## 4. Variaveis de ambiente no servidor

Crie `/home/SEU_USUARIO/tikah.com.br/app/.env` com permissao restrita:

```bash
cat > /home/SEU_USUARIO/tikah.com.br/app/.env <<'EOF'
DATABASE_URL="file:./prisma/dev.db"
NEXTAUTH_URL="https://tikah.com.br"
NEXTAUTH_SECRET="gere-um-segredo-longo-e-aleatorio"
TWO_FACTOR_SECRET_KEY="gere-outro-segredo-longo-e-aleatorio-para-2fa"
ASAAS_ENV="sandbox"
ASAAS_API_KEY=""
ASAAS_WEBHOOK_TOKEN=""
CRON_SECRET="gere-um-segredo-longo-e-aleatorio-para-crons"
SECURITY_ALERT_EMAIL="daniel@huryz.com.br"
BACKUP_DIR="/root/backups/tikah"
TIKAH_WAF_CONFIRMED="false"
TIKAH_SERVER_HARDENED="false"
TIKAH_SITE_LOCK_USERNAME="tikah"
TIKAH_SITE_PASSWORD="gere-uma-senha-longa-e-unica"
TIKAH_SITE_LOCK_ENABLED="true"
PORT="3000"
PM2_APP_NAME="tikah"
EOF
chmod 600 /home/SEU_USUARIO/tikah.com.br/app/.env
```

> Para producao com PostgreSQL, nao basta trocar `DATABASE_URL`: o schema Prisma, o adapter e as migrations precisam estar preparados para Postgres antes de ativar `RUN_MIGRATIONS=true`.

Gere um `NEXTAUTH_SECRET` forte:

```bash
openssl rand -base64 48
```

## 5. Runner self-hosted do GitHub

No GitHub do repositorio:

1. Acesse `Settings > Actions > Runners > New self-hosted runner`.
2. Escolha Linux x64.
3. No servidor:

```bash
mkdir -p /root/actions-runner-tikah
cd /root/actions-runner-tikah
# execute os comandos de download/configure exibidos pelo GitHub
./svc.sh install
./svc.sh start
```

O runner deve ficar em `/root` para fazer `npm ci`, `npm run build` e `npm prune` fora da particao `/home` com `noexec`.

## 6. Secrets do GitHub Actions

Cadastre em `Settings > Secrets and variables > Actions > Repository secrets`:

- `DEPLOY_PATH`: `/home/SEU_USUARIO/tikah.com.br/app`
- `DEPLOY_OWNER`: `SEU_USUARIO`
- `NEXTAUTH_URL`: `https://tikah.com.br`
- `NEXTAUTH_SECRET`: o segredo gerado
- `TWO_FACTOR_SECRET_KEY`: segredo diferente e longo para criptografar 2FA e recovery codes
- `DATABASE_URL`: `file:./prisma/dev.db` ou a URL do banco de producao
- `ASAAS_ENV`: `sandbox` enquanto homologar, `production` quando virar a chave
- `ASAAS_API_KEY`: chave do Asaas
- `ASAAS_WEBHOOK_TOKEN`: segredo do webhook
- `CRON_SECRET`: segredo longo para proteger rotas `/api/cron/*`
- `SECURITY_ALERT_EMAIL`: e-mail que recebe alertas criticos de seguranca
- `BACKUP_DIR`: diretorio do servidor onde backups sao gravados, por exemplo `/root/backups/tikah`
- `TIKAH_WAF_CONFIRMED`: `true` somente depois de ativar WAF/CDN/rate limit
- `TIKAH_SERVER_HARDENED`: `true` somente depois de aplicar o hardening AlmaLinux
- `TIKAH_SITE_LOCK_USERNAME`: `tikah`
- `TIKAH_SITE_PASSWORD`: senha longa, aleatÃ³ria e exclusiva para a trava temporÃ¡ria da landing
- `TIKAH_SITE_LOCK_ENABLED`: `true`
- `PORT`: `3000`
- `PM2_APP_NAME`: `tikah`
- `RUN_MIGRATIONS`: `true` se quiser que o workflow rode `prisma migrate deploy`
- `NEXT_PUBLIC_TIKAH_CONTACT_EMAIL`: e-mail comercial exibido na landing, por exemplo `contato@tikah.com.br`
- `NEXT_PUBLIC_TIKAH_WHATSAPP_URL`: link completo do WhatsApp comercial, por exemplo `https://wa.me/5516997986937?text=Quero%20conhecer%20mais%20sobre%20a%20Tik%C3%A1h.`; quando vazio, o botao flutuante nao aparece
- `ALLOW_SELF_SERVICE_ORGANIZER_REGISTRATION`: manter `false` nesta fase para impedir criacao publica automatica de eventos

## 7. Reverse proxy

Configure Apache, Nginx ou o proxy do cPanel para encaminhar `tikah.com.br` para `127.0.0.1:3000`.

Exemplo Nginx:

```nginx
server {
  listen 80;
  server_name tikah.com.br www.tikah.com.br;
  return 301 https://tikah.com.br$request_uri;
}

server {
  listen 443 ssl http2;
  server_name tikah.com.br www.tikah.com.br;

  client_max_body_size 10m;

  location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_buffering off;
  }
}
```

## 8. Primeiro deploy

Depois dos secrets e runner:

```bash
git push origin main
```

Ou rode manualmente em `Actions > Deploy Tikáh > Run workflow`.

No servidor, confira:

```bash
pm2 status
pm2 logs tikah --lines 100
curl -I https://tikah.com.br/api/health
curl -I https://tikah.com.br
```

`/api/health` deve responder sem senha. A landing deve retornar `401` antes da senha e abrir com usuario `tikah` e a senha longa configurada em `TIKAH_SITE_PASSWORD`.

## 9. Backups

O script `scripts/backup-tikah.sh` faz backup de `.env`, PostgreSQL via `pg_dump` quando `DATABASE_URL` for Postgres, SQLite local quando existir, e uploads. Instale no cron:

Tambem ha o workflow agendado `.github/workflows/backup.yml`, que usa os secrets `DEPLOY_PATH`, `BACKUP_DIR` e `DATABASE_URL` no runner self-hosted.

```bash
mkdir -p /root/backups/tikah
crontab -e
```

Linha sugerida:

```cron
15 3 * * * APP_DIR=/home/SEU_USUARIO/tikah.com.br/app BACKUP_DIR=/root/backups/tikah /home/SEU_USUARIO/tikah.com.br/app/scripts/backup-tikah.sh >> /root/backups/tikah/backup.log 2>&1
```

Teste restore mensalmente em uma pasta separada antes de confiar no backup.

## 10. Checklist antes de divulgar

- Trocar senhas demo e garantir admins reais com senha forte.
- Confirmar `.env` fora do Git e com `chmod 600`.
- Rodar `npm audit --audit-level=high --omit=dev`.
- Rodar `npm run build`.
- Rodar `npm run security:readiness`; falhas (`FAIL`) devem ser resolvidas antes de abrir producao.
- Acessar `/tikah-admin/configuracoes/seguranca`, ativar 2FA do Super Admin e confirmar todos os administradores com 2FA.
- Confirmar logs de auditoria para admin/role, SMTP, banco, tenant, uploads, landing, programacao, configuracao cientifica e webhook financeiro.
- Confirmar que `NEXTAUTH_SECRET`, `CRON_SECRET` e `ASAAS_WEBHOOK_TOKEN` estao fortes e distintos.
- Confirmar `TWO_FACTOR_SECRET_KEY` forte e diferente de `NEXTAUTH_SECRET`.
- Confirmar `SECURITY_ALERT_EMAIL` recebendo alertas de teste.
- Validar login, inscricao, upload, pagamento sandbox, e-mails e LGPD.
- Confirmar WAF/rate limit na Cloudflare.
- Depois de ativar WAF/rate limit, definir `TIKAH_WAF_CONFIRMED=true`.
- Depois do hardening AlmaLinux, definir `TIKAH_SERVER_HARDENED=true`.
- Confirmar backup e restore.
- Confirmar PM2 com `pm2 save`.
- Remover a senha temporaria quando a landing puder ficar publica: apagar `TIKAH_SITE_PASSWORD` ou definir `TIKAH_SITE_LOCK_ENABLED="false"` e fazer novo deploy/restart.
