Files
ermnvldmr.com/services/docs/content/ru/root/guides/first-node.md
T

7.1 KiB

title, description, weight
title description weight
Создание узла (First Node) Практическое руководство по созданию вашего первого узла и подключению общих модулей. 25

Цель: Создать репозиторий конфигураций для вашей собственной инфраструктуры, подключить общие модули в качестве подмодуля (submodule) и запустить первый базовый узел.

1. Создание репозитория конфигураций

Ваша инфраструктура должна управляться из единого Git-репозитория. Этот репозиторий будет содержать конфигурации для всех ваших серверов (узлов).

{{% steps %}}

Шаг 1: Инициализация репозитория

Создайте новую директорию и инициализируйте Git.

mkdir my-infrastructure
cd my-infrastructure
git init

Шаг 2: Добавление общих модулей как подмодуля

Общие модули (ermnvldmr.com-root-commons) должны располагаться по пути .operator/shared.

mkdir -p .operator
git submodule add https://github.com/deytenit/ermnvldmr.com-root-commons.git .operator/shared

Шаг 3: Создание загрузочного скрипта (Bootstrap)

Создайте файл init.sh в корне вашего репозитория. Этот скрипт свяжет общие модули с вашим локальным окружением.

#!/usr/bin/env bash
# init.sh

# Загрузка общих утилит из подмодуля
source "$(git -C "$(dirname "$0")" rev-parse --show-toplevel)/.operator/shared/scripts/lib/common.sh"

SCRIPT_NAME="init"

navigate_to_repo_root

log_info "Настройка Git hooks..."
git config core.hooksPath .operator/shared/githooks
git config --global --add safe.directory "${REPO_ROOT}"

log_info "Настройка PATH для диспетчера root..."
ABSOLUTE_RUN_DIR="$(realpath "${REPO_ROOT}/.operator/shared/scripts/run")"
BASHRC_ENTRY="export PATH=\"${ABSOLUTE_RUN_DIR}:\$PATH\""

sed -i '/\.operator\/shared\/scripts\/run/d' ~/.bashrc
echo "$BASHRC_ENTRY" >> ~/.bashrc
log_info "Готово. Выполните 'source ~/.bashrc' или перезайдите в терминал."

Сделайте его исполняемым:

chmod +x init.sh

{{% /steps %}}

2. Определение вашего первого узла

Узел (Node) — это папка в корне репозитория, которая представляет один физический или виртуальный сервер.

Структура узла

Давайте создадим узел с именем daedalus. Внутри него мы определим конфигурацию оператора (например, для резервного копирования) и базовый сервис.

mkdir -p daedalus/.operator/configs/{cron,crowdsec,systemd,ufw/docker,ufw/host}
mkdir -p daedalus/root

Базовые настройки (Опционально)

Вы можете добавить файлы конфигурации (например, правила UFW или crontab) в директорию daedalus/.operator/configs/. Например, простой crontab:

# Запуск резервного копирования каждую ночь в 3:00
0 3 * * * root sync tiers daedalus

3. Настройка сервисов (Docker Compose)

Фреймворк опирается на docker-compose.yml.

Инфраструктурный уровень (Узел оператора)

Файл daedalus/docker-compose.yml запускает инфраструктурные утилиты, такие как restic для бекапов или VPN-агенты. Этот compose-файл имеет прямой доступ к файловой системе через монтирование директорий @tierX.

name: 'operator'

services:
  restic:
    image: restic/restic:0.18.1
    container_name: operator-restic
    volumes:
      # Пример: монтирование данных для резервного копирования (Только для чтения)
      - ./@tier2/my-app/data:/data/@tier2/my-app/data:ro
      - ./@tier3/.operator/restic/cache:/var/restic-cache
    environment:
      RESTIC_REPOSITORY: "s3:example.com/my-bucket/daedalus"
      RESTIC_PASSWORD: "${RESTIC_PASSWORD?error}"
      # Данные AWS...
    network_mode: "host"
    entrypoint: [ "restic" ]

Корневой уровень (Root)

Проект root обычно содержит обратные прокси (Traefik) и сервисы, к которым обращаются другие проекты.

name: root

services:
  socket-proxy:
    image: tecnativa/docker-socket-proxy:0
    container_name: root-socket-proxy
    user: "0:0"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      CONTAINERS: 1
      SERVICES: 1
      TASKS: 1
    networks:
      socket: {}
    restart: unless-stopped

  traefik:
    image: traefik:3.6
    container_name: root-traefik
    # UID и GID подставляются автоматически фреймворком после команды 'root tiers useradd'
    user: "${UID?error}:${GID?error}"
    group_add:
      - "${SHARED_GID?error}"
    depends_on:
      - socket-proxy
    volumes:
      - ./@tier1/shared/root/traefik/letsencrypt:/letsencrypt
      - ./@tier3/traefik/logs:/logs
      - ./@tier1/traefik/dynamic:/etc/traefik/dynamic:ro
    ports:
      - '0.0.0.0:80:80'
      - '0.0.0.0:443:443'
    networks:
      proxy: {}
      socket: {}
    command:
      - "--api.dashboard=true"
      - "--providers.docker=true"
      - "--providers.docker.network=root-proxy"
      - "--providers.docker.endpoint=tcp://root-socket-proxy:2375"
    restart: unless-stopped

networks:
  proxy:
    name: root-proxy
    internal: true
    driver: bridge
  socket:
    name: root-socket
    internal: true
    driver: bridge

4. Развертывание

Теперь, когда структура создана:

  1. Закоммитьте и отправьте (push) этот репозиторий на ваш Git-сервер (например, GitHub).
  2. Зайдите на ваш VPS.
  3. Следуйте руководству по Установке (Installation), используя URL вашего нового репозитория.

См. также: