# Настройка машины

На этой странице описывается процесс настройки первой машины: создание конфигурации, регистрация сервера, его подготовка и опциональная настройка инфраструктуры для публичного доступа.

## Шаг 1: Создание конфигурации

**Конфигурация**, это именованный файл конфигурации, хранящий ваши SSH-учетные данные, определения машин и привязки репозиториев. Воспринимайте его как рабочее пространство проекта.

```bash
rdc config init --name my-infra --ssh-key ~/.ssh/id_ed25519
```

| Опция | Обязательно | Описание |
|-------|-------------|----------|
| `--ssh-key <path>` | Да | Путь к вашему приватному SSH-ключу. Тильда (`~`) раскрывается автоматически. |
| `--renet-path <path>` | Нет | Пользовательский путь к бинарному файлу renet на удаленных машинах. По умолчанию используется стандартное расположение установки. |

Эта команда создает конфигурацию с именем `my-infra` и сохраняет её в `~/.config/rediacc/my-infra.json`. Конфигурация по умолчанию (без указания имени) хранится как `~/.config/rediacc/rediacc.json`.

> Вы можете иметь несколько конфигураций (например, `production`, `staging`, `dev`). Переключайтесь между ними с помощью флага `--config` в любой команде.

## Шаг 2: Добавление машины

Зарегистрируйте ваш удаленный сервер как машину в конфигурации:

```bash
rdc config machine add --name server-1 --ip 203.0.113.50 --user deploy
```

| Опция | Обязательно | По умолчанию | Описание |
|-------|-------------|--------------|----------|
| `--ip <address>` | Да | - | IP-адрес или имя хоста удаленного сервера |
| `--user <username>` | Да | - | Имя пользователя SSH на удаленном сервере |
| `--port <port>` | Нет | `22` | Порт SSH |
| `--datastore <path>` | Нет | `/mnt/rediacc` | Путь на сервере, где Rediacc хранит зашифрованные репозитории |

После добавления машины rdc автоматически выполняет `ssh-keyscan` для получения ключей хоста сервера. Вы также можете выполнить это вручную:

```bash
rdc config machine scan-keys -m server-1
```

Для просмотра всех зарегистрированных машин:

```bash
rdc config machine list
```

## Шаг 3: Настройка машины

Подготовьте удаленный сервер, установив все необходимые зависимости:

```bash
rdc config machine setup --name server-1
```

Эта команда:
1. Загружает бинарный файл renet на сервер через SFTP
2. Устанавливает Docker, containerd и cryptsetup (если отсутствуют)
3. Создает системного пользователя `rediacc` (UID 7111)
4. Создает директорию хранилища данных и подготавливает её для зашифрованных репозиториев

| Опция | Обязательно | По умолчанию | Описание |
|-------|-------------|--------------|----------|
| `--datastore <path>` | Нет | `/mnt/rediacc` | Директория хранилища данных на сервере |
| `--datastore-size <size>` | Нет | `95%` | Какую долю доступного диска выделить для хранилища данных |
| `--debug` | Нет | `false` | Включить подробный вывод для диагностики |

> Настройку нужно выполнить только один раз для каждой машины. Повторный запуск безопасен при необходимости.

## Управление ключами хоста

Если SSH-ключи хоста сервера изменились (например, после переустановки), обновите сохраненные ключи:

```bash
rdc config machine scan-keys -m server-1
```

Эта команда обновляет поле `knownHosts` в вашей конфигурации для данной машины.

## Проверка SSH-подключения

После добавления машины убедитесь, что она доступна:

```bash
rdc term connect -m server-1 -c "hostname"
```

Открывает SSH-подключение к машине и выполняет команду. Если всё прошло успешно, ваша конфигурация SSH верна.

Для более подробной диагностики выполните:

```bash
rdc doctor
```

> **Только для облачного адаптера**: команда `rdc machine test-connection` обеспечивает детальную диагностику SSH, но требует облачного адаптера. Для локального адаптера используйте `rdc term` или `ssh` напрямую.

## Настройка инфраструктуры

Для машин, которым необходимо обслуживать публичный трафик, настройте параметры инфраструктуры:

### Установка инфраструктуры

```bash
rdc config infra set -m server-1 \
  --public-ipv4 203.0.113.50 \
  --base-domain example.com \
  --cert-email admin@example.com \
  --cf-dns-token your-cloudflare-api-token
```

| Опция | Область | Описание |
|-------|---------|----------|
| `--public-ipv4 <ip>` | Machine | Public IPv4 address, proxy entrypoints are only created for configured address families |
| `--public-ipv6 <ip>` | Machine | Public IPv6 address, proxy entrypoints are only created for configured address families |
| `--base-domain <domain>` | Machine | Базовый домен для приложений (например, `example.com`) |
| `--cert-email <email>` | Config | Email для TLS-сертификатов Let's Encrypt (общий для всех машин) |
| `--cf-dns-token <token>` | Config | API-токен Cloudflare DNS для ACME DNS-01 проверок (общий для всех машин) |
| `--tcp-ports <ports>` | Machine | Дополнительные TCP-порты для проброса через запятую (например, `25,143,465,587,993`) |
| `--udp-ports <ports>` | Machine | Дополнительные UDP-порты для проброса через запятую (например, `53`) |

Опции области Machine хранятся для каждой машины. Опции области Config (`--cert-email`, `--cf-dns-token`) являются общими для всех машин в конфигурации, задайте их один раз, и они применяются повсюду.

### Просмотр инфраструктуры

```bash
rdc config infra show -m server-1
```

### Применение на сервере

Сгенерируйте и разверните конфигурацию обратного прокси Traefik на сервере:

```bash
rdc config infra push -m server-1
```

Эта команда:
1. Разворачивает бинарный файл renet на удалённой машине
2. Настраивает обратный прокси Traefik, маршрутизатор и службы systemd
3. Создаёт DNS-записи Cloudflare для поддомена машины (`server-1.example.com` и `*.server-1.example.com`), если задан `--cf-dns-token`

Шаг DNS выполняется автоматически и идемпотентно, создаёт недостающие записи, обновляет записи с изменёнными IP-адресами и пропускает записи, которые уже корректны. Если токен Cloudflare не настроен, DNS пропускается с предупреждением. Per-repo wildcard DNS records (for auto-routes) are created automatically when you run `rdc repo up`.

## Облачное провизионирование

Вместо ручного создания виртуальных машин вы можете настроить облачного провайдера и позволить `rdc` автоматически провизионировать машины с помощью [OpenTofu](https://opentofu.org/).

### Предварительные требования

Установите OpenTofu: [opentofu.org/docs/intro/install](https://opentofu.org/docs/intro/install/)

Убедитесь, что ваша конфигурация SSH включает публичный ключ:

```bash
rdc config set --key ssh.privateKeyPath --value ~/.ssh/id_ed25519
```

### Добавление облачного провайдера

```bash
rdc config provider add --name my-linode \
  --provider linode/linode \
  --token $LINODE_API_TOKEN \
  --region us-east \
  --type g6-standard-2
```

| Опция | Обязательно | Описание |
|-------|-------------|----------|
| `--provider <source>` | Да* | Известный источник провайдера (например, `linode/linode`, `hetznercloud/hcloud`) |
| `--source <source>` | Да* | Пользовательский источник провайдера OpenTofu (для неизвестных провайдеров) |
| `--token <token>` | Да | API-токен облачного провайдера |
| `--region <region>` | Нет | Регион по умолчанию для новых машин |
| `--type <type>` | Нет | Тип/размер экземпляра по умолчанию |
| `--image <image>` | Нет | Образ ОС по умолчанию |
| `--ssh-user <user>` | Нет | Имя пользователя SSH (по умолчанию: `root`) |

\* Требуется либо `--provider`, либо `--source`. Используйте `--provider` для известных провайдеров (встроенные значения по умолчанию). Используйте `--source` с дополнительными флагами `--resource`, `--ipv4-output`, `--ssh-key-attr` для пользовательских провайдеров.

### Провизионирование машины

```bash
rdc machine provision --name prod-2 --provider my-linode
```

Эта единственная команда:
1. Создаёт VM у облачного провайдера через OpenTofu
2. Ожидает SSH-подключения
3. Регистрирует машину в вашей конфигурации
4. Устанавливает renet и все зависимости
5. Configures Traefik proxy and Cloudflare DNS (auto-detects base domain from sibling machines, or pass `--base-domain` explicitly)

| Опция | Описание |
|-------|----------|
| `--provider <name>` | Имя облачного провайдера (из `add-provider`) |
| `--region <region>` | Переопределяет регион провайдера по умолчанию |
| `--type <type>` | Переопределяет тип экземпляра по умолчанию |
| `--image <image>` | Переопределяет образ ОС по умолчанию |
| `--base-domain <domain>` | Base domain for infrastructure. Auto-detected from sibling machines if not specified |
| `--no-infra` | Skip infrastructure configuration (proxy + DNS) entirely |
| `--debug` | Показывает подробный вывод провизионирования |

### Депровизионирование машины

```bash
rdc machine deprovision --name prod-2
```

Уничтожает VM через OpenTofu и удаляет её из вашей конфигурации. Требует подтверждения, если не используется `--force`. Работает только для машин, созданных с помощью `machine provision`.

### Список провайдеров

```bash
rdc config provider list
```

## Установка значений по умолчанию

Установите значения по умолчанию, чтобы не указывать их в каждой команде:

```bash
rdc config set --key machine --value server-1  # Машина по умолчанию
rdc config set --key team --value my-team  # Команда по умолчанию (облачный адаптер, экспериментальный)
```

После установки машины по умолчанию можно опускать `-m server-1` в командах:

```bash
rdc repo create --name my-app -m my-server --size 10G
```

## Несколько конфигураций

Управляйте несколькими средами с помощью именованных конфигураций:

```bash
# Создание отдельных конфигураций
rdc config init --name production --ssh-key ~/.ssh/id_prod
rdc config init --name staging --ssh-key ~/.ssh/id_staging

# Использование определенной конфигурации
rdc repo list -m server-1 --config production
rdc repo list -m staging-1 --config staging
```

Просмотр всех конфигураций:

```bash
rdc config list
```

Просмотр деталей текущей конфигурации:

```bash
rdc config show
```