docs: create Codigos/PassoaPasso
This commit is contained in:
647
Codigos/PassoaPasso.md
Normal file
647
Codigos/PassoaPasso.md
Normal 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
|
||||
Reference in New Issue
Block a user