add deploy
This commit is contained in:
parent
e1a1dcddf5
commit
a7ab7e7f71
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=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
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
|
||||
|
||||
Создание мотивационного
|
||||
модуля геймификации
|
||||
для кадровой системы «Алабуги»
|
||||
Создание мотивационного модуля геймификации для кадровой системы «Алабуги»
|
||||
|
||||
Суть
|
||||
## Суть
|
||||
|
||||
В ОЭЗ «Алабуга» работает более 26 000 сотрудников, и ежемесячно к нам
|
||||
приезжают тысячи кандидатов. Как перед трудоустройством, так и во время
|
||||
работы у специалистов есть определённые задачи, ведущие к достижению их
|
||||
В ОЭЗ «Алабуга» работает более 26 000 сотрудников, и ежемесячно к нам приезжают тысячи
|
||||
кандидатов. Как перед трудоустройством, так и во время работы у специалистов есть
|
||||
определённые задачи, ведущие к достижению их целей.
|
||||
|
||||
целей.
|
||||
Сейчас задачи приходят разрозненно, из-за чего между ними не хватает общей связи, и нет
|
||||
ощущения, что один шаг сейчас — это большой вклад в будущее. В связи с этим мы хотим разработать
|
||||
геймифицированную платформу, на которой пользователи смогут выполнять различные задачи на любом
|
||||
этапе, отслеживать свой прогресс и видеть, что ещё нужно сделать для достижения цели.
|
||||
|
||||
Сейчас задачи приходят разрозненно, из-за чего между ними не хватает общей
|
||||
## Тематика
|
||||
|
||||
связи, и нет ощущения, что один шаг сейчас — это большой вклад в будущее. В
|
||||
связи с этим мы хотим разработать геймифицированную платформу, на которой
|
||||
пользователи смогут выполнять различные задачи на любом этапе, отслеживать
|
||||
Корпоративная культура «Алабуги» всегда учила нас решать сверхзадачи и стремиться к звёздам. На
|
||||
крыше пирамиды одного из офисов «Алабуги» расположен прототип советского орбитального ракетоплана
|
||||
«Буран», напоминая о том, что в каждом из нас живёт частичка ДНК технологических изобретателей. А
|
||||
кроме того, в планах компании на ближайшие 25 лет — начать освоение космоса и колонизацию лун
|
||||
Юпитера.
|
||||
|
||||
свой прогресс и видеть, что ещё нужно сделать для достижения цели.
|
||||
В связи с этим тематику геймифицированной платформы хотелось бы видеть связанной с тематикой
|
||||
космоса, где пользователи проходят путь от космических пилотов-кандидатов до командиров космических
|
||||
подразделений.
|
||||
|
||||
Тематика
|
||||
|
||||
Корпоративная культура «Алабуги» всегда учила нас решать сверхзадачи и
|
||||
стремиться к звёздам. На крыше пирамиды одного из офисов «Алабуги»
|
||||
расположен прототип советского орбитального ракетоплана «Буран», напоминая
|
||||
о том, что в каждом из нас живёт частичка ДНК технологических изобретателей. А
|
||||
кроме того, в планах компании на ближайшие 25 лет — начать освоение космоса
|
||||
|
||||
и колонизацию лун Юпитера.
|
||||
|
||||
В связи с этим тематику геймифицированной платформы хотелось бы видеть
|
||||
связанной с тематикой космоса, где пользователи проходят путь от космических
|
||||
|
||||
пилотов-кандидатов до командиров космических подразделений.
|
||||
|
||||
Терминология
|
||||
## Терминология
|
||||
|
||||
- Пользователь — кандидат или сотрудник, пользователь платформы.
|
||||
- HR — сотрудник, отвечающий за разработку заданий в платформе.
|
||||
- Организатор — сотрудник, проводящий мероприятие (миссию).
|
||||
- Опыт — очки прогресса, необходимые для повышения ранга.
|
||||
- Мана — очки игровой валюты, за которые можно приобрести определённые
|
||||
|
||||
бонусы.
|
||||
|
||||
- Мана — очки игровой валюты, за которые можно приобрести определённые бонусы.
|
||||
- Ранг — игровое звание пользователя. Открывает новые задачи и цели.
|
||||
- Артефакты — знаки отличия за миссии.
|
||||
- Компетенции — определённые навыки со шкалами прогресса.
|
||||
|
||||
## Основные механики
|
||||
|
||||
### Ранги
|
||||
|
||||
1. Основные механики
|
||||
Выполняя различные задачи на всех этапах, пользователи получают опыт и ману, которые повышают их
|
||||
ранг. Ранги расположены в линейной последовательности, и нельзя через них перескакивать. Для
|
||||
повышения ранга есть
|
||||
|
||||
1. Ранги
|
||||
### 3 условия:
|
||||
|
||||
Выполняя различные задачи на всех этапах, пользователи получают опыт и
|
||||
ману, которые повышают их ранг. Ранги расположены в линейной
|
||||
последовательности, и нельзя через них перескакивать. Для повышения ранга есть
|
||||
- Первое — достаточное количество опыта, полученного при выполнении заданий.
|
||||
- Второе — выполнение определённых заданий, необходимых для желаемого грейда.
|
||||
- Третье — получение необходимого уровня прокачки конкретных компетенций.
|
||||
|
||||
## 3 условия:
|
||||
> Пример: кандидат хочет получить оффер. Чтобы получить оффер, кандидату необходимо набрать 500
|
||||
> очков опыта, выполнить задания (загрузка документов, заполнение резюме, выбор направлений) и
|
||||
> прокачать компетенции «Общение» и «Аналитика» до 1 балла. Выполнив все условия, кандидат сможет
|
||||
> получить оффер.
|
||||
|
||||
- Первое — достаточное количество опыта, полученного при выполнении
|
||||
|
||||
заданий.
|
||||
|
||||
- Второе — выполнение определённых заданий, необходимых для желаемого
|
||||
|
||||
грейда.
|
||||
|
||||
- Третье — получение необходимого уровня прокачки конкретных
|
||||
|
||||
компетенций.
|
||||
|
||||
Пример:
|
||||
|
||||
кандидат хочет получить оффер. Чтобы получить оффер, кандидату необходимо набрать 500 очков
|
||||
опыта, выполнить задания (загрузка документов, заполнение резюме, выбор направлений) и
|
||||
прокачать компетенции «Общение» и «Аналитика» до 1 балла. Выполнив все условия, кандидат
|
||||
сможет получить оффер.
|
||||
|
||||
Примеры
|
||||
|
||||
рангов:
|
||||
искатель, разведчик, навигатор, пилот-кандидат, принятый в экипаж, пилот-испытатель, лидер
|
||||
эскадрильи, командир космического поселения и т. д.
|
||||
|
||||
нейминга
|
||||
|
||||
для
|
||||
|
||||
Со стороны HR необходимо сделать возможность настраивать условия для
|
||||
|
||||
получения рангов:
|
||||
Примеры рангов: искатель, разведчик, навигатор, пилот-кандидат, принятый в экипаж,
|
||||
пилот-испытатель, лидер эскадрильи, командир космического поселения и т. д.
|
||||
|
||||
Со стороны HR необходимо сделать возможность настраивать условия для получения рангов:
|
||||
- Опыт: [NNN]
|
||||
- Ключевые задания: [mission1, mission2]
|
||||
- Уровень компетенций: [competention=N]
|
||||
|
||||
2. Миссии
|
||||
### Миссии
|
||||
|
||||
Миссии — это список заданий, доступных пользователю. Список миссий должен
|
||||
меняться в зависимости от ранга. Открыв миссию, пользователь должен
|
||||
Миссии — это список заданий, доступных пользователю. Список миссий должен меняться в зависимости от
|
||||
ранга. Открыв миссию, пользователь должен ознакомиться со всеми условиями и иметь возможность
|
||||
перейти к действию.
|
||||
|
||||
ознакомиться со всеми условиями и иметь возможность перейти к действию.
|
||||
|
||||
Примеры миссий: сбор документов, заполнение резюме, прохождение бизнес-симуляций,
|
||||
приезд на очный этап, прохождение собеседования, прохождение онбординга, выполнение плана
|
||||
на месяц, участие в ежегодном ассессменте и т. д.
|
||||
Примеры миссий: сбор документов, заполнение резюме, прохождение бизнес-симуляций, приезд на очный
|
||||
этап, прохождение собеседования, прохождение онбординга, выполнение плана на месяц, участие в
|
||||
ежегодном ассессменте и т. д.
|
||||
|
||||
Минимальный список параметров для миссии:
|
||||
|
||||
|
||||
● Название миссии
|
||||
- Название миссии
|
||||
- Описание миссии
|
||||
- Награда в опыте
|
||||
- Награда в мане
|
||||
- Доступность по рангу
|
||||
- Какие компетенции на сколько прокачиваются
|
||||
- Дополнительно: будет здорово за некоторые миссии выдавать особые
|
||||
- Дополнительно: будет здорово за некоторые миссии выдавать особые награды — артефакты
|
||||
|
||||
награды — артефакты
|
||||
### Ветвление
|
||||
|
||||
3. Ветвление
|
||||
|
||||
Миссии должны быть связанными, а не сами по себе. В списке миссий
|
||||
|
||||
пользователь должен видеть, какие ветви пути у него есть, например:
|
||||
Миссии должны быть связанными, а не сами по себе. В списке миссий пользователь должен видеть, какие
|
||||
ветви пути у него есть, например:
|
||||
|
||||
Ветка 1 — Блогерская:
|
||||
|
||||
- Миссия 1 — пост с фото
|
||||
- Миссия 2 — сторис с хэштегом
|
||||
- Миссия 3 — съёмка видеоблога про компанию
|
||||
|
||||
Миссии могут делиться по категориям:
|
||||
|
||||
- Квесты — базовые онлайн и офлайн задачи
|
||||
- Рекрутинг — задания, направленные на привлечение новых кандидатов
|
||||
- Лекторий — задания, направленные на обучение коллег и кандидатов
|
||||
- Симулятор — задания, направленные на проверку знаний, например тесты,
|
||||
- Симулятор — задания, направленные на проверку знаний, например тесты, соревнования
|
||||
|
||||
соревнования
|
||||
При этом нельзя делать список миссий статичным, так как время, люди, задачи, цели — всё меняется.
|
||||
Соответственно, со стороны HR мы должны иметь возможность создания и редактирования миссий, чтобы
|
||||
поддерживать интересные и актуальные задачи в списке миссий у пользователей.
|
||||
|
||||
При этом нельзя делать список миссий статичным, так как время, люди, задачи,
|
||||
цели — всё меняется. Соответственно, со стороны HR мы должны иметь
|
||||
возможность создания и редактирования миссий, чтобы поддерживать
|
||||
интересные и актуальные задачи в списке миссий у пользователей.
|
||||
### Бортовой журнал
|
||||
История действий, прогресса пользователя и рейтинга. Пользователь может видеть свой прогресс,
|
||||
сколько он выполнил и к чему это привело. Также доступен просмотр ТОПов за месяц, неделю или год.
|
||||
|
||||
4. Бортовой журнал
|
||||
|
||||
История действий, прогресса пользователя и рейтинга. Пользователь может
|
||||
видеть свой прогресс, сколько он выполнил и к чему это привело. Также доступен
|
||||
|
||||
просмотр ТОПов за месяц, неделю или год.
|
||||
|
||||
|
||||
|
||||
|
||||
5. Навыки
|
||||
### Навыки
|
||||
|
||||
Список всех имеющихся компетенций с текущим уровнем прокачки:
|
||||
|
||||
- Вера в дело
|
||||
- Стремление к большему
|
||||
- Общение
|
||||
|
|
@ -175,72 +122,53 @@
|
|||
|
||||
Прокачивать компетенции можно, выполняя миссии.
|
||||
|
||||
6. Хранилище
|
||||
### Хранилище
|
||||
|
||||
Магазин, в котором можно приобрести за ману разнообразный мерч, товары,
|
||||
Магазин, в котором можно приобрести за ману разнообразный мерч, товары, билеты и прочие бонусы.
|
||||
|
||||
билеты и прочие бонусы.
|
||||
### Онбординг
|
||||
|
||||
7. Онбординг
|
||||
Для большего погружения в тематику необходимо не просто выдавать задачи и поощрять баллами, а
|
||||
периодически предоставлять интересные отрывки лора. Онбординг должен рассказывать о работе
|
||||
отдельных блоков на платформе, подкрепляя это интересными научными и историческими фактами о
|
||||
космосе.
|
||||
|
||||
Для большего погружения в тематику необходимо не просто выдавать задачи и
|
||||
поощрять баллами, а периодически предоставлять интересные отрывки лора.
|
||||
Онбординг должен рассказывать о работе отдельных блоков на платформе,
|
||||
### Статистика для HR-специалистов
|
||||
|
||||
подкрепляя это интересными научными и историческими фактами о космосе.
|
||||
HR-специалистам важно иметь доступ к информации для анализа конверсии выполнения миссий, веток и
|
||||
прогресса пользователей. Если результат миссии можно увидеть удалённо, будет здорово, чтобы
|
||||
пользователи прикрепляли его при закрытии миссии. В таком случае также необходим функционал
|
||||
модерации выполнения заданий.
|
||||
|
||||
8. Статистика для HR-специалистов
|
||||
### Артефакты
|
||||
|
||||
HR-специалистам важно иметь доступ к информации для анализа конверсии
|
||||
выполнения миссий, веток и прогресса пользователей. Если результат миссии
|
||||
можно увидеть удалённо, будет здорово, чтобы пользователи прикрепляли его при
|
||||
закрытии миссии. В таком случае также необходим функционал модерации
|
||||
|
||||
выполнения заданий.
|
||||
|
||||
9. Артефакты
|
||||
|
||||
Артефакты — уникальные награды, которые можно получить за прохождение
|
||||
|
||||
миссий. Необходим функционал создания артефактов со стороны HR.
|
||||
|
||||
|
||||
|
||||
У артефакта есть атрибуты:
|
||||
Артефакты — уникальные награды, которые можно получить за прохождение миссий. Необходим функционал
|
||||
создания артефактов со стороны HR.
|
||||
|
||||
У артефакта есть атрибуты:
|
||||
- Изображение
|
||||
- Название
|
||||
- Краткое описание
|
||||
- Дополнительно: редкость артефакта
|
||||
|
||||
2. Наши ресурсы
|
||||
### Наши ресурсы
|
||||
|
||||
ОЭЗ «Алабуга» [alabuga.ru]
|
||||
ОЭЗ «Алабуга» [alabuga.ru] - основной сайт компании
|
||||
|
||||
- основной сайт компании
|
||||
|
||||
HR-платформа [hr.alabuga.ru]
|
||||
|
||||
- основная платформа для авторизации в экосистеме «Алабуги». На этой
|
||||
платформе расположены бизнес-симуляции, в которые играют кандидаты и
|
||||
з
|
||||
сотрудники
|
||||
HR-платформа [hr.alabuga.ru] - основная платформа для авторизации в экосистеме «Алабуги». На этой
|
||||
платформе расположены бизнес-симуляции, в которые играют кандидаты из сотрудники
|
||||
|
||||
Карьера.100 лидеров [career.alabuga.space]
|
||||
|
||||
Карьера.Политех — [в разработке]
|
||||
Карьера.Старт — [в разработке]
|
||||
- платформы для трудоустройства кандидатов. В этих сервисах кандидаты
|
||||
Карьера.Политех [в разработке]
|
||||
|
||||
заполняют резюме, документы, проходят симуляции, записываются на очные
|
||||
Карьера.Старт [в разработке] - платформы для трудоустройства кандидатов. В этих сервисах
|
||||
кандидаты заполняют резюме, документы, проходят симуляции, записываются на очные этапы и проходят
|
||||
собеседования
|
||||
|
||||
этапы и проходят собеседования
|
||||
Алга.Алабуга [alga.alabuga.ru] - профориентационные экскурсии, которые запомнятся каждому участнику!
|
||||
|
||||
Алга.Алабуга [alga.alabuga.ru]
|
||||
|
||||
- профориентационные экскурсии, которые запомнятся каждому участнику!
|
||||
|
||||
3. Программно-аппаратные требования
|
||||
## Программно-аппаратные требования
|
||||
|
||||
3.1. Аппаратные требования и подход к разработке
|
||||
|
||||
|
|
|
|||
|
|
@ -1,28 +1,17 @@
|
|||
FROM python:3.13-slim
|
||||
|
||||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||
PYTHONUNBUFFERED=1 \
|
||||
PYO3_USE_ABI3_FORWARD_COMPATIBILITY=1
|
||||
ENV PYTHONDONTWRITEBYTECODE=1
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
ENV PYO3_USE_ABI3_FORWARD_COMPATIBILITY=1
|
||||
|
||||
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
|
||||
|
||||
COPY pyproject.toml ./
|
||||
RUN uv pip install --system --no-cache -e .
|
||||
|
||||
COPY pyproject.toml uv.lock ./
|
||||
RUN uv sync
|
||||
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
|
||||
|
||||
ENTRYPOINT ["uv", "run"]
|
||||
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
|
|
@ -2,39 +2,59 @@ services:
|
|||
backend:
|
||||
build:
|
||||
context: ./backend
|
||||
command: uvicorn app.main:app --host 0.0.0.0 --port 8000
|
||||
ports:
|
||||
- '8000:8000'
|
||||
volumes:
|
||||
- backend-data:/data
|
||||
- ./backend:/app
|
||||
env_file:
|
||||
- backend/.env
|
||||
depends_on: []
|
||||
environment:
|
||||
ALABUGA_ENVIRONMENT: "${ALABUGA_ENVIRONMENT}"
|
||||
ALABUGA_DEBUG: "${ALABUGA_DEBUG}"
|
||||
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:
|
||||
- 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:
|
||||
build:
|
||||
context: ./frontend
|
||||
command: npm run dev -- --hostname 0.0.0.0 --port 3000
|
||||
ports:
|
||||
- '3000:3000'
|
||||
env_file:
|
||||
- frontend/.env
|
||||
environment:
|
||||
NEXT_PUBLIC_API_URL: "https://${ALABUGA_DOMAIN}"
|
||||
NEXT_INTERNAL_API_URL: http://backend:8000
|
||||
volumes:
|
||||
- ./frontend:/app
|
||||
- /app/node_modules
|
||||
depends_on:
|
||||
- backend
|
||||
NEXT_PUBLIC_DEMO_EMAIL: "${NEXT_PUBLIC_DEMO_EMAIL}"
|
||||
NEXT_PUBLIC_DEMO_PASSWORD: "${NEXT_PUBLIC_DEMO_PASSWORD}"
|
||||
NEXT_PUBLIC_DEMO_HR_EMAIL: "${NEXT_PUBLIC_DEMO_HR_EMAIL}"
|
||||
NEXT_PUBLIC_DEMO_HR_PASSWORD: "${NEXT_PUBLIC_DEMO_HR_PASSWORD}"
|
||||
networks:
|
||||
- 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:
|
||||
backend-data:
|
||||
|
||||
networks:
|
||||
app-network:
|
||||
driver: bridge
|
||||
collabry-stage_default:
|
||||
external: true
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user