RU: полноценный Fullstack дипломный проект маркетплейса стоковых фотографий: витрина, каталог с фильтрами, карточка фото, личный кабинет пользователя и панель администратора. Реализовано на Django 5 и Vue 3 с автоматизированным тестированием (E2E) и Docker-инфраструктурой.
EN: a full-featured Fullstack stock-photo marketplace project — built with Django 5 and Vue 3. Includes catalog, user profile, admin panel, automated E2E testing (Playwright), and Docker-ready infrastructure.
| Главная | Каталог | Карточка фото |
|---|---|---|
| Главная | Каталог | Карточка |
| Новинки на главной | Лента каталога | Блок доверия |
|---|---|---|
| Новинки | Лента | Доверие |
| Похожие фото |
|---|
| Похожие |
Скриншоты можно переснять:
./photo build, затем в одном терминале./photo up, в другом —cd frontend && npm run capture:readme(нуженnpx playwright install chromium).
- Возможности
- Стек
- Архитектура
- Быстрый старт
- Деплой на VDS
- Переменные окружения
- Локальные материалы
- Безопасность
| Область | Что реализовано |
|---|---|
| Витрина | Главная с динамическими подборками, поиском и блоками доверия. |
| Каталог | Реальные данные из БД, фильтры, избранное, пагинация. |
| Карточка фото | Детали, теги, похожие работы (через API). |
| Профиль | JWT-авторизация, редактирование данных, личный кабинет. |
| Админка | Панель управления статистикой, авторами и категориями (на Vue + API). |
| Качество | Pytest (Backend), Playwright E2E и Visual Regression тесты. |
| Слой | Технологии |
|---|---|
| Frontend | Vue 3, Vite, TypeScript, Vue Router |
| Backend | Django 5, DRF, JWT (SimpleJWT), Whitenoise |
| QA / Tests | Playwright (E2E & Visual), Pytest (API) |
| Infrastructure | Docker, Postgres, Bash CLI Orchestrator |
flowchart LR
subgraph client [Браузер]
SPA[Vue 3 SPA]
end
subgraph backend [Сервер]
API[Django REST API]
DB[(PostgreSQL)]
FS[(Media Storage)]
end
SPA <--> API
API <--> DB
API <--> FS
Все команды — через CLI ./photo в корне репозитория.
- Node.js 20+
- Docker Desktop (для сценария «один шаг») или Python 3.12+ для полностью локального режима
- (Опционально) Python-venv, если не используете Docker
Нужен запущенный Docker Desktop.
Рабочая директория — корень репозитория (папка graduation/, где лежит файл photo).
Если вы в backend/, либо cd .., либо запускайте ./photo start (обёртка backend/photo поднимается в корень).
cd /путь/к/graduation
chmod +x photo backend/photo # один раз, если zsh: permission denied
./photo startСкрипт: создаст .env при отсутствии, соберёт образ, поднимет Postgres и Django, применит миграции, выполнит seed (кроме SKIP_SEED=1), поставит npm-зависимости и запустит Vite на http://localhost:5173 (API проксируется на порт 8000). Останов: Ctrl+C в терминале, затем при желании ./photo down.
Если ReadTimeout / No matching distribution found for Django при docker build — это сбой сети к PyPI (таймаут, SSL, фильтр), а не «нет пакета». Повторите сборку позже, включите стабильный VPN или задайте в корневом .env строку PIP_INDEX_URL=https://pypi.org/simple и снова docker compose build --no-cache / ./photo start. Образы стали легче: добавлен backend/.dockerignore (раньше в контекст попадал .venv и десятки мегабайт).
Первая сборка после git pull с новыми requirements.txt: уже включено в ./photo start. Чтобы пропустить docker build, можно NO_BUILD=1 ./photo start.
./photo up
./photo seed./photo dev:back # venv при первом запуске создаётся сам; миграции; :8000./photo dev:front # :5173./photo seedЕсли крутится Docker — сид идёт в Postgres в контейнере. Если Docker выключен — в локальный backend с SQLite/вашим DATABASE_URL из backend/.env.
./photo test:fullПрогонит полный цикл: тесты бэкенда, проверку типов фронтенда и сквозные тесты Playwright.
Автоматизированный деплой на Linux-сервер через rsync + ssh + Docker.
При создании VDS (Ubuntu 22.04+) вставьте скрипт в поле Cloud-init:
cat scripts/cloud-init.shОн установит Docker, UFW (22/80/443) и swap 2GB.
ssh-copy-id root@<IP-сервера>echo 'PHOTO_DEPLOY_HOST=<IP-сервера>' >> .env./photo deployСкрипт:
- 🔨 Собирает фронт (
npm run build) и статику (collectstatic) локально - 📤 Синхронизирует код на VDS
- 🔐 Генерирует production
.env(секретный ключ, пароль админа) - 🐳 Собирает Docker-образы на VDS (Postgres + Django + Nginx)
- 🔄 Миграции + демо-данные
- 🚀 Запуск: Nginx (:80) → Django (Gunicorn) → PostgreSQL
Пользователь ──▶ Nginx (:80)
├── / → frontend/dist/index.html (SPA)
├── /api/* → backend:8000 (Django)
├── /admin/* → backend:8000 (Django)
├── /static/* → backend/staticfiles/
└── /media/* → Docker volume (фото)
Домен не обязателен — всё работает по IP. Готово к HTTPS (добавьте server с SSL в scripts/nginx.conf при появлении домена).
| Переменная | По умолчанию | Описание |
|---|---|---|
PHOTO_DEPLOY_HOST |
— | IP или домен VDS (обязательно) |
PHOTO_DEPLOY_USER |
root |
SSH-пользователь |
PHOTO_DEPLOY_PATH |
/opt/phototochka |
Путь на сервере |
PHOTO_DEPLOY_SKIP_BUILD |
0 |
=1 пропустить локальную сборку |
PIP_INDEX_URL |
— | Зеркало PyPI (если таймауты) |
Копируйте из [.env.example](./.env.example).
| Переменная | Назначение |
|---|---|
VITE_API_URL |
URL API бэкенда (в dev — пусто для проксирования). |
DJANGO_SECRET_KEY |
Секретный ключ Django. |
DATABASE_URL |
Строка подключения к БД (Postgres). |
SEED_ADMIN_EMAIL |
Email администратора для первичного сидирования. |
PHOTO_DEPLOY_HOST |
Хост для автоматизированного деплоя. |
CELERY_BROKER_URL |
URL Redis (если пусто — Celery в eager, без воркера). |
REDIS_URL |
Кэш Django; вместе с SHOWCASE_CACHE_SECONDS — кэш витрины. |
AWS_* |
S3: при задании ключа, бакета и секрета — хранение медиа. |
Фоновая обработка фото (WebP/AVIF после загрузки): при непустом CELERY_BROKER_URL запустите воркер:
cd backend && . .venv/bin/activate && celery -A config worker -l infoКаталог docs/ и настройки .cursor/ не входят в git (см. .gitignore). В репозитории остаются только исходный код, тесты и конфигурации для развертывания.
- JWT Auth: Используется безопасная передача токенов с механизмом Refresh.
- IsAdminUser: Все административные эндпоинты защищены проверкой прав на стороне бэкенда.
- Rate Limiting: Рекомендуется настроить на уровне Nginx перед деплоем в прод.
© 2026 ФотоТочка. Дипломный проект.