406 lines
8.5 KiB
Markdown
406 lines
8.5 KiB
Markdown
---
|
|
title: GPT
|
|
description: Como criar um chat para o gpt pro
|
|
published: true
|
|
date: 2026-07-24T00:20:31.706Z
|
|
tags:
|
|
editor: markdown
|
|
dateCreated: 2026-07-24T00:20:31.706Z
|
|
---
|
|
|
|
# Guia: Aplicacao Web GPT em LXC no Proxmox
|
|
|
|
|
|
Sim. O caminho mais limpo e hospedar uma aplicacao web no **LXC** e deixar a chave da OpenAI somente no servidor.
|
|
|
|
A arquitetura fica assim:
|
|
|
|
```text
|
|
Voce no navegador
|
|
-> https://gpt.seudominio.com
|
|
-> Nginx no LXC
|
|
-> App Node.js/Next.js
|
|
-> OpenAI API
|
|
```
|
|
|
|
## 1. Criar o container LXC no Proxmox
|
|
|
|
No Proxmox, crie um CT com:
|
|
|
|
```text
|
|
Template: Debian 12 ou Ubuntu 24.04
|
|
CPU: 2 cores
|
|
RAM: 2 GB
|
|
Disco: 10-20 GB
|
|
Rede: IP fixo ou DHCP reservado
|
|
Unprivileged container: sim
|
|
Start at boot: sim
|
|
```
|
|
|
|
Depois entre no container:
|
|
|
|
```bash
|
|
pct enter ID_DO_CONTAINER
|
|
```
|
|
|
|
Ou por SSH:
|
|
|
|
```bash
|
|
ssh root@IP_DO_CONTAINER
|
|
```
|
|
|
|
## 2. Instalar dependencias
|
|
|
|
Dentro do LXC:
|
|
|
|
```bash
|
|
apt update && apt upgrade -y
|
|
apt install -y curl git nginx ca-certificates
|
|
```
|
|
|
|
Instale Node.js LTS:
|
|
|
|
```bash
|
|
curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
|
|
apt install -y nodejs
|
|
```
|
|
|
|
Confirme:
|
|
|
|
```bash
|
|
node -v
|
|
npm -v
|
|
```
|
|
|
|
## 3. Criar o app web
|
|
|
|
Crie uma pasta:
|
|
|
|
```bash
|
|
mkdir -p /opt/meu-gpt
|
|
cd /opt/meu-gpt
|
|
```
|
|
|
|
Crie um projeto Next.js:
|
|
|
|
```bash
|
|
npx create-next-app@latest .
|
|
```
|
|
|
|
Sugestao de escolhas:
|
|
|
|
```text
|
|
TypeScript: yes
|
|
ESLint: yes
|
|
Tailwind: yes
|
|
App Router: yes
|
|
src directory: no
|
|
Turbopack: no
|
|
Import alias: yes
|
|
```
|
|
|
|
Instale o SDK da OpenAI:
|
|
|
|
```bash
|
|
npm install openai
|
|
```
|
|
|
|
## 4. Configurar a chave da OpenAI
|
|
|
|
Crie o arquivo `.env.local`:
|
|
|
|
```bash
|
|
nano .env.local
|
|
```
|
|
|
|
Coloque:
|
|
|
|
```env
|
|
OPENAI_API_KEY=sua_chave_aqui
|
|
OPENAI_MODEL=gpt-4.1-mini
|
|
APP_PASSWORD=uma_senha_forte_aqui
|
|
```
|
|
|
|
Importante: essa chave **nunca** deve ir para o frontend.
|
|
|
|
## 5. Criar uma API de chat
|
|
|
|
Crie o arquivo:
|
|
|
|
```bash
|
|
nano app/api/chat/route.ts
|
|
```
|
|
|
|
Conteudo:
|
|
|
|
```ts
|
|
import OpenAI from "openai";
|
|
|
|
const client = new OpenAI({
|
|
apiKey: process.env.OPENAI_API_KEY,
|
|
});
|
|
|
|
export async function POST(req: Request) {
|
|
const { messages, password } = await req.json();
|
|
|
|
if (password !== process.env.APP_PASSWORD) {
|
|
return Response.json({ error: "Unauthorized" }, { status: 401 });
|
|
}
|
|
|
|
const response = await client.responses.create({
|
|
model: process.env.OPENAI_MODEL || "gpt-4.1-mini",
|
|
input: messages,
|
|
});
|
|
|
|
return Response.json({
|
|
text: response.output_text,
|
|
});
|
|
}
|
|
```
|
|
|
|
## 6. Criar tela simples de chat
|
|
|
|
Edite:
|
|
|
|
```bash
|
|
nano app/page.tsx
|
|
```
|
|
|
|
Com uma versao basica:
|
|
|
|
```tsx
|
|
"use client";
|
|
|
|
import { useState } from "react";
|
|
|
|
type Message = {
|
|
role: "user" | "assistant";
|
|
content: string;
|
|
};
|
|
|
|
export default function Home() {
|
|
const [password, setPassword] = useState("");
|
|
const [input, setInput] = useState("");
|
|
const [messages, setMessages] = useState<Message[]>([]);
|
|
const [loading, setLoading] = useState(false);
|
|
|
|
async function sendMessage() {
|
|
if (!input.trim()) return;
|
|
|
|
const nextMessages: Message[] = [
|
|
...messages,
|
|
{ role: "user", content: input },
|
|
];
|
|
|
|
setMessages(nextMessages);
|
|
setInput("");
|
|
setLoading(true);
|
|
|
|
const res = await fetch("/api/chat", {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
body: JSON.stringify({
|
|
password,
|
|
messages: nextMessages.map((m) => ({
|
|
role: m.role,
|
|
content: m.content,
|
|
})),
|
|
}),
|
|
});
|
|
|
|
const data = await res.json();
|
|
|
|
setLoading(false);
|
|
|
|
if (!res.ok) {
|
|
setMessages([
|
|
...nextMessages,
|
|
{ role: "assistant", content: data.error || "Erro ao responder." },
|
|
]);
|
|
return;
|
|
}
|
|
|
|
setMessages([
|
|
...nextMessages,
|
|
{ role: "assistant", content: data.text },
|
|
]);
|
|
}
|
|
|
|
return (
|
|
<main className="min-h-screen bg-zinc-950 text-zinc-100 p-6">
|
|
<div className="mx-auto max-w-3xl space-y-4">
|
|
<h1 className="text-2xl font-semibold">Meu GPT</h1>
|
|
|
|
<input
|
|
className="w-full rounded border border-zinc-700 bg-zinc-900 p-3"
|
|
type="password"
|
|
placeholder="Senha"
|
|
value={password}
|
|
onChange={(e) => setPassword(e.target.value)}
|
|
/>
|
|
|
|
<div className="min-h-[60vh] space-y-3 rounded border border-zinc-800 bg-zinc-900 p-4">
|
|
{messages.map((m, i) => (
|
|
<div
|
|
key={i}
|
|
className={m.role === "user" ? "text-blue-300" : "text-zinc-100"}
|
|
>
|
|
<strong>{m.role === "user" ? "Voce" : "GPT"}:</strong>{" "}
|
|
<span className="whitespace-pre-wrap">{m.content}</span>
|
|
</div>
|
|
))}
|
|
|
|
{loading && <div className="text-zinc-400">Respondendo...</div>}
|
|
</div>
|
|
|
|
<div className="flex gap-2">
|
|
<textarea
|
|
className="flex-1 rounded border border-zinc-700 bg-zinc-900 p-3"
|
|
placeholder="Digite sua mensagem..."
|
|
value={input}
|
|
onChange={(e) => setInput(e.target.value)}
|
|
/>
|
|
|
|
<button
|
|
className="rounded bg-blue-600 px-5 font-medium hover:bg-blue-500"
|
|
onClick={sendMessage}
|
|
disabled={loading}
|
|
>
|
|
Enviar
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
);
|
|
}
|
|
```
|
|
|
|
## 7. Testar localmente no LXC
|
|
|
|
```bash
|
|
npm run dev
|
|
```
|
|
|
|
Acesse:
|
|
|
|
```text
|
|
http://IP_DO_CONTAINER:3000
|
|
```
|
|
|
|
Se funcionar, pare com `Ctrl+C`.
|
|
|
|
## 8. Rodar em producao com PM2
|
|
|
|
```bash
|
|
npm install -g pm2
|
|
npm run build
|
|
pm2 start npm --name meu-gpt -- start
|
|
pm2 save
|
|
pm2 startup
|
|
```
|
|
|
|
O comando `pm2 startup` vai mostrar outro comando. Execute o comando que ele mostrar.
|
|
|
|
## 9. Configurar Nginx
|
|
|
|
Crie:
|
|
|
|
```bash
|
|
nano /etc/nginx/sites-available/meu-gpt
|
|
```
|
|
|
|
Conteudo:
|
|
|
|
```nginx
|
|
server {
|
|
listen 80;
|
|
server_name gpt.seudominio.com;
|
|
|
|
location / {
|
|
proxy_pass http://127.0.0.1:3000;
|
|
proxy_http_version 1.1;
|
|
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
|
|
proxy_set_header Upgrade $http_upgrade;
|
|
proxy_set_header Connection "upgrade";
|
|
}
|
|
}
|
|
```
|
|
|
|
Ative:
|
|
|
|
```bash
|
|
ln -s /etc/nginx/sites-available/meu-gpt /etc/nginx/sites-enabled/
|
|
nginx -t
|
|
systemctl reload nginx
|
|
```
|
|
|
|
## 10. Colocar HTTPS
|
|
|
|
Se voce tiver dominio apontando para o IP publico do servidor:
|
|
|
|
```bash
|
|
apt install -y certbot python3-certbot-nginx
|
|
certbot --nginx -d gpt.seudominio.com
|
|
```
|
|
|
|
Depois acesse:
|
|
|
|
```text
|
|
https://gpt.seudominio.com
|
|
```
|
|
|
|
## Observacoes importantes
|
|
|
|
Nao exponha a `OPENAI_API_KEY` no navegador.
|
|
|
|
Use senha forte ou login real antes de deixar publico.
|
|
|
|
Se quiser acessar so por VPN, melhor ainda.
|
|
|
|
Se for expor na internet, recomendo tambem configurar firewall, HTTPS e limite de requisicoes.
|
|
|
|
## Proximo passo opcional
|
|
|
|
Uma versao mais completa pode incluir:
|
|
|
|
- Login
|
|
- Historico de conversas
|
|
- Dockerfile
|
|
- PM2 pronto
|
|
- Upload de arquivos
|
|
- Controle de custo por usuario
|
|
- Deploy automatizado no LXC
|
|
|
|
## Linguagens e Tecnologias Usadas
|
|
|
|
Nesse projeto/guia foram usadas ou propostas estas linguagens e tecnologias:
|
|
|
|
- **Proxmox VE**: servidor de virtualizacao onde o LXC sera criado.
|
|
- **LXC**: container Linux que vai hospedar a aplicacao.
|
|
- **Debian 12 ou Ubuntu 24.04**: sistema operacional dentro do container.
|
|
- **Linux shell / Bash**: comandos de instalacao e configuracao no container.
|
|
- **Node.js**: runtime JavaScript usado para rodar a aplicacao web.
|
|
- **npm**: gerenciador de pacotes do Node.js.
|
|
- **Next.js**: framework web usado para criar o frontend e backend da aplicacao.
|
|
- **React**: biblioteca usada pela tela de chat do Next.js.
|
|
- **TypeScript**: linguagem usada nos arquivos `route.ts` e `page.tsx`.
|
|
- **TSX**: sintaxe de React com TypeScript usada na interface.
|
|
- **Tailwind CSS**: estilizacao da tela de chat.
|
|
- **OpenAI SDK para JavaScript/TypeScript**: biblioteca `openai` para chamar a API da OpenAI.
|
|
- **OpenAI API / Responses API**: API usada para enviar mensagens ao modelo GPT.
|
|
- **Variaveis de ambiente**: `.env.local` com `OPENAI_API_KEY`, `OPENAI_MODEL` e `APP_PASSWORD`.
|
|
- **Nginx**: servidor web/reverse proxy na frente da aplicacao.
|
|
- **PM2**: gerenciador de processo para manter o app rodando em producao.
|
|
- **Certbot / Let's Encrypt**: geracao de certificado HTTPS.
|
|
- **HTTPS/TLS**: acesso seguro pelo navegador.
|
|
- **DNS/dominio**: exemplo `gpt.seudominio.com` apontando para o servidor.
|
|
- **Markdown**: formato do guia criado em `guia-meu-gpt-lxc-proxmox.md`.
|
|
|
|
Em resumo: o app em si usa **Next.js + React + TypeScript + Tailwind + Node.js + OpenAI API**, hospedado em **LXC no Proxmox**, com **Nginx + PM2 + HTTPS** na infraestrutura. |