task/refactoring #7
23
.github/workflows/deploy-production.yaml
vendored
Normal file
23
.github/workflows/deploy-production.yaml
vendored
Normal 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=production make start;
|
||||||
|
- name: Wait
|
||||||
|
run: sleep 120
|
||||||
|
- name: Clean
|
||||||
|
run: docker system prune --all --force
|
||||||
23
.github/workflows/deploy-stage.yaml
vendored
Normal file
23
.github/workflows/deploy-stage.yaml
vendored
Normal 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
|
||||||
|
|
@ -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 в формате:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
● Демонстрация: Упор на живой сквозной сценарий, а не на слайды.
|
● Демонстрация: Упор на живой сквозной сценарий, а не на слайды.
|
||||||
- Тайминг: Уложиться в отведенное время.
|
- Тайминг: Уложиться в отведенное время.
|
||||||
|
|
||||||
Референсы:
|
Референсы:
|
||||||
|
|
|
||||||
|
|
@ -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
1161
backend/uv.lock
Normal file
File diff suppressed because it is too large
Load Diff
|
|
@ -1,40 +1,72 @@
|
||||||
|
version: "3.9"
|
||||||
|
|
||||||
services:
|
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
|
||||||
|
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
|
||||||
|
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=3000"
|
||||||
|
# - "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"
|
||||||
|
|
||||||
|
- "traefik.http.middlewares.alabuga-frontend.redirectregex.regex=^(.*)"
|
||||||
|
- "traefik.http.middlewares.alabuga-frontend.redirectregex.replacement=https://alabuga.hchm.ru$$1"
|
||||||
|
- "traefik.http.middlewares.alabuga-frontend.redirectregex.permanent=true"
|
||||||
|
|
||||||
|
# Роутер
|
||||||
|
- "traefik.http.routers.alabuga-frontend.rule=Host(`${ALABUGA_DOMAIN}`)"
|
||||||
|
- "traefik.http.routers.alabuga-frontend.entrypoints=web"
|
||||||
|
- "traefik.http.routers.alabuga-frontend.middlewares=redirect-alabuga"
|
||||||
|
- "traefik.http.routers.alabuga-frontend.service=noop@internal"
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
backend-data:
|
backend-data:
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
app-network:
|
app-network:
|
||||||
driver: bridge
|
collabry:
|
||||||
|
external: true
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user