Files
wiki/Codigos/PassoaPasso.md

14 KiB

title, description, published, date, tags, editor, dateCreated
title description published date tags editor dateCreated
Gpt custom true 2026-07-24T23:21:58.427Z markdown 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

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:

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

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:

pct enter ID_DO_CONTAINER

Ou por SSH:

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:

scp -r gpt_custom root@IP_DO_CONTAINER:/opt/

Outra opcao e manter o projeto em um repositorio Git privado:

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:

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:

node -v
npm -v
psql --version
nginx -v
pm2 -v

7. Criar o banco PostgreSQL

Gere primeiro uma senha forte para o banco:

openssl rand -base64 32

Entre no PostgreSQL:

sudo -u postgres psql

Execute, substituindo a senha:

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

cd /opt/gpt_custom
cp .env.example .env
nano .env

Preencha:

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:

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

cd /opt/gpt_custom
npm ci

npm ci usa exatamente as versoes registradas no package-lock.json.

10. Criar as tabelas

npm run db:deploy

Esse comando aplica os arquivos em prisma/migrations.

Para conferir o status:

npx prisma migrate status

11. Criar o administrador

Confirme que ADMIN_EMAIL e ADMIN_PASSWORD estao no .env e execute:

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

npm run dev

No computador da mesma rede, acesse:

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

npm run lint
npm run typecheck
npm run build

Os tres comandos devem terminar sem erros.

14. Ajustar permissoes

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.

cd /opt/gpt_custom
sudo -u gpt-custom pm2 start deploy/ecosystem.config.cjs
sudo -u gpt-custom pm2 save

Para ativar no boot:

pm2 startup systemd -u gpt-custom --hp /home/gpt-custom

O PM2 exibira um comando adicional. Execute exatamente o comando mostrado e depois:

sudo -u gpt-custom pm2 save

Comandos uteis:

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:

cp deploy/nginx-gpt-custom.conf /etc/nginx/sites-available/gpt-custom
nano /etc/nginx/sites-available/gpt-custom

Troque:

gpt.seudominio.com

pelo dominio real.

Ative:

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:

Tipo: A
Nome: gpt
Valor: IP_PUBLICO_DO_SERVIDOR

Aguarde a propagacao e confirme:

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

certbot --nginx -d gpt.seudominio.com

Teste a renovacao:

certbot renew --dry-run

Depois, confirme no .env:

APP_URL="https://gpt.seudominio.com"

Reinicie:

sudo -u gpt-custom pm2 restart gpt-custom

19. Criar usuarios

Por padrao:

ALLOW_REGISTRATION="false"

Isso impede cadastros publicos. Para permitir temporariamente:

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:

/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:

cd /opt/gpt_custom
set -a
source .env
set +a
chmod +x scripts/backup.sh
scripts/backup.sh

O resultado fica em:

/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:

crontab -e

Exemplo diario as 02:30:

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:

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:

cd /opt/gpt_custom
set -a && source .env && set +a
scripts/backup.sh

Depois de receber os novos arquivos:

npm ci
npm run db:deploy
npm run build
sudo -u gpt-custom pm2 restart gpt-custom

Confira:

sudo -u gpt-custom pm2 logs gpt-custom --lines 100

26. Diagnostico

Erro de conexao com banco

systemctl status postgresql
sudo -u postgres psql -d gpt_custom -c "SELECT 1;"

Confirme usuario, senha e URL no .env.

Erro 502 no Nginx

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:

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

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

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