Кластер на M4 Mac mini: как сэкономить до 50 000 рублей в месяц на облачных подписках
Подробный гайд по созданию мощного и экономичного кластера на Mac mini M4 для самохостинга. Узнайте, как заменить дорогие облачные подписки на собственный homelab и сократить ежемесячные расходы.
Первоначальная настройка оборудования
Подготовьте Mac mini для работы 24/7. Включите удаленный доступ (SSH) и назначьте статические IP-адреса для каждого узла кластера. Отключите автоматический сон в настройках энергосбережения.
1. Системные настройки -> Общие -> Доступ -> Удаленный доступ (SSH)
2. Системные настройки -> Энергосбережение -> Отключить «Предотвращать сон при отключении экрана»
3. Сетевые настройки -> Назначить IP вручную (например, 192.168.1.10 для Master, 192.168.1.11 для Worker)Установка Docker на macOS
Установите Docker Desktop для управления контейнерами. Это основа для запуска Nextcloud, Home Assistant и других сервисов.
# Установка через Homebrew (рекомендуемый способ)
brew install --cask docker
# Проверка установки
docker --version
# Docker version 24.0.0+, build...Настройка общего хранилища (NFS)
Для отказоустойчивости данные должны быть доступны всем узлам. Настройте общий доступ к папке на одном из Mac mini (или NAS) через протокол NFS. Это позволит контейнерам на разных узлах видеть одни и те же файлы.
# На узле-хранилище (macOS)
sudo -s
mkdir -p /Shared/Storage
# Экспорт папки (требует редактирования конфига или использования UI)
# Включите общий доступ к папке через Системные настройки -> Общий доступ -> Файлы -> NFS
# Добавьте запись типа: -mapall=501:20 192.168.1.0/24
# На остальных узлах (монтирование)
# Добавьте в /etc/fstab или монтируйте вручную
mkdir -p /mnt/nas
df -hСоздание Docker Swarm кластера
Инициализируйте кластер Docker Swarm для оркестрации контейнеров. Это позволит управлять сервисами и балансировать нагрузку между узлами.
# На Master-узле (IP 192.168.1.10)
docker swarm init --advertise-addr 192.168.1.10
# Скопируйте токен, который вернет команда, и выполните на Worker-узлах
# Пример токена:
docker swarm join --token SWMTKN-1-xyz... 192.168.1.10:2377
# Проверка статуса Swarm
docker node lsРазвертывание Nextcloud
Создайте Docker Compose файл для развертывания Nextcloud с подключением к общему хранилищу и базе данных (например, MariaDB). Запустите стек как сервис Swarm.
version: '3.8'
services:
nextcloud:
image: nextcloud:latest
ports:
- "8080:80"
volumes:
- /mnt/nas/nextcloud_data:/var/www/html/data
environment:
- MYSQL_HOST=db
- MYSQL_PASSWORD=password
networks:
- backend
deploy:
replicas: 1
db:
image: mariadb:10.5
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=nextcloud
volumes:
- /mnt/nas/db_data:/var/lib/mysql
networks:
- backend
deploy:
replicas: 1
networks:
backend:
driver: overlayУправление приложением Home Assistant
Запустите Home Assistant в отдельном контейнере. Убедитесь, что у контейнера есть доступ к USB-координаторам (Zigbee/Z-Wave) через параметр --device или volume.
# Запуск Home Assistant в Docker Swarm
docker service create \
--name homeassistant \
--mount type=bind,source=/mnt/nas/hass_config,target=/config \
--constraint 'node.role == worker' \
-p 8123:8123 \
--env TZ=Europe/Moscow \
ghcr.io/home-assistant/home-assistant:stable
# Для доступа к USB (если подключен к узлу):
# Используйте утилиту UTM или добавьте --device /dev/ttyUSB0 при создании сервиса.Балансировка нагрузки и SSL (Nginx Proxy Manager)
Установите Nginx Proxy Manager в Docker для доступа к сервисам по доменным именам и автоматического получения SSL-сертификатов (Let's Encrypt).
version: '3.8'
services:
nginx-proxy-manager:
image: jc21/nginx-proxy-manager:latest
ports:
- "80:80"
- "81:81"
- "443:443"
volumes:
- /mnt/nas/npm_data:/data
- /mnt/nas/npm_letsencrypt:/etc/letsencrypt
deploy:
placement:
constraints:
- node.role == masterМониторинг ресурсов (Prometheus + Grafana)
Разверните стек мониторинга для наблюдения за нагрузкой CPU, RAM и сетью на каждом Mac mini.
version: '3.8'
services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- /mnt/nas/prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
ports:
- "9090:9090"
grafana:
image: grafana/grafana
volumes:
- /mnt/nas/grafana_data:/var/lib/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin