🚀 Цель:
Развернуть приложение в облаке Cloud.ru в Docker контейнере с помощью:
- Artifact Registry (репозиторий образов Docker),
- Container Apps (управляемый запуск контейнеров в облаке).
🔧 ЧАСТЬ 1. Подготовка и структура проекта
1.1 Что такое Artifact Registry и Container Apps?
Artifact Registry - облачное хранилище Docker-образов. Хранит ваши docker image, как GitVerse или GitHub хранит ваш код.
Container Apps - выполняет облачный запуск ваших Docker-контейнеров с автоматическим масштабированием в зависмости от нагрузки на ваше приложение.
1.2 Установка необходимых инструментов
✅ Требования:
- Операционная система: Linux/macOS/Windows;
- Установленный Docker Engine, Docker CLI;
- Установленный cloud-cli от Cloud.ru
В сloud.ru у меня подключен бесплатный VPS сервер для разработчиков с Linux Ubuntu 22.04.5 LTS.
Параметры сервера: 4 ГБ ОЗУ, 30 ГБ SSD, 100 ГБ S3 бакет AWS.
Чтобы мой сервер имел связь с интернетом я подключил к нему внешний IP адрес за 150 руб/мес.
Для удобства работы на удаленном сервере я подключился к нему через SSH по публичному ключу с помощью VSCod. В этом случае я могу работать на сервере через графический интерфейс и командную строку VSCod . Это очень удобно и наглядно в работе с кодом и файлами на удаленном сервере.
Инструкцию как подключиться к удаленному серверу через VSCod читайте по ссылке.
1.2.1 Установка Docker Engine, Docker CLI в Linux Ubuntu
Установим Docker Engine, Docker CLI:
Обновляем индекс пакетов apt, чтобы получить самую свежую информацию о доступных пакетах:
sudo apt update
Устанавливаем пакет docker.io — это версия Docker из стандартного репозитория Ubuntu.
⚠️ Внимание: это не самая свежая версия Docker. Для продакшена обычно используют docker-ce.
sudo apt install docker.io -y
Включаем сервис Docker в systemd, чтобы он автоматически запускался при старте системы:
sudo systemctl enable docker
Запускаем Docker прямо сейчас, без перезагрузки
sudo systemctl start docker
Добавляем текущего пользователя в группу docker, чтобы можно было выполнять команды docker без sudo
⚠️ После выполнения команды нужно выйти из системы и войти снова (или выполнить newgrp docker)
sudo usermod -aG docker $USER
Команду newgrp docker нужно выполнить в терминале после добавления пользователя в группу docker, чтобы изменения вступили в силу без перезагрузки или выхода из системы.
newgrp docker
Проверьте установку:
docker --version
Результат на моем сервере:
Docker version 27.5.0, build a187fa5
1.2.2 Установка cloud-cli
cloud-cli — это инструмент командной строки (CLI) для работы с облачной платформой Cloud.ru. Он позволяет управлять ресурсами (серверы, хранилище, контейнеры и др.) напрямую из терминала, без использования веб-интерфейса.
Это как «пульт управления» для Cloud.ru, только не графический, а текстовый. Через него вы можете:
- запускать виртуальные машины (VPS),
- разворачивать контейнеры в Container Apps,
- управлять S3-хранилищем,
- просматривать логи и метрики,
- автоматизировать деплой и DevOps-процессы.
Установка cloud-cli:
sudo curl -sSL https://sbc-cli.obs.ru-moscow-1.hc.sbercloud.ru/cli/latest/cloud_install.sh \
-o ./cloud_install.sh && sudo bash ./cloud_install.sh
Результат:
Проверьте версию cloud-cli:
sudo cloud version
Результат:
Current Cloud CLI version: 4.2.12
Включите автодополнение в cloud-cli::
sudo cloud auto-complete on
Результат:
Autocomplete (bash only) turned on. If it does not work, run the `bash` command.
Получение справки по командам cloud-cli:
sudo cloud --help
Результат
Настройка профиля доступа в Cloud CLI AKSK
Что потребуется заранее:
- Access Key (AK) — строка вида AKIA************
- Secret Key (SK) — строка вида abc123************
- Регион — например: ru-moscow-1
- Project ID — можно найти в панели Cloud.ru → IAM → Проекты
Создание именованного профиля (например, prod):
Создайте .env файл в корневой папке вашего проекта:
# .env
CLOUD_CLI_USERNAME=94d121e29ee3b81d75cc8629813fa42d
CLOUD_CLI_PASSWORD=a92d48387eb597e4044cf72a1b985cbc
CLOUD_CLI_REGION=ru-moscow-1
CLOUD_CLI_PROJECT_ID=8e63e869-24bc-4d78-98b5-35818d0edcee
CLOUD_CLI_DOMAIN_ID=dc6ff359-dabe-4eee-b425-d3178c09619c
Загрузите переменные в сессию терминала.
export $(grep -v '^#' .env | xargs)
Так вы сможете использовать переменные в CLI-командах без их раскрытия в истории терминала.
Проверьте переменные (для уверенности):
echo $CLOUD_CLI_USERNAME
Настройте профиль prod для cloud cli, возьмите секреты из .env:
# Подгружаем переменные окружения из .env
export $(grep -v '^#' .env | xargs)
# Настраиваем профиль prod, используя переменные из .env
sudo cloud configure set \
--cli-profile=prod \
--cli-mode=token \
--cli-domain="$CLOUD_CLI_USERNAME" \
--cli-password="$CLOUD_CLI_PASSWORD" \
--cli-domain-id="$CLOUD_CLI_DOMAIN_ID" \
--cli-project-id="$CLOUD_CLI_PROJECT_ID" \
--cli-region="$CLOUD_CLI_REGION"
Авторизация через токен вручную
Cloud CLI не использует --cli-password напрямую. Вместо этого:
- вам нужно получить токен вручную через API,
- затем передать его в CLI через --cli-x-auth-token.
Шаг 1. Отправим curl-запрос, чтобы получить токен
Создайте скрытый файл .auth.json:
Затем выполните команду:
curl -s -X POST https://iam.ru-moscow-1.api.cloud.ru/v3/auth/tokens \
-H "Content-Type: application/json" \
-d @.auth.json \
-i
Диагностика:
curl -v -X POST https://iam.ru-moscow-1.api.cloud.ru/v3/auth/tokens \
-H "Content-Type: application/json" \
-d @.auth.json \
-i
Результат: