Привет, Хабр! Мне 14 лет, и пока мои ровесники ругаются в cs2, а нормальные люди спят по 8 часов, я решил, что мне катастрофически не хватает стресса в жизни. Поэтому за последний месяц я написал собственную платформу для решения алгоритмических задач - с изолированным выполнением кода, микросервисами и котиками.

Встречайте - ЛитКот. Проект уже крутится в проде на leetcot.ru, а в этой статье я расскажу, как организовать архитектуру такого сервиса, не задохнуться в монорепе и защитить сервер от мамкиных хакеров (вроде меня самого).

Зачем нужен ещё один тренажёр?

LeetCode - это классика, но давайте честно: решать сухие задачи про инверсию бинарного дерева бывает невероятно скучно. Особенно когда на реальном собеседовании тебя попросят просто отцентрировать div или переложить JSON из одной апишки в другую. Мне захотелось добавить геймификации, сюжета и немного (а точнее, нездорово много) безумия.

Например, в моём курсе «Щёлкаем алгоритмы как рыбку» нет унылой задачи «Поиск элемента в отсортированном массиве». Зато есть «Прятки с сосиской»! Пользователю нужно написать алгоритм бинарного поиска за O(log n), чтобы помочь коту найти сосиску в контейнерах. Согласитесь, ради виртуальной сосиски писать код как-то приятнее, чем ради мифического оффера в бигтех.

Выполнение кода: даём пользователю гранату (и надеемся на лучшее)

Самое весёлое в разработке аналога LeetCode - это запуск чужого кода. Разрешить случайным людям из интернета выполнять Python-скрипты на твоём сервере - это как добровольно пригласить в дом полтергейста. Один случайно (или специально) запущенный while True: fork() - и твой сервер со слезами отправляется в Вальгалу. Я это узнал не из книжки — во время разработки умудрился положить собственный тестовый сервер именно так. Сидел и смотрел как он перестаёт отвечать, пока до меня дошло что происходит.

Пришлось продумать надёжную изоляцию процессов. Код каждого пользователя выполняется в изолированной песочнице со строгими ограничениями по памяти и жёстким тайм-аутом. Не успел найти сосиску вовремя - лови Time Limit Exceeded и иди оптимизируй. У нас тут суровый кошачий киберспорт.

Инфраструктура, или «Я у мамы DevOps»

Чтобы проект не жил только на моём localhost, я настроил полноценный CI/CD-пайплайн в GitHub Actions. Проект пакуется в Docker-контейнеры с аккуратным Dockerfile и .dockerignore, чтобы случайно не утянуть в прод папку node_modules весом с небольшую чёрную дыру.

Для удобной разработки настроены DevContainers - настраивать локальное окружение руками каждый раз это для слабаков.

А чтобы после моих гениальных релизов не отваливались вёрстка и логика, прикручены E2E-тесты на Playwright. Да, я даже пишу тесты. Сам в шоке.

name: Deploy Production
on:
  release:
    types: [published]
jobs:
  deploy:
    runs-on: self-hosted
    steps:
      - name: Cleanup host
        run: |
          docker system prune -af --volumes
          sudo journalctl --vacuum-size=10M
          sudo apt-get clean
      - uses: actions/checkout@v4
      - name: Environment
        run: |
          [ -f /home/user1/actions-runner/secrets.env ] && cp /home/user1/actions-runner/secrets.env ./.env || exit 1
      - name: Update and Deploy
        run: |
          docker compose pull
          docker compose up -d --remove-orphans
      - name: Migrations
        run: |
          docker compose exec -T app pnpm --filter @repo/db exec prisma migrate deploy

Что дальше?

Месяц плотного кодинга на энтузиазме дал свои плоды. Проект работает, пользователи могут учить алгоритмы, а котики находят свои сосиски.

Но почивать на лаврах скучно. Прямо сейчас я готовлю к релизу следующий проект -и это будет кое-что большее чем просто тренажёр задач. Следите за leetcot.ru и arlist.ru.

Буду рад конструктивной критике (и неконструктивному хейту) в комментариях. Пишите, как вы реализовывали безопасное выполнение кода в своих пет-проектах, ставьте плюсики и буду рад увидеться с вами вновь!

Комментарии (9)


  1. janvarev
    22.06.2026 10:35

    Лайк за идею и реализацию в 14 лет (серьезно, это очень круто). Квазиминус за нейросгенеренный текст (квази - потому что самостоятельно писать прилично в 14 лет дофига редкий навык).

    Про поиск сосиски - имхо идея хороша для возраста разработчика, а, как ни странно, взрослым людям уже удобнее видеть типовые "найдите в массиве А число бинарным поиском" - меньше когнитивная нагрузка. Втыкать в сосиски в 40+ уже не очень хочется - и так общаешься с ЛПР, и у каждого уникальная сосиска (нет).

    Вангую: к 23 будете прям хорошим разработчиком (тем более AI-paired programmers нужны), но денег вам платить много не будут, и вы будете спрашивать "почему". К 35 годам разберетесь, и денег станет больше :)


    1. Koteukin
      22.06.2026 10:35

      Я искренне не понимаю как вы понимаете используется ли ИИ в написании постов или нет. Учитывая то что я вижу обвинения в использовании ИИ почти под каждым постом, мне больше кажется это парраноей чем объективной критикой. Лично тут я вижу больше проработанный пост чем ИИ-слоп (второе я сам замечал), возможно ему помогали писать пост родители или администраторы хабра.

      Так-же года 2 назад (как раз примерно лет в 14 лет) в своих постах (я вёл канал по разработке в телеграмме) я часто ставил эмодзи перед каждым абзацем, только сейчас понимаю как это выглядело по ИИ-шному, но я это делал сам и даже не задумывался об ИИ (хоть они тогда и начинали хайповать, но я их честно не использовал).

      Ну и в целом мне лично переодически говорили что стиль моего общения похож на ИИ-шный.


      1. janvarev
        22.06.2026 10:35

        Я искренне не понимаю как вы понимаете используется ли ИИ в написании постов или нет

        Насмотренность. В данном случае характерные обороты самокритики и описания проектов (типа "X это вам не хухры-мухры"). Могу ошибаться, конечно. Но заодно прогнал через Яндекс детектор (по одним очень хорошим обсуждениям у него реально хороший детектор) - получил то же самое.

        Ваш коммент очевидно не нейросетевой - тоже по куче оборотов.

        И да, на всякий случай - конкретно в данном случае я не считаю это чем-то криминальным; повторюсь, в 14 лет не уметь писать крутые статьи это более чем норма (я даже себя немного помню), а описать проект хочется. Вот когда такое же начиная с 20-25 лет - это уже не хорошо, там уже оценивается и умение написать текст тоже.

        Автору в любом случае успехов, да и вам (по комментарию ниже вам 16) - тоже; писать проекты и быть на Хабре в таком возрасте - круто, без сарказма.

        PS: Вот правда, не обижайтесь, что вас немного оценивают согласно возрасту - считайте, что это как битвы в разных весовых категорях. Ну не бьются люди 60 кг vs 120 кг обычно. Для тимлида 35-40 лет сделать такой сервис, ну... не очень круто, правда, по ряду причин. Для 14-16 лет - правда достижение.


  1. G4vni1L
    22.06.2026 10:35

    Ещё надо cap_drop: ALL и ACL на юзера 1228 с правами write только на src/


  1. Apokalepsis
    22.06.2026 10:35

    Можно попробовать прикрутить выполнение в serverless, тогда безопасность будет по умолчанию.


  1. Koteukin
    22.06.2026 10:35

    Очень круто! Мне 16, у меня даже есть парочка успешных релизов в прод, но твой проект круче их всех.

    Учитывая то что у меня пока особо нету опыта, критиковать твой проект мне кажется как минимум не вежливо, да и для твоего возраста проект такого уровня это невероятно.

    Хотел проголосовать за пост, но из-за маленькой кармы хабр не позволил это сделать. Завтра вернусь и обязательно проголосую.


  1. Koteukin
    22.06.2026 10:35

    Полазил по сайту. Есть несколько моментов которые я заметил:
    1. На основной странице появляется горизонтальный скролл, можно пофиксить добавлением overflow-hidden на первый section или div внутри, возможно это костыль.
    2. При решении задачи при изменении текстового поля теряется выделение (вероятно проблема с неправильным использованием MonacoEditor), проблема повторилась и на Chrome и на Firefox.

    Так-же, если проект опенсорс могу стать контрибьютером и фиксить разные баги)

    Ещё парочка советов для развития проекта, возможно они не прям простые, но реально могут полезными для многих:
    1. Добавь локализацию сайта (а позже задачь) на английский и возможно другие языки
    2. Добавь разные языки программирования

    Сам пользуюсь neovim как основным редактором, так что мне очень понравилось что ты добавил vim motions :)


    1. Koteukin
      22.06.2026 10:35

      Ещё ошибка, при попытке регистрации через Arlist ID появляется ошибка
      redirect_uri did not match any of the client's registered redirect_uris

      С регистрацией по паролю проблем нет


    1. Koteukin
      22.06.2026 10:35

      Ещё есть не критичная ошибка в решениях, при сохранении решения по умолчанию в кодовых блоках стоит ts

      Так-же смена темы не работает почти для всего сайта. Для меня лично это не критично (так как сам пользуюсь тёмной темой), но всё равно забавный баг

      (Если что всё это не критично, сайт реально классный, просто пишу баги которые сам заметил)