Данное руководство описывает процесс ручной установки системы управления устройствами Ринго MDM с использованием Let's Encrypt для автоматической выдачи SSL-сертификатов. После выполнения всех шагов вы получите полностью настроенную систему с веб-интерфейсом для управления устройствами Apple.
Перед началом установки убедитесь, что ваша система соответствует следующим требованиям:
key.json — файл для доступа к Docker-реестру (предоставляется компанией Ринго)Этот вариант подходит для серверов с внешним («белым») IP-адресом, где веб-сервер автоматически получает SSL-сертификат от Let’s Encrypt. Схема взаимодействия контейнеров:
Обновление системы. Войдите на сервер под учётной записью root и обновите пакеты системы до последних версий:
Для Ubuntu/Debian/Astra:
apt update && apt upgrade -y
Для RedOS/ROSA:
dnf update -y
Для ALT Linux:
apt-get update && apt-get upgrade -y
Важно! Все команды в данном руководстве должны выполняться от имени пользователя root.
Установка Docker. Ринго распространяется в виде Docker-контейнеров. Для запуска системы требуется установленный Docker Engine и Docker Compose. Воспользуйтесь официальным руководством от Docker для установки Docker Engine, а также инструкцией по установке Docker Compose. Ниже представленны примеры для разных OC:
Для Ubuntu/Debian:
apt install -y ca-certificates curl gnupg openssl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release && echo "$ID")/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/$(. /etc/os-release && echo "$ID") $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Для Astra Linux:
apt update
apt install -y docker.io openssl curl
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
Для ALT Linux:
apt-get update
apt-get install -y docker-engine openssl docker-compose
systemctl enable --now docker
Для RedOS:
dnf install -y docker-ce docker-ce-cli docker-compose openssl
systemctl enable docker --now
Для ROSA Linux:
dnf install -y docker-ce docker-cli docker-compose openssl
systemctl enable docker --now
Создание рабочей директории. Создайте каталог для размещения конфигурационных файлов и перейдите в него:
mkdir -p /etc/ringo
cd /etc/ringo
Копирование ключа реестра. Скопируйте файл key.json в директорию /etc/ringo/. Для переноса можно использовать команды scp или sftp, либо вручную создать файл в указанной директории, вставив в него содержимое key.json.
Проверка DNS-разрешения. Убедитесь, что выбранное доменное имя правильно отображается в IP-адрес вашего сервера:
nslookup yourdomain.com
Создание директорий для Nginx. Создайте необходимые каталоги для хранения конфигураций и сертификатов Nginx:
mkdir -p /apps/docker-articles/nginx/{vhost.d,certs,html}
Создание файла конфигурации Docker Compose. Создайте файл /etc/ringo/docker-compose.yml с конфигурацией всех необходимых контейнеров:
nano /etc/ringo/docker-compose.yml
version: '3.9'
services:
nginx-proxy:
image: jwilder/nginx-proxy
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- /apps/docker-articles/nginx/vhost.d:/etc/nginx/vhost.d
- /apps/docker-articles/nginx/certs:/etc/nginx/certs:ro
- /apps/docker-articles/nginx/html:/usr/share/nginx/html
labels:
com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion:latest
restart: always
depends_on:
- nginx-proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /apps/docker-articles/nginx/vhost.d:/etc/nginx/vhost.d
- /apps/docker-articles/nginx/certs:/etc/nginx/certs:rw
- /apps/docker-articles/nginx/html:/usr/share/nginx/html
backend:
image: cr.yandex/crpsam2fr3938ne18jd0/ringo:2.3.5
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:
- "127.0.0.1:5000:5000"
volumes:
- vol-deploy-backend:/files
micromdm:
image: ghcr.io/micromdm/micromdm:v1.11.0
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
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:
Если необходимо установить конкретную версию Ринго, измените значение образа для контейнера backend (roll-deploy-backend) в docker-compose.yml с:
image: cr.yandex/crpsam2fr3938ne18jd0/ringo:latest
# на
image: cr.yandex/crpsam2fr3938ne18jd0/ringo:v.v.v
v.v.v — это номер версии Ринго.Обратите внимание: переменные
STATIC_LOGINиSTATIC_PASSWORDвключают базовую аутентификацию на уровне nginx. Если она вам не нужна, удалите эти переменные изdocker-compose.yml.
Создание файла переменных окружения. Создайте файл /etc/ringo/.env с необходимыми параметрами. Для автоматической генерации паролей используйте следующий скрипт, заменив yourdomain.com на ваш домен:
nano gen_env.sh
#!/bin/bash
# Function for generating random passwords
genpass() {
openssl rand -base64 10 | cut -d '=' -f 1
}
# Creating .env file with environment variables
cat << EOF > /etc/ringo/.env
JWT_SECRET_KEY=$(genpass)
JWT_EXPIRATION_TIME=24h
DB_PASSWORD=$(genpass)
MICROMDM_SECRET=$(genpass)
DOCUMENTATION_ENABLED=true
DOCUMENTATION_LOGIN=support
DOCUMENTATION_PASSWORD=$(genpass)
ENROLL_PAGE_LOGIN=support
ENROLL_PAGE_PASSWORD=$(genpass)
PUBLIC_URL=https://yourdomain.com
AGENT_SECRET=$(genpass)
HOST_DOMAIN=yourdomain.com
EMAIL=support@ringomdm.ru
ADMIN_LOGIN=support
ADMIN_PASSWORD=$(genpass)
EOF
chmod +x gen_env.sh
./gen_env.sh
Подключение к Docker-реестру. Выполните аутентификацию в реестре контейнеров, используя предоставленный ключ:
cat /etc/ringo/key.json | docker login --username json_key --password-stdin cr.yandex
Запуск Docker. Убедитесь, что Docker запущен:
systemctl start docker
Запуск контейнеров. Перейдите в рабочую директорию и запустите все сервисы в фоновом режиме:
Для большинства систем:
cd /etc/ringo
docker compose up -d
Для Astra Linux (используется старая версия Docker Compose):
cd /etc/ringo
docker-compose up -d
Проверка статуса контейнеров. Убедитесь, что все контейнеры успешно запущены:
docker compose ps
Настройка лимитов загрузки файлов. После запуска контейнеров настройте максимальный размер загружаемых файлов для корректной работы веб-интерфейса:
echo "client_max_body_size 5m;" > /etc/ringo/ringo-proxy-settings.conf
docker cp /etc/ringo/ringo-proxy-settings.conf ringo-nginx-proxy-1:/etc/nginx/conf.d/ringo-proxy-settings.conf
docker container restart ringo-nginx-proxy-1
rm /etc/ringo/ringo-proxy-settings.conf
Для корректного отображения информации о сервере в интерфейсе Ринго выполните сбор системной информации с помощью следующего скрипта:
nano collect_host_info.sh
#!/bin/bash
collect_host_info() {
local date=$(date '+%Y-%m-%d %H:%M:%S')
local os_info=$(grep "PRETTY_NAME" /etc/os-release 2>/dev/null | cut -d= -f2 | tr -d '"')
local docker_info=$(docker version --format 'json' 2>/dev/null || echo '{"error": "Docker not available"}')
local cpu_info=$(lscpu --json 2>/dev/null || echo '{"error": "lscpu not available"}')
local memory_gb=$(free --giga 2>/dev/null | awk '/^Mem:/ {print $2}' || echo "0")
local memory_bytes=$((memory_gb * 1024 * 1024 * 1024))
local disk_info=$(lsblk --json 2>/dev/null || echo '{"error": "lsblk not available"}')
cat << EOF > /etc/ringo/hostInfo.json
{
"general": {
"OperatingSystemPrettyName": "$os_info"
},
"docker": $docker_info,
"cpu": $cpu_info,
"memory": [{"description":"System memory","units":"bytes","size":$memory_bytes}],
"disk": $disk_info,
"metadata": {
"date": "$date",
"generalCommand": "custom function",
"dockerCommand": "docker version --format 'json'",
"cpuCommand": "lscpu --json",
"memoryCommand": "free --giga",
"diskCommand": "lsblk --json"
}
}
EOF
echo "System information has been collected and saved to /etc/ringo/hostInfo.json"
}
copy_files_to_containers() {
echo "Copying files to containers..."
docker cp /etc/ringo/hostInfo.json roll-deploy-backend:/hostInfo.json
docker cp /etc/ringo/docker-compose.yml roll-deploy-backend:/docker-compose.yml
docker container restart roll-deploy-backend
rm /etc/ringo/hostInfo.json
echo "Files copied and containers restarted."
}
collect_host_info
copy_files_to_containers
chmod +x collect_host_info.sh
./collect_host_info.sh
После выполнения всех шагов система Ринго MDM будет доступна по адресу https://yourdomain.com.
Для входа в систему используйте учётные данные:
ADMIN_PASSWORD из файла /etc/ringo/.envЧтобы посмотреть все сгенерированные пароли, выполните:
cat /etc/ringo/.env
Важные замечания:
.env для последующего использования