Esta aplicación consiste en tres componentes principales: backend, frontend y classifier.
- Bun instalado
- Python 3 instalado
- Postgres instalado
- Docker instalado
- Docker Compose instalado
Se debe descargar el modelo clasificador en la carpeta classifier bajo el nombre "vit_leaf_classifier.pth".
También se debe crear una base de datos con usuario y contraseña correspondientes a los colocados en el archivo backend/.env.
docker-compose -f docker-compose.yml up -ddocker-compose -f docker-compose.prod.yml up -dcd backend
bun install
bun prisma migrate dev
bun run devcd frontend
bun install
bun run devcd classifiercrear un entorno virtual
python -m venv envactivar el entorno virtual
source env/bin/activatepip install -r requirements.txtpython3 app.pyPara iniciar todos los servicios de una vez, puedes usar el script de desarrollo:
./dev.shEste script iniciará automáticamente:
- Classifier en http://localhost:8000
- Backend en el puerto configurado en
src/server.ts - Frontend en el puerto configurado por Vite (por defecto 5173)
Presiona Ctrl+C para detener todos los servicios.
Antes de desplegar la aplicación en producción, asegúrate de tener:
- Docker y Docker Compose instalados y funcionando
- Permisos sudo para ejecutar comandos Docker
- Dominio configurado apuntando a la IP del servidor
- Puertos 80 y 443 abiertos en el firewall
- Archivo
.enven la raíz del proyecto con las siguientes variables:DOMAIN: El dominio donde se desplegará la aplicación (ej:example.com)EMAIL: Email para notificaciones de Let's Encrypt (ej:admin@example.com)
- Archivo
backend/.env.prodcon las variables de entorno del backend para producción:DATABASE_URL: URL de conexión a la base de datos PostgreSQL- Otras variables de entorno necesarias para el backend
El script deploy.sh automatiza el proceso de despliegue completo:
./deploy.sh¿Qué hace el script?
- Verifica que exista el archivo
.envconDOMAINyEMAILconfigurados - Crea los directorios necesarios para certificados SSL (
certbot/confycertbot/www) - Construye e inicia todos los servicios usando
docker-compose.prod.yml - Espera a que el frontend esté listo
- Verifica si ya existe un certificado SSL:
- Si existe: omite la generación de certificados
- Si no existe: solicita un certificado SSL de Let's Encrypt automáticamente
- Recarga nginx para habilitar SSL
Servicios desplegados:
- Base de datos PostgreSQL (puerto interno)
- Backend API (puerto interno 5000)
- Classifier Service (puerto interno)
- Frontend con Nginx (puertos 80 y 443 expuestos)
- Certbot para gestión automática de certificados SSL
Después del despliegue:
- Frontend disponible en:
https://$DOMAIN - API disponible en:
https://$DOMAIN/api/v1
Comandos útiles después del despliegue:
# Ver logs de todos los servicios
sudo docker compose -f docker-compose.prod.yml logs -f
# Ver logs de un servicio específico
sudo docker compose -f docker-compose.prod.yml logs -f backend
sudo docker compose -f docker-compose.prod.yml logs -f frontend
sudo docker compose -f docker-compose.prod.yml logs -f certbot
# Verificar estado de los servicios
sudo docker compose -f docker-compose.prod.yml ps
# Reiniciar un servicio específico
sudo docker compose -f docker-compose.prod.yml restart backendEl script reset.sh permite resetear completamente el despliegue:
./reset.sh¿Qué hace el script?
- Detiene y elimina todos los contenedores
- Pregunta si deseas eliminar volúmenes (esto eliminará los datos de la base de datos)
- Pregunta si deseas eliminar las imágenes construidas
- Pregunta si deseas eliminar los certificados SSL
Opciones interactivas:
- Eliminar volúmenes: Si respondes
y, se eliminarán todos los volúmenes, incluyendo los datos de PostgreSQL - Eliminar imágenes: Si respondes
y, se eliminarán las imágenes Docker construidas - Eliminar certificados SSL: Si respondes
y, se eliminarán los certificados SSL (tendrás que regenerarlos en el próximo despliegue)
Después del reset:
Para volver a desplegar después de un reset:
./deploy.shPara actualizar la aplicación después de hacer cambios:
# 1. Detener los servicios
sudo docker compose -f docker-compose.prod.yml down
# 2. Reconstruir e iniciar con los nuevos cambios
./deploy.shO simplemente:
# Reconstruir e iniciar (el script ya hace build)
sudo docker compose -f docker-compose.prod.yml up -d --buildLos certificados SSL se renuevan automáticamente mediante el servicio certbot que corre en segundo plano. El servicio verifica la renovación cada 12 horas.
Para verificar manualmente el estado de los certificados:
sudo docker compose -f docker-compose.prod.yml logs certbotProblema: El certificado SSL no se genera
- Verifica que el dominio apunte correctamente a la IP del servidor
- Verifica que los puertos 80 y 443 estén abiertos
- Revisa los logs:
sudo docker compose -f docker-compose.prod.yml logs certbot_init - Si el certificado falla, elimínalo y vuelve a intentar:
sudo rm -rf certbot/conf/live/$DOMAIN ./deploy.sh
Problema: Los servicios no inician
- Verifica los logs:
sudo docker compose -f docker-compose.prod.yml logs - Verifica que el archivo
.envybackend/.env.prodestén correctamente configurados - Verifica que la base de datos esté accesible
Problema: El frontend no carga
- Verifica que nginx esté corriendo:
sudo docker compose -f docker-compose.prod.yml ps frontend - Revisa los logs de nginx:
sudo docker compose -f docker-compose.prod.yml logs frontend - Verifica la configuración de nginx en el contenedor
- El backend corre en el puerto configurado en
src/server.ts. - El frontend corre en el puerto configurado por Vite (por defecto 5173).
- El classifier corre en el puerto 8000.
- En producción, el frontend se sirve a través de Nginx en los puertos 80 (HTTP) y 443 (HTTPS).
- Los certificados SSL se renuevan automáticamente cada 12 horas.