На этой странице собраны все правила, которые нужны ИИ-ассистенту, чтобы подготовить проект для Ai to App. Читать её не обязательно: просто отправьте ассистенту сообщение ниже.
Прочитайте руководство по адресу https://aitoapp.com/ru/upload-guide. Подготовьте мой проект для Ai to App по этому руководству, пройдите контрольный список по пунктам и соберите zip-файл.
Ai to App проверяет и публикует сайты и приложения, загруженные в виде zip-файла. Загруженные файлы во время проверки не запускаются. Серверные приложения после публикации работают в собственной изолированной среде, отдельно от других проектов. В этом руководстве собраны все правила, необходимые для того, чтобы проект прошёл первую загрузку без проблем.
1. Определите тип проекта
Ai to App сам определяет тип проекта по файлам внутри zip. Если подходит сразу несколько типов, действует порядок ниже; побеждает тот, что выше.
| Порядок | Тип | Как определяется | Что класть в zip |
|---|---|---|---|
| 1 | Dockerfile | Dockerfile в корне | Исходный код + Dockerfile |
| 2 | Next.js (сервер) | next в зависимостях package.json | Исходный код |
| 2 | Next.js (статический экспорт) | output: 'export' в next.config.* | СОДЕРЖИМОЕ папки out после сборки |
| 3 | Сервер на Node.js | express, fastify, koa, hono, @nestjs/core, @hapi/hapi, restify, socket.io | Исходный код |
| 4 | Собираемый сайт | vite, react-scripts, vue, @angular/core, astro, @sveltejs/vite-plugin-svelte, parcel, webpack + скрипт build | СОДЕРЖИМОЕ папки dist после сборки (для react-scripts — build) |
| 5 | Node.js (общий случай) | Скрипт start или поле main в package.json | Исходный код |
| 6 | Python | requirements.txt, pyproject.toml, Pipfile или manage.py | Исходный код |
| 7 | .NET | .csproj / .fsproj в корне | Исходный код |
| 8 | Статический сайт | Только index.html и файлы HTML/CSS/JS | Сами файлы |
Важно:
- Для собираемых сайтов (React, Vue, Vite, Angular, Svelte, Astro) сначала выполните
npm run build. Заархивируйте файлы, находящиеся ВНУТРИ получившейся папкиdist(илиbuild). В корне zip должен лежать непосредственноindex.html. - Проекты на Go публикуются только через
Dockerfile. - docker-compose не поддерживается; запускается только основное приложение (Dockerfile). Базу данных Ai to App предоставляет отдельно (см. раздел 4).
2. Правила для zip
Ограничения
| Правило | Ограничение |
|---|---|
| Размер zip-файла | не более 50 МБ |
| Общий размер файлов после распаковки zip | До 200 МБ для статического сайта, до 300 МБ для серверного приложения (100 МБ на бесплатном тарифе) |
| Размер одного файла | не более 25 МБ |
| Количество файлов | До 2000 для статического сайта, до 5000 для серверного приложения |
Структура папок
- Файлы проекта должны лежать в корне zip или внутри одной верхней папки.
- В статическом сайте
index.htmlдолжен лежать в корне zip или внутри одной верхней папки. - Два файла с одинаковым путём и небезопасные пути, содержащие
../, не принимаются.
НЕ кладите в zip (удаляются автоматически, только занимают место)
- Зависимости:
node_modules,.venv,venv,__pycache__,bower_components,.pytest_cache,.mypy_cache - Папки инструментов и систем контроля версий:
.git,.svn,.hg,.idea,.vscode,.vs,.cache,.turbo,.parcel-cache,.gradle - Результаты сборки:
.next,.nuxt,.svelte-kit. В .NET дополнительноbinиobj. - Системные файлы:
__MACOSX,.DS_Store,Thumbs.db,desktop.ini,*.pyc
НИКОГДА не кладите в zip (удаляются и не сохраняются)
- Файлы
.env: такие как.env,.env.local,.env.production. Файлы-примеры можно оставить:.env.example,.env.sample,.env.template. Если в zip есть.env, файл не сохраняется; в сборку идут только публичные значения с префиксамиVITE_,NEXT_PUBLIC_,PUBLIC_,REACT_APP_. Секретные значения вводите в панели. - Файлы ключей и учётных данных:
*.pem,*.key,*.p12,*.pfx,*.ppk,*.jks,*.keystore,id_rsa,id_ed25519,.npmrc,.pypirc,.netrc. Если один из них уже был где-либо опубликован, замените ключ на новый.
Файлы, из-за которых загрузка останавливается
- В исходном коде приложения: скрипты и установочные файлы Windows (
.bat,.cmd,.ps1,.vbs,.scr,.msi). Скомпилированные программные файлы (.exe,.dll,.soи подобные) удаляются; сервер собирает проект из исходного кода. - В статическом сайте:
- Серверный код и исполняемые файлы запрещены:
.php,.py,.rb,.pl,.cgi,.asp,.aspx,.cshtml,.jsp,.exe,.dll,.sh,.jar,.htaccess,.config. - Разрешённые типы:
.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. - Файлы
.mapи.mdпропускаются.
- Серверный код и исполняемые файлы запрещены:
3. Обязательные настройки для серверных приложений
Порт и адрес
Ai to App передаёт порт, который должно слушать приложение, через переменную окружения PORT. Приложение должно привязываться к адресу 0.0.0.0; localhost или 127.0.0.1 снаружи недоступны.
| Язык | Правильное использование |
|---|---|
| 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 | В коде НЕ должно быть строки UseUrls(...) |
Команда запуска
- Node.js:
- Скрипт
startвpackage.jsonдолжен запускать продакшн-сервер, например"start": "node server.js". - Команд для разработки в
startбыть НЕ должно:vite,next dev,nodemon,ts-node-dev,tsx watch,webpack serve,react-scripts start,npm run dev. Оставьте их в скриптеdev. - TypeScript: добавьте
"build": "tsc"и сделайте"start": "node dist/index.js". Компиляция TypeScript на лету медленная. - Добавьте в zip файл блокировки зависимостей (
package-lock.json,pnpm-lock.yaml,yarn.lockилиbun.lockb). - Укажите версию Node через
package.json→engines.nodeили.nvmrc.
- Скрипт
- Python:
- FastAPI, Flask, Django, Streamlit и Gradio определяются автоматически.
- Если вы используете другую структуру, создайте в корне
Procfile:web: <команда запуска>. Команда должна использовать0.0.0.0и$PORT. - Flask:
gunicornдолжен быть вrequirements.txt. - Django:
ALLOWED_HOSTSне должен быть пустым, должно бытьDEBUG = False, аSECRET_KEYнужно читать из переменной окружения. - Укажите версию Python через
runtime.txtили.python-version.
- .NET: В корне должен быть
.csproj. Ai to App собирает проект командойdotnet publish -c Release; целевая версия берётся изTargetFrameworkв.csproj. - Dockerfile: Укажите порт приложения через
EXPOSE. Приложение при этом всё равно должно читать переменнуюPORT.
4. База данных
Ai to App сам создаёт базу данных и передаёт данные для подключения через переменную окружения. Не записывайте адрес подключения в код; читайте его из переменной ниже.
| База данных | Переменная окружения | Примечание |
|---|---|---|
| PostgreSQL | DATABASE_URL | Вам выделяются отдельная база данных и пользователь |
| MySQL | DATABASE_URL | Вам выделяется отдельная база данных |
| MongoDB | MONGODB_URI | Вам выделяется отдельная база данных |
| Redis | REDIS_URL | |
| SQLite | DATABASE_PATH | Файл хранится в постоянной папке (/data/app.db) |
| SQL Server | — | Не предоставляется; укажите адрес собственного сервера через переменную окружения или перейдите на PostgreSQL |
| Supabase, Firebase, Neon, PlanetScale, Turso | ваши собственные переменные | Укажите данные для подключения в панели как переменные окружения |
- Prisma: добавьте в zip папку
prisma/migrations; без неё таблицы могут не создаться автоматически. - Alembic: если есть
alembic.ini, перед публикацией автоматически выполняетсяalembic upgrade head. - Файл SQLite: SQLite-файл из zip используется как начальные данные только при первой публикации; последующие загрузки не перезаписывают рабочие данные. Не кладите в zip тестовую базу данных с персональными данными.
- Обновления: при загрузке новой версии данные в базе данных сохраняются.
5. Постоянные файлы
Диск среды, в которой работает приложение, не является постоянным; при каждой новой публикации он очищается. Единственная постоянная папка — /data.
- Сохраняйте в
/dataфотографии и документы, загруженные посетителями, создаваемые файлы и базу данных SQLite. - Читайте путь к папке из переменной окружения
DATA_DIR; Ai to App сам задаёт для неё значение/data.
6. Секретные данные и переменные окружения
- Не записывайте пароли, API-ключи и токены в код; читайте их из переменных окружения. Значения вы вводите в панели Ai to App; они хранятся в зашифрованном виде.
- Публичные префиксы: переменные с префиксами
VITE_,NEXT_PUBLIC_,REACT_APP_иPUBLIC_встраиваются в код при сборке, и их может увидеть любой посетитель. Не помещайте в них секретные значения. - Система входа (NextAuth / Auth.js):
NEXTAUTH_URL(илиAUTH_URL) должен быть реальным адресом сайта, аNEXTAUTH_SECRET(илиAUTH_SECRET) должен быть заполнен. - OAuth (Google, GitHub): добавьте адрес опубликованного сайта в настройки провайдера как разрешённый адрес перенаправления.
- Вход через Supabase: в Supabase в разделе Authentication > URL Configuration укажите опубликованный адрес в поле Site URL и добавьте точный адрес в Redirect URLs (
https://your-app.aitoapp.com/). Иначе ссылки в письмах подтверждения и входа ведут наlocalhost:3000, и вход не завершается. Для входа через Google в Google Cloud добавьте опубликованный адрес в Authorized JavaScript origins, аhttps://PROJECT.supabase.co/auth/v1/callback— в Authorized redirect URIs. - Переменные, которые Ai to App задаёт сам:
PORT,HOST=0.0.0.0,DATA_DIR=/dataи переменные базы данных (раздел 4). Для Node.js —NODE_ENV=production.
7. Чего не должно быть в коде
- Адреса
localhost: код, который отправляет запросы наhttp://localhost:...илиhttp://127.0.0.1:..., после публикации обращается к компьютеру самого посетителя и не работает. Читайте адрес из переменной окружения (например,import.meta.env.VITE_API_URL) или, если это тот же сервер, используйте относительный путь (fetch('/api/...')). - Запросы
/api/...в статическом сайте: у статического сайта нет сервера. Если нужен API, подготовьте проект как единое серверное приложение (например, Express), работающее вместе со своим API. - Жёстко заданный порт:
const PORT = 3000не должно быть само по себе; используйтеprocess.env.PORT || 3000. - Режим отладки:
debug=TrueилиDEBUG = Trueне должны быть включены в продакшне. - Секреты, встроенные в код: найденный ключ считается раскрытым; замените его.
8. Контрольный список для ассистента
- Тип проекта определён (раздел 1).
- Если это собираемый сайт, выполнена сборка, и в zip помещено только содержимое папки
dist/build/out; в корне естьindex.html. - Если это серверное приложение, скрипт
start(или Procfile) запускает продакшн-сервер. - Порт читается из переменной окружения
PORT; сервер привязан к адресу0.0.0.0. - В коде не осталось адресов
localhost/127.0.0.1. - Пароли и ключи убраны из кода; они читаются из переменных окружения.
- Подключение к базе данных читается из
DATABASE_URL/MONGODB_URI/REDIS_URL/DATABASE_PATH. - Постоянные файлы записываются в
/data. - Файл блокировки зависимостей на месте (
package-lock.jsonи т. п.). - В zip НЕТ
node_modules,.git,.venv,.next,bin,obj,.envи файлов ключей. - Zip меньше 50 МБ, отдельный файл меньше 25 МБ; не более 2000 файлов.
9. По окончании работы сообщите мне следующее
- Точное расположение подготовленного zip-файла.
- Тип проекта и используемый язык или фреймворк (например, "Node.js + Express").
- Список переменных окружения, которые мне нужно ввести в панели: имя каждой и для чего она нужна. Значения не пишите; я введу их сам.
- Краткое описание внесённых вами изменений.
Если после загрузки zip-файла возникнет проблема, Ai to App объяснит её простыми словами; вставьте этот текст в чат с ассистентом.
