MatchApp — социальное музыкальное приложение: друзья, эфиры, синхронное прослушивание, чат, подкасты и обмен треками.
Для меня буткемп навсегда останется частью меня, это был уникальный опыт, который стал частью меня, я вас безумно сильно люблю и мечтаю провести с вами хотя бы еще один день в Ареале.
5 апреля команда Win-Win+ стала победителем буткемпа Центрального университета, заняв номинацию за лучшее техническое решение.
Самый простой путь поднять проект с нуля локально:
git clone https://github.com/keeendaaa/bootcamp-match.git
cd bootcamp-matchЗапусти backend с PostgreSQL через Docker:
cd CU-weekend-2026
cp .env.example .env
docker compose up --buildВ новом терминале запусти frontend:
cd web-app
cp .env.example .env
npm ci
npm run devОткрой http://localhost:5173. API будет доступен на http://localhost:8000, healthcheck — http://localhost:8000/health.
Минимальный набор:
- Git
- Node.js
20+ - npm
10+ - Docker Desktop или Docker Engine с Docker Compose
Если backend запускается без Docker, дополнительно нужны:
- Python
3.11+ - PostgreSQL
16+
.
├── web-app/ # Vite + React + TypeScript frontend
├── CU-weekend-2026/ # FastAPI backend, SQLAlchemy модели, Alembic миграции
├── photos/ # локальные ассеты, не коммитятся
├── _env # локальные секреты, не коммитятся
├── .idea/ # настройки JetBrains IDE для быстрого запуска
└── README.md # этот файл
Ключевые файлы:
web-app/src/App.tsx— основной UI, API-клиент, player, social flows, realtime polling.web-app/src/mobile/— Capacitor bridge, deep links, интеграции с мобильной оболочкой.web-app/MOBILE.md— заметки по iOS/Android WebView-shell и виджетам.web-app/package.json— команды frontend-сборки.CU-weekend-2026/app/main.py— FastAPI routes, websocket voice signaling, music/podcast proxy.CU-weekend-2026/app/models.py— SQLAlchemy модели.CU-weekend-2026/app/schemas.py— Pydantic схемы API.CU-weekend-2026/app/db.py— настройки окружения и подключение к базе.CU-weekend-2026/alembic/versions/— миграции базы данных.CU-weekend-2026/docker-compose.yml— локальный backend + PostgreSQL.
Frontend:
- Vite собирает SPA в
web-app/dist. - React-приложение ходит в API по
VITE_API_BASE_URL. - Если переменная не задана, frontend использует production API
https://matchapp.site/api. - Для локальной разработки нужен
VITE_API_BASE_URL=http://localhost:8000илиhttp://localhost:8000/api, если API проксируется с префиксом.
Backend:
- FastAPI слушает
8000. - PostgreSQL хранит пользователей, друзей, треки, лайки, direct messages и listen sessions.
- Alembic применяет миграции схемы.
- Uploaded files лежат в
uploads/. - YouTube Music и podcast endpoints проксируются через backend.
- Voice signaling работает через websocket
WS /listen/{session_id}/voice-signal/ws?token=<jwt>.
Production сейчас обычно выглядит так:
nginxпринимает80/443.- Static frontend лежит в
/var/www/matchapp. - Backend работает локально на
127.0.0.1:8000черезuvicorn/systemd. - PostgreSQL доступен только локально на сервере.
nginxпроксирует/api/*в backend.
Файл: web-app/.env.
VITE_API_BASE_URL=http://localhost:8000Для production на Vercel чаще всего нужно:
VITE_API_BASE_URL=https://api.example.comПодсказки:
- Переменные Vite должны начинаться с
VITE_, иначе они не попадут в браузерный bundle. - Не клади секреты во frontend
.env: всё, что начинается сVITE_, увидит пользователь в браузере. - После изменения
.envперезапустиnpm run dev.
Файл: CU-weekend-2026/.env.
Минимальный локальный вариант для Docker уже лежит в .env.example:
DATABASE_URL=postgresql+psycopg2://cu_user:cu_password@db:5432/cu_weekend
JWT_SECRET=change-me-in-local-dev
JWT_ALGORITHM=HS256
JWT_EXPIRES_MINUTES=10080
UPLOAD_DIR=uploadsДля запуска без Docker поменяй db на localhost:
DATABASE_URL=postgresql+psycopg2://cu_user:cu_password@localhost:5432/cu_weekendOAuth-переменные нужны только если включаешь вход через Google/Yandex:
SOCIAL_AUTH_DEFAULT_ORIGIN=http://localhost:5173
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_REDIRECT_URI=http://localhost:8000/auth/google/callback
YANDEX_CLIENT_ID=
YANDEX_CLIENT_SECRET=
YANDEX_REDIRECT_URI=http://localhost:8000/auth/yandex/callbackВажно:
.env,_env,.venv,node_modules,dist,uploadsне коммитятся.JWT_SECRETв production должен быть длинным случайным значением.DATABASE_URLдля Docker должен указывать на хостdb, потому что это имя compose-сервиса.DATABASE_URLдля systemd/VPS обычно указывает наlocalhostили127.0.0.1.
Backend + база:
cd CU-weekend-2026
cp .env.example .env
docker compose up --buildЧто произойдёт:
- Поднимется PostgreSQL
16наlocalhost:5432. - Поднимется FastAPI на
localhost:8000. - Миграции применятся при старте контейнера через
entrypoint.sh. uploads/будет примонтирован как локальная папка.docker-compose.override.ymlвключит autoreload дляapp/иalembic/.
Проверка:
curl http://localhost:8000/healthОстановить контейнеры:
docker compose downСбросить базу полностью:
docker compose down -vBackend:
cd CU-weekend-2026
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .envВ .env поставь DATABASE_URL на свою локальную PostgreSQL базу, затем:
alembic upgrade head
uvicorn app.main:app --host 127.0.0.1 --port 8000 --reloadFrontend:
cd web-app
cp .env.example .env
npm ci
npm run devОткрой http://localhost:5173.
Frontend из web-app/:
npm ci # установить зависимости по package-lock.json
npm run dev # dev server
npm run build # TypeScript build + production Vite build
npm run preview # локально посмотреть production build
npm run lint # ESLintMobile/WebView из web-app/:
npm run mobile:webview:copy
npm run mobile:webview:sync
npm run cap:open:ios
npm run cap:open:androidBackend из CU-weekend-2026/:
docker compose up --build
alembic upgrade head
uvicorn app.main:app --host 127.0.0.1 --port 8000 --reloadAuth:
POST /auth/registerPOST /auth/loginGET /auth/google/startGET /auth/google/callbackGET /auth/yandex/startGET /auth/yandex/callback
Профиль:
GET /meGET /me/statsPUT /me/avatarPOST /me/avatar/uploadPUT /me/tagGET /me/likesPOST /me/likes/toggleGET /me/songsPUT /me/now-playingPOST /me/now-playing/heartbeatDELETE /me/now-playing
Друзья и пользователи:
GET /friendsPOST /friendsGET /users/searchGET /users/by-tag/{tag}GET /friends/{friend_id}/songsGET /friends/{friend_id}/now-playing
Музыка и подкасты:
GET /music/searchGET /music/stream/{video_id}GET /podcasts/searchGET /podcasts/{podcast_id}/episodesGET /podcasts/stream/{stream_id}POST /songsPOST /songs/uploadGET /files/{filename}
Чаты:
GET /chats/threadsGET /chats/{friend_id}/messagesPOST /chats/{friend_id}/messagesPOST /chats/{friend_id}/read
Совместное прослушивание:
POST /listen/inviteGET /listen/incomingGET /listen/activePOST /listen/{session_id}/acceptPOST /listen/{session_id}/endPUT /listen/{session_id}/stateGET /listen/{session_id}/messagesPOST /listen/{session_id}/messagesWS /listen/{session_id}/voice-signal/ws?token=<jwt>
Подсказка: если frontend работает через nginx с префиксом /api, nginx должен срезать этот префикс или backend должен получать route без /api, потому что FastAPI routes объявлены как /auth/login, /me, /music/search и так далее.
Минимальная проверка frontend:
cd web-app
npm run buildМинимальная проверка backend:
cd CU-weekend-2026
docker compose up --build
curl http://localhost:8000/healthЕсли менялись модели или схемы базы:
cd CU-weekend-2026
alembic revision --autogenerate -m "describe change"
alembic upgrade headТекущая production-схема:
- Домен:
https://matchapp.site - Frontend root:
/var/www/matchapp - Backend код:
/opt/cu-backend - API upstream:
127.0.0.1:8000 - systemd service:
matchapp-api.service - nginx site:
/etc/nginx/sites-available/matchapp
Frontend:
cd web-app
npm ci
npm run build
rsync -az --delete dist/ root@<server>:/var/www/matchapp/Backend:
rsync -az --delete --exclude '.git' --exclude '.venv' --exclude '.env' --exclude 'uploads' CU-weekend-2026/ root@<server>:/opt/cu-backend/
ssh root@<server>
cd /opt/cu-backend
source .venv/bin/activate
pip install -r requirements.txt
alembic upgrade head
systemctl restart matchapp-api.serviceПолезные команды на сервере:
systemctl status matchapp-api.service
journalctl -u matchapp-api.service -n 200 --no-pager
nginx -t
systemctl reload nginx
ss -tulpnМожно вынести только frontend на Vercel, а backend оставить на VPS.
Если VPS удаляется и нужен публичный демо-показ без backend, используй отдельную ветку vercel-demo. Она не меняет main и содержит Vercel-сборку, которая сразу открывает встроенный демо-режим.
Рекомендуемый Vercel-деплой для демо:
- Branch:
vercel-demo - Root Directory:
web-app - Install Command:
npm ci - Build Command:
npm run build - Output Directory:
dist
Настройки Vercel:
- Root Directory:
web-app - Install Command:
npm ci - Build Command:
npm run build - Output Directory:
dist - Environment Variable:
VITE_API_BASE_URL=https://api.example.com
Что важно:
- Backend должен быть доступен по HTTPS.
- Для API лучше использовать отдельный поддомен:
api.example.com. - Если backend остаётся за nginx на VPS, настрой CORS или отдавай API с того же домена через proxy.
- Не размещай PostgreSQL на Vercel: для базы используй VPS, Supabase, Neon, Railway или другой managed Postgres.
Frontend открывается, но login/search не работает:
- Проверь
web-app/.env. - Проверь, что
VITE_API_BASE_URLуказывает на backend. - Перезапусти
npm run devпосле изменения.env. - Открой DevTools Network и посмотри фактический URL запроса.
Backend не подключается к базе:
- Для Docker используй host
dbвDATABASE_URL. - Для локального Python используй
localhostили127.0.0.1. - Проверь, что PostgreSQL запущен и база создана.
alembic upgrade head падает:
- Проверь
DATABASE_URL. - Убедись, что находишься в
CU-weekend-2026/. - Если база локальная тестовая и её можно удалить, проще сделать
docker compose down -vи поднять заново.
npm run build падает на TypeScript:
- Сначала запусти
npm ci. - Проверь, что Node.js версии
20+. - Исправляй TypeScript errors до Vite build: команда
build:webсначала запускаетtsc -b.
Vercel показывает старый API:
- Проверь Environment Variables в Vercel Project Settings.
- После изменения env сделай redeploy.
- Убедись, что переменная называется именно
VITE_API_BASE_URL.
В репозиторий не должны попадать:
.envи_envnode_modules/web-app/dist/CU-weekend-2026/.venv/CU-weekend-2026/uploads/- реальные пароли, токены, OAuth secrets, приватные ключи
Перед публикацией изменений полезно проверить:
git status --short
git diff --statДля JetBrains IDE в .idea/ добавлены project-level настройки и run configurations:
Frontend - Vite devзапускаетnpm run devизweb-app.Frontend - buildзапускаетnpm run buildизweb-app.Backend - Docker Composeзапускаетdocker compose up --buildизCU-weekend-2026.Backend - uvicorn devзапускает FastAPI локально через Python moduleuvicorn.
После клона открой корень репозитория в WebStorm/PyCharm/IntelliJ. IDE должна увидеть Git mapping, исключить node_modules, dist, .venv, uploads и предложить удобные команды запуска.





