Прокрутите вниз
Обсудить проект со мной
Назад к проектам

NaromaxShots

NaromaxShots — фотосток с нуля: оплата, защищённые оригиналы и своя админка

Собственный фотосток фотографа, написанный с нуля: Next.js, PostgreSQL и приватное облачное хранилище, оплата Stripe и PayPal, превью с водяными знаками, RAW-оригиналы по подписанным ссылкам и полная админка.

Фотосток с нуля · Stripe + PayPal
Год
2026
Длительность
Июнь – июль 2026
Отрасль
Фотография — онлайн-фотосток
Страна
Онлайн-магазин · покупатели по всему миру
Услуги
Разработка сайтов, E-commerce, Дизайн сайтов
NaromaxShots — desktop homepage
Десктоп · 1440 px
NaromaxShots — mobile homepage
Мобильный · iPhone

Результаты

  • 82

    Фото в продаже, у каждого своя страница товара и структурированные данные

  • 12

    Форматов загрузки — от JPEG и HEIC с iPhone до DNG и RAW с камер

  • 5 мин

    Время жизни подписанной ссылки на приватный оригинал

  • 37 / 37

    Сквозных проверок покупки — от загрузки до скачивания

Обзор проекта

NaromaxShots — собственный фотосток фотографа: пейзажи, дороги и горы из поездок по Северной Америке, которые продаются поштучно по простой royalty-free лицензии. Владелец не хотел маркетплейс, который забирает комиссию, или шаблонный магазин, который не справится с файлом камеры на 30 МБ. Задача — магазин, который целиком принадлежит автору: фото, покупатели, данные и деньги.

Это превращает «сайт-галерею» в настоящую e-commerce систему. Оригиналы должны оставаться приватными до оплаты, превью — быть достаточно красивыми, чтобы продавать, но бесполезными для кражи, каждый платёж — подтверждаться на сервере, а владелец — фотограф, а не разработчик, — должен управлять всем из админ-панели. Ни одна CMS или конструктор магазинов этого не покрывает, поэтому каждая часть написана с нуля.

Моя роль в проекте

Я спроектировал и построил всю платформу сам — от базы данных до админ-панели и деплоя. Направления, которые я вёл и выполнял непосредственно:

  • Архитектура: Next.js 15 на строгом TypeScript, PostgreSQL через Prisma, Cloudflare R2 с приватным бакетом для оригиналов и публичным CDN для превью, деплой на Railway
  • Пайплайн изображений, который принимает JPEG, PNG, WebP, HEIC с iPhone, Apple ProRAW DNG и RAW с камер Canon, Nikon, Sony, Fujifilm, Olympus и Panasonic, проявляет RAW в WebAssembly и готовит превью с водяными знаками, миниатюры и размытые заглушки
  • Оплата двумя каналами — Stripe как основной (карты, Apple Pay, Google Pay) и PayPal; цены берутся только из базы, каждый платёж подтверждают сервер и подписанные вебхуки
  • Выдача файлов: покупатель получает нетронутый оригинал байт в байт, включая RAW, по короткоживущим подписанным ссылкам, а резервная ссылка приходит на e-mail
  • Админ-панель на русском для фото, заказов, подписчиков, рассылок, статистики и контента сайта, плюс пошаговая инструкция для владельца
  • Аудит безопасности против современных атак и повторные аудиты кода оплаты, выдачи, рассылок и статистики

Что я сделал: магазин

  • Главная со слайдером на всю ширину: фото, анимация (четыре вида), скорость, стрелки и точки настраиваются в админке
  • Каталог с поиском по названию, описанию и локации, фильтрами по группам, которые задаёт владелец, и кнопкой «показать ещё»
  • Страница фото с превью с водяными знаками до 3200 px, полноэкранным просмотром с зумом 2× и 3× и честной пометкой о том, что получит покупатель: разрешение, размер и формат оригинала
  • Корзина без регистрации и оплата нескольких фото сразу, избранное в шапке
  • Страница заказа, которая следит за статусом оплаты в реальном времени; мгновенное скачивание каждого оригинала, «Download all» для нескольких фото и резервная ссылка на e-mail
  • Подписка на рассылку с двойным подтверждением и отпиской в один клик
  • Структурированные данные Product и Offer для каждого фото, данные Organization, canonical, sitemap и robots

Что я сделал: защита фото

  • Оригиналы лежат в приватном бакете, которого публика не видит; скачивание — это подписанная ссылка, которая живёт пять минут, а каждый заказ разрешает ограниченное число скачиваний за ограниченное время — оба лимита проверяются на сервере атомарно
  • Каждое превью несёт плиточные водяные знаки и ограничено 3200 px, миниатюры тоже помечены, а превью всего каталога можно перегенерировать, если водяной знак изменился
  • EXIF-данные удаляются из всего, что может загрузить посетитель
  • Загруженный файл проверяется декодированием, а не по расширению, с защитой от «декомпрессионных бомб»

Что я сделал: админка

  • Дашборд на живых данных
  • Загрузка перетаскиванием с прогрессом для больших файлов, таблица фото с правкой цены прямо в строке и массовыми действиями, архив, который удаляет файлы из хранилища окончательно
  • Группы и значения фильтров для каталога; тексты главной, правовые страницы и блоки футера редактируются в визуальном редакторе
  • Настройки слайдера, переключатель раздела видео и диагностика хранилища, которая объясняет неудачную загрузку простыми словами
  • Заказы с историей и действиями, выгрузка заказов, статистики и подписчиков в CSV
  • Рассылки: редактор markdown со вставкой фото, тестовое письмо, пакетная отправка с автоматическими UTM-метками и аварийная остановка
  • Статистика по периодам: график по дням, топ фото, категории и каналы трафика по UTM-атрибуции первого касания
  • Настройки со сменой пароля и встроенные диалоги, которые одинаково работают на планшете и компьютере

Безопасность и надёжность

Админка защищена паролем в bcrypt и запечатанной http-only сессией с тайм-аутом бездействия, ограничением попыток входа с экспоненциальной задержкой, отзывом сессий и журналом неудачных попыток. Каждый запрос к админке проверяется дважды — в middleware и в обработчике, — а каждое изменение проверяет, откуда оно пришло. Вебхуки проверяются по подписи, дедуплицируются и сверяются с суммой и валютой в базе; брошенные оформления заказов закрываются через 24 часа; а продакшн-сборка отказывается стартовать с секретами-заглушками или тестовым платёжным драйвером. Строгие заголовки безопасности (CSP, HSTS, защита от фреймов, Referrer- и Permissions-Policy) и лимиты частоты на вход, оплату, скачивание и формы дополняют картину.

Весь магазин также запускается локально без единого внешнего ключа благодаря сменным драйверам хранилища, почты и оплаты. Качество охраняют юнит-тесты и сквозной тест полной покупки — загрузка, публикация, поиск, покупка, скачивание (байты должны совпасть с оригиналом), письмо-чек, заказ в статистике: 37 из 37 проверок зелёные.

Ключевые экраны

NaromaxShots — Каталог: поиск по названию, описанию и месту, фильтры, цена и локация на каждой карточке.
Каталог: поиск по названию, описанию и месту, фильтры, цена и локация на каждой карточке.
NaromaxShots — Страница фото: превью с водяными знаками до 3200 px, реальный размер и формат оригинала, купить сейчас или добавить в корзину.
Страница фото: превью с водяными знаками до 3200 px, реальный размер и формат оригинала, купить сейчас или добавить в корзину.
NaromaxShots — Полноэкранный просмотр с зумом 2× и 3×, который следует за курсором или пальцем, — водяные знаки остаются на каждом превью.
Полноэкранный просмотр с зумом 2× и 3×, который следует за курсором или пальцем, — водяные знаки остаются на каждом превью.
NaromaxShots — Корзина без регистрации: несколько фото в одной оплате — карты, Apple Pay и Google Pay через Stripe или PayPal.
Корзина без регистрации: несколько фото в одной оплате — карты, Apple Pay и Google Pay через Stripe или PayPal.

Главная страница целиком, десктоп

NaromaxShots — full-page website screenshot

Технологический стек

  • Next.js 15
  • TypeScript
  • PostgreSQL + Prisma
  • Cloudflare R2
  • Stripe
  • PayPal
  • sharp · LibRaw · libheif (WASM)
  • Resend
  • Railway

Хотите реализовать похожий проект?

Расскажите мне о задаче. Я лично изучу ваш проект и предложу подходящий формат реализации.

Обсудить проект со мной