Esta página reúne todas las reglas que tu asistente de IA necesita para preparar tu proyecto para Ai to App. No hace falta que la leas; basta con dar a tu asistente el mensaje de abajo.
Lee la guía en https://aitoapp.com/es/upload-guide. Prepara mi proyecto para Ai to App según esta guía, aplica la lista de verificación punto por punto y crea el archivo zip.
Ai to App revisa y publica sitios y aplicaciones que se suben como archivo zip. Los archivos subidos no se ejecutan durante la revisión. Las aplicaciones de servidor, una vez publicadas, se ejecutan en su propio espacio cerrado, separado de los demás proyectos. Esta guía contiene todas las reglas necesarias para que el proyecto pase sin problemas en la primera carga.
1. Determina el tipo de proyecto
Ai to App reconoce el tipo por sí solo a partir de los archivos dentro del zip. Si coinciden varios tipos, vale el orden de abajo; gana el de más arriba.
| Orden | Tipo | Cómo se reconoce | Qué poner en el zip |
|---|---|---|---|
| 1 | Dockerfile | Dockerfile en la raíz | Código fuente + Dockerfile |
| 2 | Next.js (servidor) | next en las dependencias de package.json | Código fuente |
| 2 | Next.js (exportación estática) | output: 'export' en next.config.* | El INTERIOR de la carpeta out tras la compilación |
| 3 | Servidor Node.js | express, fastify, koa, hono, @nestjs/core, @hapi/hapi, restify, socket.io | Código fuente |
| 4 | Sitio compilado | vite, react-scripts, vue, @angular/core, astro, @sveltejs/vite-plugin-svelte, parcel, webpack + script build | El INTERIOR de la carpeta dist tras la compilación (build para react-scripts) |
| 5 | Node.js (genérico) | Script start o campo main en package.json | Código fuente |
| 6 | Python | requirements.txt, pyproject.toml, Pipfile o manage.py | Código fuente |
| 7 | .NET | .csproj / .fsproj en la raíz | Código fuente |
| 8 | Sitio estático | Solo index.html y archivos HTML/CSS/JS | Los archivos tal cual |
Importante:
- En los sitios compilados (React, Vue, Vite, Angular, Svelte, Astro) ejecuta primero
npm run build. Comprime en el zip los archivos que están DENTRO de la carpetadist(obuild) que se genera. En la raíz del zip debe estar directamenteindex.html. - Los proyectos Go solo se publican con un
Dockerfile. - docker-compose no se admite; solo se ejecuta la aplicación principal (Dockerfile). La base de datos la proporciona Ai to App aparte (ver Sección 4).
2. Reglas del zip
Límites
| Regla | Límite |
|---|---|
| Tamaño del archivo zip | como máximo 50 MB |
| Tamaño total de los archivos extraídos del zip | Hasta 200 MB en un sitio estático, hasta 300 MB en una app de servidor (100 MB en el plan gratuito) |
| Tamaño de un solo archivo | como máximo 25 MB |
| Número de archivos | Hasta 2000 en un sitio estático, hasta 5000 en una app de servidor |
Estructura de carpetas
- Los archivos del proyecto deben estar en la raíz del zip o dentro de una única carpeta superior.
- En un sitio estático,
index.htmldebe estar en la raíz del zip o dentro de la única carpeta superior. - No se aceptan dos archivos con la misma ruta ni rutas inseguras que contengan
../.
NO pongas en el zip (se descartan automáticamente, ocupan espacio en vano)
- Dependencias:
node_modules,.venv,venv,__pycache__,bower_components,.pytest_cache,.mypy_cache - Carpetas de herramientas y control de versiones:
.git,.svn,.hg,.idea,.vscode,.vs,.cache,.turbo,.parcel-cache,.gradle - Resultado de la compilación:
.next,.nuxt,.svelte-kit. En .NET tambiénbinyobj. - Archivos del sistema:
__MACOSX,.DS_Store,Thumbs.db,desktop.ini,*.pyc
NUNCA pongas en el zip (se descartan y no se guardan)
- Archivos
.env: como.env,.env.local,.env.production. Los archivos de ejemplo pueden quedarse:.env.example,.env.sample,.env.template. Si tu zip incluye un.env, el archivo no se guarda; a la compilación solo pasan los valores públicos con los prefijosVITE_,NEXT_PUBLIC_,PUBLIC_,REACT_APP_. Introduce los valores secretos en el panel. - Archivos de claves y credenciales:
*.pem,*.key,*.p12,*.pfx,*.ppk,*.jks,*.keystore,id_rsa,id_ed25519,.npmrc,.pypirc,.netrc. Si alguno de ellos se compartió antes, renueva la clave.
Archivos que detienen la carga
- En el código fuente de la aplicación: scripts y archivos de instalación de Windows (
.bat,.cmd,.ps1,.vbs,.scr,.msi). Los archivos de programa compilados (.exe,.dll,.soy similares) se descartan; el servidor compila el proyecto a partir del código fuente. - En un sitio estático:
- Están prohibidos el código de servidor y los archivos ejecutables:
.php,.py,.rb,.pl,.cgi,.asp,.aspx,.cshtml,.jsp,.exe,.dll,.sh,.jar,.htaccess,.config. - Tipos permitidos:
.html,.htm,.css,.js,.mjs,.json,.webmanifest,.txt,.xml,.csv,.svg,.png,.jpg,.jpeg,.gif,.webp,.avif,.ico,.bmp,.woff,.woff2,.ttf,.otf,.eot,.mp4,.webm,.mp3,.ogg,.wav,.pdf. - Los archivos
.mapy.mdse omiten.
- Están prohibidos el código de servidor y los archivos ejecutables:
3. Ajustes obligatorios para aplicaciones de servidor
Puerto y dirección
Ai to App indica el puerto en el que debe escuchar la aplicación mediante la variable de entorno PORT. La aplicación debe enlazarse a la dirección 0.0.0.0; localhost o 127.0.0.1 no son accesibles desde fuera.
| Lenguaje | Uso correcto |
|---|---|
| Node.js | app.listen(process.env.PORT || 3000, '0.0.0.0') |
| Python (FastAPI) | uvicorn main:app --host 0.0.0.0 --port $PORT |
| Python (Flask) | gunicorn app:app --bind 0.0.0.0:$PORT |
| Python (Django) | gunicorn config.wsgi --bind 0.0.0.0:$PORT |
| Go | ":" + os.Getenv("PORT") |
| .NET | En el código NO debe haber la línea UseUrls(...) |
Comando de inicio
- Node.js:
- El script
startdepackage.jsondebe iniciar el servidor de producción, p. ej."start": "node server.js". - Los comandos de desarrollo NO deben estar en
start:vite,next dev,nodemon,ts-node-dev,tsx watch,webpack serve,react-scripts start,npm run dev. Déjalos en el scriptdev. - TypeScript: añade
"build": "tsc"y pon"start": "node dist/index.js". Compilar TypeScript en tiempo de ejecución es lento. - Añade al zip el archivo de bloqueo (
package-lock.json,pnpm-lock.yaml,yarn.lockobun.lockb). - Indica la versión de Node con
package.json→engines.nodeo con.nvmrc.
- El script
- Python:
- FastAPI, Flask, Django, Streamlit y Gradio se reconocen automáticamente.
- Si usas otra estructura, crea en la raíz un
Procfile:web: <comando de inicio>. El comando debe usar0.0.0.0y$PORT. - Flask:
gunicorndebe estar enrequirements.txt. - Django:
ALLOWED_HOSTSno debe estar vacío,DEBUG = FalseySECRET_KEYdebe leerse de una variable de entorno. - Indica la versión de Python con
runtime.txto.python-version.
- .NET: Debe haber un
.csprojen la raíz. Ai to App compila condotnet publish -c Release; la versión de destino se lee deTargetFrameworken el.csproj. - Dockerfile: Indica el puerto de la aplicación con
EXPOSE. La aplicación debe seguir leyendo la variablePORT.
4. Base de datos
Ai to App configura la base de datos por sí mismo y entrega los datos de conexión mediante una variable de entorno. No escribas la dirección de conexión en el código; léela de la variable indicada abajo.
| Base de datos | Variable de entorno | Nota |
|---|---|---|
| PostgreSQL | DATABASE_URL | Se te asigna una base de datos y un usuario independientes |
| MySQL | DATABASE_URL | Se te asigna una base de datos independiente |
| MongoDB | MONGODB_URI | Se te asigna una base de datos independiente |
| Redis | REDIS_URL | |
| SQLite | DATABASE_PATH | El archivo se guarda en la carpeta persistente (/data/app.db) |
| SQL Server | — | No se proporciona; introduce la dirección de tu propio servidor como variable de entorno o cambia a PostgreSQL |
| Supabase, Firebase, Neon, PlanetScale, Turso | tus propias variables | Introduce los datos de conexión como variables de entorno en el panel |
- Prisma: añade al zip la carpeta
prisma/migrations; si no, es posible que las tablas no se creen automáticamente. - Alembic: si existe
alembic.ini, antes de la publicación se ejecuta automáticamentealembic upgrade head. - Archivo SQLite: el archivo SQLite incluido en el zip solo se usa como datos iniciales en la primera publicación; las cargas posteriores no sobrescriben los datos en vivo. No pongas en el zip una base de datos de prueba que contenga datos personales.
- Actualizaciones: cuando subes una nueva versión, los datos de la base de datos se conservan.
5. Archivos persistentes
El disco del espacio donde se ejecuta la aplicación no es persistente; se borra en cada nueva publicación. La única carpeta persistente es /data.
- Guarda bajo
/datalas fotos y documentos que suben los visitantes, los archivos generados y la base de datos SQLite. - Lee la ruta de la carpeta de la variable de entorno
DATA_DIR; Ai to App la configura por ti como/data.
6. Información secreta y variables de entorno
- No escribas contraseñas, claves de API ni tokens en el código; léelos de variables de entorno. Los valores los introduces en el panel de Ai to App; se guardan cifrados.
- Prefijos públicos: las variables con los prefijos
VITE_,NEXT_PUBLIC_,REACT_APP_yPUBLIC_se incrustan en el código durante la compilación y cualquier visitante puede verlas. No pongas valores secretos en ellas. - Sistema de inicio de sesión (NextAuth / Auth.js):
NEXTAUTH_URL(oAUTH_URL) debe ser la dirección real del sitio yNEXTAUTH_SECRET(oAUTH_SECRET) debe tener valor. - OAuth (Google, GitHub): añade la dirección de publicación en los ajustes del proveedor como URI de redirección autorizada.
- Inicio de sesión con Supabase: en Supabase, en Authentication > URL Configuration, escribe tu dirección publicada en Site URL y añade la dirección exacta en Redirect URLs (
https://your-app.aitoapp.com/). Si no, los enlaces de los correos de confirmación e inicio de sesión van alocalhost:3000y el inicio de sesión no se completa. Para iniciar sesión con Google, en Google Cloud añade tu dirección publicada a Authorized JavaScript origins yhttps://PROJECT.supabase.co/auth/v1/callbacka Authorized redirect URIs. - Variables que proporciona el propio Ai to App:
PORT,HOST=0.0.0.0,DATA_DIR=/datay las variables de la base de datos (Sección 4). En Node.js,NODE_ENV=production.
7. Lo que no debe haber en el código
- Direcciones
localhost: el código que hace peticiones ahttp://localhost:...ohttp://127.0.0.1:...una vez publicado va al ordenador del propio visitante y no funciona. Lee la dirección de una variable de entorno (p. ej.import.meta.env.VITE_API_URL) o, si está en el mismo servidor, usa una ruta relativa (fetch('/api/...')). - Peticiones
/api/...en un sitio estático: detrás de un sitio estático no hay servidor. Si necesitas una API, prepara el proyecto como una única aplicación de servidor (p. ej. Express) que funcione junto con su API. - Puerto fijo:
const PORT = 3000no debe estar solo; usaprocess.env.PORT || 3000. - Modo de depuración:
debug=TrueoDEBUG = Trueno deben estar activos en producción. - Secretos incrustados en el código: una clave encontrada se considera compartida; renuévala.
8. Lista de verificación para el asistente
- Se determinó el tipo de proyecto (Sección 1).
- Si es un sitio compilado, se hizo la compilación y se comprimió solo el interior de la carpeta
dist/build/out;index.htmlestá en la raíz. - Si es una aplicación de servidor, el script
start(o el Procfile) inicia el servidor de producción. - El puerto se lee de la variable de entorno
PORT; el servidor se enlaza a0.0.0.0. - No quedó ninguna dirección
localhost/127.0.0.1en el código. - Las contraseñas y claves se sacaron del código; se leen de variables de entorno.
- La conexión a la base de datos se lee de
DATABASE_URL/MONGODB_URI/REDIS_URL/DATABASE_PATH. - Los archivos persistentes se escriben bajo
/data. - Existe el archivo de bloqueo (
package-lock.json, etc.). node_modules,.git,.venv,.next,bin,obj,.envy los archivos de claves NO están en el zip.- El zip pesa menos de 50 MB y cada archivo menos de 25 MB; como máximo 2000 archivos.
9. Al terminar, dime esto
- La ubicación exacta del archivo zip preparado.
- El tipo de proyecto y el lenguaje o framework usado (p. ej. "Node.js + Express").
- La lista de variables de entorno que debo introducir en el panel: el nombre de cada una y para qué sirve. No escribas los valores; los introduciré yo.
- Un breve resumen de los cambios que hiciste.
Si hay un problema después de subir el zip, Ai to App lo explica con palabras sencillas; pega ese texto a tu asistente.
