Skip to content

Commit b2b98e1

Browse files
authored
Merge pull request #13 from assertlab/docs/atualizacao-geral
docs: revisão geral de consistência e atualização pós-migração Oracle…
2 parents b8bd2b5 + 0b1440f commit b2b98e1

6 files changed

Lines changed: 133 additions & 88 deletions

File tree

‎README.md‎

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,21 +38,22 @@ O cutuCÃO nasce de uma filosofia simples: **o aluno é dono do próprio progres
3838
| `/exportar` | Exporta registros em JSON com filtros (canal, nível, período, tudo) | Orientador |
3939
| `/limpar` | Remove registros com confirmação obrigatória e opção de exportar antes | Orientador |
4040
| `/teste-lembrete` | Dispara manualmente o job de lembrete | Orientador |
41+
| `/teste-boas-vindas` | Simula a mensagem de boas-vindas no canal de entrada | Orientador |
4142

4243
**Detecção automática** — Canais com prefixo `phd-`, `msc-` ou `bsc-` na categoria "Orientações" são monitorados automaticamente. Criou um canal novo? O cutuCÃO já começa a vigiar.
4344

4445
## Stack
4546

46-
- **Runtime:** Node.js 18+
47+
- **Runtime:** Node.js 20+
4748
- **Linguagem:** TypeScript
4849
- **Framework:** discord.js v14
4950
- **Banco de dados:** SQLite (via better-sqlite3)
5051
- **Agendamento:** node-cron
51-
- **Hospedagem:** Railway
52+
- **Hospedagem:** Oracle Cloud Free Tier (VPS com Node.js + systemd)
5253

5354
## Pré-requisitos
5455

55-
- [Node.js](https://nodejs.org/) 18 ou superior
56+
- [Node.js](https://nodejs.org/) 20 ou superior
5657
- [Git](https://git-scm.com/)
5758
- Uma aplicação de bot criada no [Discord Developer Portal](https://discord.com/developers/applications)
5859

@@ -186,14 +187,18 @@ Consulte a [seção 9 da SPEC.md](SPEC.md) para detalhes completos.
186187

187188
## Deploy
188189

189-
O cutuCÃO roda em produção no [Railway](https://railway.app):
190+
O cutuCÃO roda em produção em uma VM gratuita do Oracle Cloud Free Tier, com o processo gerenciado por systemd. Consulte [docs/deploy-oracle-cloud.md](docs/deploy-oracle-cloud.md) para o guia completo de deploy no Oracle Cloud Free Tier, incluindo criação da instância, instalação do Node.js, serviço systemd e script de atualização.
190191

191-
1. Conecte o repositório GitHub ao Railway
192-
2. Configure as variáveis de ambiente no dashboard (nunca no código)
193-
3. Adicione um volume montado em `/app/data` para persistência do SQLite
194-
4. O deploy acontece automaticamente a cada push na `main`
192+
Outras opções de hospedagem: Fly.io ou qualquer VPS com Node.js. Em qualquer plataforma, configure as variáveis de ambiente fora do código e garanta persistência do arquivo SQLite em disco.
195193

196-
Outras opções de hospedagem: Fly.io, Oracle Cloud Free Tier, ou qualquer VPS com Node.js.
194+
## Documentação
195+
196+
Além deste README e da [SPEC.md](SPEC.md) (especificação técnica completa), a pasta `docs/` reúne:
197+
198+
- [docs/guia-operacional.md](docs/guia-operacional.md): premissas do servidor, convenções de nomenclatura, configuração via `config.json`, variáveis de ambiente, comandos de gestão de dados e troubleshooting.
199+
- [docs/deploy-oracle-cloud.md](docs/deploy-oracle-cloud.md): guia de deploy no Oracle Cloud Free Tier, do zero, com instância gratuita permanente e serviço systemd.
200+
- [docs/migracao-railway-oracle.md](docs/migracao-railway-oracle.md): registro da migração da hospedagem do Railway para o Oracle Cloud (referência histórica).
201+
- [docs/melhorias-es.md](docs/melhorias-es.md): proposta de melhorias de engenharia de software (Fases 5 e 6), com o estado de cada item.
197202

198203
## Contribuindo
199204

@@ -229,6 +234,7 @@ Usamos [Conventional Commits](https://www.conventionalcommits.org/):
229234
## Roadmap
230235

231236
- [x] **v1.0.0** — Lembretes, cobrança, resumo semanal, boas-vindas, comandos básicos
237+
- [x] **v1.1.0**: Engenharia de software: mensagens externalizadas em JSON, padrão Repository, testes automatizados (Vitest)
232238
- [x] **v1.2.0** — Configuração por arquivo (`config.json`): categorias, prefixos, horários, escalação
233239
- [x] **v1.3.0** — Gestão de dados: `/uso`, `/exportar` (JSON por DM), `/limpar` (com confirmação por botão)
234240
- [ ] Comandos `/config` para configuração em tempo real (sem reiniciar o bot)
@@ -248,7 +254,7 @@ O cutuCÃO foi criado para o ASSERT Lab, mas pode ser adaptado para qualquer gru
248254
5. Copie `config.example.json` para `config.json` e ajuste categorias, prefixos, horários e demais configurações
249255
6. Faça deploy
250256

251-
O bot detecta canais automaticamente — sem alterar código. Consulte o `config.example.json` para todas as opções de customização.
257+
O bot detecta canais automaticamente, sem alterar código. Consulte o `config.example.json` para todas as opções de customização. Para o deploy, o [guia do Oracle Cloud](docs/deploy-oracle-cloud.md) cobre a instalação completa do zero em uma VM gratuita no Oracle Cloud Free Tier.
252258

253259
## Licença
254260

‎SPEC.md‎

Lines changed: 50 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# cutuCÃO 🐕 — Especificação Técnica
22

3-
**Projeto:** cutuCÃO — Bot Discord do ASSERT Lab (CIn-UFPE) **Mascote:** Vira-lata caramelo com megafone **Objetivo:** Automatizar o acompanhamento de orientandos, substituindo o Carl-bot por uma solução própria com controle total. **Stack:** TypeScript + discord.js **Hospedagem:** Nuvem (gratuito ou baixo custo) **Repositório:** `cutucao-bot`
3+
**Projeto:** cutuCÃO — Bot Discord do ASSERT Lab (CIn-UFPE) **Mascote:** Vira-lata caramelo com megafone **Objetivo:** Automatizar o acompanhamento de orientandos, substituindo o Carl-bot por uma solução própria com controle total. **Stack:** TypeScript + discord.js **Hospedagem:** Oracle Cloud Free Tier (VPS com Node.js + systemd) **Repositório:** `cutucao-bot`
44

55
---
66

@@ -106,18 +106,29 @@ Dúvidas? É só perguntar no #café!
106106

107107
### 2.4. Comandos utilitários
108108

109+
**Implementados:**
110+
111+
| Comando | Descrição | Quem pode usar |
112+
| ------------------- | ------------------------------------------------------------- | -------------- |
113+
| `/template` | Exibe o template de check-in para copiar e colar | Todos |
114+
| `/ajuda` | Exibe lista de comandos disponíveis | Todos |
115+
| `/status` | Mostra o status de check-in da semana (quem postou, quem não) | Orientador |
116+
| `/resumo #canal` | Mostra o histórico de check-ins do canal (semanas configuráveis) | Orientador |
117+
| `/uso` | Estatísticas do banco (registros, canais, tamanho, breakdown por nível) | Orientador |
118+
| `/exportar` | Exporta registros em JSON (DM, filtros: canal/nível/período/tudo) | Orientador |
119+
| `/limpar` | Remove registros do banco com confirmação obrigatória por botão | Orientador |
120+
| `/teste-lembrete` | Dispara manualmente o job de lembrete de check-in | Orientador |
121+
| `/teste-boas-vindas`| Simula a mensagem de boas-vindas no canal de entrada | Orientador |
122+
123+
**Planejados (roadmap, ainda não implementados):**
124+
109125
| Comando | Descrição | Quem pode usar |
110126
| -------------------- | ------------------------------------------------------------- | -------------- |
111-
| `/template` | Exibe o template de check-in para copiar e colar | Todos |
112-
| `/status` | Mostra o status de check-in da semana (quem postou, quem não) | Orientador |
113-
| `/resumo @aluno` | Mostra o histórico de check-ins do aluno (últimas 4 semanas) | Orientador |
114-
| `/uso` | Estatísticas do banco (registros, canais, tamanho, breakdown por nível) | Orientador |
115-
| `/exportar` | Exporta registros em JSON (DM, filtros: canal/nível/período/tudo) | Orientador |
116-
| `/limpar` | Remove registros do banco com confirmação obrigatória por botão | Orientador |
117127
| `/config canais` | Lista os canais monitorados e permite adicionar/remover | Orientador |
118128
| `/config orientador` | Define quem recebe os resumos semanais (por ID do Discord) | Orientador |
119129
| `/config horarios` | Ajusta horários de lembrete, cobrança e resumo | Orientador |
120-
| `/ajuda` | Exibe lista de comandos disponíveis | Todos |
130+
131+
Até que os comandos `/config` existam, categorias, prefixos, canal de boas-vindas e horários são ajustados via `config.json` (seção 10), com reinício do bot.
121132

122133
### 2.4.1. Comandos de gestão de dados (orientador)
123134

@@ -209,24 +220,29 @@ cutucao-bot/
209220
│ ├── database.ts # Setup e queries SQLite
210221
│ ├── commands/
211222
│ │ ├── template.ts # /template
223+
│ │ ├── ajuda.ts # /ajuda
212224
│ │ ├── status.ts # /status
213-
│ │ ├── resumo.ts # /resumo @aluno
214-
│ │ ├── config.ts # /config (subcomandos)
215-
│ │ └── ajuda.ts # /ajuda
225+
│ │ ├── resumo.ts # /resumo #canal
226+
│ │ ├── uso.ts # /uso
227+
│ │ ├── exportar.ts # /exportar
228+
│ │ ├── limpar.ts # /limpar (+ limparState.ts)
229+
│ │ ├── testeLembrete.ts # /teste-lembrete
230+
│ │ └── testeBoasVindas.ts # /teste-boas-vindas
216231
│ ├── events/
217232
│ │ ├── ready.ts # Inicialização, registro de comandos
218233
│ │ ├── guildMemberAdd.ts # Boas-vindas
219234
│ │ ├── messageCreate.ts # Detecta check-ins nos canais monitorados
220-
│ │ └── channelCreate.ts # Detecta novos canais na categoria Orientações
235+
│ │ ├── channelCreate.ts # Detecta novos canais na categoria Orientações
236+
│ │ └── interactionCreate.ts # Roteia slash commands e botões
221237
│ ├── jobs/
222238
│ │ ├── scheduler.ts # Setup do node-cron
223239
│ │ ├── lembrete.ts # Job de segunda 09:00
224240
│ │ ├── cobranca.ts # Job de quarta 09:00
225241
│ │ └── resumo.ts # Job de sexta 18:00
226-
│ └── utils/
227-
│ ├── canais.ts # Helpers para identificar canais de orientação
228-
│ ├── formatters.ts # Formatação de mensagens
229-
│ └── semana.ts # Cálculo de semana ISO, datas
242+
│ ├── repositories/ # Padrão Repository (checkins e configuração)
243+
│ ├── mensagens/ # Templates de mensagens externalizados (templates.json)
244+
│ ├── config/ # Carregamento e validação do config.json
245+
│ └── utils/ # Helpers (canais, formatação, semana ISO, validação, log)
230246
├── package.json
231247
├── tsconfig.json
232248
├── .env # DISCORD_TOKEN, GUILD_ID, ORIENTADOR_ID
@@ -328,31 +344,23 @@ TZ=America/Recife
328344

329345
## 7. Hospedagem
330346

331-
### Opção recomendada: Railway (https://railway.app)
347+
### Opção recomendada: Oracle Cloud Free Tier
332348

333-
- **Plano gratuito:** $5/mês de crédito gratuito (mais que suficiente para um bot leve).
334-
- Deploy direto do GitHub.
335-
- Suporte nativo a Node.js/TypeScript.
336-
- Persistent disk para o SQLite.
337-
- Boa confiabilidade e uptime.
349+
- **Custo:** gratuito permanente (não é trial). Uma VM AMD Micro (1 OCPU, 1 GB RAM) é suficiente; o bot consome menos de 30 MB.
350+
- VM completa com controle total, processo gerenciado por systemd (reinício automático após crash ou reboot).
351+
- Sem limites de tempo e sem suspensão por inatividade.
352+
- Persistência do SQLite em disco local da instância.
353+
354+
O guia completo de deploy (criação da instância, Node.js, systemd, script de atualização) está em [docs/deploy-oracle-cloud.md](docs/deploy-oracle-cloud.md).
338355

339356
### Alternativas
340357

341-
| Plataforma | Custo | Observações |
358+
| Plataforma | Custo | Observações |
342359
| -------------------------- | ------------------------- | --------------------------------------------------------------------------------------------- |
343-
| **Render** (render.com) | Gratuito (com limitações) | Plano free pode suspender após inatividade — ruim para bots que precisam estar sempre online. |
344-
| **Fly.io** | Gratuito (com limites) | Bom para bots leves. Requer um pouco mais de configuração. |
345-
| **Oracle Cloud Free Tier** | Gratuito permanente | VM completa gratuita. Mais trabalho de setup, mas sem limites de tempo. |
346-
| **VPS própria** | ~$5/mês | DigitalOcean, Hetzner. Controle total. |
347-
348-
### Setup no Railway
349-
350-
```bash
351-
# 1. Criar repositório no GitHub com o código do bot
352-
# 2. Conectar o repositório ao Railway
353-
# 3. Configurar variáveis de ambiente no dashboard do Railway
354-
# 4. Deploy automático a cada push
355-
```
360+
| **Fly.io** | Gratuito (com limites) | Bom para bots leves; requer um pouco mais de configuração. |
361+
| **VPS própria** | ~$5/mês | DigitalOcean, Hetzner; controle total, mesma abordagem de Node.js + systemd. |
362+
| **Railway** (railway.app) | $5/mês de crédito | Alternativa histórica: foi a hospedagem original do projeto (deploy direto do GitHub, persistent disk). Migrado para Oracle Cloud. |
363+
| **Render** (render.com) | Gratuito (com limitações) | Plano free pode suspender após inatividade; ruim para bots que precisam estar sempre online. |
356364

357365
---
358366

@@ -398,7 +406,7 @@ Esta seção define os requisitos de segurança do cutuCÃO. O bot opera em um s
398406
**Token do bot:**
399407

400408
- NUNCA commitado no repositório. O `.gitignore` deve incluir `.env`, `*.db`, `data/`, e qualquer arquivo de configuração local.
401-
- Armazenado exclusivamente via variáveis de ambiente da plataforma de hospedagem (Railway, Fly.io, etc.).
409+
- Armazenado exclusivamente via variáveis de ambiente da plataforma de hospedagem (no Oracle Cloud, via arquivo `.env` lido pelo systemd; em PaaS como Fly.io, via dashboard).
402410
- Rotação do token a cada 6 meses ou imediatamente em caso de suspeita de comprometimento (via Discord Developer Portal → Bot → Reset Token).
403411
- Se o repositório for público, habilitar o GitHub Secret Scanning para detecção automática de tokens expostos.
404412

@@ -416,7 +424,7 @@ dist/
416424
**Variáveis de ambiente no CI/CD:**
417425

418426
- Nunca usar variáveis de ambiente em arquivos de configuração do repositório (ex: `docker-compose.yml` com valores hardcoded).
419-
- No Railway/Fly.io, configurar via dashboard — nunca via CLI em logs compartilhados.
427+
- No Oracle Cloud, manter o `.env` com permissões restritas na VM (fora do Git); em PaaS, configurar via dashboard, nunca via CLI em logs compartilhados.
420428

421429
### 9.3. Princípio do menor privilégio
422430

@@ -457,7 +465,7 @@ O bot deve recusar operar em qualquer servidor que não seja o GUILD_ID configur
457465

458466
**Toda entrada do usuário é potencialmente maliciosa.** Isso inclui:
459467

460-
- Parâmetros de slash commands (`/config horarios`, `/resumo @aluno`)
468+
- Parâmetros de slash commands (`/config horarios`, `/resumo #canal`)
461469
- Nomes de canais (usados para extrair nível phd/msc/bsc)
462470
- Nomes de usuário (usados em mensagens de boas-vindas)
463471

@@ -557,7 +565,7 @@ db.exec(`SELECT * FROM checkins WHERE canalId = '${canalId}'`);
557565

558566
**Backup:**
559567

560-
- Configurar backup automático semanal do arquivo `.db` (no Railway, usar o persistent disk).
568+
- Configurar backup automático semanal do arquivo `.db` (no Oracle Cloud, um cron na VM copiando `data/cutucao.db` para outro diretório ou bucket).
561569
- Se usar Turso, os backups são automáticos.
562570
- O arquivo de banco NUNCA deve estar no repositório Git.
563571

@@ -624,7 +632,7 @@ async function enviarComRateLimit(
624632

625633
### 9.11. Segurança na hospedagem
626634

627-
**Railway / Fly.io / qualquer PaaS:**
635+
**Oracle Cloud / Fly.io / qualquer VPS ou PaaS:**
628636

629637
- Habilitar 2FA (autenticação de dois fatores) na conta da plataforma de hospedagem.
630638
- Habilitar 2FA na conta do Discord Developer Portal.
@@ -679,7 +687,7 @@ Antes de colocar o cutuCÃO em produção, verificar todos os itens:
679687
- [x] Resumo semanal para o orientador (sexta 18:00) com ephemeral DM
680688
- [x] Controle de acesso a comandos (seção 9.5)
681689
- [x] Sanitização de entrada em todos os inputs (seção 9.4)
682-
- [ ] Deploy no Railway com 2FA habilitado
690+
- [x] Deploy no Oracle Cloud Free Tier (systemd) com 2FA habilitado
683691
- [ ] Executar checklist de segurança (seção 9.13)
684692

685693
### Fase 2 — Complementos

‎docs/deploy-oracle-cloud.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,7 @@ sudo journalctl -u cutucao --since "24 hours ago"
377377
| Shape | VM.Standard.E2.1.Micro |
378378
| CPU / RAM | 1 OCPU / 1 GB |
379379
| OS | Ubuntu 24.04 LTS |
380+
| Node.js | 20+ (guia instala 20.x) |
380381
| Custo | Gratuito permanente |
381382
| Usuário SSH | `ubuntu` |
382383
| Diretório do bot | `/home/ubuntu/cutucao-bot` |

0 commit comments

Comments
 (0)