|
|
1 개월 전 | |
|---|---|---|
| .github | 1 개월 전 | |
| backend | 1 개월 전 | |
| deploy | 1 개월 전 | |
| frontend | 1 개월 전 | |
| obsidian_data | 1 개월 전 | |
| .editorconfig | 2 달 전 | |
| .env.example | 1 개월 전 | |
| .gitignore | 1 개월 전 | |
| CONTRIBUTING.md | 1 개월 전 | |
| FINDINGS.md | 1 개월 전 | |
| Makefile | 1 개월 전 | |
| README.md | 1 개월 전 | |
| docker-compose.yml | 1 개월 전 |
Маркетплейс фотолокаций: находите места и студии для фотосъёмок, бронируйте, общайтесь с фотографами.
| Компонент | Технология |
|---|---|
| Фронтенд | Next.js 14, React 18, TypeScript, Tailwind CSS |
| Бэкенд | Go 1.22, Chi router, pgx |
| База данных | PostgreSQL 16 + PostGIS |
| Кэш | Redis 7 |
| Файлы | MinIO (S3-совместимое хранилище) |
| Авторизация | JWT (access + refresh токены) |
| Инфраструктура | Docker, docker-compose |
git clone http://192.168.88.96:10880/foxtime/photoplaces.git
cd photoplaces
docker compose up -d postgres redis minio
cp backend/.env.example backend/.env
cp frontend/.env.local.example frontend/.env.local
cd backend
go run ./cmd/api
Бэкенд будет доступен на http://localhost:8080/api/v1
cd frontend
npm install
npm run dev
Фронтенд будет доступен на http://localhost:3000
make dev # docker compose + go run + npm run dev одновременно
Заходим на сервер по SSH и запускаем:
ssh foxtime@192.168.88.128
curl -fsSL http://192.168.88.96:10880/foxtime/photoplaces/raw/main/deploy/deploy-remote.sh | bash
Скрипт автоматически:
ssh foxtime@192.168.88.128
cd /home/foxtime/photoplaces
docker compose --env-file deploy/env.prod -f deploy/docker-compose.prod.yml up -d --build
ssh foxtime@192.168.88.128
cd /home/foxtime/photoplaces
docker compose -f deploy/docker-compose.prod.yml logs -f
ssh foxtime@192.168.88.128
cd /home/foxtime/photoplaces
git pull origin main
docker compose --env-file deploy/env.prod -f deploy/docker-compose.prod.yml up -d --build --remove-orphans
photoplaces/
├── backend/
│ ├── cmd/api/main.go # Точка входа API
│ ├── internal/
│ │ ├── config/ # Загрузка конфига из env
│ │ ├── handlers/ # HTTP-обработчики (auth, places, services...)
│ │ ├── middleware/ # JWT-аутентификация, rate limiter
│ │ ├── models/ # Модели данных (User, Place, Booking...)
│ │ ├── repository/ # Запросы к PostgreSQL
│ │ ├── services/ # Бизнес-логика
│ │ ├── validator/ # Валидация (go-playground/validator)
│ │ ├── pointer/ # Утилиты для указателей
│ │ └── log/ # Структурированное логирование (slog)
│ ├── migrations/ # SQL-миграции (golang-migrate)
│ └── docs/ # Документация
├── frontend/
│ ├── src/
│ │ ├── app/ # Страницы (Next.js App Router)
│ │ ├── components/ # React-компоненты
│ │ ├── hooks/ # Пользовательские хуки (useAuth)
│ │ ├── lib/ # Утилиты (api, map)
│ │ ├── styles/ # Глобальные стили
│ │ └── types/ # TypeScript-типы
│ └── public/
├── deploy/ # Инфраструктура продакшена
│ ├── docker-compose.prod.yml
│ ├── env.prod
│ ├── deploy.sh
│ ├── deploy-remote.sh
│ └── setup.sh
├── docker-compose.yml # Локальная разработка
└── Makefile # Автоматизация команд
make dev # Локальная разработка
make prod # Продакшен-сборка
make test # Запуск всех тестов
make test-backend # Тесты бэкенда
make test-frontend # Тесты фронтенда
make logs # Просмотр логов
make stop # Остановка контейнеров
make migrate # Запуск миграций
Полная спецификация: backend/docs/API_CONTRACT.md
Базовый URL: http://localhost:8080/api/v1
| Метод | Путь | Авторизация |
|---|---|---|
| POST | /auth/register | Нет |
| POST | /auth/login | Нет |
| POST | /auth/refresh | Нет |
| POST | /auth/logout | + |
| GET | /auth/me | + |
| GET | /places | Нет |
| GET | /places/:id | Нет |
| POST | /places | + |
| PATCH | /places/:id | + |
| DELETE | /places/:id | + |
| POST | /places/:id/moderate | moderator+ |
| GET | /tags | Нет |
| GET | /features | Нет |
| GET | /services | Нет |
| POST | /services | + |
| PATCH | /services/:id | + |
| DELETE | /services/:id | + |
| POST | /bookings | + |
| GET | /bookings/me | + |
| PATCH | /bookings/:id/cancel | + |
| GET | /reviews | Нет |
| POST | /reviews | + |
| GET | /users/:id | Нет |
| PATCH | /users/me | + |
| GET | /admin/users | moderator+ |
| PATCH | /admin/users/:id | moderator+ |
| POST | /upload/presigned-url | + |
| GET | /ws/visitors | Нет (WebSocket) |
backend/.env)| Переменная | По умолчанию | Описание |
|---|---|---|
| APP_ENV | development | Среда |
| SERVER_PORT | 8080 | Порт |
| DATABASE_URL | postgres://... | Подключение к БД |
| REDIS_URL | redis://... | Подключение к Redis |
| S3_ENDPOINT | http://localhost:9000 | MinIO endpoint |
| S3_PUBLIC_ENDPOINT | http://localhost:9000 | Публичный S3 endpoint |
| S3_ACCESS_KEY | photoplaces | S3 Access Key |
| S3_SECRET_KEY | photoplaces_dev | S3 Secret Key |
| S3_BUCKET | photoplaces | S3 Bucket |
| JWT_SECRET | dev-secret | JWT Secret |
| JWT_REFRESH_SECRET | dev-refresh-secret | JWT Refresh Secret |
| ALLOWED_ORIGINS | http://localhost:3000 | CORS origins |
frontend/.env.local)| Переменная | По умолчанию |
|---|---|
| NEXT_PUBLIC_API_URL | http://localhost:8080/api/v1 |
| NEXT_PUBLIC_MAP_PROVIDER | yandex |
| NEXT_PUBLIC_YANDEX_MAPS_API_KEY | (задаётся) |
Миграции запускаются автоматически через docker-entrypoint.sh при старте бэкенда, либо отдельно:
docker compose run --rm migrate
Файлы миграций: backend/migrations/
| Роль | Права |
|---|---|
| superadmin | Полный доступ |
| moderator | Модерация мест, управление пользователями |
| landlord | Создание и управление студиями |
| executor | Создание и управление услугами |
| customer | Поиск и бронирование |