#!/usr/bin/env bash # # tribly-setup.sh — локальный программа установки Tribly (Linux/macOS). # Скачайте, запустите — он спросит IP/логин вашего VPS, подключится по SSH # и развернёт всё на сервере (Docker, стек, пробная лицензия — автоматически). # # Пароль SSH вводится один раз при подключении. Дальше вопросы установщика # (домен, почта для лицензии) задаются прямо в этом же окне. # set -euo pipefail # ИСТОЧНИК ДИСТРИБУТИВА — релизы на GitHub. Тот же, из которого сервер потом # берёт обновления, поэтому «чем поставили» и «чем обновляется» — одно и то же # место. Отдельного тарбола на своём домене больше нет: он требовал ручной # выкладки и однажды разошёлся бы с релизом. UPDATE_REPO="${UPDATE_REPO:-4eSyH/tribly-messenger}" RELEASES_API="https://api.github.com/repos/$UPDATE_REPO/releases/latest" # Файлы комплекта развёртывания в релизе. Caddyfile обязателен: без него docker # создаёт на месте ./caddy/Caddyfile пустой КАТАЛОГ, и контейнер входа уходит в # рестарт-цикл, то есть сервер остаётся без TLS. updater.sh нужен кнопке # «Обновить сейчас» в админке. SETUP_FILES="install.sh update.sh remote-update.sh updater.sh backup-db.sh docker-compose.yml Caddyfile" echo "=== Установка Tribly на ваш VPS ===" echo "Нужен VPS с Ubuntu 24.04 или новее и белым IP" echo read -r -p "IP адрес сервера: " HOST [ -n "$HOST" ] || { echo "IP обязателен."; exit 1; } read -r -p "SSH-пользователь [root]: " SSH_USER SSH_USER="${SSH_USER:-root}" echo echo "Подключаюсь к $SSH_USER@$HOST. Если для этого сервера настроен ключ SSH — вход пройдёт без пароля, иначе он будет запрошен." echo "Дальше отвечайте на вопросы установщика прямо здесь." echo exec ssh -t -o StrictHostKeyChecking=accept-new "$SSH_USER@$HOST" " set -e export DEBIAN_FRONTEND=noninteractive SUDO=\"\"; [ \"\$(id -u)\" -eq 0 ] || SUDO=sudo command -v curl >/dev/null 2>&1 || { \$SUDO apt-get update -y && \$SUDO apt-get install -y curl; } \$SUDO mkdir -p /opt/tribly && cd /opt/tribly # Докачиваем ПОФАЙЛОВО — только то, чего нет. Проверять один install.sh мало: # оборвавшаяся на середине закачка оставляла установку в тупике (повторный # запуск видел install.sh, пропускал и докачку, и chmod, и падал на «Permission # denied» или на битом compose). Но и качать весь комплект целиком нельзя: на # работающем сервере, поставленном старой версией, не хватает updater.sh и # Caddyfile — и полная перекачка молча затёрла бы правленые docker-compose.yml # и env.example. # КОМПЛЕКТ ПРИВОДИМ К ВЫПУСКУ ПО СОДЕРЖИМОМУ, А НЕ ПО НАЛИЧИЮ ФАЙЛОВ. # # Раньше качалось только недостающее. После прерванной установки на сервере # оставались все файлы прошлого выпуска, ничего не «не хватало» — и заново # запускался СТАРЫЙ установщик, хотя человек только что скачал свежий скрипт. # Со стороны это выглядело как «правки не приехали». echo '==> Узнаю последнюю версию…' TAG=\$(curl -fsSL --max-time 20 -H 'Accept: application/vnd.github+json' '$RELEASES_API' \ | grep -o '\"tag_name\"[[:space:]]*:[[:space:]]*\"[^\"]*\"' | head -1 | cut -d'\"' -f4) [ -n \"\$TAG\" ] || { echo 'Не удалось определить версию — проверьте доступ сервера в интернет.'; exit 1; } # Файлы лежат под ТЕГОМ (он с буквой «v»), номер — только для показа. VER=\${TAG#v} echo \"==> Готовлю Tribly \$VER…\" \$SUDO curl -fsSL --max-time 60 -o /opt/tribly/.release-sums \ \"https://github.com/$UPDATE_REPO/releases/download/\$TAG/SHA256SUMS\" 2>/dev/null || true for f in $SETUP_FILES; do # Файл на месте и совпадает с выпуском — не трогаем. if [ -f \"/opt/tribly/\$f\" ] && [ -s /opt/tribly/.release-sums ]; then want=\$(grep -E \"[ *]\$f\\$\" /opt/tribly/.release-sums | awk '{print \$1}' | head -1) have=\$(sha256sum \"/opt/tribly/\$f\" 2>/dev/null | awk '{print \$1}') if [ -n \"\$want\" ] && [ \"\$want\" = \"\$have\" ]; then continue fi # Правки владельца в настройках стека молча не теряем. case \"\$f\" in docker-compose.yml|Caddyfile) if [ -f /opt/tribly/.env ]; then \$SUDO cp -f \"/opt/tribly/\$f\" \"/opt/tribly/\$f.bak\" 2>/dev/null || true echo \" прежний \$f сохранён рядом как \$f.bak\" fi ;; esac echo \" обновляю \$f\" fi \$SUDO curl -fsSL -o \"/opt/tribly/\$f.part\" \ \"https://github.com/$UPDATE_REPO/releases/download/\$TAG/\$f\" \ || { \$SUDO rm -f \"/opt/tribly/\$f.part\"; echo \"Не скачался \$f\"; exit 1; } \$SUDO mv -f \"/opt/tribly/\$f.part\" \"/opt/tribly/\$f\" done \$SUDO chmod +x install.sh update.sh remote-update.sh updater.sh backup-db.sh \$SUDO ./install.sh "