Ми намагаємося створити український Реддіт
Ми зробили соцмережу. Стійте, не розходьтеся — це цікава історія!
Мені 41. Коли о 5 ранку мене в Києві розбудили вибухи, я вже давно не виходив із дому. Причини — медичні та просто не хочу. Але мова не про це.
Я мріяв купити квартиру, планував розумний дім і що пройду все, що купив до колекції з усіх можливих приставок. За роки назбиралося чимало. Війна забрала половину всіх зібраних коштів — я підбирав покинутих котів і споряджав друзів, донатив щоразу, коли прокидався від нового вибуху. На решту вирішив спробувати втілити божевільний план.
Але, блін, це теж не зовсім початок. Коротше, у 2019 ми знову сварили Цукерберга у Facebook, хтось у коментарях написав, що треба робити свою платформу. Я поржав і викотив бетонні аргументи, чому це ідіотська ідея. На рівні тих, що колись Парацельс приводив, щоб довести, що Бога немає.
Не впевнений, чи це був саме Парацельс, але суть в тому, що він наводив шість аргументів проти Бога, а потім сьомий — який скасовував усі попередні.
Ось тепер це вже не вода, а суть
Решту заощаджень я вклав у те, щоб зібрати команду. Ми рік проектували контентний сайт у дусі Reddit і 9GAG. І от маємо умовний продакшн. Хочу представити його вам на обговорення.
Це не рекламний пост — зараз будуть деталі.
Сайт зроблено на Rails
+ React
, працює в Kubernetes на DigitalOcean. Я відповідав за бекенд, друзі з команди — за фронт. Ми витратили шалено багато часу на ітерації дизайну, і врешті зробили простий сайт для контенту. Філософія — створити платформу для кількості українського контенту. З якістю розберемося потім.
Унікальних фіч багато. Ну як — унікальних... Ми просто зібрали всі добрі практики. Дизайн підтримує світлу і темну тему, є мобільна адаптація та додаток, є ШІ на базі Gemini 2.0 Flash, який спростовує відверту нісенітницю. Загалом, зараз це мінімальний, але впевнений блог для всіх.
Про Ruby можу розповісти більш предметно.
Щоб уникнути проблем SSR, index.html у нас рендерить бекенд. Це досягається через комбінацію логіки Nginx і проксі, приблизно так:
location /proxy_index.html { internal; proxy_pass localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
Це дозволяє віддавати бекендом запити типу /proxy_index.html/…
— спочатку файл, потім шлях для React. Бекенд будує OpenGraph
, Twitter
і JSON-LD
мета-дані для гарних превʼюшок. Можна було б це рендерити на фронті, але цей варіант дозволяє нам розв’язати руки та досягати диких результатів.
Gemini у нас підʼєднаний через гем RubyLLM
, контрибʼютором якого я сподіваюсь стати днями, буквально. Для Gemini
тулинг поки не працює, що дає кумедні результати: наприклад, без тулингу він пише на пост, що Трамп —
Сервери на DigitalOcean
, тому особливо довелося попотіти з превʼюшками для лінків тому, що великі сайти виявляється не люблять скрапінг з відомих пулів великих провайдерів, або прикидаються каменем (типу старої фішки Nginx
з помилкою 444). Для YouTube використовуємо API v3, а більшість інших сайтів на запит відповідають 403. Тому я підняв окремий проксі-сервер на TinyProxy
прямо у своїй квартирі з фолбеком і форкнув гем для OpenGraph
, щоб усе працювало нормально.
Що ще вас може розважити
Ми зробили чимало за рік. Для пет-проєкту маленької робочої команди в якій у кожного є основна робота та ЖИТТЯ — Jira на 1000+ задач — це вже перемога. У планах ще 300 фіч і взагалі.
Я не хочу, щоб цей пост виглядав як реклама. Це AMA (ask me anything). З радістю відповім на всі питання — від архітектури до скептичних «Це точно не злетить». Якщо спитаєте, чи не страшно це робити в Україні — теж відповім. Покажу снипети, буду максимально відкритим.
Такі пости зазвичай викликають зівок, але я прошу повірити — я не просто так убив на це рік, і наміри в мене щирі.
А ще, навіть якщо технічна частина вам не важлива, прошу подивитися наші політики щодо контенту і, головне, пункт номер 6. Я буду вдячний за думку щодо цього у будь-якому вигляді.
Посилання, ну як я забув, цейво: vmist.net
І правила про які я говорив: vmist.net/static/ref/rules
Найкращі коментарі пропустити