Скрипт установки сервиса #8

Closed
opened 2026-09-26 09:27:13 +00:00 by forgejo-admin · 4 comments

Нужно создать скрипт, который бы устанавливал на машину linux с pi сборщика данных, который предоставляет для UI данные.
С точки зрения пользователя это должно выглядеть так: одна команда на скачивание и установку, пользователь лишь вставляет команду и все должно происходить автоматически. В конце статус об успешной или не успешной установке. Скрипт должен быть идемпотентным.

Сначала предложи решение и дождись моего аппрува.

Нужно создать скрипт, который бы устанавливал на машину linux с pi сборщика данных, который предоставляет для UI данные. С точки зрения пользователя это должно выглядеть так: одна команда на скачивание и установку, пользователь лишь вставляет команду и все должно происходить автоматически. В конце статус об успешной или не успешной установке. Скрипт должен быть идемпотентным. Сначала предложи решение и дождись моего аппрува.
Collaborator

Предлагаю решение.

Формат запуска

Одна команда — скачивание и установка (репозиторий публичный, raw-файл доступен без авторизации):

curl -fsSL http://10.10.1.7:3000/forgejo-admin/watcherenish/raw/branch/main/deploy/install.sh | sudo bash

Кто не любит pipe-to-bash — тот же скрипт можно скачать и запустить: curl -fsSL -o install.sh <url> && sudo bash install.sh. Скрипт поддерживает оба варианта.

Что делает скрипт (deploy/install.sh, чистый bash, без внешних зависимостей)

  1. Проверки окружения: Linux + systemd, наличие root/sudo — иначе понятная ошибка и выход с ненулевым кодом.
  2. Node.js ≥ 20: если не найден — установка через NodeSource; если дистрибутивный пакет ≥ 20 — используем его.
  3. Код: /opt/watcherenish уже есть → git pull (обновление), нет → git clone.
  4. npm test перед запуском сервиса — при падении установка прерывается со статусом «не успешно».
  5. systemd-юнит: генерируется из шаблона deploy/pi-web-monitor.service; пользователь/пути (User, WorkingDirectory, SESSIONS_DIR, GATE_LOG) автодетектятся, всё переопределяется переменными окружения скрипта. daemon-reload, enable --now.
  6. Финальная проверка: ждём GET /api/health со статусом ok (с fallback на systemctl is-active), в конце печатаем:
    • успех: «Установка выполнена успешно» + адрес сервиса + подсказка по проверке;
    • неудача: конкретный шаг, на котором упало, и что смотреть в логах; код возврата ≠ 0.

Идемпотентность

Повторный запуск безопасен: обновляет код, перегенерирует юнит, рестартует сервис; не создаёт дубликатов юнитов. Конфиг-переменные вынесем в EnvironmentFile=/etc/default/pi-web-monitor — файл создаётся только при первом запуске и при повторных установках не перетирается (ручные правки не теряются).

Вопросы (может, сразу снимем)

  1. AUTH_TOKEN: генерировать автоматически при первой установке (печатать в итоговом статусе) или по умолчанию оставить BIND=127.0.0.1 без токена, как сейчас в юните?
  2. Пути по умолчанию: /opt/watcherenish, пользователь pi, SESSIONS_DIR=~pi/.pi/agent/sessions — подходят? Всё переопределяется флагами, но дефолты лучше зафиксировать.

Жду аппрува — после него возьму задачу в работу (ветка feature/8_install_script).

Предлагаю решение. ## Формат запуска Одна команда — скачивание и установка (репозиторий публичный, raw-файл доступен без авторизации): ```bash curl -fsSL http://10.10.1.7:3000/forgejo-admin/watcherenish/raw/branch/main/deploy/install.sh | sudo bash ``` Кто не любит pipe-to-bash — тот же скрипт можно скачать и запустить: `curl -fsSL -o install.sh <url> && sudo bash install.sh`. Скрипт поддерживает оба варианта. ## Что делает скрипт (`deploy/install.sh`, чистый bash, без внешних зависимостей) 1. **Проверки окружения**: Linux + systemd, наличие root/sudo — иначе понятная ошибка и выход с ненулевым кодом. 2. **Node.js ≥ 20**: если не найден — установка через NodeSource; если дистрибутивный пакет ≥ 20 — используем его. 3. **Код**: `/opt/watcherenish` уже есть → `git pull` (обновление), нет → `git clone`. 4. **`npm test`** перед запуском сервиса — при падении установка прерывается со статусом «не успешно». 5. **systemd-юнит**: генерируется из шаблона `deploy/pi-web-monitor.service`; пользователь/пути (User, WorkingDirectory, `SESSIONS_DIR`, `GATE_LOG`) автодетектятся, всё переопределяется переменными окружения скрипта. `daemon-reload`, `enable --now`. 6. **Финальная проверка**: ждём `GET /api/health` со статусом ok (с fallback на `systemctl is-active`), в конце печатаем: - успех: «Установка выполнена успешно» + адрес сервиса + подсказка по проверке; - неудача: конкретный шаг, на котором упало, и что смотреть в логах; код возврата ≠ 0. ## Идемпотентность Повторный запуск безопасен: обновляет код, перегенерирует юнит, рестартует сервис; не создаёт дубликатов юнитов. Конфиг-переменные вынесем в `EnvironmentFile=/etc/default/pi-web-monitor` — файл создаётся только при первом запуске и при повторных установках не перетирается (ручные правки не теряются). ## Вопросы (может, сразу снимем) 1. **`AUTH_TOKEN`**: генерировать автоматически при первой установке (печатать в итоговом статусе) или по умолчанию оставить `BIND=127.0.0.1` без токена, как сейчас в юните? 2. **Пути по умолчанию**: `/opt/watcherenish`, пользователь `pi`, `SESSIONS_DIR=~pi/.pi/agent/sessions` — подходят? Всё переопределяется флагами, но дефолты лучше зафиксировать. Жду аппрува — после него возьму задачу в работу (ветка `feature/8_install_script`).
Author
Owner
  1. Давай генерировать при первой установке
  2. ок
    Аппрув, приступай
1. Давай генерировать при первой установке 2. ок Аппрув, приступай
Collaborator

Аппрув получен, фиксирую решения:

  1. AUTH_TOKEN — генерируем автоматически при первой установке (openssl rand -hex 32), печатаем в итоговом статусе и сохраняем в /etc/default/pi-web-monitor.
  2. Пути по умолчанию — /opt/watcherenish, пользователь pi, SESSIONS_DIR=~pi/.pi/agent/sessions (всё переопределяется переменными окружения).

Беру задачу, ветка feature/8_install_script. Блокировка снята.

Аппрув получен, фиксирую решения: 1. `AUTH_TOKEN` — генерируем автоматически при первой установке (openssl rand -hex 32), печатаем в итоговом статусе и сохраняем в `/etc/default/pi-web-monitor`. 2. Пути по умолчанию — `/opt/watcherenish`, пользователь `pi`, `SESSIONS_DIR=~pi/.pi/agent/sessions` (всё переопределяется переменными окружения). Беру задачу, ветка `feature/8_install_script`. Блокировка снята.
Collaborator

Готово, PR #10 на ревью, ветка feature/8_install_script.

Всё по согласованному плану, плюс решения из аппрува: AUTH_TOKEN генерируется автоматически при первой установке и печатается в итоговом статусе; дефолтные пути — /opt/watcherenish, пользователь pi, SESSIONS_DIR=~pi/.pi/agent/sessions.

Проверено E2E на этой машине: установка с нуля, идемпотентный перезапуск (конфиг не перетирается), pipe-режим, healthcheck с токеном/без, коды возврата при ошибках.

Примечание: one-liner curl ... | sudo bash заработает после мержа (скрипт появится в main); в PR он указан как целевой.

Готово, PR #10 на ревью, ветка `feature/8_install_script`. Всё по согласованному плану, плюс решения из аппрува: `AUTH_TOKEN` генерируется автоматически при первой установке и печатается в итоговом статусе; дефолтные пути — `/opt/watcherenish`, пользователь `pi`, `SESSIONS_DIR=~pi/.pi/agent/sessions`. Проверено E2E на этой машине: установка с нуля, идемпотентный перезапуск (конфиг не перетирается), pipe-режим, healthcheck с токеном/без, коды возврата при ошибках. Примечание: one-liner `curl ... | sudo bash` заработает после мержа (скрипт появится в `main`); в PR он указан как целевой.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
forgejo-admin/watcherenish#8
No description provided.