task/refactoring #7

Merged
oyurchik merged 14 commits from task/refactoring into main 2025-10-04 18:45:56 +00:00
6 changed files with 1363 additions and 219 deletions
Showing only changes of commit df84cf89c0 - Show all commits

View File

@ -0,0 +1,23 @@
name: Deploy Production
on:
push:
tags:
- "v*.*.*"
workflow_dispatch:
jobs:
deploy:
runs-on: [stage]
steps:
- name: Set environment variables
run: >
for e in $(env | grep "ALABUGA__production__");
do echo "${e#'ALABUGA__production__'}" >> $GITHUB_ENV;
done
- name: Checkout
uses: actions/checkout@v4
- name: Deploy
run: env=stage make start;
- name: Wait
run: sleep 120
- name: Clean
run: docker system prune --all --force

23
.github/workflows/deploy-stage.yaml vendored Normal file
View File

@ -0,0 +1,23 @@
name: Deploy Stage
on:
push:
branches:
- main
workflow_dispatch:
jobs:
deploy:
runs-on: [stage]
steps:
- name: Set environment variables
run: >
for e in $(env | grep "ALABUGA__stage__");
do echo "${e#'ALABUGA__stage__'}" >> $GITHUB_ENV;
done
- name: Checkout
uses: actions/checkout@v4
- name: Deploy
run: env=stage make start;
- name: Wait
run: sleep 120
- name: Clean
run: docker system prune --all --force

View File

@ -1,168 +1,115 @@
# Техническое задание # Техническое задание
Задача 9 Задача 9
Создание мотивационного Создание мотивационного модуля геймификации для кадровой системы «Алабуги»
модуля геймификации
для кадровой системы «Алабуги»
Суть ## Суть
В ОЭЗ «Алабуга» работает более 26 000 сотрудников, и ежемесячно к нам В ОЭЗ «Алабуга» работает более 26 000 сотрудников, и ежемесячно к нам приезжают тысячи
приезжают тысячи кандидатов. Как перед трудоустройством, так и во время кандидатов. Как перед трудоустройством, так и во время работы у специалистов есть
работы у специалистов есть определённые задачи, ведущие к достижению их определённые задачи, ведущие к достижению их целей.
целей. Сейчас задачи приходят разрозненно, из-за чего между ними не хватает общей связи, и нет
ощущения, что один шаг сейчас — это большой вклад в будущее. В связи с этим мы хотим разработать
геймифицированную платформу, на которой пользователи смогут выполнять различные задачи на любом
этапе, отслеживать свой прогресс и видеть, что ещё нужно сделать для достижения цели.
Сейчас задачи приходят разрозненно, из-за чего между ними не хватает общей ## Тематика
связи, и нет ощущения, что один шаг сейчас — это большой вклад в будущее. В Корпоративная культура «Алабуги» всегда учила нас решать сверхзадачи и стремиться к звёздам. На
связи с этим мы хотим разработать геймифицированную платформу, на которой крыше пирамиды одного из офисов «Алабуги» расположен прототип советского орбитального ракетоплана
пользователи смогут выполнять различные задачи на любом этапе, отслеживать «Буран», напоминая о том, что в каждом из нас живёт частичка ДНК технологических изобретателей. А
кроме того, в планах компании на ближайшие 25 лет — начать освоение космоса и колонизацию лун
Юпитера.
свой прогресс и видеть, что ещё нужно сделать для достижения цели. В связи с этим тематику геймифицированной платформы хотелось бы видеть связанной с тематикой
космоса, где пользователи проходят путь от космических пилотов-кандидатов до командиров космических
подразделений.
Тематика ## Терминология
Корпоративная культура «Алабуги» всегда учила нас решать сверхзадачи и
стремиться к звёздам. На крыше пирамиды одного из офисов «Алабуги»
расположен прототип советского орбитального ракетоплана «Буран», напоминая
о том, что в каждом из нас живёт частичка ДНК технологических изобретателей. А
кроме того, в планах компании на ближайшие 25 лет — начать освоение космоса
и колонизацию лун Юпитера.
В связи с этим тематику геймифицированной платформы хотелось бы видеть
связанной с тематикой космоса, где пользователи проходят путь от космических
пилотов-кандидатов до командиров космических подразделений.
Терминология
- Пользователь — кандидат или сотрудник, пользователь платформы. - Пользователь — кандидат или сотрудник, пользователь платформы.
- HR — сотрудник, отвечающий за разработку заданий в платформе. - HR — сотрудник, отвечающий за разработку заданий в платформе.
- Организатор — сотрудник, проводящий мероприятие (миссию). - Организатор — сотрудник, проводящий мероприятие (миссию).
- Опыт — очки прогресса, необходимые для повышения ранга. - Опыт — очки прогресса, необходимые для повышения ранга.
- Мана — очки игровой валюты, за которые можно приобрести определённые - Мана — очки игровой валюты, за которые можно приобрести определённые бонусы.
бонусы.
- Ранг — игровое звание пользователя. Открывает новые задачи и цели. - Ранг — игровое звание пользователя. Открывает новые задачи и цели.
- Артефакты — знаки отличия за миссии. - Артефакты — знаки отличия за миссии.
- Компетенции — определённые навыки со шкалами прогресса. - Компетенции — определённые навыки со шкалами прогресса.
## Основные механики
### Ранги
1. Основные механики Выполняя различные задачи на всех этапах, пользователи получают опыт и ману, которые повышают их
ранг. Ранги расположены в линейной последовательности, и нельзя через них перескакивать. Для
повышения ранга есть
1. Ранги ### 3 условия:
Выполняя различные задачи на всех этапах, пользователи получают опыт и - Первое — достаточное количество опыта, полученного при выполнении заданий.
ману, которые повышают их ранг. Ранги расположены в линейной - Второе — выполнение определённых заданий, необходимых для желаемого грейда.
последовательности, и нельзя через них перескакивать. Для повышения ранга есть - Третье — получение необходимого уровня прокачки конкретных компетенций.
## 3 условия: > Пример: кандидат хочет получить оффер. Чтобы получить оффер, кандидату необходимо набрать 500
> очков опыта, выполнить задания (загрузка документов, заполнение резюме, выбор направлений) и
> прокачать компетенции «Общение» и «Аналитика» до 1 балла. Выполнив все условия, кандидат сможет
> получить оффер.
- Первое — достаточное количество опыта, полученного при выполнении Примеры рангов: искатель, разведчик, навигатор, пилот-кандидат, принятый в экипаж,
пилот-испытатель, лидер эскадрильи, командир космического поселения и т. д.
заданий.
- Второе — выполнение определённых заданий, необходимых для желаемого
грейда.
- Третье — получение необходимого уровня прокачки конкретных
компетенций.
Пример:
кандидат хочет получить оффер. Чтобы получить оффер, кандидату необходимо набрать 500 очков
опыта, выполнить задания (загрузка документов, заполнение резюме, выбор направлений) и
прокачать компетенции «Общение» и «Аналитика» до 1 балла. Выполнив все условия, кандидат
сможет получить оффер.
Примеры
рангов:
искатель, разведчик, навигатор, пилот-кандидат, принятый в экипаж, пилот-испытатель, лидер
эскадрильи, командир космического поселения и т. д.
нейминга
для
Со стороны HR необходимо сделать возможность настраивать условия для
получения рангов:
Со стороны HR необходимо сделать возможность настраивать условия для получения рангов:
- Опыт: [NNN] - Опыт: [NNN]
- Ключевые задания: [mission1, mission2] - Ключевые задания: [mission1, mission2]
- Уровень компетенций: [competention=N] - Уровень компетенций: [competention=N]
2. Миссии ### Миссии
Миссии — это список заданий, доступных пользователю. Список миссий должен Миссии — это список заданий, доступных пользователю. Список миссий должен меняться в зависимости от
меняться в зависимости от ранга. Открыв миссию, пользователь должен ранга. Открыв миссию, пользователь должен ознакомиться со всеми условиями и иметь возможность
перейти к действию.
ознакомиться со всеми условиями и иметь возможность перейти к действию. Примеры миссий: сбор документов, заполнение резюме, прохождение бизнес-симуляций, приезд на очный
этап, прохождение собеседования, прохождение онбординга, выполнение плана на месяц, участие в
Примеры миссий: сбор документов, заполнение резюме, прохождение бизнес-симуляций, ежегодном ассессменте и т. д.
приезд на очный этап, прохождение собеседования, прохождение онбординга, выполнение плана
на месяц, участие в ежегодном ассессменте и т. д.
Минимальный список параметров для миссии: Минимальный список параметров для миссии:
- Название миссии
● Название миссии
- Описание миссии - Описание миссии
- Награда в опыте - Награда в опыте
- Награда в мане - Награда в мане
- Доступность по рангу - Доступность по рангу
- Какие компетенции на сколько прокачиваются - Какие компетенции на сколько прокачиваются
- Дополнительно: будет здорово за некоторые миссии выдавать особые - Дополнительно: будет здорово за некоторые миссии выдавать особые награды — артефакты
награды — артефакты ### Ветвление
3. Ветвление Миссии должны быть связанными, а не сами по себе. В списке миссий пользователь должен видеть, какие
ветви пути у него есть, например:
Миссии должны быть связанными, а не сами по себе. В списке миссий
пользователь должен видеть, какие ветви пути у него есть, например:
Ветка 1 — Блогерская: Ветка 1 — Блогерская:
- Миссия 1 — пост с фото - Миссия 1 — пост с фото
- Миссия 2 — сторис с хэштегом - Миссия 2 — сторис с хэштегом
- Миссия 3 — съёмка видеоблога про компанию - Миссия 3 — съёмка видеоблога про компанию
Миссии могут делиться по категориям: Миссии могут делиться по категориям:
- Квесты — базовые онлайн и офлайн задачи - Квесты — базовые онлайн и офлайн задачи
- Рекрутинг — задания, направленные на привлечение новых кандидатов - Рекрутинг — задания, направленные на привлечение новых кандидатов
- Лекторий — задания, направленные на обучение коллег и кандидатов - Лекторий — задания, направленные на обучение коллег и кандидатов
- Симулятор — задания, направленные на проверку знаний, например тесты, - Симулятор — задания, направленные на проверку знаний, например тесты, соревнования
соревнования При этом нельзя делать список миссий статичным, так как время, люди, задачи, цели — всё меняется.
Соответственно, со стороны HR мы должны иметь возможность создания и редактирования миссий, чтобы
поддерживать интересные и актуальные задачи в списке миссий у пользователей.
При этом нельзя делать список миссий статичным, так как время, люди, задачи, ### Бортовой журнал
цели — всё меняется. Соответственно, со стороны HR мы должны иметь История действий, прогресса пользователя и рейтинга. Пользователь может видеть свой прогресс,
возможность создания и редактирования миссий, чтобы поддерживать сколько он выполнил и к чему это привело. Также доступен просмотр ТОПов за месяц, неделю или год.
интересные и актуальные задачи в списке миссий у пользователей.
4. Бортовой журнал ### Навыки
История действий, прогресса пользователя и рейтинга. Пользователь может
видеть свой прогресс, сколько он выполнил и к чему это привело. Также доступен
просмотр ТОПов за месяц, неделю или год.
5. Навыки
Список всех имеющихся компетенций с текущим уровнем прокачки: Список всех имеющихся компетенций с текущим уровнем прокачки:
- Вера в дело - Вера в дело
- Стремление к большему - Стремление к большему
- Общение - Общение
@ -175,88 +122,69 @@
Прокачивать компетенции можно, выполняя миссии. Прокачивать компетенции можно, выполняя миссии.
6. Хранилище ### Хранилище
Магазин, в котором можно приобрести за ману разнообразный мерч, товары, Магазин, в котором можно приобрести за ману разнообразный мерч, товары, билеты и прочие бонусы.
билеты и прочие бонусы. ### Онбординг
7. Онбординг Для большего погружения в тематику необходимо не просто выдавать задачи и поощрять баллами, а
периодически предоставлять интересные отрывки лора. Онбординг должен рассказывать о работе
отдельных блоков на платформе, подкрепляя это интересными научными и историческими фактами о
космосе.
Для большего погружения в тематику необходимо не просто выдавать задачи и ### Статистика для HR-специалистов
поощрять баллами, а периодически предоставлять интересные отрывки лора.
Онбординг должен рассказывать о работе отдельных блоков на платформе,
подкрепляя это интересными научными и историческими фактами о космосе. HR-специалистам важно иметь доступ к информации для анализа конверсии выполнения миссий, веток и
прогресса пользователей. Если результат миссии можно увидеть удалённо, будет здорово, чтобы
пользователи прикрепляли его при закрытии миссии. В таком случае также необходим функционал
модерации выполнения заданий.
8. Статистика для HR-специалистов ### Артефакты
HR-специалистам важно иметь доступ к информации для анализа конверсии Артефакты — уникальные награды, которые можно получить за прохождение миссий. Необходим функционал
выполнения миссий, веток и прогресса пользователей. Если результат миссии создания артефактов со стороны HR.
можно увидеть удалённо, будет здорово, чтобы пользователи прикрепляли его при
закрытии миссии. В таком случае также необходим функционал модерации
выполнения заданий.
9. Артефакты
Артефакты — уникальные награды, которые можно получить за прохождение
миссий. Необходим функционал создания артефактов со стороны HR.
У артефакта есть атрибуты:
У артефакта есть атрибуты:
- Изображение - Изображение
- Название - Название
- Краткое описание - Краткое описание
- Дополнительно: редкость артефакта - Дополнительно: редкость артефакта
2. Наши ресурсы ### Наши ресурсы
ОЭЗ «Алабуга» [alabuga.ru] ОЭЗ «Алабуга» [alabuga.ru] - основной сайт компании
- основной сайт компании HR-платформа [hr.alabuga.ru] - основная платформа для авторизации в экосистеме «Алабуги». На этой
платформе расположены бизнес-симуляции, в которые играют кандидаты из сотрудники
HR-платформа [hr.alabuga.ru]
- основная платформа для авторизации в экосистеме «Алабуги». На этой
платформе расположены бизнес-симуляции, в которые играют кандидаты и
з
сотрудники
Карьера.100 лидеров [career.alabuga.space] Карьера.100 лидеров [career.alabuga.space]
Карьера.Политех — [в разработке] Карьера.Политех [в разработке]
Карьера.Старт — [в разработке]
- платформы для трудоустройства кандидатов. В этих сервисах кандидаты
заполняют резюме, документы, проходят симуляции, записываются на очные Карьера.Старт [в разработке] - платформы для трудоустройства кандидатов. В этих сервисах
кандидаты заполняют резюме, документы, проходят симуляции, записываются на очные этапы и проходят
собеседования
этапы и проходят собеседования Алга.Алабуга [alga.alabuga.ru] - профориентационные экскурсии, которые запомнятся каждому участнику!
Алга.Алабуга [alga.alabuga.ru] ## Программно-аппаратные требования
- профориентационные экскурсии, которые запомнятся каждому участнику!
3. Программно-аппаратные требования
3.1. Аппаратные требования и подход к разработке 3.1. Аппаратные требования и подход к разработке
Mobile First (для пользователей-сотрудников/кандидатов): интерфейс должен Mobile First (для пользователей-сотрудников/кандидатов): интерфейс должен
быть адаптирован под мобильные устройства (ширина viewport от 320px). быть адаптирован под мобильные устройства (ширина viewport от 320px).
Предполагается, что большинство задач пользователи будут выполнять на ходу: Предполагается, что большинство задач пользователи будут выполнять на ходу:
проверять задания, загружать фотоотчёты, тратить ману в магазине. проверять задания, загружать фотоотчёты, тратить ману в магазине.
Desktop/Tablet (для HR-специалистов): административный интерфейс для Desktop/Tablet (для HR-специалистов): административный интерфейс для
требует большого экрана. требует большого экрана.
создания миссий, отслеживания статистики создания миссий, отслеживания статистики
Минимальная ширина — 1024px. Минимальная ширина — 1024px.
@ -266,7 +194,7 @@ Mobile First (для пользователей-сотрудников/кан
Frontend: Frontend:
Фреймворк: React (предпочтительно с использованием функциональных Фреймворк: React (предпочтительно с использованием функциональных
компонентов и хуков) компонентов и хуков)
@ -274,7 +202,7 @@ Frontend:
рангах, миссиях и наградах) рангах, миссиях и наградах)
Стили: CSS-in-JS (Styled-components, Emotion) или modern CSS с модулями. Стили: CSS-in-JS (Styled-components, Emotion) или modern CSS с модулями.
Важно обеспечить тему, легко меняемую под космический стиль Важно обеспечить тему, легко меняемую под космический стиль
@ -286,15 +214,15 @@ Frontend:
Backend: Backend:
Фреймворк: Python + FastAPI (современный, высокопроизводительный) или Фреймворк: Python + FastAPI (современный, высокопроизводительный) или
Django (более богатый из коробки, но тяжелее) Django (более богатый из коробки, но тяжелее)
База данных: SQLite на время хакатона для простоты разработки и База данных: SQLite на время хакатона — для простоты разработки и
демонстрации. В продакшене — PostgreSQL демонстрации. В продакшене — PostgreSQL
Аутентификация: JWT-токены. Необходима интеграция с «hr.alabuga.ru» (на Аутентификация: JWT-токены. Необходима интеграция с «hr.alabuga.ru» (на
хакатоне можно замокать или использовать простой вход по логину/паролю) хакатоне можно замокать или использовать простой вход по логину/паролю)
@ -306,7 +234,7 @@ Django (более богатый из коробки, но тяжелее)
Презентация должна быть в формате последовательного пользовательского Презентация должна быть в формате последовательного пользовательского
сценария (User Flow). сценария (User Flow).
@ -318,11 +246,11 @@ Django (более богатый из коробки, но тяжелее)
Видит свою цель — «Получить оффер» (требует ранг «Пилот-кандидат»). Видит свою цель — «Получить оффер» (требует ранг «Пилот-кандидат»).
Переходит в раздел «Миссии», видит доступные ветки: «Рекрутинг» (загрузка резюме, Переходит в раздел «Миссии», видит доступные ветки: «Рекрутинг» (загрузка резюме,
документов) и «Лекторий» (просмотр видео о компании). документов) и «Лекторий» (просмотр видео о компании).
Выбирает миссию «Загрузить резюме» загружает файл получает награду (опыт, мана, Выбирает миссию «Загрузить резюме» → загружает файл → получает награду (опыт, мана,
прокачка компетенции «Аналитика»). прокачка компетенции «Аналитика»).
@ -334,7 +262,7 @@ Django (более богатый из коробки, но тяжелее)
кандидат» и выдаёт уведомление об успехе. кандидат» и выдаёт уведомление об успехе.
Пользователь заходит в «Хранилище» и тратит заработанную ману на мерч (например, Пользователь заходит в «Хранилище» и тратит заработанную ману на мерч (например,
«Футболка Алабуга» за 100 маны). «Футболка Алабуга» за 100 маны).
@ -348,13 +276,13 @@ Django (более богатый из коробки, но тяжелее)
Команда и роли. Кто за что отвечал. Команда и роли. Кто за что отвечал.
Архитектура. Краткое описание структуры фронтенда и бэкенда (какие Архитектура. Краткое описание структуры фронтенда и бэкенда (какие
основные модули, как взаимодействуют). основные модули, как взаимодействуют).
Реализованные механики. Список того, что получилось сделать (например: Реализованные механики. Список того, что получилось сделать (например:
«Реализована система рангов с проверкой 3 условий», «Реализован CRUD для «Реализована система рангов с проверкой 3 условий», «Реализован CRUD для
миссий со стороны HR»). миссий со стороны HR»).
@ -364,7 +292,7 @@ Django (более богатый из коробки, но тяжелее)
Что не реализовано и почему. Честность приветствуется. Что не реализовано и почему. Честность приветствуется.
Инструкция по запуску. Как установить зависимости и запустить приложение Инструкция по запуску. Как установить зависимости и запустить приложение
локально. локально.
@ -374,7 +302,7 @@ Django (более богатый из коробки, но тяжелее)
Основные референсы: Предоставлены ниже. Основные референсы: Предоставлены ниже.
В оформлении использовать логотип (из приложенного файла) и брендовые В оформлении использовать логотип (из приложенного файла) и брендовые
цвета: цвета:
@ -386,8 +314,8 @@ Django (более богатый из коробки, но тяжелее)
Бизнес-симуляции с “hr.alabuga.ru” -> Задачи типа "Симуляция". Бизнес-симуляции с “hr.alabuga.ru” -> Задачи типа "Симуляция".
На хакатоне: Достаточно замокать данные интеграции (например, сделать На хакатоне: Достаточно замокать данные интеграции (например, сделать
несколько пользователей в БД и эмулировать успешный возврат с бизнес- несколько пользователей в БД и эмулировать успешный возврат с бизнес-
симуляции). симуляции).
@ -400,18 +328,18 @@ Django (более богатый из коробки, но тяжелее)
Визуальный концепт: Визуальный концепт:
- Макеты ключевых экранов (как минимум: ЛК пользователя с прогрессом, список - Макеты ключевых экранов (как минимум: ЛК пользователя с прогрессом, список
миссий, карточка миссии, ЛК HR для создания миссии) в Figma/Adobe XD. миссий, карточка миссии, ЛК HR для создания миссии) в Figma/Adobe XD.
- Проработанный космический UI-kit: цветовая палитра, кнопки, типографика, - Проработанный космический UI-kit: цветовая палитра, кнопки, типографика,
иконки. иконки.
Предпочтительная реализация ключевых механик: Предпочтительная реализация ключевых механик:
- Работающий фронтенд на React с роутингом между пустыми страницами. - Работающий фронтенд на React с роутингом между пустыми страницами.
- Работающий бэкенд на Python с 2-3 API-эндпоинтами (например, “GET - Работающий бэкенд на Python с 2-3 API-эндпоинтами (например, “GET
/api/missions”, “POST /api/missions”). /api/missions”, “POST /api/missions”).
@ -425,13 +353,13 @@ User Stories в формате:
сколько еще нужно сделать для оффера». сколько еще нужно сделать для оффера».
- «Как HR, я хочу иметь возможность указать награду в мане за миссию, чтобы - «Как HR, я хочу иметь возможность указать награду в мане за миссию, чтобы
мотивировать пользователей выполнять ее». мотивировать пользователей выполнять ее».
7.2. Финальная сдача 7.2. Финальная сдача
Полная реализация одного end-to-end процесса. Например, процесса Полная реализация одного end-to-end процесса. Например, процесса
«Кандидат выполняет миссии для получения оффера»: «Кандидат выполняет миссии для получения оффера»:
@ -439,7 +367,7 @@ User Stories в формате:
- Видит свой текущий ранг и цели. - Видит свой текущий ранг и цели.
- Выполняет 2-3 связанные миссии из одной ветки (квест + симулятор). - Выполняет 2-3 связанные миссии из одной ветки (квест + симулятор).
- Система начисляет опыт, ману, прокачивает компетенции. - Система начисляет опыт, ману, прокачивает компетенции.
- При выполнении всех условий система автоматически повышает ранг - При выполнении всех условий система автоматически повышает ранг
пользователя. пользователя.
@ -447,7 +375,7 @@ User Stories в формате:
Пользователь видит это изменение в UI (уведомление, изменение в бортовом ● Пользователь видит это изменение в UI (уведомление, изменение в бортовом
журнале). журнале).
@ -508,7 +436,7 @@ User Stories в формате:
Демонстрация: Упор на живой сквозной сценарий, а не на слайды. ● Демонстрация: Упор на живой сквозной сценарий, а не на слайды.
- Тайминг: Уложиться в отведенное время. - Тайминг: Уложиться в отведенное время.
Референсы: Референсы:

View File

@ -1,28 +1,17 @@
FROM python:3.13-slim FROM python:3.13-slim
ENV PYTHONDONTWRITEBYTECODE=1 \ ENV PYTHONDONTWRITEBYTECODE=1
PYTHONUNBUFFERED=1 \ ENV PYTHONUNBUFFERED=1
PYO3_USE_ABI3_FORWARD_COMPATIBILITY=1 ENV PYO3_USE_ABI3_FORWARD_COMPATIBILITY=1
WORKDIR /app WORKDIR /app
RUN apt-get update \
&& apt-get install -y --no-install-recommends build-essential libpq-dev curl \
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*
# Install uv
RUN pip install --no-cache-dir uv RUN pip install --no-cache-dir uv
COPY pyproject.toml uv.lock ./
COPY pyproject.toml ./ RUN uv sync
RUN uv pip install --system --no-cache -e .
COPY . /app COPY . /app
RUN adduser --disabled-password --gecos '' appuser && \
mkdir -p /data && chown -R appuser:appuser /data && chown -R appuser:appuser /app
USER appuser
EXPOSE 8000 EXPOSE 8000
ENTRYPOINT ["uv", "run"]
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

1161
backend/uv.lock Normal file

File diff suppressed because it is too large Load Diff

View File

@ -2,39 +2,59 @@ services:
backend: backend:
build: build:
context: ./backend context: ./backend
command: uvicorn app.main:app --host 0.0.0.0 --port 8000
ports:
- '8000:8000'
volumes: volumes:
- backend-data:/data - backend-data:/data
- ./backend:/app environment:
env_file: ALABUGA_ENVIRONMENT: "${ALABUGA_ENVIRONMENT}"
- backend/.env ALABUGA_DEBUG: "${ALABUGA_DEBUG}"
depends_on: [] ALABUGA_SECRET_KEY: "${ALABUGA_SECRET_KEY}"
ALABUGA_JWT_ALGORITHM: "HS256"
ALABUGA_ACCESS_TOKEN_EXPIRE_MINUTES: "720"
ALABUGA_REQUIRE_EMAIL_CONFIRMATION: "false"
ALABUGA_SQLITE_PATH: /data/app.db
ALABUGA_UPLOADS_PATH: /data/uploads
ALABUGA_BACKEND_CORS_ORIGIN: '["https://${ALABUGA_API_DOMAIN}","https://${ALABUGA_DOMAIN}"]'
networks: networks:
- app-network - app-network
- collabry-stage_default
labels:
- "traefik.enable=true"
- "traefik.http.services.alabuga-backend.loadbalancer.server.port=8000"
- "traefik.http.routers.alabuga-backend.service=alabuga-backend"
- "traefik.http.routers.alabuga-backend.rule=Host(`${ALABUGA_API_DOMAIN}`)
- "traefik.http.routers.alabuga-backend.entrypoints=websecure"
- "traefik.http.routers.alabuga-backend.tls.certresolver=letsencrypt"
frontend: frontend:
build: build:
context: ./frontend context: ./frontend
command: npm run dev -- --hostname 0.0.0.0 --port 3000
ports:
- '3000:3000'
env_file:
- frontend/.env
environment: environment:
NEXT_PUBLIC_API_URL: "https://${ALABUGA_DOMAIN}"
NEXT_INTERNAL_API_URL: http://backend:8000 NEXT_INTERNAL_API_URL: http://backend:8000
volumes: NEXT_PUBLIC_DEMO_EMAIL: "${NEXT_PUBLIC_DEMO_EMAIL}"
- ./frontend:/app NEXT_PUBLIC_DEMO_PASSWORD: "${NEXT_PUBLIC_DEMO_PASSWORD}"
- /app/node_modules NEXT_PUBLIC_DEMO_HR_EMAIL: "${NEXT_PUBLIC_DEMO_HR_EMAIL}"
depends_on: NEXT_PUBLIC_DEMO_HR_PASSWORD: "${NEXT_PUBLIC_DEMO_HR_PASSWORD}"
- backend
networks: networks:
- app-network - app-network
- collabry-stage_default
ports:
- '3000:3000'
command: npm run dev -- --hostname 0.0.0.0 --port 3000
depends_on:
- backend
labels:
- "traefik.enable=true"
- "traefik.http.services.alabuga-frontend.loadbalancer.server.port=8000"
- "traefik.http.routers.alabuga-frontend.service=alabuga-frontend"
- "traefik.http.routers.alabuga-frontend.rule=Host(`${ALABUGA_DOMAIN}`)
- "traefik.http.routers.alabuga-frontend.entrypoints=websecure"
- "traefik.http.routers.alabuga-frontend.tls.certresolver=letsencrypt"
volumes: volumes:
backend-data: backend-data:
networks: networks:
app-network: app-network:
driver: bridge collabry-stage_default:
external: true