rating.title

rating.best

rating.noPosts

Dumb Lab

Блог-платформа для трейдеров и инвесторов — архитектура и стек

🏗️Как это всё устроено

Dumb Lab — это полнофункциональная блог-платформа, заточенная под трейдерское комьюнити. Весь проект живёт в одном монорепо: фронт, бэк, API, миграции базы, сиды переводов — всё вместе. Деплоится одним docker compose up на любой сервер.

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

Фреймворк

Next.js 16.2

+ App Router + Turbopack

Самая свежая версия. Сервер и клиент в одном проекте — SSR, API routes, middleware (он же proxy.ts в v16). Turbopack вместо Webpack — билд в 5 раз быстрее.

Фронтенд

React 19 + Tailwind 4

+ Zustand + Lucide Icons

React 19 с серверными компонентами. Tailwind 4 — новый движок, zero-config. Zustand для глобального стейта вместо громоздкого Redux. Lucide — лёгкие SVG-иконки.

База данных

PostgreSQL 16

+ Prisma 7.5 ORM

Postgres — надёжен, поддерживает полнотекстовый поиск, JSON, и case-insensitive сравнения из коробки. Prisma 7 — type-safe запросы, миграции, auto-generated типы.

Аутентификация

NextAuth v5 (beta)

JWT стратегия

Credentials-провайдер: логин/email + пароль. Пароли хешируются bcrypt (12 раундов). JWT-токены хранят id, username, role, spiritAnimal. Без сессий в БД — stateless.

Хранилище файлов

AWS S3

+ Sharp для ресайза

Аватарки и картинки в постах загружаются на S3. Sharp ресайзит аватарки до 256×256 на лету перед загрузкой — экономит трафик и место.

Редактор

Tiptap 3.20

15+ расширений

Полноценный WYSIWYG: заголовки, списки, код с подсветкой синтаксиса (lowlight), картинки, ссылки, цитаты, таблицы. Контент сохраняется и как HTML, и как JSON.

Почта

Nodemailer + Titan

STARTTLS на порту 587

Верификация email и сброс пароля через Titan SMTP (Namecheap). Почта отправляется с admin@dumb-lab.org — свой домен, не «от gmail.com».

Инфраструктура

Docker + Lightsail

Nginx + Let's Encrypt

Multi-stage Docker билд — финальный образ ~200MB. AWS Lightsail (8GB RAM). Nginx терминирует SSL с бесплатным сертификатом от Let's Encrypt.

Валидация

Zod 4 + React Hook Form

type-safe на обоих концах

Формы на клиенте через React Hook Form. Серверная валидация — Zod-схемы. Один и тот же тип описывает и форму, и API — ошибки невозможны.

Почему именно этот стек?

  • Next.js 16 = фуллстек в одном проекте. Не надо отдельно пилить API на Express и фронт на Vite — всё рядом, всё типизировано

  • PostgreSQL + Prisma = надёжность + удобство. Prisma генерирует типы прямо из схемы БД — забудь про расхождения между фронтом и бэком

  • JWT вместо серверных сессий = горизонтальное масштабирование без проблем. Добавил второй сервер — и всё работает

  • Tailwind 4 = стили прямо в JSX, никаких CSS-модулей, никакого BEM. Новый движок — в 10 раз быстрее компиляция

  • Docker = «работает у меня» ≡ «работает на сервере». Один Dockerfile, один compose — и проект живёт

🌍Мультиязычность — но не как у всех

Три языка: русский, английский и NSF (шуточный «олбанский» язык). Но переводы хранятся не в JSON-файлах, а прямо в базе данных (таблица Translation). Это значит: можно менят�� тексты на лету, без передеплоя. Кэш в памяти обновляется к��ждые 60 секунд.

Локаль определяется из cookie NEXT_LOCALE, а если его нет — из заголовка Accept-Language. Middleware (proxy.ts) автоматически редиректит / на /ru/, /en/ или /nsf/. В URL всегда видно, на каком языке страница — SEO-friendly.

Сиды переводов (prisma/seed-translations.ts и seed-nsf.ts) содержат 349+ ключей. При деплое достаточно запустить сид — и все переводы обновятся через upsert.

✨Интересные фишки

🦥 Красивый Rate Limit

Если пользователь слишком активен — вместо сухой 429 ошибки он видит стильную страницу с ленивцем и обратным отсчётом до разблокировки. Три уровня: general (200 req/min), API (100 req/min), auth (20 req/5min).

🐾 Духовные животные

При регистрации можно выбрать «духовное животное» — от Капибары до Малыша Йоды. Оно отображается как маленький бейдж на аватарке пользователя по всему сайту. 15 вариантов, каждый с уникальной PNG-иконкой.

🔒 Auth Modal вместо редиректа

Незалогиненный пользователь нажимает «Лайк» или «В избранное» — вместо грубого редиректа на логин появляется элегантная модалка с предложением войти или зарегистрироваться. Контекст страницы не теряется.

📝 WYSIWYG как у взрослых

Tiptap-редактор с подсветкой кода, вставкой картинок (drag & drop в S3), форматирование�� текста, таблицами. Контент сохраняется и как HTML для рендеринга, и как JSON для редактирования — не теряется ни крошки форматирования.

🧹 XSS-защита через DOMPurify

Весь пользовательский HTML (посты, комментарии) прогоняется через isomorphic-dompurify с белым списком тегов. Работает и на сервере, и на клиенте — изоморфно. Вставить <script> не получится.

🎯 Система рейтингов

Посты ранжируются по лайкам, избранным, обсуждаемости. Периоды: 24 часа, 7 дней, 30 дней. Есть порог лайков для попадания на главную страницу — настраивается админом через панель.

👑 Полная админка

Управление пользователями (роли, баны на 1ч/24ч/7д/30д/навсегда с причиной), модерация постов, настройка порога лайков. Всё через веб-интерфейс, без SSH на сервер.

🔔 Нотификации

Лайк на пост, ответ на комментарий, новый подписчик — всё приходит в колокольчик в шапке сайта. Типизированная система: COMMENT_REPLY, POST_LIKE, NEW_FOLLOWER, MENTION и т.д.

📧 Верификация по email

6-значный криптографически безопасный код (crypto.randomInt, не Math.random!). Отправляется через Titan SMTP. Код живёт 24 часа. Без верификации — нельзя залогиниться.

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

Прошли полный аудит безопасности и закрыли все критические и высокоприоритетные уязвимости:

Content-Security-Policy

HSTS (2 года)

X-Frame-Options: DENY

XSS-санитизация (DOMPurify)

bcrypt (12 раундов)

Rate limiting (3 уровня)

Крипто-коды верификации

SSL/TLS (Let's Encrypt)

Docker non-root user

PostgreSQL/Redis только localhost

Пароли через env vars

Case-insensitive уникальность

🚀Деплой

Весь цикл от коммита до продакшена — три команды:

[Локальная машина]
git push origin main ← код улетает на GitHub

[AWS Lightsail — 3.129.93.77]
cd /opt/dumblab && sudo git pull ← сервер забирает код
sudo docker compose build app ← пересобирает образ
sudo docker compose up -d app ← перезапускает контейнер
sudo -E npx tsx prisma/seed-*.ts ← обновляет переводы (если менялись)

Всё. Сайт обновлён. https://dumb-lab.org

Dumb Lab — Апрель 2026

Архитектура и разработка при содействии Claude Code (Anthropic)

8