Данная инструкция предназначена для развертывания системы Ринго на сервере, который не имеет доступа в интернет для загрузки контейнеров. Далее будут описаны шаги, как скачать необходимые контейнеры на macOS, затем экспортировать их в архив и распаковать на сервере без доступа в интернет.
Убедитесь, что на сервере, куда планируется перемещение Ринго, установлена актуальная версия Docker Engine.
Вам потребуются root-права на целевом сервере, а на macOS - права администратора.
На компьютере macOS потребуется неограниченный доступ в интернет.
На компьютере macOS должна быть установлена терминальная утилита jq. Входит в стандартную поставку macOS >15.0
Установка на Intel-based и ARM-based Mac отличается. Обе инструкции подразумевают развертывание на Linux с архитектурой amd64.
docker-compose.yml, .env, key.json. Файл docker-compose.yml должен содержать настройки тех контейнеров, которые вы планируете использовать в том окружении, куда будете переносить систему. Файл key.json можно получить от поддержки Ринго - support@ringomdm.ru. Он потребуется для авторизации в реестре контейнеров Docker.version: '3.9'
services:
backend:
image: cr.yandex/crpsam2fr3938ne18jd0/ringo:latest
platform: linux/amd64
container_name: roll-deploy-backend
command: npm run start:prod
depends_on:
- micromdm
- deploydb
environment:
VIRTUAL_HOST: ${HOST_DOMAIN}
VIRTUAL_PORT: 5000
LETSENCRYPT_HOST: ${HOST_DOMAIN}
LETSENCRYPT_EMAIL: ${EMAIL}
PORT: 5000
JWT_SECRET_KEY: ${JWT_SECRET_KEY}
JWT_EXPIRATION_TIME: ${JWT_EXPIRATION_TIME}
DB_HOST: deploydb
DB_PORT: 5432
DB_USERNAME: roll
DB_PASSWORD: ${DB_PASSWORD}
DB_DATABASE: roll_deploy
MICROMDM_HOST: http://micromdm:8080
MICROMDM_SECRET: ${MICROMDM_SECRET}
DOCUMENTATION_ENABLED: ${DOCUMENTATION_ENABLED}
DOCUMENTATION_LOGIN: ${DOCUMENTATION_LOGIN}
DOCUMENTATION_PASSWORD: ${DOCUMENTATION_PASSWORD}
STATIC_LOGIN: ${STATIC_LOGIN}
STATIC_PASSWORD: ${STATIC_PASSWORD}
PUBLIC_URL: ${PUBLIC_URL}
AGENT_SECRET: ${AGENT_SECRET}
ADMIN_LOGIN: ${ADMIN_LOGIN}
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
ports:
- "5000:5000"
volumes:
- vol-deploy-backend:/files
micromdm:
image: ghcr.io/micromdm/micromdm:v1.11.0
platform: linux/amd64
container_name: roll-deploy-micromdm
environment:
MICROMDM_SERVER_URL: ${PUBLIC_URL}
MICROMDM_API_KEY: ${MICROMDM_SECRET}
MICROMDM_WEBHOOK_URL: http://backend:5000/mdm/webhook
MICROMDM_TLS: false
volumes:
- vol-deploy-micromdm:/var/db/micromdm
deploydb:
image: postgres:14-alpine
platform: linux/amd64
container_name: roll-deploy-db
environment:
POSTGRES_DB: roll_deploy
POSTGRES_USER: roll
POSTGRES_PASSWORD: ${DB_PASSWORD}
ports:
- '127.0.0.1:5432:5432'
volumes:
- vol-deploy-postgres:/var/lib/postgresql/data
volumes:
vol-deploy-micromdm:
vol-deploy-backend:
vol-deploy-postgres:
JWT_SECRET_KEY=[your-password]
JWT_EXPIRATION_TIME=24h
DB_PASSWORD=[your-password]
MICROMDM_SECRET=[your-password]
DOCUMENTATION_ENABLED=true
DOCUMENTATION_LOGIN=support
DOCUMENTATION_PASSWORD=[your-password]
PUBLIC_URL=https://ringo.mydomain.com
AGENT_SECRET=[your-password]
HOST_DOMAIN=ringo.mydomain.com
EMAIL=support@ringomdm.ru
ADMIN_LOGIN=support
ADMIN_PASSWORD=[your-password]
Создайте директорию, например, ~/ringo, поместите туда все файлы, созданные на шаге 2, затем перейдите в эту директорию:
mkdir ~/ringo
cd ~/ringo
Авторизуйтесь в реестре контейнеров Docker с помощью файла key.json:
cat key.json | docker login --username json_key --password-stdin cr.yandex
Разверните все контейнеры локально:
docker compose up -d
Убедитесь, что необходимые контейнеры работают:
docker ps -a
Если контейнер roll-deploy-backend в статусе Created, но не Up, перезапустите все контейнеры:
docker restart $(docker ps -aq)
Поскольку большинство популярных Docker-образов имеют multi-arch manifest lists, нужно явно удостовериться, что используется одноархитектурный (amd64) манифест/образ — и сохранить именно его (через pull по digest или перетегирование).
Автоматическая подготовка и экспорт образов с помощью скрипта:
save_amd64_images.sh:#!/usr/bin/env bash
set -euo pipefail
# Usage: ./save_amd64_images.sh my_images.tar
OUT_TAR=${1:-my_images.tar}
command -v docker >/dev/null 2>&1 || { echo "docker not found in PATH"; exit 1; }
command -v jq >/dev/null 2>&1 || {
echo "Warning: 'jq' not found. The script will try a fragile fallback. For reliability: brew install jq"
USE_JQ=0
} && USE_JQ=1
IMAGES=$(docker compose config 2>/dev/null | awk '/image:/ {print $2}' | sort -u)
if [ -z "$IMAGES" ]; then
echo "No images found in docker compose config. Exiting."
exit 1
fi
echo "Found images:"
echo "$IMAGES"
echo
TO_SAVE=()
for img in $IMAGES; do
echo "----"
echo "Processing: $img"
if [ "$USE_JQ" -eq 1 ]; then
digest=$(docker manifest inspect "$img" 2>/dev/null | jq -r '.manifests[]? | select(.platform? .architecture == "amd64" and .platform?.os == "linux") | .digest' | head -n1 || true)
else
# fallback if jq is not installed
digest=$(docker manifest inspect "$img" 2>/dev/null \
| awk '/"platform":/ {p=1} p && /"architecture"/ && /amd64/ {amd=1} p && /"digest"/ { if (amd) { gsub(/[,"]/,"",$2); print $2; exit } }' || true)
fi
if [ -n "$digest" ]; then
echo "Found amd64 digest: $digest"
echo "Pulling: $img@$digest"
docker pull "$img@$digest"
newtag="${img}-amd64"
echo "Tagging $img@$digest -> $newtag"
docker tag "$img@$digest" "$newtag"
TO_SAVE+=("$newtag")
else
echo "No amd64 digest found in manifest-list (or couldn't parse). Will pull --platform=linux/amd64"
docker pull --platform=linux/amd64 "$img"
newtag="${img}-amd64"
echo "Tagging $img -> $newtag"
docker tag "$img" "$newtag"
TO_SAVE+=("$newtag")
fi
arch=$(docker image inspect "${newtag}" --format '{{.Architecture}}' 2>/dev/null || true)
echo "Local image ${newtag} architecture: ${arch:-unknown}"
done
echo
echo "Saving images to $OUT_TAR:"
printf '%s\n' "${TO_SAVE[@]}"
docker save -o "$OUT_TAR" "${TO_SAVE[@]}"
echo "Saved $OUT_TAR (size: $(du -h "$OUT_TAR" | awk '{print $1}'))"
echo "Done."
Выдайте скрипту права на исполнение:
chmod +x save_amd64_images.sh
Запустите скрипт:
./save_amd64_images.sh my_images.tar
На данном этапе создастся файл ~/ringo/my_images.tar, готовый к переносу. Дальнейшние шаги не зависят от архитектуры процессора, можете переходить к развертыванию на Linux-сервере.
Выполните шаги 1-6 из инструкции по ARM Mac.
Выполните команду для экспорта контейнеров в архив:
docker save -o my_images.tar cr.yandex/crpsam2fr3938ne18jd0/ringo:latest ghcr.io/micromdm/micromdm:v1.11.0 postgres:14-alpine
На данном этапе создастся файл ~/ringo/my_images.tar, готовый к переносу. Дальнейшние шаги не зависят от архитектуры процессора, можете переходить к развертыванию на Linux-сервере.
Создайте директорию /etc/ringo:
mkdir /etc/ringo
Скопируйте с компьютера Mac содержимое директории ~/ringo/ на сервер в директорию /etc/ringo
Убедитесь, что архив с контейнерами my_images.tar скопировался тоже.
Импортируйте контейнеры Docker:
docker load < /etc/ringo/my_images.tar
Если экспорт проводился с Intel Mac, то запустите контейнеры:
docker compose -f /etc/ringo/docker-compose.yml up -d
Убедитесь, что контейнеры успешно запустились:
docker ps -a
На этом перенос завершен, система готова к использованию.
Если экспорт проводился с ARM Mac, отредактируйте файл docker-compose.yml на сервере:
Для каждого контейнера отредактируйте строку image (добавьте -amd64):
backend:
image: cr.yandex/crpsam2fr3938ne18jd0/ringo:latest-amd64
micromdm:
image: ghcr.io/micromdm/micromdm:v1.11.0-amd64
deploydb:
image: postgres:14-alpine-amd64
Запустите контейнеры:
docker compose -f /etc/ringo/docker-compose.yml up -d
Убедитесь, что контейнеры успешно запустились:
docker ps -a
Перенос завершен, система готова к использованию.