Стартап за несколько часов

Затупил над распределённой системой хранения данных и решил отвлечься. Пришла забавная мысль найти копью Tiktok в github и погнал искать интересные проекты.
Нашёл только пару простых устаревших демо состоящих только из визуальных частей и захордкоженных данных. Никакого бэкенда.

Зато красивая оболочка, и думаю, надо доделать, может что интересное получится)

Стартап за несколько часов

gRPC - потому что REST это слишком мейнстрим

Первым делом нужно было решить, как клиент будет общаться с сервером. REST API? Скучно. GraphQL? Слишком модно. WebSocket? Для видео-стриминга — почему бы и нет, но хотелось чего-то более... инженерного.

Почему gRPC?

  • Бинарный протокол - быстрее JSON
  • Встроенная поддержка стриминга(самое то для реплики tiktok)
  • Строгая типизация
  • Возможность генерировать код из одного .proto для фронта и бэкенда

Основа файла .proto

package tiktok; option java_multiple_files = true; option java_package = "com.tiktok.grpc"; option java_outer_classname = "VideoServiceProto"; // Сервис для работы с видео service VideoService { // Получить ленту видео (пагинация) rpc GetFeed(FeedRequest) returns (FeedResponse); // Получить видео по ID rpc GetVideo(VideoRequest) returns (Video); // Стриминг видео (chunks) rpc StreamVideo(VideoRequest) returns (stream VideoChunk); // Загрузка видео (streaming upload) rpc UploadVideo(stream VideoUploadChunk) returns (UploadResponse); // Лайк/дизлайк rpc LikeVideo(LikeRequest) returns (LikeResponse); // Получить видео пользователя rpc GetUserVideos(UserVideosRequest) returns (FeedResponse); }

Что меня самого удивило, это то что получаешь готовый код для Dart и Java

Backend и снова он

Стартап за несколько часов
Стартап за несколько часов

Для такого сервиса лучше было бы выбрать Go, Rust или C++ но в них я совсем не шарю и если вайбкодить то точно не разберусь в нейросетевых художествах, поэтому Spring boot + быстрота поднятия сервера)

Docker Compose - потому что "у меня работает" больше не оправдание

Локальная разработка без Docker в 2025 году — это как программирование на Notepad. Технически возможно, но зачем?

Как и с распределённым хранилищем поднял две базы
PostgreSQL(Метаданные) и MinIO(Видео)

services: postgres: image: postgres:18 environment: POSTGRES_DB: tiktok POSTGRES_USER: postgres POSTGRES_PASSWORD: password ports: - "5432:5432" minio: image: minio/minio:latest command: server /data --console-address ":9001" ports: - "9000:9000" - "9001:9001"

Помню, как учили поднимать базу... без Docker кошмар...
50 раз переустановишь, пока не запуститься с нужными настройками....

Авторизация и аутентификация

В репозитории приложение было без экрана входа, подумал - не канон. Нельзя просто так взять и сделать социальную сеть без авторизации. Ну, технически можно, но тогда это будет анархия.

Из интересного скажу - интеграция JWT с gRPC. Spring Security по умолчанию работает на HTTP, но gRPC использует HTTP/2 и свои метаданные. Поэтому написал кастомный GrpcAuthenticationInterceptor, который отдаёт токен из metadata и валидирует его.

Что в итоге?

Из демо копии с хардами получилось полноценное приложение. Если оптимизировать виртуальными потоками и добавить ИИ систему рекомендаций можно запускать и рубить бабло на рекламе, загружаться будет быстрее чем у чёрно-оранжевого ютуба. А то видео у них нормально загружаются а шортсы нифига - просто кошмар!

Начать дискуссию