You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit b2b98e1
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: README.md
+16-10Lines changed: 16 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -38,21 +38,22 @@ O cutuCÃO nasce de uma filosofia simples: **o aluno é dono do próprio progres
38
38
|`/exportar`| Exporta registros em JSON com filtros (canal, nível, período, tudo) | Orientador |
39
39
|`/limpar`| Remove registros com confirmação obrigatória e opção de exportar antes | Orientador |
40
40
|`/teste-lembrete`| Dispara manualmente o job de lembrete | Orientador |
41
+
|`/teste-boas-vindas`| Simula a mensagem de boas-vindas no canal de entrada | Orientador |
41
42
42
43
**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.
43
44
44
45
## Stack
45
46
46
-
-**Runtime:** Node.js 18+
47
+
-**Runtime:** Node.js 20+
47
48
-**Linguagem:** TypeScript
48
49
-**Framework:** discord.js v14
49
50
-**Banco de dados:** SQLite (via better-sqlite3)
50
51
-**Agendamento:** node-cron
51
-
-**Hospedagem:**Railway
52
+
-**Hospedagem:**Oracle Cloud Free Tier (VPS com Node.js + systemd)
52
53
53
54
## Pré-requisitos
54
55
55
-
-[Node.js](https://nodejs.org/)18 ou superior
56
+
-[Node.js](https://nodejs.org/)20 ou superior
56
57
-[Git](https://git-scm.com/)
57
58
- Uma aplicação de bot criada no [Discord Developer Portal](https://discord.com/developers/applications)
58
59
@@ -186,14 +187,18 @@ Consulte a [seção 9 da SPEC.md](SPEC.md) para detalhes completos.
186
187
187
188
## Deploy
188
189
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.
190
191
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.
195
193
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.
-[x]**v1.1.0**: Engenharia de software: mensagens externalizadas em JSON, padrão Repository, testes automatizados (Vitest)
232
238
-[x]**v1.2.0** — Configuração por arquivo (`config.json`): categorias, prefixos, horários, escalação
233
239
-[x]**v1.3.0** — Gestão de dados: `/uso`, `/exportar` (JSON por DM), `/limpar` (com confirmação por botão)
234
240
-[ ] 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
248
254
5. Copie `config.example.json` para `config.json` e ajuste categorias, prefixos, horários e demais configurações
249
255
6. Faça deploy
250
256
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.
Copy file name to clipboardExpand all lines: SPEC.md
+50-42Lines changed: 50 additions & 42 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# cutuCÃO 🐕 — Especificação Técnica
2
2
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`
4
4
5
5
---
6
6
@@ -106,18 +106,29 @@ Dúvidas? É só perguntar no #café!
|`/limpar`| Remove registros do banco com confirmação obrigatória por botão | Orientador |
117
127
|`/config canais`| Lista os canais monitorados e permite adicionar/remover | Orientador |
118
128
|`/config orientador`| Define quem recebe os resumos semanais (por ID do Discord) | Orientador |
119
129
|`/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.
121
132
122
133
### 2.4.1. Comandos de gestão de dados (orientador)
123
134
@@ -209,24 +220,29 @@ cutucao-bot/
209
220
│ ├── database.ts # Setup e queries SQLite
210
221
│ ├── commands/
211
222
│ │ ├── template.ts # /template
223
+
│ │ ├── ajuda.ts # /ajuda
212
224
│ │ ├── 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
216
231
│ ├── events/
217
232
│ │ ├── ready.ts # Inicialização, registro de comandos
218
233
│ │ ├── guildMemberAdd.ts # Boas-vindas
219
234
│ │ ├── messageCreate.ts # Detecta check-ins nos canais monitorados
-**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).
# 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. |
356
364
357
365
---
358
366
@@ -398,7 +406,7 @@ Esta seção define os requisitos de segurança do cutuCÃO. O bot opera em um s
398
406
**Token do bot:**
399
407
400
408
- 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).
402
410
- Rotação do token a cada 6 meses ou imediatamente em caso de suspeita de comprometimento (via Discord Developer Portal → Bot → Reset Token).
403
411
- Se o repositório for público, habilitar o GitHub Secret Scanning para detecção automática de tokens expostos.
404
412
@@ -416,7 +424,7 @@ dist/
416
424
**Variáveis de ambiente no CI/CD:**
417
425
418
426
- 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.
420
428
421
429
### 9.3. Princípio do menor privilégio
422
430
@@ -457,7 +465,7 @@ O bot deve recusar operar em qualquer servidor que não seja o GUILD_ID configur
457
465
458
466
**Toda entrada do usuário é potencialmente maliciosa.** Isso inclui:
459
467
460
-
- Parâmetros de slash commands (`/config horarios`, `/resumo @aluno`)
468
+
- Parâmetros de slash commands (`/config horarios`, `/resumo #canal`)
461
469
- Nomes de canais (usados para extrair nível phd/msc/bsc)
462
470
- Nomes de usuário (usados em mensagens de boas-vindas)
463
471
@@ -557,7 +565,7 @@ db.exec(`SELECT * FROM checkins WHERE canalId = '${canalId}'`);
557
565
558
566
**Backup:**
559
567
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).
561
569
- Se usar Turso, os backups são automáticos.
562
570
- O arquivo de banco NUNCA deve estar no repositório Git.
563
571
@@ -624,7 +632,7 @@ async function enviarComRateLimit(
624
632
625
633
### 9.11. Segurança na hospedagem
626
634
627
-
**Railway / Fly.io / qualquer PaaS:**
635
+
**Oracle Cloud / Fly.io / qualquer VPS ou PaaS:**
628
636
629
637
- Habilitar 2FA (autenticação de dois fatores) na conta da plataforma de hospedagem.
630
638
- 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:
679
687
-[x] Resumo semanal para o orientador (sexta 18:00) com ephemeral DM
680
688
-[x] Controle de acesso a comandos (seção 9.5)
681
689
-[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
0 commit comments