Я сделал свою соцсеть. Вот как это устроено
Сразу скажу честно - я не пытаюсь конкурировать с Instagram или ВКонтакте. Это было бы смешно. Я сделал AbuZhuma потому что хотел показать что умею, и потому что живой проект говорит о разработчике куда больше чем любое резюме.
Ну и немного интересно было, если честно.
Что это вообще такое
AbuZhuma - это соцсеть. Можно публиковать текст, фото, видео, кружки как в Telegram, писать полноценные статьи. Есть лайки, дизлайки, комменты, репосты. Подписки и друзья как в Instagram. Уведомления, поиск, всё публичное - никаких приватных аккаунтов.
Ещё есть верификация - звёздочка для медийных людей. Пока выдаю вручную.
Что под капотом
Бэкенд
Сервер написан на Rust с фреймворком Axum. Выбрал Rust осознанно - хотел попрактиковаться в чём-то сложном и получить быстрый надёжный бэкенд. Местами было больно, но оно того стоило.
Честно скажу - в Rust я ещё только начинающий, поэтому при разработке бэкенда мне помогал Claude Code. Но этот проект реально сильно подтянул мои знания в языке, так что не жалею ни капли.
Для базы данных - PostgreSQL 16, запросы через SQLx с проверкой на этапе компиляции. Это значит что если я написал кривой SQL - узнаю об этом ещё до запуска, а не в продакшне.
Redis используется для кэша и для того чтобы WebSocket работал между несколькими инстансами сервера через pub/sub.
Медиафайлы - фото, видео, кружки - хранятся в MinIO, это S3-совместимое хранилище которое можно поднять у себя. Видео обрабатывает FFmpeg: транскодинг, генерация превью. Картинки ресайзятся через библиотеку на Rust.
Авторизация через JWT + refresh-токены. Пароли хэшируются через Argon2 - один из самых надёжных алгоритмов на сегодня.
Архитектура бэкенда - hexagonal (ports & adapters). Грубо говоря, бизнес-логика не знает ничего про базу данных или HTTP. Это делает код чище и проще тестировать.
Фронтенд
Фронтенд написан полностью моими руками, без помощи AI. Next.js 15 с App Router и TypeScript в строгом режиме. Стили - SCSS-модули, стейт - Zustand.
Архитектура - FSD (Feature-Sliced Design). Это способ организовать код так чтобы через полгода можно было в нём разобраться. Слои идут сверху вниз: app - widgets - features - entities - shared. Импорты только вниз, никакой каши.
Всё mobile-first. Тач-таргеты минимум 44px, никаких мелких кнопок. Опубликовать пост можно за 2 клика с любой страницы.
Публичные страницы рендерятся на сервере (SSR) - для SEO и скорости. Метатеги, OG-разметка, JSON-LD - всё это есть.
Админка
Отдельно написал админ-панель на React. Там есть аналитика по пользователям и контенту, управление верификацией, модерация. Через неё и выдаю звёздочки. Доступа к личным перепискам пользователей в админке нет - этого интерфейса просто не существует.
Инфраструктура
Всё self-hosted. Nginx как reverse proxy, Certbot для SSL-сертификатов. Бэкапы базы данных через cron. Бэкенд запускается через systemd.
Планы
Проект живой и я продолжаю его развивать. Из ближайшего - хочу добавить комнаты для созвонов.
Мелких доработок тоже хватает. Например сейчас есть баг с обрезкой обложки профиля - картинка иногда кропается не так как надо. Уже разбираюсь, скоро починю.
В общем работы ещё много, и это нормально.
Если хочешь зайти
Платформа открытая, регистрация свободная. Буду рад если зайдёшь и посмотришь. Ну и если что-то сломается или увидишь баг - напиши, не обижусь, наоборот буду рад фидбеку.
Комментарии