EXAI
актуально
Для новых сотрудников · Engineering

Техническая инфраструктура
компании.

Стартовая карта технической среды: где живут проекты, как устроены окружения, какие инструменты и доступы используются, как запускать и сопровождать типовой проект — и где искать всё, что не покрыто этим документом.

Чтение
~18 мин
Владелец
Dev team
Глава 01

О документе

Зачем он нужен и как им пользоваться.

1.1

Цель документа

#

Стартовая карта технической среды для новых сотрудников.

Документ помогает новому инженеру быстро сориентироваться в инфраструктуре компании и понять, как устроены наши проекты — без необходимости задавать каждый вопрос вживую.

После прочтения вы поймёте

  • где живут проекты и сервисы;
  • как обычно устроены окружения;
  • какие инструменты и доступы используются;
  • как запускать и сопровождать типовой проект;
  • где искать логи, конфиги и точки диагностики.
Версия
1.0
Владелец
Команда разработки
Актуально на
16 июня 2026
1.2

Как читать этот документ

#

Документ построен по двум уровням: сначала — общая инфраструктурная модель компании, затем — пример её применения на одном реальном проекте.

Если возникли уточнения по конкретному проекту

Ищите их в проектной документации (README, docs/) и у команды, которая сопровождает проект. Этот документ — общий каркас, а не справочник по каждому репозиторию.

Глава 02

Техническая карта

Где живут проекты, как устроены окружения и доступы.

2.1

Где живут проекты

#

Хостинг, провайдеры и принцип размещения.

Beget

Основной VPS/VDS-хостинг для backend и frontend. На нём же — регистрация доменов и часть managed-сервисов.

FirstVDS

Дополнительный хостинг-провайдер. Часть серверов и вспомогательных сервисов компании.

Managed-сервисы

Облачные PostgreSQL, S3-совместимое объектное хранилище, облачный n8n, платформа Lovable для прототипов.

Принцип размещения

  • Production backend проекта обычно живёт на выделенном под него сервере в Beget.
  • Frontend того же проекта обычно размещается рядом — как frontend-hosting в Beget.
  • Часть проектов и вспомогательных сервисов может быть размещена в FirstVDS.
  • Production и staging окружения могут жить как в Beget, так и в FirstVDS.

Внешние платформы

  • Lovable — среда для быстрых прототипов; прототипы нередко становятся основой production-приложений.
  • Облачный n8n — единый инстанс на всю компанию, на нём работают automation/workflow-проекты.
  • Облачные PostgreSQL в Beget — используются несколькими проектами.
  • S3-совместимое хранилище в Beget — файлы и артефакты проектов.
2.2

Окружения

#
local

Локальная среда разработчика. Здесь поднимаются и тестируются изменения до того, как они уедут дальше.

staging

Тестовое или предбоевое окружение. Промежуточная точка для обкатки релиза перед production.

production

Боевое окружение. Любые изменения сюда — только после прохождения предыдущих этапов и согласования.

Заметка

На уровне общей карты документ не описывает окружения каждого проекта. Где находится тестовый сервер и где допустимо проводить эксперименты — разбирается в проектном онбординге.

2.3

Сетевой контур и доступы

#

Прямой SSH, персональные пользователи и закрытый root.

Специальной промежуточной инфраструктуры (VPN, bastion, jump host) по умолчанию нет. Доступ к серверу настраивается напрямую по SSH.

Базовая модель доступа к backend-серверу

  • Под backend-проект разворачивается отдельный сервер.
  • На сервере выполняются базовые настройки безопасности.
  • Стандартный SSH-порт закрывается, вместо него — кастомный случайный порт.
  • Вход разрешён только по SSH-ключам, парольная авторизация отключена.
  • Авторизация под root запрещена; root-доступ отключается для повседневной работы.
  • Создаётся привилегированный пользователь с правами sudo.
  • Создаётся отдельный непривилегированный пользователь, под которым запускается приложение.

Модель доступа для команды

  • Для нового разработчика на сервере создаётся отдельный пользователь.
  • Доступ выдаётся через персональный SSH-ключ.
  • Совместная работа ведётся через персональные учётные записи, а не через общий аккаунт.
Что важно новичку

Доступы выдаются адресно. Для входа нужен подготовленный SSH-ключ. Работа с сервером ведётся не из-под root — для повседневных задач используется ваш персональный пользователь.

2.4

Где хранится код

#

Внутренний git-сервер и корпоративный GitHub.

Внутренний git-сервер

Отдельный VPS с bare git repositories. Основной источник кода компании. Не SaaS — обычный git по SSH.

Корпоративный GitHub

Используется для части проектов, особенно связанных с Lovable. Доступ — по приглашению в организацию.

Источник кода зависит от проекта

В компании более одного git-источника. Перед началом работы уточните у команды, где именно находится репозиторий нужного проекта.

Как это выглядит на практике

  • Вам отдельно сообщат, в каком репозитории лежит код проекта.
  • В этом же сообщении придут параметры доступа к внутреннему git-серверу и пример команды для clone.
  • SSH-ключ к git-серверу выдаётся адресно конкретному сотруднику.
bash· Пример онбординг-сообщения
# Подключение к внутреннему git-серверу
ssh -p <ssh_port> -i ~/.ssh/<key_path> <git_user>@<git_host_ip>

# Структура хранилища на сервере
~/git_store                      # корневой каталог git-хранилища
~/git_store/voice_ai.git         # проект

# Клонирование через локальный SSH-alias
git clone <git_user>@<git_alias>:git_store/voice_ai.git
Заметка

git_alias — локальный SSH-alias, его сотрудник настраивает так, как удобно. Реальные IP, порты, имена пользователей и ключи не фиксируются в этом документе и передаются адресно при подключении к конкретному проекту.

2.5

Секреты и конфигурация

#

Текущая базовая практика

  • Конфигурация хранится в .env-файле проекта.
  • .env обычно лежит в корне проекта.
  • Единой централизованной системы управления секретами пока нет.
  • Настройки привязаны к проекту, а не к корпоративной платформе конфигурации.
Жёсткое правило

Секреты и содержимое .env запрещено коммитить в репозиторий. Перед коммитом проверьте .gitignore и diff — это самая частая причина утечек.

Как это происходит на практике

  • .env-файл разработчик обычно заполняет сам.
  • Если переменные или значения неочевидны — помогают другие разработчики команды.
  • Перед запуском уточните, какой .env использовать: local, staging или production.
Заметка

Право на изменение боевых конфигов определяется контекстом конкретного проекта и согласуется внутри команды.

2.6

CI/CD и деплой

#

Текущая практика

  • Автоматического CI в компании пока нет.
  • Тесты запускаются локально или на тестовом сервере с тестовыми данными.
  • После обкатки на тестовом сервере деплой в production выполняется вручную через git.
  • Код на сервере обновляется через git pull.
  • После обновления приложение перезапускается через docker compose.
  • Production deploy выполняет ответственный разработчик.
bash· Типовой релиз на сервере
# На сервере, под непривилегированным пользователем
cd /opt/projects/<project>
git pull
docker compose up -d --build
docker compose ps
docker compose logs -f --tail=200
Ответственность

Проверка перед релизом лежит на команде и конкретном разработчике. Тестовый сервер — промежуточная точка перед ручной выкладкой; обязательного централизованного pipeline нет.

Заметка

Сценарий rollback зависит от проекта и должен быть отдельно описан в его проектной документации.

2.7

Наблюдаемость и диагностика

#
  • Логи по возможности выносятся в отдельные файлы.
  • Для логов настраивается ротация.
  • При необходимости логи смотрятся через docker compose logs.
  • Единого централизованного сервиса мониторинга пока нет.

Откуда начинать диагностику

  • Зайти на сервер проекта по SSH.
  • Проверить статус контейнеров: docker compose ps.
  • Посмотреть последние логи нужного сервиса: docker compose logs --tail=300 <service>.
  • Проверить файловые логи в logs/ проекта.
  • Если есть healthcheck — дёрнуть его руками.
Глава 03

Модель проекта

Как обычно устроен типовой проект компании.

3.1

Что обычно есть в типовом проекте

#

Backend-стек

  • Python как основной язык backend.
  • uv — менеджер проекта и зависимостей.
  • Makefile — алиасы команд и типовые операции.
  • docker compose — запуск приложения.

Типовая структура на верхнем уровне

text
project/
├── <package>/              # основная кодовая база
├── docs/                   # проектная документация
├── logs/                   # логи приложения
├── ansible/                # инфраструктурные плейбуки (опционально)
├── nginx/                  # конфигурация прокси (опционально)
├── Makefile                # типовые команды
├── docker-compose.yml      # запуск сервисов
├── pyproject.toml          # зависимости (uv)
└── .env                    # конфигурация и секреты (НЕ коммитится)
Заметка

Это типовая модель, а не жёсткий стандарт. Кроме Python-backend в компании есть JS/frontend-проекты — там в качестве инструмента сборки и dev-runtime обычно используется Vite.

3.2

Как поднять проект локально

#

Конкретные команды смотрите в README, docs и Makefile проекта — этот раздел описывает только общий принцип.

Типовой сценарий

  • 01Склонировать проект из внутреннего git-хранилища или корпоративного GitHub.
  • 02Создать и заполнить .env (запросить значения у команды, если неочевидно).
  • 03Если проект контейнеризирован — поднять: docker compose up -d --build.
  • 04Открыть README/Makefile и пройтись по smoke-командам проекта.
Не каждый проект поднимается локально

Часть проектов требует запуска именно на сервере — они завязаны на домены, внешний IP, сетевое окружение или внешние интеграции. Не угадывайте способ запуска по памяти: README, docs и Makefile — первая точка.

3.3

Как проект работает на сервере

#

Подготовка сервера

  • Под каждый проект сервер заранее готовится через Ansible.
  • Стандартный SSH-порт меняется на случайный кастомный.
  • Отключаются вход под root и парольная авторизация.
  • Создаётся один привилегированный пользователь.
  • Создаётся как минимум один непривилегированный пользователь для запуска проекта.
  • При необходимости создаются дополнительные непривилегированные пользователи для разработчиков.

Размещение проекта на сервере

  • Проекты обычно клонируются в /opt/projects.
  • Доступ к этой директории настраивается через Ansible.
  • Директория подготовлена для совместной работы нескольких непривилегированных пользователей.
bash· Типовой рабочий цикл на сервере
ssh -p <port> <user>@<host>
cd /opt/projects/<project>
git pull
docker compose up -d --build
docker compose logs -f --tail=200 <service>
Что важно новичку

Работа на сервере ведётся не из домашней директории, а из /opt/projects. Повседневный запуск приложения — под непривилегированным пользователем.

3.4

Что проверить после запуска

#
  • Приложение действительно поднялось и не падает в перезапуск.
  • Логи не содержат явных критических ошибок.
  • Основной пользовательский сценарий проходит базовую проверку.
  • Если в проекте есть healthcheck — он отвечает корректно.
Заметка

Не во всех проектах есть отдельный healthcheck. Минимальный набор проверки зависит от проекта, но логи и базовый сценарий проверяются почти всегда.

Глава 04

Правила

Что можно делать самостоятельно, а что — нет.

4.1

Что делается только согласованно

#

Принцип простой: рутинные действия в своей зоне ответственности — самостоятельно. Решения, влияющие на production, доступы, общую инфраструктуру или работу других людей — по согласованию с командой.

Можно самостоятельно

Локальная разработка, эксперименты на своей машине, изменения в своей фиче-ветке, обновление документации проекта.

Только согласованно

Изменения в production, выдача доступов, миграции БД, изменения сетевой конфигурации, обновление общих сервисов.

4.2

Что запрещено или нежелательно

#
Запрещено

Хранить секреты в git. Любые ключи, токены, пароли и .env — только вне репозитория.

Обязательно

Если изменения в коде затрагивают спецификацию — документация обновляется вместе с кодом, в том же PR/коммите.

Глава 05

Пример: voice_ai

Как общая модель выглядит на реальном проекте.

5.1

Назначение проекта

#

voice_ai — внутреннее приложение компании для интеграции телефонии с голосовыми AI-агентами.

Прямая рабочая интеграция голосовых агентов ElevenLabs с сервисами уровня Twilio для нас недоступна, поэтому был реализован собственный контур на базе Asterisk. Проект связывает телефонный звонок клиента с голосовым AI-агентом через нашу маршрутизацию и серверную логику.

5.2

Основные сервисы

#
asterisk

SIP / dialplan / RTP.

ai-bridge

FastAPI-мост к AI-провайдерам.

admin-api

Runtime-управление маршрутами и генерацией dialplan.

Серверная схема по зонам

server-r
Сервер в ru-зоне с Asterisk, подключён к SIP trunk Mango Office.
server-l
Сервер в eu-зоне с Asterisk, подключён к ElevenLabs и Retell. Здесь основная логика маршрутизации звонка между клиентом и AI-агентом.
5.3

Как проект запускается локально

#
  • Зависимости ставятся через uv — в первую очередь для локальной разработки, отдельных сервисов и тестов.
  • Основной runtime, особенно на сервере, идёт через docker compose.
  • Перед первым контейнерным запуском нужна инициализация через Makefile.
  • Часть поведения зависит от .env.
  • Для проверки используются health и отдельные smoke-команды.
bash· Первый запуск
# Подготовка артефактов
make logs_init       # создать директории для логов
make sounds_init     # создать звуковой файл для Asterisk

# Поднимаем сервисы
docker compose up -d --build
docker compose ps

# Smoke-проверка
make health
Заметка

uv нужен прежде всего для локальной работы разработчика. Рабочий контейнерный сценарий проекта завязан на docker compose и подготовительные команды из Makefile.

5.4

Что инфраструктурно важно

#
  • Asterisk работает в host network.
  • Admin backend не должен писать в системные Asterisk-конфиги, кроме generated include.
  • DID и SIP-маршрутизация чувствительны к корректным env-переменным.
  • Есть внешние зависимости: Mango Office, ElevenLabs, Retell — следите за их статусом при разборе инцидентов.