diff --git a/AGENTS.md b/AGENTS.md index 8bb574b..f67ac8f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -83,14 +83,26 @@ ## Deploy - Все документы и заметки по деплою хранить в папке `Dev_Docs/deploy/`. -- Базовый целевой хост для деплоя по умолчанию: `player@93.170.12.154` (`shineup.me`). +- Production-хост SHiNE: `player@shineup.me` (`185.229.109.118`). +- Основной test-хост SHiNE: `player@193.8.215.70` (`test2.shineup.me`). +- Резервный test-хост SHiNE: `player@93.170.12.154` (`test.shineup.me`). - Базовый путь на сервере для SHiNE: `/home/player` (проекты SHiNE размещать в `/home/player/SHiNE/...`). - По возможности все справки, комментарии и примечания в конфигах/документах писать на русском языке. - Для операций `git push` при необходимости использовать токен из переменной окружения `$GITEA_TOKEN`. -- Для серверного деплоя использовать один gradle task: `./gradlew deployServer`. -- Для UI деплоя использовать один gradle task: `./gradlew deployUI`. +- Любые изменения и любой деплой на production `shineup.me` выполнять только после отдельного явного подтверждения пользователя. +- Если пользователь пишет просто `задеплой` без уточнения production/test, по умолчанию деплоить на `test2.shineup.me`. +- Default server deploy: `./gradlew deployServer` или `./gradlew deployServerTest2`. +- Default UI deploy: `./gradlew deployUI` или `./gradlew deployUITest2`. +- Production server deploy: `./gradlew deployServerProduction`. +- Production UI deploy: `./gradlew deployUIProduction`. +- Резервный test deploy на `test.shineup.me`: `./gradlew deployServerTest` и `./gradlew deployUITest`, но пока их не использовать без отдельной причины. - Для локального запуска использовать `./gradlew startLocal` (или `startLocalWithBuild`). - Сначала предлагать локальную проверку, а деплой на сервер выполнять по запросу пользователя. +- Для временной бесплатной загрузки аватаров в Arweave секретный JWK нельзя хранить в git и нельзя прописывать в репозиторный `application.properties`. +- Для продовой настройки тестового Arweave-кошелька JWK-файл нужно хранить только на сервере, например: `/home/player/SHiNE/secrets/test-free-avatar-wallet.json`. +- Для этой временной фичи на проде должны быть заданы параметры `test.freeAvatar.walletJwkPath` и `test.freeAvatar.walletAddress` через серверный override-конфиг/секреты на хосте. +- После изменения продовых значений `test.freeAvatar.*` нужно заново выполнить серверный деплой или перезапуск сервера, чтобы настройки были перечитаны приложением. +- При таких изменениях в git допускается коммитить только документацию и код чтения настроек, но не сам JWK, не содержимое секрета и не реальные приватные ключи. ## Логи звонков (установка соединения) - Специальный поток диагностики установки звонков идёт через `CallDeliveryReport` (клиент → сервер). diff --git a/Dev_Docs/Pending_Features/2026-06-20_1835_test_deploy_contour.md b/Dev_Docs/Pending_Features/2026-06-20_1835_test_deploy_contour.md new file mode 100644 index 0000000..43ff8d0 --- /dev/null +++ b/Dev_Docs/Pending_Features/2026-06-20_1835_test_deploy_contour.md @@ -0,0 +1,22 @@ +# Тестовые deploy-контуры `test2.shineup.me` и `test.shineup.me` + +- краткое описание: + - default deploy-задачи `deployServer` и `deployUI` переведены на основной тестовый сервер `test2.shineup.me`; + - production-задачи вынесены в `deployServerProduction` и `deployUIProduction`; + - `test.shineup.me` оставлен как резервный тестовый сервер без обычного deploy по умолчанию. + +- что проверять: + - `./gradlew deployServer` и `./gradlew deployUI` действительно направлены на `test2.shineup.me`; + - `./gradlew deployServerProduction` и `./gradlew deployUIProduction` больше не используются как default; + - `https://test2.shineup.me` открывает UI; + - `wss://test2.shineup.me/ws` отвечает; + - на `test2.shineup.me` после deploy есть копия продовой `shine.sqlite` и `.bch`. + +- ожидаемый результат: + - default deploy идёт только на `test2.shineup.me`; + - production `shineup.me` меняется только после отдельного подтверждения; + - `test.shineup.me` остаётся резервным тестовым сервером; + - тестовый deploy не гоняет удалённые тесты и не создаёт пустую БД. + +- статус: + - pending diff --git a/Dev_Docs/deploy/README.md b/Dev_Docs/deploy/README.md index 165d1ef..0459063 100644 --- a/Dev_Docs/deploy/README.md +++ b/Dev_Docs/deploy/README.md @@ -13,12 +13,56 @@ - актуальный IP должен браться через DNS-резолв на момент подключения; - ручное дублирование IP в документации и deploy-скриптах не поддерживать. +## Контуры деплоя + +- Production: + - SSH: `player@shineup.me` + - Домен: `shineup.me` + - IP: `185.229.109.118` +- Main test: + - SSH: `player@193.8.215.70` + - Домен: `test2.shineup.me` + - IP: `193.8.215.70` +- Reserve test: + - SSH: `player@93.170.12.154` + - Домен: `test.shineup.me` + - IP: `93.170.12.154` + ## Локальные команды -- Деплой сервера: `./gradlew deployServer` -- Деплой UI: `./gradlew deployUI` +- Default server deploy: `./gradlew deployServer` или `./gradlew deployServerTest2` +- Default UI deploy: `./gradlew deployUI` или `./gradlew deployUITest2` +- Production server deploy: `./gradlew deployServerProduction` +- Production UI deploy: `./gradlew deployUIProduction` +- Reserve test server deploy: `./gradlew deployServerTest` +- Reserve test UI deploy: `./gradlew deployUITest` - Локальный запуск: `./gradlew startLocal` +## Политика подтверждений + +- `shineup.me` — production. +- Любые изменения на `shineup.me`, включая deploy сервера, deploy UI, конфиги, перезапуски и миграции, делать только после отдельного явного подтверждения пользователя. +- Если пользователь пишет просто `задеплой` без уточнения, по умолчанию это означает deploy на `test2.shineup.me`. + +## Main test deploy (`test2.shineup.me`) + +- Это основной сервер для тестов. +- `deployServer` и `deployUI` по умолчанию направлены именно сюда. +- Серверный deploy не запускает JUnit/IT-тесты на удалённом сервере. +- `deployServer` / `deployServerTest2` делают: + - сборку fat-jar локально; + - синхронизацию `data/` и `shine.sqlite` с production `shineup.me`; + - перенос `application.properties` с production с поправкой `server.ui.indexPath` на `/home/player/SHiNE/shine-ui/index.html`; + - установку `systemd` unit на `193.8.215.70`; + - перезапуск `shine-server.service`; + - установку/проверку Caddy для `test2.shineup.me`. +- `deployUI` / `deployUITest2` публикуют UI в `/home/player/SHiNE/shine-ui` на `193.8.215.70`. + +## Reserve test deploy (`test.shineup.me`) + +- `test.shineup.me` пока не использовать для обычного deploy. +- Задачи `deployServerTest` и `deployUITest` считаются резервными и требуют отдельной причины. + ## UI-деплой и Caddy (обязательно) - Целевая директория UI-деплоя: `/home/player/SHiNE/shine-ui`. diff --git a/Dev_Docs/deploy/servers/193.8.215.70_test2_main.md b/Dev_Docs/deploy/servers/193.8.215.70_test2_main.md new file mode 100644 index 0000000..fbc36d5 --- /dev/null +++ b/Dev_Docs/deploy/servers/193.8.215.70_test2_main.md @@ -0,0 +1,42 @@ +# Сервер `193.8.215.70` — основной test (`test2.shineup.me`) + +- Пользователь: `player` +- Домен: `test2.shineup.me` +- Каталог SHiNE: `/home/player/SHiNE` +- UI публикация для Caddy: `/home/player/SHiNE/shine-ui` +- Сервер: `/home/player/SHiNE/shine-server/shine-server.jar` +- Данные: `/home/player/SHiNE/shine-server/data/` + - `shine.sqlite` + - `*.bch` +- Логи сервера: `/home/player/SHiNE/shine-server/logs/app.log` + +## Сервисы + +- `shine-server.service` (systemd) +- `caddy.service` (systemd) + +## Статус + +- Это основной сервер для тестов SHiNE. +- Default deploy по умолчанию должен идти сюда. +- Источник данных для тестовой БД: production `shineup.me`. + +## Caddy + +- Конфиг: `/etc/caddy/Caddyfile` +- Сайты: + - `test2.shineup.me` + - `agent.shiningpeople.ru` +- Для `test2.shineup.me`: + - `root * /home/player/SHiNE/shine-ui` + - `try_files {path} /index.html` + - `reverse_proxy /ws* -> 127.0.0.1:7070` + +## Deploy + +- Default server deploy: + - `./gradlew deployServer` + - `./gradlew deployServerTest2` +- Default UI deploy: + - `./gradlew deployUI` + - `./gradlew deployUITest2` diff --git a/Dev_Docs/deploy/servers/93.170.12.154_rapsberry.md b/Dev_Docs/deploy/servers/93.170.12.154_rapsberry.md index cf424ce..9c0e4df 100644 --- a/Dev_Docs/deploy/servers/93.170.12.154_rapsberry.md +++ b/Dev_Docs/deploy/servers/93.170.12.154_rapsberry.md @@ -1,14 +1,14 @@ -# Сервер `93.170.12.154` — резервный +# Сервер `93.170.12.154` — test.shineup.me - Пользователь: `player` - Каталог SHiNE: `/home/player/SHiNE` -- UI исходник (после rsync): `/home/player/SHiNE/SHiNE-UI` -- UI публикация для Caddy: `/var/www/shine-ui` -- Сервер: `/home/player/SHiNE/SHiNE-server/shine-server.jar` -- Данные: `/home/player/SHiNE/SHiNE-server/data/` +- Домен: `test.shineup.me` +- UI публикация для Caddy: `/home/player/SHiNE/shine-ui` +- Сервер: `/home/player/SHiNE/shine-server/shine-server.jar` +- Данные: `/home/player/SHiNE/shine-server/data/` - `shine.sqlite` - `*.bch` -- Логи сервера: `/home/player/SHiNE/SHiNE-server/logs/app.log` +- Логи сервера: `/home/player/SHiNE/shine-server/logs/app.log` ## Сервисы @@ -17,8 +17,10 @@ ## Статус -- Резервный сервер для SHiNE. -- Основной прод-сервер: `shineup.me` (подключение через `player@shineup.me`, IP определяется через DNS). +- Резервный тестовый сервер для SHiNE. +- Источник данных для тестовой БД: production `shineup.me`. +- Пока не использовать для обычного deploy. +- Основной прод-сервер: `shineup.me` (`185.229.109.118`). ## Caddy @@ -26,4 +28,12 @@ - Настройки: - `no-store/no-cache` заголовки; - `try_files {path} /index.html` (SPA fallback); - - `reverse_proxy /ws* -> 127.0.0.1:7070`. + - `reverse_proxy /ws* -> 127.0.0.1:7070`; + - целевой сайт: `test.shineup.me`. + +## Deploy + +- Резервные задачи: + - `./gradlew deployServerTest` + - `./gradlew deployUITest` +- Эти задачи пока не использовать без отдельной причины. diff --git a/Dev_Docs/deploy/servers/shineup.me_main.md b/Dev_Docs/deploy/servers/shineup.me_main.md index 891929c..66700ba 100644 --- a/Dev_Docs/deploy/servers/shineup.me_main.md +++ b/Dev_Docs/deploy/servers/shineup.me_main.md @@ -33,3 +33,15 @@ - `https://test-solana-tickets.shineup.me` - `https://test-solana-tickets.shiningpeople.ru` - Для всех deploy-скриптов и инструкций использовать именно `player@shineup.me`, без жёсткой фиксации IP. + +## Правило изменений + +- `shineup.me` — production. +- Любые изменения на этом сервере делать только после отдельного явного подтверждения пользователя. + +## Deploy + +- Production deploy-задачи: + - `./gradlew deployServerProduction` + - `./gradlew deployUIProduction` +- Default deploy-задачи `./gradlew deployServer` и `./gradlew deployUI` сюда больше не относятся. diff --git a/SHiNE-server/AGENTS.md b/SHiNE-server/AGENTS.md index 5d319b9..4734e4f 100644 --- a/SHiNE-server/AGENTS.md +++ b/SHiNE-server/AGENTS.md @@ -56,9 +56,28 @@ shine-UI/server-ui.html ``` ./gradlew deployServer +./gradlew deployUI ``` -Хост по умолчанию: `player@93.170.12.154` (shineup.me). +Default deploy по умолчанию идёт на `test2.shineup.me` (`player@193.8.215.70`). + +Production deploy: + +``` +./gradlew deployServerProduction +./gradlew deployUIProduction +``` + +Любые изменения на `shineup.me` делать только после отдельного явного подтверждения пользователя. + +Резервный test-контур: + +``` +./gradlew deployServerTest +./gradlew deployUITest +``` + +`test.shineup.me` пока не использовать для обычного deploy. Логи на проде: - `/home/player/SHiNE/shine-server/logs/app.log` diff --git a/VERSION.properties b/VERSION.properties index 9263a2d..dda8933 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.2.227 -server.version=1.2.213 +client.version=1.2.228 +server.version=1.2.214 diff --git a/build.gradle b/build.gradle index 4866cff..6c17c5e 100644 --- a/build.gradle +++ b/build.gradle @@ -185,16 +185,14 @@ tasks.named('build') { finalizedBy tasks.named('integrationTest') } -tasks.register('deployServer', JavaExec) { +tasks.register('deployServerProduction', JavaExec) { group = "!!deployment" - description = "Build → upload to server → restart service (без удаления БД, без IT тестов)" + description = "Production deploy: build → upload to shineup.me → restart service (только после явного подтверждения)" classpath = sourceSets.test.runtimeClasspath mainClass = "test.it.IT_DeployRestartNoCleanNoTestsMain" workingDir = file('SHiNE-server') - // можно переопределить при запуске: - // ./gradlew deployServer -Dit.remoteHost=... -Dit.wsUri=... dependsOn shadowJar systemProperty "it.remoteHost", System.getProperty("it.remoteHost", "shineup.me") systemProperty "it.remoteUser", System.getProperty("it.remoteUser", "player") @@ -205,13 +203,57 @@ tasks.register('deployServer', JavaExec) { dependsOn testClasses } -tasks.register('deployUI', Exec) { +tasks.register('deployUIProduction', Exec) { group = "!!deployment" - description = "Deploy WEB UI (production: shineup.me)" + description = "Production UI deploy: shineup.me (только после явного подтверждения)" workingDir = rootDir commandLine 'bash', file('deploy_shine-PWA.sh').absolutePath } +tasks.register('deployServer', Exec) { + group = "!!deployment" + description = "Default deploy server: test2.shineup.me" + dependsOn shadowJar + workingDir = rootDir + environment 'LOCAL_JAR', file('SHiNE-server/build/libs/shine-server.jar').absolutePath + commandLine 'bash', file('deploy_shine-server_test2.sh').absolutePath +} + +tasks.register('deployUI', Exec) { + group = "!!deployment" + description = "Default deploy UI: test2.shineup.me" + workingDir = rootDir + commandLine 'bash', file('deploy_shine-ui_test2.sh').absolutePath +} + +tasks.register('deployServerTest2') { + group = "!!deployment" + description = "Явный алиас основного test deploy server: test2.shineup.me" + dependsOn tasks.named('deployServer') +} + +tasks.register('deployUITest2') { + group = "!!deployment" + description = "Явный алиас основного test deploy UI: test2.shineup.me" + dependsOn tasks.named('deployUI') +} + +tasks.register('deployServerTest', Exec) { + group = "!!deployment" + description = "Резервный test deploy: test.shineup.me (пока не использовать)" + dependsOn shadowJar + workingDir = rootDir + environment 'LOCAL_JAR', file('SHiNE-server/build/libs/shine-server.jar').absolutePath + commandLine 'bash', file('deploy_shine-server_test.sh').absolutePath +} + +tasks.register('deployUITest', Exec) { + group = "!!deployment" + description = "Резервный test UI deploy: test.shineup.me (пока не использовать)" + workingDir = rootDir + commandLine 'bash', file('deploy_shine-ui_test.sh').absolutePath +} + tasks.register('startLocal', Exec) { group = "!!run" description = "Builds server, starts local WS server and local HTTP UI for end-to-end local testing" diff --git a/deploy_shine-PWA.sh b/deploy_shine-PWA.sh index 42021df..d857555 100755 --- a/deploy_shine-PWA.sh +++ b/deploy_shine-PWA.sh @@ -24,7 +24,7 @@ if [[ -z "$CLIENT_VERSION" ]]; then fi export CLIENT_VERSION -TARGET_URL="https://shineup.me" +TARGET_URL="${TARGET_URL:-https://${EXPECTED_CADDY_SITE}}" REMOTE_DIR="${REMOTE_UI_DIR}" cleanup() { diff --git a/deploy_shine-server_test.sh b/deploy_shine-server_test.sh new file mode 100644 index 0000000..d6fd7ea --- /dev/null +++ b/deploy_shine-server_test.sh @@ -0,0 +1,128 @@ +#!/usr/bin/env bash +set -euo pipefail + +PROD_HOST="${PROD_HOST:-player@shineup.me}" +TEST_HOST="${TEST_HOST:-player@93.170.12.154}" +TARGET_DOMAIN="${TARGET_DOMAIN:-test.shineup.me}" +REMOTE_BASE="${REMOTE_BASE:-/home/player/SHiNE}" +REMOTE_SERVER_DIR="${REMOTE_SERVER_DIR:-$REMOTE_BASE/shine-server}" +REMOTE_UI_DIR="${REMOTE_UI_DIR:-$REMOTE_BASE/shine-ui}" +REMOTE_DATA_DIR="${REMOTE_DATA_DIR:-$REMOTE_SERVER_DIR/data}" +REMOTE_LOGS_DIR="${REMOTE_LOGS_DIR:-$REMOTE_SERVER_DIR/logs}" +REMOTE_SERVICE_NAME="${REMOTE_SERVICE_NAME:-shine-server}" +LOCAL_JAR="${LOCAL_JAR:-build/libs/shine-server.jar}" +PROD_DATA_DIR="${PROD_DATA_DIR:-/home/player/SHiNE/shine-server/data}" +PROD_APP_PROPS="${PROD_APP_PROPS:-/home/player/SHiNE/shine-server/application.properties}" + +TMP_DIR="$(mktemp -d)" + +cleanup() { + rm -rf "$TMP_DIR" +} +trap cleanup EXIT + +require_file() { + local path="$1" + if [[ ! -f "$path" ]]; then + echo "ERROR: файл не найден: $path" >&2 + exit 1 + fi +} + +echo "==> Проверка локального jar" +require_file "$LOCAL_JAR" +jar_size="$(stat -c %s "$LOCAL_JAR")" +if [[ "$jar_size" -lt 10485760 ]]; then + echo "ERROR: jar слишком маленький для fat-jar: $jar_size bytes" >&2 + exit 1 +fi + +echo "==> Проверка SSH и sudo" +ssh -o BatchMode=yes -o ConnectTimeout=10 "$PROD_HOST" "echo SSH OK" >/dev/null +ssh -o BatchMode=yes -o ConnectTimeout=10 "$TEST_HOST" "echo SSH OK" >/dev/null +ssh "$TEST_HOST" "sudo -n true" + +echo "==> Подготовка Caddy для $TARGET_DOMAIN" +TEST_HOST="$TEST_HOST" \ +TARGET_DOMAIN="$TARGET_DOMAIN" \ +REMOTE_UI_DIR="$REMOTE_UI_DIR" \ +bash "$(dirname "$0")/scripts/install_test_caddyfile.sh" + +echo "==> Забираем продовые данные и application.properties" +mkdir -p "$TMP_DIR/data" +rsync -az --delete "$PROD_HOST:$PROD_DATA_DIR/" "$TMP_DIR/data/" +scp -p "$PROD_HOST:$PROD_APP_PROPS" "$TMP_DIR/application.properties" >/dev/null + +if grep -q '^server\.ui\.indexPath=' "$TMP_DIR/application.properties"; then + perl -0pi -e 's@^server\.ui\.indexPath=.*$@server.ui.indexPath=/home/player/SHiNE/shine-ui/index.html@m' "$TMP_DIR/application.properties" +else + printf '\nserver.ui.indexPath=/home/player/SHiNE/shine-ui/index.html\n' >>"$TMP_DIR/application.properties" +fi + +cat >"$TMP_DIR/shine-server.service" < Останавливаем текущий сервер на тестовом хосте" +ssh "$TEST_HOST" "sudo systemctl stop $REMOTE_SERVICE_NAME || true" + +echo "==> Создаём каталоги" +ssh "$TEST_HOST" "mkdir -p '$REMOTE_SERVER_DIR' '$REMOTE_DATA_DIR' '$REMOTE_LOGS_DIR' '$REMOTE_UI_DIR' '$REMOTE_BASE/caddy'" + +echo "==> Копируем продовую БД и blockchain-данные" +rsync -az --delete "$TMP_DIR/data/" "$TEST_HOST:$REMOTE_DATA_DIR/" + +echo "==> Загружаем новый jar и конфиг" +rsync -az --timeout=120 "$LOCAL_JAR" "$TEST_HOST:$REMOTE_SERVER_DIR/shine-server.jar.new" +rsync -az --timeout=30 "$TMP_DIR/application.properties" "$TEST_HOST:$REMOTE_SERVER_DIR/application.properties.new" +rsync -az --timeout=30 "$TMP_DIR/shine-server.service" "$TEST_HOST:/tmp/shine-server.service.new" + +echo "==> Применяем systemd unit и файлы сервера" +ssh "$TEST_HOST" "set -euo pipefail; \ + mv -f '$REMOTE_SERVER_DIR/shine-server.jar.new' '$REMOTE_SERVER_DIR/shine-server.jar'; \ + mv -f '$REMOTE_SERVER_DIR/application.properties.new' '$REMOTE_SERVER_DIR/application.properties'; \ + sudo mv -f /tmp/shine-server.service.new /etc/systemd/system/shine-server.service; \ + sudo chown root:root /etc/systemd/system/shine-server.service; \ + chmod 644 '$REMOTE_SERVER_DIR/application.properties'; \ + chmod 664 '$REMOTE_SERVER_DIR/shine-server.jar'; \ + mkdir -p '$REMOTE_LOGS_DIR'; \ + touch '$REMOTE_LOGS_DIR/app.log'; \ + chown -R player:player '$REMOTE_SERVER_DIR'; \ + sudo systemctl daemon-reload; \ + sudo systemctl enable '$REMOTE_SERVICE_NAME'; \ + sudo systemctl restart '$REMOTE_SERVICE_NAME'" + +echo "==> Ждём порт 7070" +for _ in $(seq 1 50); do + if ssh "$TEST_HOST" "ss -ltn '( sport = :7070 )' | grep -q 7070"; then + echo "==> Порт 7070 поднялся" + break + fi + sleep 1 +done + +if ! ssh "$TEST_HOST" "ss -ltn '( sport = :7070 )' | grep -q 7070"; then + echo "ERROR: тестовый сервер не поднял порт 7070" >&2 + exit 1 +fi + +echo "==> Проверяем статус сервиса" +ssh "$TEST_HOST" "sudo systemctl --no-pager --full status '$REMOTE_SERVICE_NAME' | sed -n '1,20p'" + +echo "test_server_deploy_done" diff --git a/deploy_shine-server_test2.sh b/deploy_shine-server_test2.sh new file mode 100644 index 0000000..d2bf746 --- /dev/null +++ b/deploy_shine-server_test2.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +set -euo pipefail + +PROD_HOST="${PROD_HOST:-player@shineup.me}" +TARGET_HOST="${TARGET_HOST:-player@193.8.215.70}" +TARGET_DOMAIN="${TARGET_DOMAIN:-test2.shineup.me}" +REMOTE_BASE="${REMOTE_BASE:-/home/player/SHiNE}" +REMOTE_SERVER_DIR="${REMOTE_SERVER_DIR:-$REMOTE_BASE/shine-server}" +REMOTE_DATA_DIR="${REMOTE_DATA_DIR:-$REMOTE_SERVER_DIR/data}" +REMOTE_LOGS_DIR="${REMOTE_LOGS_DIR:-$REMOTE_SERVER_DIR/logs}" +REMOTE_UI_DIR="${REMOTE_UI_DIR:-$REMOTE_BASE/shine-ui}" +REMOTE_SERVICE_NAME="${REMOTE_SERVICE_NAME:-shine-server}" +LOCAL_JAR="${LOCAL_JAR:-SHiNE-server/build/libs/shine-server.jar}" +PROD_DATA_DIR="${PROD_DATA_DIR:-/home/player/SHiNE/shine-server/data}" +PROD_APP_PROPS="${PROD_APP_PROPS:-/home/player/SHiNE/shine-server/application.properties}" + +TMP_DIR="$(mktemp -d)" +cleanup() { + rm -rf "$TMP_DIR" +} +trap cleanup EXIT + +if [[ ! -f "$LOCAL_JAR" ]]; then + echo "ERROR: локальный jar не найден: $LOCAL_JAR" >&2 + exit 1 +fi + +ssh -o BatchMode=yes -o ConnectTimeout=20 "$PROD_HOST" "echo SSH OK" >/dev/null +ssh -o BatchMode=yes -o ConnectTimeout=20 "$TARGET_HOST" "echo SSH OK" >/dev/null +ssh "$TARGET_HOST" "sudo -n true" +ssh "$TARGET_HOST" "java -version >/dev/null 2>&1" + +mkdir -p "$TMP_DIR/data" +rsync -az --delete "$PROD_HOST:$PROD_DATA_DIR/" "$TMP_DIR/data/" +rsync -az "$PROD_HOST:$PROD_APP_PROPS" "$TMP_DIR/application.properties" +perl -0pi -e 's@^server\.ui\.indexPath=.*$@server.ui.indexPath=/home/player/SHiNE/shine-ui/index.html@m' "$TMP_DIR/application.properties" + +cat >"$TMP_DIR/shine-server.service" < Подготовка Caddy для $TARGET_DOMAIN" +TEST_HOST="$TEST_HOST" \ +TARGET_DOMAIN="$TARGET_DOMAIN" \ +REMOTE_UI_DIR="$REMOTE_UI_DIR" \ +bash "$(dirname "$0")/scripts/install_test_caddyfile.sh" + +echo "==> Деплой UI на $TARGET_DOMAIN" +REMOTE_HOST="$TEST_HOST" \ +REMOTE_UI_DIR="$REMOTE_UI_DIR" \ +EXPECTED_CADDY_UI_ROOT="$REMOTE_UI_DIR" \ +EXPECTED_CADDY_SITE="$TARGET_DOMAIN" \ +TARGET_URL="https://$TARGET_DOMAIN" \ +bash "$(dirname "$0")/deploy_shine-PWA.sh" diff --git a/deploy_shine-ui_test2.sh b/deploy_shine-ui_test2.sh new file mode 100644 index 0000000..91bb06c --- /dev/null +++ b/deploy_shine-ui_test2.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +set -euo pipefail + +TARGET_HOST="${TARGET_HOST:-player@193.8.215.70}" +TARGET_DOMAIN="${TARGET_DOMAIN:-test2.shineup.me}" +REMOTE_UI_DIR="${REMOTE_UI_DIR:-/home/player/SHiNE/shine-ui}" + +TARGET_HOST="$TARGET_HOST" TARGET_DOMAIN="$TARGET_DOMAIN" REMOTE_UI_DIR="$REMOTE_UI_DIR" \ + bash "$(dirname "$0")/scripts/install_test2_caddyfile.sh" + +REMOTE_HOST="$TARGET_HOST" \ +REMOTE_UI_DIR="$REMOTE_UI_DIR" \ +EXPECTED_CADDY_UI_ROOT="$REMOTE_UI_DIR" \ +EXPECTED_CADDY_SITE="$TARGET_DOMAIN" \ +TARGET_URL="https://$TARGET_DOMAIN" \ +bash "$(dirname "$0")/deploy_shine-PWA.sh" + +ssh "$TARGET_HOST" "sudo chmod o+x /home/player /home/player/SHiNE '$REMOTE_UI_DIR'; \ + sudo find '$REMOTE_UI_DIR' -type d -exec chmod o+rx {} +; \ + sudo find '$REMOTE_UI_DIR' -type f -exec chmod o+r {} +" + diff --git a/scripts/install_test2_caddyfile.sh b/scripts/install_test2_caddyfile.sh new file mode 100644 index 0000000..d28f505 --- /dev/null +++ b/scripts/install_test2_caddyfile.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +set -euo pipefail + +TARGET_HOST="${TARGET_HOST:-player@193.8.215.70}" +TARGET_DOMAIN="${TARGET_DOMAIN:-test2.shineup.me}" +REMOTE_UI_DIR="${REMOTE_UI_DIR:-/home/player/SHiNE/shine-ui}" +REMOTE_CADDYFILE="${REMOTE_CADDYFILE:-/etc/caddy/Caddyfile}" + +TMP_DIR="$(mktemp -d)" +cleanup() { + rm -rf "$TMP_DIR" +} +trap cleanup EXIT + +cat >"$TMP_DIR/Caddyfile" </dev/null +ssh "$TARGET_HOST" "sudo -n true" +rsync -az "$TMP_DIR/Caddyfile" "$TARGET_HOST:/tmp/caddy-test2.new" +ssh "$TARGET_HOST" "set -euo pipefail; \ + sudo mv -f /tmp/caddy-test2.new '$REMOTE_CADDYFILE'; \ + sudo chown root:root '$REMOTE_CADDYFILE'; \ + sudo caddy validate --config '$REMOTE_CADDYFILE'; \ + sudo systemctl restart caddy" + diff --git a/scripts/install_test_caddyfile.sh b/scripts/install_test_caddyfile.sh new file mode 100644 index 0000000..9c47d92 --- /dev/null +++ b/scripts/install_test_caddyfile.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash +set -euo pipefail + +TEST_HOST="${TEST_HOST:-player@93.170.12.154}" +TARGET_DOMAIN="${TARGET_DOMAIN:-test.shineup.me}" +REMOTE_UI_DIR="${REMOTE_UI_DIR:-/home/player/SHiNE/shine-ui}" +REMOTE_CADDYFILE="${REMOTE_CADDYFILE:-/etc/caddy/Caddyfile}" + +TMP_DIR="$(mktemp -d)" + +cleanup() { + rm -rf "$TMP_DIR" +} +trap cleanup EXIT + +cat >"$TMP_DIR/Caddyfile" < Проверка SSH и sudo на $TEST_HOST" +ssh -o BatchMode=yes -o ConnectTimeout=10 "$TEST_HOST" "echo SSH OK" >/dev/null +ssh "$TEST_HOST" "sudo -n true" + +echo "==> Установка Caddy-конфига для $TARGET_DOMAIN" +scp -p "$TMP_DIR/Caddyfile" "$TEST_HOST:/tmp/shine-test-caddyfile.new" >/dev/null +ssh "$TEST_HOST" "sudo mkdir -p \"$(dirname "$REMOTE_CADDYFILE")\" && \ + sudo mv -f /tmp/shine-test-caddyfile.new \"$REMOTE_CADDYFILE\" && \ + sudo chown root:root \"$REMOTE_CADDYFILE\" && \ + sudo caddy validate --config \"$REMOTE_CADDYFILE\" && \ + sudo systemctl reload caddy" + +echo "==> Caddy настроен для $TARGET_DOMAIN"