docs: create Codigos/PassoaPasso

This commit is contained in:
2026-07-24 23:22:02 +00:00
committed by Bruno Santos
parent 608f37edc6
commit 51401ee208

647
Codigos/PassoaPasso.md Normal file
View File

@@ -0,0 +1,647 @@
---
title: Gpt custom
description:
published: true
date: 2026-07-24T23:21:58.427Z
tags:
editor: markdown
dateCreated: 2026-07-24T23:21:58.427Z
---
# GPT Custom: Guia Final de Instalacao no LXC Proxmox
Este guia instala e publica a aplicacao que esta nesta pasta. O projeto inclui:
- login individual com sessoes salvas no PostgreSQL;
- cadastro publico opcional;
- historico de conversas;
- upload privado de PDF, TXT, CSV, DOCX, PNG e JPEG;
- uso de arquivos nas perguntas enviadas a OpenAI;
- registro de tokens e custo estimado por usuario;
- limite mensal individual;
- painel administrativo;
- Nginx, HTTPS, PM2 e scripts de backup.
> A assinatura do ChatGPT nao inclui creditos da OpenAI API. Esta aplicacao usa uma chave da API e a cobranca ocorre na conta da plataforma OpenAI.
## 1. Arquitetura
```text
Navegador
|
| HTTPS
v
Nginx no LXC
|
v
Next.js 16 + React 19
|-- autenticacao e sessoes
|-- chat e historico
|-- upload privado
|-- controle de limite
|
|-- PostgreSQL -> usuarios, sessoes, conversas e consumo
|-- Disco LXC -> arquivos privados
`-- OpenAI API -> respostas e leitura de anexos
```
## 2. Requisitos
No Proxmox, crie um container com:
```text
Template: Debian 12 ou Ubuntu 24.04
CPU: 2 a 4 cores
RAM: 4 GB
Disco: 30 GB ou mais
Unprivileged container: sim
Start at boot: sim
Rede: IP fixo ou DHCP reservado
```
Tambem sera necessario:
- um dominio ou subdominio, por exemplo `gpt.seudominio.com`;
- redirecionamento das portas 80 e 443 para o LXC, se o acesso vier da internet;
- uma chave criada na plataforma OpenAI;
- saldo ou faturamento ativo na OpenAI API.
## 3. Conteudo da pasta
```text
gpt_custom/
|-- app/ telas e APIs do Next.js
|-- components/ componentes React
|-- lib/ autenticacao, banco, OpenAI e custos
|-- prisma/
| |-- schema.prisma estrutura do banco
| `-- migrations/ migration inicial
|-- deploy/
| |-- ecosystem.config.cjs configuracao do PM2
| `-- nginx-gpt-custom.conf configuracao do Nginx
|-- scripts/
| |-- install-lxc.sh prepara o LXC
| |-- create-admin.ts cria a conta administrativa
| `-- backup.sh backup do banco e uploads
|-- .env.example modelo das variaveis
|-- package.json dependencias e comandos
`-- GUIA-PASSO-A-PASSO.md este documento
```
## 4. Entrar no LXC
Pelo host Proxmox:
```bash
pct enter ID_DO_CONTAINER
```
Ou por SSH:
```bash
ssh root@IP_DO_CONTAINER
```
## 5. Copiar o projeto para o LXC
Uma opcao e copiar por SCP a partir do computador que contem a pasta:
```bash
scp -r gpt_custom root@IP_DO_CONTAINER:/opt/
```
Outra opcao e manter o projeto em um repositorio Git privado:
```bash
git clone URL_DO_REPOSITORIO /opt/gpt_custom
```
Nao envie `.env`, chaves ou senhas para o Git.
## 6. Preparar o LXC
Entre na pasta e execute o instalador:
```bash
cd /opt/gpt_custom
chmod +x scripts/install-lxc.sh scripts/backup.sh
./scripts/install-lxc.sh
```
O script instala:
- Node.js 22;
- PostgreSQL;
- Nginx;
- Certbot;
- PM2;
- ferramentas de compilacao.
Confirme:
```bash
node -v
npm -v
psql --version
nginx -v
pm2 -v
```
## 7. Criar o banco PostgreSQL
Gere primeiro uma senha forte para o banco:
```bash
openssl rand -base64 32
```
Entre no PostgreSQL:
```bash
sudo -u postgres psql
```
Execute, substituindo a senha:
```sql
CREATE USER gpt_custom WITH ENCRYPTED PASSWORD 'SENHA_FORTE_DO_BANCO';
CREATE DATABASE gpt_custom OWNER gpt_custom;
\q
```
O banco fica acessivel apenas localmente no LXC. Nao abra a porta 5432 no roteador.
## 8. Criar o arquivo de configuracao
```bash
cd /opt/gpt_custom
cp .env.example .env
nano .env
```
Preencha:
```env
DATABASE_URL="postgresql://gpt_custom:SENHA_FORTE_DO_BANCO@127.0.0.1:5432/gpt_custom"
APP_URL="https://gpt.seudominio.com"
SESSION_COOKIE_NAME="gpt_custom_session"
SESSION_DAYS="30"
OPENAI_API_KEY="SUA_CHAVE_OPENAI"
OPENAI_MODEL="gpt-5.6-luna"
OPENAI_REASONING_EFFORT="low"
OPENAI_MAX_OUTPUT_TOKENS="2048"
MODEL_INPUT_PRICE_PER_MILLION="1.00"
MODEL_CACHED_INPUT_PRICE_PER_MILLION="0.10"
MODEL_OUTPUT_PRICE_PER_MILLION="6.00"
UPLOAD_DIR="/var/lib/gpt-custom/uploads"
MAX_UPLOAD_BYTES="10485760"
DEFAULT_MONTHLY_LIMIT_USD="5.00"
ALLOW_REGISTRATION="false"
ADMIN_EMAIL="seu-email@dominio.com"
ADMIN_PASSWORD="UMA_SENHA_ADMIN_FORTE"
ADMIN_NAME="Administrador"
```
Proteja o arquivo:
```bash
chown gpt-custom:gpt-custom .env
chmod 600 .env
```
### Escolha do modelo
O exemplo usa `gpt-5.6-luna`, pois e a opcao da familia GPT-5.6 voltada a alto volume e menor custo. Para mais qualidade, altere para `gpt-5.6-terra` ou `gpt-5.6-sol`, se estiver disponivel em sua conta.
Ao trocar o modelo, atualize tambem os tres precos por milhao de tokens. Consulte sempre a pagina oficial de precos. Os valores no exemplo representam a referencia consultada em 24 de julho de 2026 e podem mudar.
## 9. Instalar dependencias
```bash
cd /opt/gpt_custom
npm ci
```
`npm ci` usa exatamente as versoes registradas no `package-lock.json`.
## 10. Criar as tabelas
```bash
npm run db:deploy
```
Esse comando aplica os arquivos em `prisma/migrations`.
Para conferir o status:
```bash
npx prisma migrate status
```
## 11. Criar o administrador
Confirme que `ADMIN_EMAIL` e `ADMIN_PASSWORD` estao no `.env` e execute:
```bash
npm run admin:create
```
O comando pode ser executado novamente para redefinir a senha do mesmo administrador.
Depois, remova `ADMIN_PASSWORD` do `.env` ou substitua por um valor longo que nao seja reutilizado. O hash da senha ja esta salvo no PostgreSQL.
## 12. Testar em modo de desenvolvimento
```bash
npm run dev
```
No computador da mesma rede, acesse:
```text
http://IP_DO_CONTAINER:3000
```
Entre com a conta administrativa. Verifique:
1. criacao de uma nova conversa;
2. envio de uma mensagem;
3. abertura do historico;
4. envio de um PDF pequeno;
5. tela de consumo;
6. painel de administracao.
Pare com `Ctrl+C`.
## 13. Gerar a versao de producao
```bash
npm run lint
npm run typecheck
npm run build
```
Os tres comandos devem terminar sem erros.
## 14. Ajustar permissoes
```bash
chown -R gpt-custom:gpt-custom /opt/gpt_custom
chown -R gpt-custom:gpt-custom /var/lib/gpt-custom
chmod 750 /var/lib/gpt-custom/uploads
```
A aplicacao nao deve rodar como `root`.
## 15. Iniciar com PM2
O arquivo fornecido usa `/opt/gpt_custom` e a porta 3000.
```bash
cd /opt/gpt_custom
sudo -u gpt-custom pm2 start deploy/ecosystem.config.cjs
sudo -u gpt-custom pm2 save
```
Para ativar no boot:
```bash
pm2 startup systemd -u gpt-custom --hp /home/gpt-custom
```
O PM2 exibira um comando adicional. Execute exatamente o comando mostrado e depois:
```bash
sudo -u gpt-custom pm2 save
```
Comandos uteis:
```bash
sudo -u gpt-custom pm2 status
sudo -u gpt-custom pm2 logs gpt-custom
sudo -u gpt-custom pm2 restart gpt-custom
```
## 16. Configurar o Nginx
Copie o modelo:
```bash
cp deploy/nginx-gpt-custom.conf /etc/nginx/sites-available/gpt-custom
nano /etc/nginx/sites-available/gpt-custom
```
Troque:
```text
gpt.seudominio.com
```
pelo dominio real.
Ative:
```bash
ln -s /etc/nginx/sites-available/gpt-custom /etc/nginx/sites-enabled/gpt-custom
rm -f /etc/nginx/sites-enabled/default
nginx -t
systemctl reload nginx
```
O arquivo ja inclui:
- limite de 10 MB por upload;
- limite de tentativas no login;
- limite de chamadas nas APIs;
- timeout maior para respostas do modelo.
## 17. Configurar DNS
No provedor do dominio, crie um registro:
```text
Tipo: A
Nome: gpt
Valor: IP_PUBLICO_DO_SERVIDOR
```
Aguarde a propagacao e confirme:
```bash
nslookup gpt.seudominio.com
```
Se o Proxmox estiver atras de um roteador, encaminhe as portas TCP 80 e 443 para o IP do LXC.
## 18. Ativar HTTPS
```bash
certbot --nginx -d gpt.seudominio.com
```
Teste a renovacao:
```bash
certbot renew --dry-run
```
Depois, confirme no `.env`:
```env
APP_URL="https://gpt.seudominio.com"
```
Reinicie:
```bash
sudo -u gpt-custom pm2 restart gpt-custom
```
## 19. Criar usuarios
Por padrao:
```env
ALLOW_REGISTRATION="false"
```
Isso impede cadastros publicos. Para permitir temporariamente:
```env
ALLOW_REGISTRATION="true"
```
Reinicie o processo, crie a conta pela pagina `/register` e desative novamente.
O administrador tambem pode definir:
- usuario ativo ou bloqueado;
- perfil comum ou administrador;
- limite mensal em dolares.
Ao bloquear um usuario, as sessoes dele sao revogadas.
## 20. Como funciona o controle de custo
Para cada resposta, a aplicacao salva:
- modelo;
- tokens de entrada;
- tokens de entrada em cache;
- tokens de saida;
- tokens de raciocinio;
- total de tokens;
- custo estimado;
- identificador da resposta.
Antes de chamar a OpenAI, a aplicacao soma o custo do mes. Se o limite foi atingido, responde com HTTP 429 e nao realiza a chamada.
Uma trava no registro do usuario permite somente uma geracao simultanea por usuario. Isso reduz o risco de varias chamadas ultrapassarem o limite ao mesmo tempo.
O valor e uma estimativa calculada a partir dos precos configurados. Compare periodicamente com o painel oficial da OpenAI.
## 21. Como funcionam os uploads
Os arquivos ficam em:
```text
/var/lib/gpt-custom/uploads/ID_DO_USUARIO/
```
O navegador nunca recebe o caminho fisico. O backend verifica a sessao e a propriedade antes de permitir download.
Protecoes implementadas:
- tamanho maximo configuravel;
- lista de tipos permitidos;
- verificacao do tipo real do arquivo;
- nome fisico aleatorio;
- hash SHA-256;
- pasta fora de `public/`;
- exclusao junto com a conversa.
Arquivos anexados sao enviados a API somente quando usados em uma mensagem.
## 22. Backup manual
Carregue as variaveis e execute:
```bash
cd /opt/gpt_custom
set -a
source .env
set +a
chmod +x scripts/backup.sh
scripts/backup.sh
```
O resultado fica em:
```text
/var/backups/gpt-custom
```
Sao criados:
- `database-DATA.dump`;
- `uploads-DATA.tar.gz`.
Copie os backups para outro equipamento ou armazenamento. Um backup no mesmo disco nao protege contra falha do servidor.
## 23. Agendar backup
Edite o cron do root:
```bash
crontab -e
```
Exemplo diario as 02:30:
```cron
30 2 * * * cd /opt/gpt_custom && set -a && . ./.env && set +a && ./scripts/backup.sh >> /var/log/gpt-custom-backup.log 2>&1
```
O script nao apaga backups antigos automaticamente. Defina sua politica de retencao depois de confirmar que as copias externas funcionam.
## 24. Restaurar o banco
Crie um banco vazio e restaure:
```bash
sudo -u postgres dropdb --if-exists gpt_custom_restore
sudo -u postgres createdb -O gpt_custom gpt_custom_restore
pg_restore --dbname="postgresql://gpt_custom:SENHA@127.0.0.1:5432/gpt_custom_restore" /var/backups/gpt-custom/database-DATA.dump
```
Restaure os uploads em uma pasta de teste antes de substituir qualquer dado de producao.
## 25. Atualizar a aplicacao
Antes da atualizacao:
```bash
cd /opt/gpt_custom
set -a && source .env && set +a
scripts/backup.sh
```
Depois de receber os novos arquivos:
```bash
npm ci
npm run db:deploy
npm run build
sudo -u gpt-custom pm2 restart gpt-custom
```
Confira:
```bash
sudo -u gpt-custom pm2 logs gpt-custom --lines 100
```
## 26. Diagnostico
### Erro de conexao com banco
```bash
systemctl status postgresql
sudo -u postgres psql -d gpt_custom -c "SELECT 1;"
```
Confirme usuario, senha e URL no `.env`.
### Erro 502 no Nginx
```bash
sudo -u gpt-custom pm2 status
curl http://127.0.0.1:3000
nginx -t
```
### Erro da OpenAI
Confirme:
- `OPENAI_API_KEY`;
- faturamento e saldo;
- disponibilidade do modelo;
- limites da conta;
- logs do PM2.
Nunca publique a chave em mensagens, capturas de tela ou logs.
### Upload rejeitado
Confira os dois limites:
```text
MAX_UPLOAD_BYTES no .env
client_max_body_size no Nginx
```
Confira tambem se a extensao e o tipo real estao na lista permitida em `lib/storage.ts`.
## 27. Seguranca antes de publicar
- use HTTPS;
- mantenha `ALLOW_REGISTRATION=false` quando nao precisar;
- use senhas unicas e fortes;
- nao exponha PostgreSQL na internet;
- nao execute a aplicacao como root;
- proteja `.env` com permissao 600;
- mantenha Node.js e dependencias atualizados;
- acompanhe consumo e erros;
- teste restauracao de backup;
- prefira VPN se o acesso for apenas pessoal ou interno;
- defina uma politica de retencao e exclusao de conversas.
## 28. Comandos de verificacao final
```bash
cd /opt/gpt_custom
npm run lint
npm run typecheck
npm run build
sudo -u gpt-custom pm2 status
nginx -t
curl -I https://gpt.seudominio.com
```
Teste tambem pelo navegador em uma janela anonima.
## 29. Referencias oficiais
- [OpenAI: modelos](https://developers.openai.com/api/docs/models)
- [OpenAI: Responses API](https://developers.openai.com/api/reference/resources/responses)
- [OpenAI: arquivos](https://developers.openai.com/api/reference/resources/files)
- [OpenAI: precos](https://openai.com/api/pricing/)
- [Next.js: Route Handlers](https://nextjs.org/docs/app/getting-started/route-handlers)
- [Prisma com Next.js](https://www.prisma.io/docs/guides/frameworks/nextjs)
- [PostgreSQL](https://www.postgresql.org/docs/)
- [PM2](https://pm2.keymetrics.io/docs/usage/quick-start/)
- [Certbot](https://certbot.eff.org/)
## 30. Checklist de conclusao
- [ ] LXC criado e atualizado
- [ ] Node.js 22 e PostgreSQL instalados
- [ ] Banco e usuario PostgreSQL criados
- [ ] `.env` preenchido e protegido
- [ ] Dependencias instaladas com `npm ci`
- [ ] Migration aplicada
- [ ] Administrador criado
- [ ] Lint, tipos e build aprovados
- [ ] PM2 ativo no boot
- [ ] Nginx configurado
- [ ] DNS apontado
- [ ] HTTPS ativado
- [ ] Chat e upload testados
- [ ] Limite de usuario testado
- [ ] Backup criado e restauracao testada