NaromaxShots
NaromaxShots — фотосток с нуля: оплата, защищённые оригиналы и своя админка
Собственный фотосток фотографа, написанный с нуля: Next.js, PostgreSQL и приватное облачное хранилище, оплата Stripe и PayPal, превью с водяными знаками, RAW-оригиналы по подписанным ссылкам и полная админка.
Фотосток с нуля · Stripe + PayPal- Год
- 2026
- Длительность
- Июнь – июль 2026
- Отрасль
- Фотография — онлайн-фотосток
- Страна
- Онлайн-магазин · покупатели по всему миру
- Услуги
- Разработка сайтов, E-commerce, Дизайн сайтов
Результаты
-
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 проверок зелёные.
Ключевые экраны
Главная страница целиком, десктоп
Технологический стек
- Next.js 15
- TypeScript
- PostgreSQL + Prisma
- Cloudflare R2
- Stripe
- PayPal
- sharp · LibRaw · libheif (WASM)
- Resend
- Railway
Хотите реализовать похожий проект?
Расскажите мне о задаче. Я лично изучу ваш проект и предложу подходящий формат реализации.
Обсудить проект со мной