#### Общая информация Alfa Cloud — серверный API, который предоставляет доступ к управлению контейнерами и конфигурацией облаков Alfa с поддержкой нескольких облачных серверов. Данный документ нужен для разработки полноценного фронтенда управления контейнерами. Все запросы должны производиться только из админки Mol. Метод авторизации каждого запроса - Basic Auth (обычный логин и пароль). Учётные данные можно менять регулярно, для этого существует специальный запрос. Учётные данные НЕ синхронизированы с основными учётными данными MOL (и для безопасности и отсутствия необходимости синхронизации всех юзеров. Нужен только главный админ). #### Точки подключения: GET: ``` /servers — получить список активных серверов (для разворачивания новых клиентов) /servers/{server_id} — получить подробную информацию о сервере (TODO: с параметрами мониторинга и нагрузкой в реальном времени) /clients — получить список контейнеров клиентов со всеми подробностями (поддерживается пагинация). С флагом доступностью контейнера. На фронте можно сделать прямой переход на облако клиента. /clients/{id}/demo_enable - применение таблиц демо-данных (demo seeder) /clients/{id}/demo_disable - удаление демо-данных (demo inverse seeder) /clients/{id}/maintain/{1/0} - включить или отключить страницу "Техническое обслуживание" у клиента /clients/{id}/send_success - отправить письмо клиенту с успешной регистрацией облака с логином и паролем /clients/{id}/send_expire - отправить письмо клиенту о скором истечении использования (можно/нужно автоматизировать) /clients/{id}/expire_dates_history - история изменения продлений дат пользователя /clients/reconfigurate - git pull и обновить все .env файлы у ВСЕХ облаков из актуального .env.example репозитория ``` POST: ``` /servers/ — создать сервер в БД (при наличии id - обновление) /clients/ — создать клиента (при наличии id - обновление данных, здесь не нужно отправлять пароль, а задавать его командой ниже) при создании - после проверки сразу вернётся id. во время создания нужно таймером опрашивать /clients/{id}/createlog и получать актуальный лог о создании контейнера (поднимать ws пока не будем). За окончание создания отвечает статус "completed" => "ok | error". /clients/{id}/admin_password — задать новый пароль администратора лаборатории /clients/{id}/expire_date - обновление крайней даты использования системы TODO: перенос данных клиента с одного сервера на другой TODO: /cloud_admin_password - задать пароль для подключения к API ``` DELETE ``` /clients/{id} — редкая функция — запуск очистки пользовательских конфигов с серверов /servers/{server_id} – не реализовано, да и пока что не надо. Тут нужно просто удаление информации о сервере из БД. ``` Команды менеджмента контейнеров и деплоя (GET) ``` /servers/check_host/{host_ip} - проверить доступность и настроенность сервера для деплоя. Применяется при создании и добавления сервера /servers/{server_id}/images - список доступных версий образов на сервере (для переключения или создания пользователя) /servers/{server_id}/reboot_server - перезапуск сервера /clients/{id}/reboot - попытка перезапуска контейнера пользователя /server/{server_id}/deploy - пересоздание ВСЕХ конфигов и перезапуск серверного кластера (действие, применяющееся после билда и/или смены версий). После этого необходимо сделать migrate_all /clients/{id}/createlog - Получить лог создания контейнера POST /containers/build_master_for_all/ - получение нового кода из ветки master на ВСЕХ серверах, сборка новых образов версии, отправка в БД всех лабораторий информации о новой версии (form-data): - version: 1.3-master - info: Описание версии и новых функций (желательно в .md) GET /clients/{subdomain}/update_to/{version} - вызов переключения образа на выбранную версию из-под интерфейса клиента. /containers/{server_id}/build_dev/{new_version} - получение кода из ветки dev, сборка фронта и нового образа (промежуточная версия/хотфикс) /containers/{server_id}/build_master/{new_version} - получение кода из ветки master, сборка нового образа (промежуточная версия/хотфикс) /containers/{server_id}/prune - удалить неиспользуемые версии образов (containers/image prune -a --force) (docker system prune -a --volumes --force) /clients/{id}/switch/{image_name} - принудительно переключить клиента на образ другой версии /server/{server_id}/switch_all/{image_name} - принудительно переключить всех клиентов на образ другой версии /clients/{id}/migrate - запустить обновление БД клиента (artisan migrate) /server/{server_id}/migrate_all - запустить обновление БД у всех клиентов на сервере /clients/{id}/move_to/{server_id} - переместить клиента на другой сервер /clients/{id}/copy_to/{client_id} - установить окружение клиента и БД в базу другого пользователя ТОЛЬКО на stage-сервер. Клиент - DEMO либо TEST. ``` Все данные в post отправляются посредством обычного post form-data. #### Описание полей form-data: ``` POST /servers/ id - опционально - обновление при наличии/создание при отсутствии name - наименование сервера host - назначение хоста, на котором расположен sql-сервер и docker-контейнер клиента, доступный бэкенду. Возможен IP-адрес внутренней сети. domain - поддомен, на котором будут работать клиенты. На этот хост должна быть направлена dns-зона основного домена sql_user sql_password - логин/пароль для удалённого подключения к SQL со стороны бэкенда для обновления БД клиентов. Необходимо выделить отдельные логины/пароли при настройке сервера и ограничить их подсетью. ``` ``` POST /clients/ id - опционально - обновление при наличии/создание при отсутствии server_id - id сервера, на котором создаётся клиент name - наименование клиента (создаётся лаба с таким именем в БД клиента) short_name - короткое наименование (для отображения у нас) admin_f - фамилия администратора admin_i - имя администратора admin_o - отчество администратора admin_login - имя пользователя администратора password - пароль администратора (последние 5 полей пишутся в БД клиента) subdomain - поддомен, на котором создаётся ЛИМС лабы email - е-мейл администратора (пишется в БД клиента) phone - телефон администратора (для будущих оповещений) city - город timezone - часовой пояс (для контейнера лаборатории) version_tag - версия образа (доступные версии получаются из запроса /server/id/images) config - конфигурация лаборатории. Условный текст. license - лицензия лаборатории. Условный текст. license_expires_at - datetime окончания лицензии (пишется в БД клиента) ``` ``` POST /clients/{id}/expire_date sender - имя обновляющего дату (запишется в логи) license_expires_at - datetime нового срока лицензии ``` ``` POST /clients/{id}/admin_password password - пароль confirm_password - подтверждение ``` ----------- **Прочая информация** Идеи: - Получать количество пользователей в каждой системе для общего списка клиентов - При билде образов автоматически вычислять версию и приписывать -dev или -master - Также версию образа можно тащить пользователям в интерфейс ### TODO: Добавить таблицу с настройками облака в каждую пользовательскую таблицу! - Проверка на уровне системы настройки "Техническое обслуживание" и показ блокирующей страницы - Проверка на крайнюю дату использования и блокировка системы. - Проверка на показ “турбостарта” при запуске - Проверка на вопрос “краткого туториала” ### Требования к конечному серверу: git docker+compose nginx mariadb / postgresql certbot && certbox-nginx nginx can bash nginx authorized key from master API nvm.sh для пользователя nginx, содержащий импорт путей к nvm/npm сделать nginx пользователя по-умолчанию www-data для правильного предоставления прав из-под контейнера. www-data/nginx sudo NOPASSWD /usr/bin/docker (remote cmd exec) www-data/nginx sudo NOPASSWD /usr/bin/docker-compose (remote cmd exec) ``` www-data ALL=(ALL) NOPASSWD: /usr/bin/docker www-data ALL=(ALL) NOPASSWD: /usr/sbin/nginx www-data ALL=(ALL) NOPASSWD: /usr/bin/docker-compose ``` www-data sudo NOPASSWD certbot (remote cmd exec) ### Права на каталоги сервера (nginx:nginx 775): /srv/www — current code (composer install && npm run build) /srv/docker – docker-compose.yml and Dockerfile (copy all from /srv/git without .git) /srv/docker/clients/client1/.env — client files mount dir /srv/docker/clients/client1/public /srv/docker/clients/client1/php/add_vars.ini