Žiadny popis

neyrogovnarik 1bc606e02f fix: hide internal errors from clients in production 1 mesiac pred
.github 8ac67d5043 P0: Security & production readiness 2 mesiacov pred
backend 1bc606e02f fix: hide internal errors from clients in production 1 mesiac pred
deploy 723292984b Fix: S3_ENDPOINT без http:// (конфликт с minio-go getEndpointURL) 1 mesiac pred
frontend 6d1b952cc1 Fix: HOSTNAME=0.0.0.0 (Next.js server.js читает HOSTNAME, не HOST) 1 mesiac pred
obsidian_data 4fdc008203 Production readiness: sentinel errors, WebSocket CORS, Docker secrets, тесты, ErrorBoundary, Obsidian Zettelkasten, CSP, DI 1 mesiac pred
.editorconfig 375ea1940b Initial commit: PhotoPlaces MVP 2 mesiacov pred
.env.example 4fdc008203 Production readiness: sentinel errors, WebSocket CORS, Docker secrets, тесты, ErrorBoundary, Obsidian Zettelkasten, CSP, DI 1 mesiac pred
.gitignore 8ac67d5043 P0: Security & production readiness 2 mesiacov pred
CONTRIBUTING.md 195ecabd23 Полная документация проекта + фикс бага callerInfo 1 mesiac pred
FINDINGS.md 1bc606e02f fix: hide internal errors from clients in production 1 mesiac pred
Makefile 8ac67d5043 P0: Security & production readiness 2 mesiacov pred
README.md a28f5d4e2e Фикс: README кодировка, curl/wget healthcheck, Caddy healthcheck fix 1 mesiac pred
docker-compose.yml a28f5d4e2e Фикс: README кодировка, curl/wget healthcheck, Caddy healthcheck fix 1 mesiac pred

README.md

PhotoPlaces

Маркетплейс фотолокаций: находите места и студии для фотосъёмок, бронируйте, общайтесь с фотографами.

Стек

Компонент Технология
Фронтенд 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

Быстрый старт (локальная разработка)

1. Клонирование и запуск зависимостей

git clone http://192.168.88.96:10880/foxtime/photoplaces.git
cd photoplaces
docker compose up -d postgres redis minio

2. Настройка окружения

cp backend/.env.example backend/.env
cp frontend/.env.local.example frontend/.env.local

3. Запуск бэкенда

cd backend
go run ./cmd/api

Бэкенд будет доступен на http://localhost:8080/api/v1

4. Запуск фронтенда (в отдельном терминале)

cd frontend
npm install
npm run dev

Фронтенд будет доступен на http://localhost:3000

Через Make

make dev    # docker compose + go run + npm run dev одновременно

Развёртывание на сервере (192.168.88.128)

Первичная настройка сервера

Заходим на сервер по SSH и запускаем:

ssh foxtime@192.168.88.128
curl -fsSL http://192.168.88.96:10880/foxtime/photoplaces/raw/main/deploy/deploy-remote.sh | bash

Скрипт автоматически:

  1. Проверит/установит Docker, Git, curl, openssl
  2. Склонирует репозиторий
  3. Сгенерирует секреты (пароли БД, JWT, S3)
  4. Запросит Yandex Maps API Key и домен
  5. Запустит docker-compose в production режиме

Ручной деплой (если автоматический не подошёл)

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

make dev      # Локальная разработка
make prod     # Продакшен-сборка
make test     # Запуск всех тестов
make test-backend   # Тесты бэкенда
make test-frontend  # Тесты фронтенда
make logs     # Просмотр логов
make stop     # Остановка контейнеров
make migrate  # Запуск миграций

API

Полная спецификация: 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 Поиск и бронирование

Безопасность

  • JWT-аутентификация: access token (15 мин) + refresh token (30 дней)
  • Rate limiting: Redis-based, настраивается для каждой группы эндпоинтов
  • CORS: только разрешённые origins
  • Защита от SQL-инъекций: pgx с параметризованными запросами
  • Валидация ввода: go-playground/validator
  • Мягкое удаление (soft delete: deleted_at)
  • Content Security Policy (CSP) через Caddy
  • WebSocket origin check: только разрешённые домены