Una aplicación web construida con Streamlit que permite interactuar con modelos de lenguaje como Claude (Anthropic) y GPT (OpenAI) a través de sus APIs.
- 🤖 Soporte para múltiples proveedores LLM (Anthropic Claude, OpenAI GPT)
- 💬 Interfaz de chat interactiva
- 🔧 Configuración fácil de API keys
- 📱 Diseño responsive
- 🚀 Listo para despliegue en producción
- Python 3.8+
- Ubuntu 20.04 LTS (para despliegue)
- API keys de Anthropic y/o OpenAI
- Clonar el repositorio:
git clone <tu-repositorio>
cd BotApiClaude- Crear entorno virtual:
python3 -m venv venv
source venv/bin/activate- Instalar dependencias:
pip install -r requirements.txt- Configurar variables de entorno:
cp .env.example .env
# Editar .env con tus API keys- Ejecutar la aplicación:
streamlit run app.pyCaso de uso: Despliegue aislado y limpio usando contenedores Docker
- En tu máquina local - Actualizar y subir cambios:
# Hacer cambios al código
git add .
git commit -m "Update application"
git push origin master- En el VPS - Actualizar proyecto:
cd ~/llm-chat-docker
git pull origin master- En el VPS - Configurar variables de entorno:
cp .env.example .env
nano .env
# Configurar ANTHROPIC_API_KEY y otras variables- En el VPS - Construir y ejecutar contenedor:
docker-compose up --build -d- En el VPS - Configurar Caddy (solo la primera vez):
sudo nano /etc/caddy/CaddyfileAgregar configuración del chat:
:80 {
# Ruta para la aplicación LLM Chat (Docker)
handle /chat/* {
uri strip_prefix /chat
reverse_proxy 127.0.0.1:8501
}
handle /chat {
redir /chat/ 301
}
# Tu configuración existente del blog
handle {
root * /var/www/tu-blog
file_server
# resto de configuración...
}
}- En el VPS - Recargar Caddy:
sudo systemctl reload caddyResultado:
- Blog:
http://tu-ip/ - App LLM:
http://tu-ip/chat/
# Hacer el script ejecutable
chmod +x deploy-caddy.sh
# Ejecutar el script de despliegue con Caddy
sudo ./deploy-caddy.sh# Hacer el script ejecutable
chmod +x deploy.sh
# Ejecutar el script de despliegue
sudo ./deploy.shCaso de uso: Ya tienes un blog funcionando con Caddy y quieres agregar la aplicación LLM en un subdirectorio /chat
- Crear directorio y clonar repositorio:
sudo mkdir -p /opt/llm-chat-app
sudo chown webmaster:webmaster /opt/llm-chat-app
cd /opt/llm-chat-app
git clone https://github.com/tu-usuario/BotApiClaude.git .- Configurar entorno virtual:
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt- Configurar variables de entorno:
cp .env.example .env
nano .env
# Configurar ANTHROPIC_API_KEY y STREAMLIT_SERVER_ADDRESS=127.0.0.1- Crear servicio systemd:
sudo nano /etc/systemd/system/llm-chat-app.serviceContenido:
[Unit]
Description=LLM Chat App - Streamlit Application
After=network.target
[Service]
Type=simple
User=webmaster
Group=webmaster
WorkingDirectory=/opt/llm-chat-app
Environment=PATH=/opt/llm-chat-app/venv/bin
ExecStart=/opt/llm-chat-app/venv/bin/streamlit run app.py --server.port 8501 --server.address 127.0.0.1
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target- Habilitar y iniciar servicio:
sudo systemctl daemon-reload
sudo systemctl enable llm-chat-app
sudo systemctl start llm-chat-app- Modificar Caddyfile existente:
sudo nano /etc/caddy/CaddyfileAgregar la configuración del chat antes del handle principal:
:80 {
# Ruta para la aplicación LLM Chat
handle /chat* {
uri strip_prefix /chat
reverse_proxy 127.0.0.1:8501 {
header_up Host localhost:8501
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
header_up Upgrade {>Upgrade}
header_up Connection {>Connection}
}
}
# Tu configuración existente del blog
handle {
root * /var/www/tu-blog
file_server
# resto de tu configuración...
}
}- Recargar Caddy:
sudo systemctl reload caddyResultado:
- Blog:
http://tu-ip/ - App LLM:
http://tu-ip/chat/
- Actualizar sistema:
sudo apt update && sudo apt upgrade -y- Instalar Caddy:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install -y caddy- Instalar dependencias Python:
sudo apt install -y python3 python3-pip python3-venv ufw- Crear usuario para la aplicación:
sudo useradd -m -s /bin/bash streamlit- Crear directorio de aplicación:
sudo mkdir -p /opt/llm-chat-app
sudo chown streamlit:streamlit /opt/llm-chat-app- Copiar archivos y configurar:
sudo cp -r . /opt/llm-chat-app/
sudo chown -R streamlit:streamlit /opt/llm-chat-app- Configurar entorno virtual:
sudo -u streamlit python3 -m venv /opt/llm-chat-app/venv
sudo -u streamlit /opt/llm-chat-app/venv/bin/pip install -r /opt/llm-chat-app/requirements.txt- Configurar systemd service:
sudo cp llm-chat-app.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable llm-chat-app
sudo systemctl start llm-chat-app- Configurar Caddy:
sudo mkdir -p /etc/caddy /var/log/caddy
sudo cp Caddyfile /etc/caddy/Caddyfile
sudo chown caddy:caddy /etc/caddy/Caddyfile
sudo chown -R caddy:caddy /var/log/caddy
# Editar el dominio en el Caddyfile
sudo nano /etc/caddy/Caddyfile
sudo systemctl enable caddy
sudo systemctl start caddy- Configurar firewall:
sudo ufw enable
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443- Configurar variables de entorno:
sudo cp /opt/llm-chat-app/.env.example /opt/llm-chat-app/.env
# Editar con tus API keys
sudo nano /opt/llm-chat-app/.envEdita el archivo .env con tus API keys:
ANTHROPIC_API_KEY=tu_clave_anthropic
OPENAI_API_KEY=tu_clave_openai
STREAMLIT_SERVER_PORT=8501
STREAMLIT_SERVER_ADDRESS=0.0.0.0Edita Caddyfile y cambia tu-dominio.com por tu dominio:
tu-dominio.com {
# configuración del proxy reverso
}Edita nginx.conf y cambia tu-dominio.com por tu dominio o IP:
server_name tu-dominio.com;# Ver estado de contenedores
docker-compose ps
# Ver logs de la aplicación
docker logs llm-chat-app
# Reiniciar contenedor
docker-compose restart
# Detener contenedores
docker-compose down
# Reconstruir y reiniciar
docker-compose up --build -d
# Ver uso de recursos
docker stats llm-chat-app# Verificar estado del servicio
sudo systemctl status llm-chat-app
# Ver logs
sudo journalctl -u llm-chat-app -f
# Reiniciar servicio
sudo systemctl restart llm-chat-app# Verificar configuración
sudo caddy validate --config /etc/caddy/Caddyfile
# Recargar configuración
sudo systemctl reload caddy
# Ver logs de Caddy
sudo journalctl -u caddy -f
# Reiniciar Caddy
sudo systemctl restart caddyLa aplicación no inicia:
- Verificar logs:
docker logs llm-chat-app - Verificar contenedor:
docker-compose ps - Verificar configuración:
docker-compose config
Error de conexión:
- Verificar que el contenedor esté corriendo:
docker-compose ps - Verificar puerto:
docker port llm-chat-app - Verificar red:
docker network ls
Error de API:
- Verificar variables de entorno:
docker exec llm-chat-app env | grep API - Verificar archivo .env:
cat .env - Verificar conectividad:
docker exec llm-chat-app curl -I https://api.anthropic.com
La aplicación no inicia:
- Verificar logs:
sudo journalctl -u llm-chat-app -n 50 - Verificar permisos:
ls -la /opt/llm-chat-app/ - Verificar entorno virtual:
sudo -u streamlit /opt/llm-chat-app/venv/bin/python -c "import streamlit"
Error de conexión:
- Verificar que el servicio esté corriendo:
sudo systemctl status llm-chat-app - Verificar puerto:
sudo netstat -tlnp | grep 8501 - Verificar firewall:
sudo ufw status
Error de API:
- Verificar API keys en
/opt/llm-chat-app/.env - Verificar conectividad:
curl -I https://api.anthropic.com
BotApiClaude/
├── app.py # Aplicación principal Streamlit
├── requirements.txt # Dependencias Python
├── .env.example # Ejemplo de variables de entorno
├── .streamlit/ # Configuración Streamlit
│ └── config.toml
├── Dockerfile # Configuración Docker
├── docker-compose.yml # Orquestación de contenedores
├── .dockerignore # Archivos excluidos de Docker
├── deploy-caddy.sh # Script de despliegue con Caddy
├── llm-chat-app.service # Archivo de servicio systemd
├── Caddyfile # Configuración Caddy standalone
└── README.md # Este archivo
- Las API keys se almacenan en variables de entorno
- Docker proporciona aislamiento de contenedores
- El servicio se ejecuta con usuario no privilegiado
- Caddy actúa como proxy reverso
- Caddy obtiene certificados SSL automáticamente
- Firewall configurado para permitir solo puertos necesarios
- Headers de seguridad configurados automáticamente
- Contenedores con acceso limitado al sistema host
- Fork el proyecto
- Crea una rama para tu feature
- Commit tus cambios
- Push a la rama
- Abre un Pull Request