From d2c0ecdf62fe5b7de969a3b07cdd06593409b9d6b27b5b141e6a8f5a526aa194 Mon Sep 17 00:00:00 2001 From: AidarKC Date: Thu, 16 Jul 2026 11:46:42 +0400 Subject: [PATCH 1/4] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8E=20=D0=B8=20=D0=BD=D0=B0=D0=B2=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B8=20=D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BE=D0=BA=20?= =?UTF-8?q?=D0=B2=20UI=20deploy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 4 ++-- Deploy/PRODUCTION_SERVERS.md | 4 ++-- Deploy/README.md | 4 ++-- Deploy/TEST_SERVERS.md | 5 +++-- SHiNE-server/AGENTS.md | 2 +- VERSION.properties | 4 ++-- build.gradle | 12 ++++++------ deploy_shine-PWA.sh | 13 +++++++++++++ deploy_shine-server_test2.sh | 2 +- ...ploy_shine-ui_production_server2shineupme.sh | 6 ++++-- deploy_shine-ui_production_shineupme.sh | 13 +++++++++++++ deploy_shine-ui_t1.sh | 13 +++++++++++++ deploy_shine-ui_t2.sh | 13 +++++++++++++ deploy_shine-ui_t3.sh | 13 +++++++++++++ deploy_shine-ui_t4.sh | 13 +++++++++++++ docs/Blockchain/CHANGELOG.md | 2 +- docs/Blockchain/sync-between-servers.md | 2 +- ..._0915_исправление_регистрации_и_деплой_t2.md | 13 +++++++++++++ ..._0935_rpc_проверки_через_текущий_endpoint.md | 12 ++++++++++++ ...solana_endpoint_normalize_and_remove_help.md | 12 ++++++++++++ ...16_1035_deploy_ui_solana_cluster_endpoint.md | 12 ++++++++++++ ...-07-16_1105_server2_and_t1_t3_t4_wrappers.md | 12 ++++++++++++ ...2026-07-16_1125_rename_server2_ui_wrapper.md | 11 +++++++++++ docs/deploy/README.md | 9 +++++---- docs/deploy/servers/193.8.215.70_test2_main.md | 10 +++++----- scripts/install_test2_caddyfile.sh | 2 +- shine-UI/js/pages/entry-settings-view.js | 15 +++------------ shine-UI/js/pages/register-view.js | 17 ++++++++++------- shine-UI/js/pages/server-settings-view.js | 4 +++- shine-UI/js/services/server-health-service.js | 7 ++++--- shine-UI/js/state.js | 11 +---------- 31 files changed, 207 insertions(+), 65 deletions(-) rename deploy_shine-ui_test2.sh => deploy_shine-ui_production_server2shineupme.sh (80%) create mode 100644 deploy_shine-ui_production_shineupme.sh create mode 100644 deploy_shine-ui_t1.sh create mode 100644 deploy_shine-ui_t2.sh create mode 100644 deploy_shine-ui_t3.sh create mode 100644 deploy_shine-ui_t4.sh create mode 100644 docs/Pending_Features/2026-07-16_0915_исправление_регистрации_и_деплой_t2.md create mode 100644 docs/Pending_Features/2026-07-16_0935_rpc_проверки_через_текущий_endpoint.md create mode 100644 docs/Pending_Features/2026-07-16_1010_fix_solana_endpoint_normalize_and_remove_help.md create mode 100644 docs/Pending_Features/2026-07-16_1035_deploy_ui_solana_cluster_endpoint.md create mode 100644 docs/Pending_Features/2026-07-16_1105_server2_and_t1_t3_t4_wrappers.md create mode 100644 docs/Pending_Features/2026-07-16_1125_rename_server2_ui_wrapper.md diff --git a/AGENTS.md b/AGENTS.md index 5e9fb0e..a5040e9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -88,13 +88,13 @@ ## Deploy - Все документы и заметки по деплою хранить в папке `Dev_Docs/deploy/`. - Production-хост SHiNE: `player@shineup.me` (`178.208.64.62`). -- Основной test-хост SHiNE: `player@193.8.215.70` (`t.shineup.me`). +- Второй production-хост SHiNE: `player@193.8.215.70` (`server2.shineup.me`). - Резервный test-хост SHiNE: `player@93.170.12.154` (`test.shineup.me`). - Базовый путь на сервере для SHiNE: `/home/player` (проекты SHiNE размещать в `/home/player/SHiNE/...`). - По возможности все справки, комментарии и примечания в конфигах/документах писать на русском языке. - Для операций `git push` при необходимости использовать токен из переменной окружения `$GITEA_TOKEN`. - Любые изменения и любой деплой на production `shineup.me` выполнять только после отдельного явного подтверждения пользователя. -- Если пользователь пишет просто `задеплой` без уточнения production/test, по умолчанию деплоить на `t.shineup.me`. +- Если пользователь пишет просто `задеплой` без уточнения production/test, по умолчанию деплоить на `server2.shineup.me`. - Default server deploy: `./gradlew deployServer` или `./gradlew deployServerTest2`. - Default UI deploy: `./gradlew deployUI` или `./gradlew deployUITest2`. - Production server deploy: `./gradlew deployServerProduction`. diff --git a/Deploy/PRODUCTION_SERVERS.md b/Deploy/PRODUCTION_SERVERS.md index fb08996..fa1613f 100644 --- a/Deploy/PRODUCTION_SERVERS.md +++ b/Deploy/PRODUCTION_SERVERS.md @@ -11,7 +11,7 @@ и - `player@193.8.215.70` -- домен `t.shineup.me` +- домен `server2.shineup.me` - IP `193.8.215.70` Отдельно резервный хост `test.shineup.me` сейчас помечен как временно неработающий. @@ -55,7 +55,7 @@ Deploy: ## 2. Второй production-сервер - SSH: `player@193.8.215.70` -- домен: `t.shineup.me` +- домен: `server2.shineup.me` - IP: `193.8.215.70` - пользователь: `player` - базовый путь: `/home/player` diff --git a/Deploy/README.md b/Deploy/README.md index 1f6d973..c9730e0 100644 --- a/Deploy/README.md +++ b/Deploy/README.md @@ -17,7 +17,7 @@ - IP `178.208.64.62` - Второй production SHiNE: - `player@193.8.215.70` - - домен `t.shineup.me` + - домен `server2.shineup.me` - IP `193.8.215.70` - Временно неработающий резервный test: - `player@93.170.12.154` @@ -35,7 +35,7 @@ ## Важно -- Production-контура SHiNE сейчас два: `shineup.me` и `t.shineup.me`. +- Production-контура SHiNE сейчас два: `shineup.me` и `server2.shineup.me`. - `test.shineup.me` сейчас помечен как временно неработающий резервный test-хост. - `t1..t4.shineup.me` — это отдельные тестовые/devnet-контуры, не production. - Любые изменения на `shineup.me` делать только после отдельного подтверждения пользователя. diff --git a/Deploy/TEST_SERVERS.md b/Deploy/TEST_SERVERS.md index 8ef01af..cba51a4 100644 --- a/Deploy/TEST_SERVERS.md +++ b/Deploy/TEST_SERVERS.md @@ -5,7 +5,7 @@ ## 1. Исторический `test2`, теперь второй production-сервер - SSH: `player@193.8.215.70` -- Домен: `t.shineup.me` +- Домен: `server2.shineup.me` - IP: `193.8.215.70` - Назначение: второй production-контур SHiNE @@ -33,6 +33,7 @@ Deploy: - этот хост больше не считать test-контуром; - исторические имена deploy-задач `deployServerTest2` / `deployUITest2` сохранены, но сам хост считать production; +- задача `deployUITest2` по умолчанию выкладывает UI на `server2.shineup.me`, а не на `t2.shineup.me`; - при описании окружений перечислять его как второй production-сервер. ## 2. Резервный test-сервер, временно неработающий @@ -129,7 +130,7 @@ Operational-нюанс: Для любого test-контура полезны такие быстрые проверки: ```bash -curl -I https://t.shineup.me +curl -I https://server2.shineup.me curl -I https://test.shineup.me curl -I https://t1.shineup.me curl -I https://t2.shineup.me diff --git a/SHiNE-server/AGENTS.md b/SHiNE-server/AGENTS.md index 5976df1..9c1f007 100644 --- a/SHiNE-server/AGENTS.md +++ b/SHiNE-server/AGENTS.md @@ -59,7 +59,7 @@ shine-UI/server-ui.html ./gradlew deployUI ``` -Default deploy по умолчанию идёт на `t.shineup.me` (`player@193.8.215.70`). +Default deploy по умолчанию идёт на `server2.shineup.me` (`player@193.8.215.70`). Production deploy: diff --git a/VERSION.properties b/VERSION.properties index 0e03320..a2f5226 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.2.313 -server.version=1.2.292 +client.version=1.2.321 +server.version=1.2.293 diff --git a/build.gradle b/build.gradle index 42fb27b..a1a8c46 100644 --- a/build.gradle +++ b/build.gradle @@ -207,12 +207,12 @@ tasks.register('deployUIProduction', Exec) { group = "!!deployment" description = "Production UI deploy: shineup.me (только после явного подтверждения)" workingDir = rootDir - commandLine 'bash', file('deploy_shine-PWA.sh').absolutePath + commandLine 'bash', file('deploy_shine-ui_production_shineupme.sh').absolutePath } tasks.register('deployServer', Exec) { group = "!!deployment" - description = "Default deploy server: t.shineup.me" + description = "Default deploy server: server2.shineup.me" dependsOn shadowJar workingDir = rootDir environment 'LOCAL_JAR', file('SHiNE-server/build/libs/shine-server.jar').absolutePath @@ -221,20 +221,20 @@ tasks.register('deployServer', Exec) { tasks.register('deployUI', Exec) { group = "!!deployment" - description = "Default deploy UI: t.shineup.me" + description = "Default deploy UI: server2.shineup.me" workingDir = rootDir - commandLine 'bash', file('deploy_shine-ui_test2.sh').absolutePath + commandLine 'bash', file('deploy_shine-ui_production_server2shineupme.sh').absolutePath } tasks.register('deployServerTest2') { group = "!!deployment" - description = "Явный алиас основного test deploy server: t.shineup.me" + description = "Явный алиас второго production deploy server: server2.shineup.me" dependsOn tasks.named('deployServer') } tasks.register('deployUITest2') { group = "!!deployment" - description = "Явный алиас основного test deploy UI: t.shineup.me" + description = "Явный алиас второго production deploy UI: server2.shineup.me" dependsOn tasks.named('deployUI') } diff --git a/deploy_shine-PWA.sh b/deploy_shine-PWA.sh index 00cbb38..c63dd68 100755 --- a/deploy_shine-PWA.sh +++ b/deploy_shine-PWA.sh @@ -28,6 +28,13 @@ TARGET_URL="${TARGET_URL:-https://${EXPECTED_CADDY_SITE}}" REMOTE_DIR="${REMOTE_UI_DIR}" DEPLOY_SERVER_LOGIN="${DEPLOY_SERVER_LOGIN:-}" DEPLOY_SERVER_ADDRESS="${DEPLOY_SERVER_ADDRESS:-}" +DEPLOY_SOLANA_CLUSTER="${DEPLOY_SOLANA_CLUSTER:-}" +DEPLOY_SOLANA_ENDPOINT="${DEPLOY_SOLANA_ENDPOINT:-}" +DEPLOY_SOLANA_CLUSTER_NORMALIZED="$DEPLOY_SOLANA_CLUSTER" + +if [[ "$DEPLOY_SOLANA_CLUSTER_NORMALIZED" == "mainnet" ]]; then + DEPLOY_SOLANA_CLUSTER_NORMALIZED="mainnet-beta" +fi cleanup() { rm -rf "$TMP_DIR" @@ -52,6 +59,12 @@ if [[ -f "$DEPLOY_CONFIG_FILE" ]]; then if [[ -n "$DEPLOY_SERVER_ADDRESS" ]]; then perl -0pi -e "s/export const defaultServerAddress = '.*?';/export const defaultServerAddress = '$DEPLOY_SERVER_ADDRESS';/s" "$DEPLOY_CONFIG_FILE" fi + if [[ -n "$DEPLOY_SOLANA_CLUSTER_NORMALIZED" ]]; then + perl -0pi -e "s/export const defaultSolanaCluster = '.*?';/export const defaultSolanaCluster = '$DEPLOY_SOLANA_CLUSTER_NORMALIZED';/s" "$DEPLOY_CONFIG_FILE" + fi + if [[ -n "$DEPLOY_SOLANA_ENDPOINT" ]]; then + perl -0pi -e "s|export const defaultSolanaEndpoint = '.*?';|export const defaultSolanaEndpoint = '$DEPLOY_SOLANA_ENDPOINT';|s" "$DEPLOY_CONFIG_FILE" + fi fi INDEX_FILE="$TMP_DIR/index.html" diff --git a/deploy_shine-server_test2.sh b/deploy_shine-server_test2.sh index e5a1cf5..b846ef2 100644 --- a/deploy_shine-server_test2.sh +++ b/deploy_shine-server_test2.sh @@ -2,7 +2,7 @@ set -euo pipefail TARGET_HOST="${TARGET_HOST:-player@193.8.215.70}" -TARGET_DOMAIN="${TARGET_DOMAIN:-t.shineup.me}" +TARGET_DOMAIN="${TARGET_DOMAIN:-server2.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}" diff --git a/deploy_shine-ui_test2.sh b/deploy_shine-ui_production_server2shineupme.sh similarity index 80% rename from deploy_shine-ui_test2.sh rename to deploy_shine-ui_production_server2shineupme.sh index f5d7f8d..6aae49d 100644 --- a/deploy_shine-ui_test2.sh +++ b/deploy_shine-ui_production_server2shineupme.sh @@ -2,7 +2,7 @@ set -euo pipefail TARGET_HOST="${TARGET_HOST:-player@193.8.215.70}" -TARGET_DOMAIN="${TARGET_DOMAIN:-t.shineup.me}" +TARGET_DOMAIN="${TARGET_DOMAIN:-server2.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" \ @@ -12,8 +12,10 @@ REMOTE_HOST="$TARGET_HOST" \ REMOTE_UI_DIR="$REMOTE_UI_DIR" \ EXPECTED_CADDY_UI_ROOT="$REMOTE_UI_DIR" \ EXPECTED_CADDY_SITE="$TARGET_DOMAIN" \ -DEPLOY_SERVER_LOGIN="tshineupme" \ +DEPLOY_SERVER_LOGIN="server2shineupme" \ DEPLOY_SERVER_ADDRESS="$TARGET_DOMAIN" \ +DEPLOY_SOLANA_CLUSTER="mainnet" \ +DEPLOY_SOLANA_ENDPOINT="https://solana-rpc.publicnode.com" \ TARGET_URL="https://$TARGET_DOMAIN" \ bash "$(dirname "$0")/deploy_shine-PWA.sh" diff --git a/deploy_shine-ui_production_shineupme.sh b/deploy_shine-ui_production_shineupme.sh new file mode 100644 index 0000000..e61a55c --- /dev/null +++ b/deploy_shine-ui_production_shineupme.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail + +REMOTE_HOST="player@shineup.me" \ +REMOTE_UI_DIR="/home/player/SHiNE/shine-ui" \ +EXPECTED_CADDY_UI_ROOT="/home/player/SHiNE/shine-ui" \ +EXPECTED_CADDY_SITE="shineup.me" \ +DEPLOY_SERVER_LOGIN="shineupme" \ +DEPLOY_SERVER_ADDRESS="shineup.me" \ +DEPLOY_SOLANA_CLUSTER="mainnet" \ +DEPLOY_SOLANA_ENDPOINT="https://solana-rpc.publicnode.com" \ +TARGET_URL="https://shineup.me" \ +bash "$(dirname "$0")/deploy_shine-PWA.sh" diff --git a/deploy_shine-ui_t1.sh b/deploy_shine-ui_t1.sh new file mode 100644 index 0000000..bd09bb5 --- /dev/null +++ b/deploy_shine-ui_t1.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail + +REMOTE_HOST="player@178.208.90.249" \ +REMOTE_UI_DIR="/home/player/t1/UI" \ +EXPECTED_CADDY_UI_ROOT="/home/player/t1/UI" \ +EXPECTED_CADDY_SITE="t1.shineup.me" \ +DEPLOY_SERVER_LOGIN="server_t1" \ +DEPLOY_SERVER_ADDRESS="t1.shineup.me" \ +DEPLOY_SOLANA_CLUSTER="devnet" \ +DEPLOY_SOLANA_ENDPOINT="https://api.devnet.solana.com" \ +TARGET_URL="https://t1.shineup.me" \ +bash "$(dirname "$0")/deploy_shine-PWA.sh" diff --git a/deploy_shine-ui_t2.sh b/deploy_shine-ui_t2.sh new file mode 100644 index 0000000..443ce20 --- /dev/null +++ b/deploy_shine-ui_t2.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail + +REMOTE_HOST="player@178.208.90.249" \ +REMOTE_UI_DIR="/home/player/t2/UI" \ +EXPECTED_CADDY_UI_ROOT="/home/player/t2/UI" \ +EXPECTED_CADDY_SITE="t2.shineup.me" \ +DEPLOY_SERVER_LOGIN="server_t2" \ +DEPLOY_SERVER_ADDRESS="t2.shineup.me" \ +DEPLOY_SOLANA_CLUSTER="devnet" \ +DEPLOY_SOLANA_ENDPOINT="https://api.devnet.solana.com" \ +TARGET_URL="https://t2.shineup.me" \ +bash "$(dirname "$0")/deploy_shine-PWA.sh" diff --git a/deploy_shine-ui_t3.sh b/deploy_shine-ui_t3.sh new file mode 100644 index 0000000..ff9d48d --- /dev/null +++ b/deploy_shine-ui_t3.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail + +REMOTE_HOST="player@178.208.90.249" \ +REMOTE_UI_DIR="/home/player/t3/UI" \ +EXPECTED_CADDY_UI_ROOT="/home/player/t3/UI" \ +EXPECTED_CADDY_SITE="t3.shineup.me" \ +DEPLOY_SERVER_LOGIN="server_t3" \ +DEPLOY_SERVER_ADDRESS="t3.shineup.me" \ +DEPLOY_SOLANA_CLUSTER="devnet" \ +DEPLOY_SOLANA_ENDPOINT="https://api.devnet.solana.com" \ +TARGET_URL="https://t3.shineup.me" \ +bash "$(dirname "$0")/deploy_shine-PWA.sh" diff --git a/deploy_shine-ui_t4.sh b/deploy_shine-ui_t4.sh new file mode 100644 index 0000000..151d197 --- /dev/null +++ b/deploy_shine-ui_t4.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail + +REMOTE_HOST="player@178.208.90.249" \ +REMOTE_UI_DIR="/home/player/t4/UI" \ +EXPECTED_CADDY_UI_ROOT="/home/player/t4/UI" \ +EXPECTED_CADDY_SITE="t4.shineup.me" \ +DEPLOY_SERVER_LOGIN="server_t4" \ +DEPLOY_SERVER_ADDRESS="t4.shineup.me" \ +DEPLOY_SOLANA_CLUSTER="devnet" \ +DEPLOY_SOLANA_ENDPOINT="https://api.devnet.solana.com" \ +TARGET_URL="https://t4.shineup.me" \ +bash "$(dirname "$0")/deploy_shine-PWA.sh" diff --git a/docs/Blockchain/CHANGELOG.md b/docs/Blockchain/CHANGELOG.md index 49f6946..da25e99 100644 --- a/docs/Blockchain/CHANGELOG.md +++ b/docs/Blockchain/CHANGELOG.md @@ -48,7 +48,7 @@ # 2026-06-26 17:45:18 +0400 - Базовый коммит-ориентир: `44a1ba0`. -- На `t.shineup.me` подтверждена рабочая схема startup sync и full-resync: +- На `server2.shineup.me` подтверждена рабочая схема startup sync и full-resync: - после рестарта сервер добивает `BlockchainTmpRecovery` и `BlockchainResyncRecovery`; - `aidartest-001` успешно подтягивается с `shineup.me`; - итоговое локальное состояние по `aidartest-001` дошло до `last_block_number=13`. diff --git a/docs/Blockchain/sync-between-servers.md b/docs/Blockchain/sync-between-servers.md index c8a4fc5..ea6d116 100644 --- a/docs/Blockchain/sync-between-servers.md +++ b/docs/Blockchain/sync-between-servers.md @@ -244,7 +244,7 @@ Full resync запускается только тогда, когда: ### 8.1 Практическая проверка на тестовом сервере -Проверка на `t.shineup.me` показала, что текущая схема действительно поднимает цепочку при старте: +Проверка на `server2.shineup.me` показала, что текущая схема действительно поднимает цепочку при старте: - после рестарта сервер сначала проходит `BlockchainTmpRecovery`; - затем обрабатывает `BlockchainResyncRecovery`; diff --git a/docs/Pending_Features/2026-07-16_0915_исправление_регистрации_и_деплой_t2.md b/docs/Pending_Features/2026-07-16_0915_исправление_регистрации_и_деплой_t2.md new file mode 100644 index 0000000..0219daf --- /dev/null +++ b/docs/Pending_Features/2026-07-16_0915_исправление_регистрации_и_деплой_t2.md @@ -0,0 +1,13 @@ +# Исправление экрана регистрации и отдельный UI-деплой на `t2.shineup.me` + +- краткое описание: + Исправлен экран регистрации после регрессии: обычное поле пароля, кнопка-глаз и кнопка проверки логина снова должны быть видимы одновременно с режимом `12 слов`. Отдельно UI выложен на `t2.shineup.me` безопасным способом без использования исторического `deployUITest2`. +- что проверять: + Открыть экран регистрации и убедиться, что видны поле логина, статус под ним, кнопка `Проверить логин`, обычное поле пароля и квадратная кнопка-глаз. + Включить режим `12 слов` и убедиться, что блок слов появляется, но обычное поле пароля не исчезает. + Ввести слова и проверить, что длинный составной пароль сразу виден в обычном поле пароля. + Проверить, что `https://t2.shineup.me` отдаёт обновлённый UI с этой правкой. +- ожидаемый результат: + Экран регистрации снова полностью рабочий и на `t2.shineup.me` доступна именно исправленная версия UI. +- статус: + pending diff --git a/docs/Pending_Features/2026-07-16_0935_rpc_проверки_через_текущий_endpoint.md b/docs/Pending_Features/2026-07-16_0935_rpc_проверки_через_текущий_endpoint.md new file mode 100644 index 0000000..78948fe --- /dev/null +++ b/docs/Pending_Features/2026-07-16_0935_rpc_проверки_через_текущий_endpoint.md @@ -0,0 +1,12 @@ +# Проверки серверных настроек через текущий выбранный Solana RPC + +- краткое описание: + Убрано использование `SOLANA_ENDPOINT_DEFAULT` в проверках логина сервера. Теперь проверки должны идти через текущий выбранный пользователем Solana endpoint из настроек. +- что проверять: + Открыть экран настроек входа или серверных настроек. + Поменять `Адрес Solana сервера` на другой endpoint и проверить логин сервера кнопкой `Проверить`. + Убедиться, что результат проверки соответствует именно выбранному RPC, а не значению по умолчанию. +- ожидаемый результат: + Все проверки логина сервера используют текущий выбранный Solana endpoint и не подмешивают дефолтный RPC. +- статус: + pending diff --git a/docs/Pending_Features/2026-07-16_1010_fix_solana_endpoint_normalize_and_remove_help.md b/docs/Pending_Features/2026-07-16_1010_fix_solana_endpoint_normalize_and_remove_help.md new file mode 100644 index 0000000..36bdd56 --- /dev/null +++ b/docs/Pending_Features/2026-07-16_1010_fix_solana_endpoint_normalize_and_remove_help.md @@ -0,0 +1,12 @@ +# Исправление нормализации Solana endpoint и удаление старой кнопки справки + +- краткое описание: + Убрана скрытая подмена выбранного Solana endpoint на дефолтный при сохранении настроек входа. Со страницы настроек входа удалена старая маленькая кнопка `?` внизу. +- что проверять: + Открыть настройки входа, ввести свой Solana RPC и сохранить. + Убедиться, что после сохранения endpoint остаётся ровно тем, который был введён, без незаметной подмены. + Проверить, что внизу страницы больше нет маленькой кнопки `?`. +- ожидаемый результат: + Клиент использует именно выбранный пользователем Solana endpoint, а экран настроек входа не содержит старой кнопки справки. +- статус: + pending diff --git a/docs/Pending_Features/2026-07-16_1035_deploy_ui_solana_cluster_endpoint.md b/docs/Pending_Features/2026-07-16_1035_deploy_ui_solana_cluster_endpoint.md new file mode 100644 index 0000000..c067eac --- /dev/null +++ b/docs/Pending_Features/2026-07-16_1035_deploy_ui_solana_cluster_endpoint.md @@ -0,0 +1,12 @@ +# UI deploy: подстановка Solana cluster и endpoint + +- краткое описание: + В UI deploy-скрипт добавлена подстановка `defaultSolanaCluster` и `defaultSolanaEndpoint` в `deploy-config.js`. Для production на уровне скриптов используется значение `mainnet`, которое внутри общего deploy-скрипта нормализуется в `mainnet-beta` для совместимости с кодом. Для `t2` выставляется devnet/api.devnet.solana.com. +- что проверять: + Выполнить production UI deploy и проверить, что в опубликованном `js/deploy-config.js` стоят `mainnet-beta` и `https://solana-rpc.publicnode.com`. + Выполнить `t2` UI deploy и проверить, что в опубликованном `js/deploy-config.js` стоят `devnet` и `https://api.devnet.solana.com`. + Убедиться, что логин и адрес сервера при этом тоже подставляются корректно. +- ожидаемый результат: + После деплоя каждый UI-инстанс получает свои правильные Solana defaults без ручной правки файла на сервере. +- статус: + pending diff --git a/docs/Pending_Features/2026-07-16_1105_server2_and_t1_t3_t4_wrappers.md b/docs/Pending_Features/2026-07-16_1105_server2_and_t1_t3_t4_wrappers.md new file mode 100644 index 0000000..5b826e6 --- /dev/null +++ b/docs/Pending_Features/2026-07-16_1105_server2_and_t1_t3_t4_wrappers.md @@ -0,0 +1,12 @@ +# Перенос второго production на `server2.shineup.me` и добавление UI-обёрток `t1/t3/t4` + +- краткое описание: + Второй production-контур переименован в документации и UI deploy-скриптах на `server2.shineup.me` с логином `server2shineupme`. Добавлены отдельные UI-обёртки для `t1`, `t3` и `t4`. +- что проверять: + Выполнить `./gradlew deployUI` и убедиться, что deploy идёт на `server2.shineup.me`. + Проверить новые скрипты `deploy_shine-ui_t1.sh`, `deploy_shine-ui_t3.sh`, `deploy_shine-ui_t4.sh`. + Убедиться, что в проектной документации больше нет упоминаний старого домена второго production-контура. +- ожидаемый результат: + Второй production везде обозначен как `server2.shineup.me`, а все четыре devnet UI-инстанса имеют отдельные короткие deploy-обёртки. +- статус: + pending diff --git a/docs/Pending_Features/2026-07-16_1125_rename_server2_ui_wrapper.md b/docs/Pending_Features/2026-07-16_1125_rename_server2_ui_wrapper.md new file mode 100644 index 0000000..3156a4d --- /dev/null +++ b/docs/Pending_Features/2026-07-16_1125_rename_server2_ui_wrapper.md @@ -0,0 +1,11 @@ +# Переименование UI-обёртки второго production в единый формат + +- краткое описание: + UI-обёртка второго production переименована в `deploy_shine-ui_production_server2shineupme.sh`, чтобы имя было единообразным с production-обёрткой основного домена. +- что проверять: + Убедиться, что `./gradlew deployUI` использует новый файл-обёртку. + Проверить, что старое имя `deploy_shine-ui_server2shineupme.sh` больше нигде не используется. +- ожидаемый результат: + Для второго production используется обёртка с именем `deploy_shine-ui_production_server2shineupme.sh`. +- статус: + pending diff --git a/docs/deploy/README.md b/docs/deploy/README.md index fc1a9c6..f2d66a5 100644 --- a/docs/deploy/README.md +++ b/docs/deploy/README.md @@ -21,7 +21,7 @@ - IP: `178.208.64.62` - Second production: - SSH: `player@193.8.215.70` - - Домен: `t.shineup.me` + - Домен: `server2.shineup.me` - IP: `193.8.215.70` - Reserve test (temporarily down): - SSH: `player@93.170.12.154` @@ -45,11 +45,11 @@ ## Политика подтверждений -- `shineup.me` и `t.shineup.me` считать production-контурами. +- `shineup.me` и `server2.shineup.me` считать production-контурами. - Любые изменения на production-контурах, включая deploy сервера, deploy UI, конфиги, перезапуски и миграции, делать только после отдельного явного подтверждения пользователя. - `test.shineup.me` считать резервным тестовым хостом, который сейчас временно не работает. -## Second production deploy (`t.shineup.me`) +## Second production deploy (`server2.shineup.me`) - Это второй production-сервер SHiNE. - Исторические задачи `deployServer`, `deployUI`, `deployServerTest2`, `deployUITest2` по-прежнему могут указывать сюда. @@ -60,8 +60,9 @@ - перенос `application.properties` с production с поправкой `server.ui.indexPath` на `/home/player/SHiNE/shine-ui/index.html`; - установку `systemd` unit на `193.8.215.70`; - перезапуск `shine-server.service`; - - установку/проверку Caddy для `t.shineup.me`. + - установку/проверку Caddy для `server2.shineup.me`. - `deployUI` / `deployUITest2` публикуют UI в `/home/player/SHiNE/shine-ui` на `193.8.215.70`. +- Важно: историческое имя `deployUITest2` вводит в заблуждение. По умолчанию эта задача деплоит на `server2.shineup.me`, а не на `t2.shineup.me`. ## Reserve test deploy (`test.shineup.me`) diff --git a/docs/deploy/servers/193.8.215.70_test2_main.md b/docs/deploy/servers/193.8.215.70_test2_main.md index 242f98c..3bab829 100644 --- a/docs/deploy/servers/193.8.215.70_test2_main.md +++ b/docs/deploy/servers/193.8.215.70_test2_main.md @@ -1,8 +1,8 @@ -# Сервер `193.8.215.70` — второй production (`t.shineup.me`) +# Сервер `193.8.215.70` — второй production (`server2.shineup.me`) - Пользователь: `player` -- Домен: `t.shineup.me` -- Логин сервера: `tshineupme` +- Домен: `server2.shineup.me` +- Логин сервера: `server2shineupme` - Каталог SHiNE: `/home/player/SHiNE` - UI публикация для Caddy: `/home/player/SHiNE/shine-ui` - Сервер: `/home/player/SHiNE/shine-server/shine-server.jar` @@ -26,9 +26,9 @@ - Конфиг: `/etc/caddy/Caddyfile` - Сайты: - - `t.shineup.me` + - `server2.shineup.me` - `agent.shiningpeople.ru` -- Для `t.shineup.me`: +- Для `server2.shineup.me`: - `root * /home/player/SHiNE/shine-ui` - `try_files {path} /index.html` - `reverse_proxy /ws* -> 127.0.0.1:7070` diff --git a/scripts/install_test2_caddyfile.sh b/scripts/install_test2_caddyfile.sh index b2d74fa..4bcb6c4 100644 --- a/scripts/install_test2_caddyfile.sh +++ b/scripts/install_test2_caddyfile.sh @@ -2,7 +2,7 @@ set -euo pipefail TARGET_HOST="${TARGET_HOST:-player@193.8.215.70}" -TARGET_DOMAIN="${TARGET_DOMAIN:-t.shineup.me}" +TARGET_DOMAIN="${TARGET_DOMAIN:-server2.shineup.me}" REMOTE_UI_DIR="${REMOTE_UI_DIR:-/home/player/SHiNE/shine-ui}" REMOTE_CADDYFILE="${REMOTE_CADDYFILE:-/etc/caddy/Caddyfile}" diff --git a/shine-UI/js/pages/entry-settings-view.js b/shine-UI/js/pages/entry-settings-view.js index df9148e..80014e1 100644 --- a/shine-UI/js/pages/entry-settings-view.js +++ b/shine-UI/js/pages/entry-settings-view.js @@ -103,7 +103,9 @@ export function render({ navigate }) { draft.shineServer = resolved.wsUrl; applyStatus(resolved.status, resolved.httpBase); } else { - const next = await checkServerAvailabilityByKey(field.key, input.value); + const next = await checkServerAvailabilityByKey(field.key, input.value, { + solanaEndpoint: draft.solanaServer, + }); applyStatus(next); } } finally { @@ -171,16 +173,6 @@ export function render({ navigate }) { actions.append(serverUiButton, cancelButton, saveButton); - const help = document.createElement('button'); - help.className = 'help-fab'; - help.type = 'button'; - help.textContent = '?'; - help.addEventListener('click', () => { - window.alert( - 'Текст для разработчиков: для SHiNE вводится логин серверного аккаунта. Клиент читает его PDA, берёт server_address, показывает точный https-адрес и проверяет доступность WS-канала автоматически.', - ); - }); - screen.append( renderHeader({ title: 'Настройки входа', @@ -188,7 +180,6 @@ export function render({ navigate }) { }), body, actions, - help, ); screen.cleanup = () => { diff --git a/shine-UI/js/pages/register-view.js b/shine-UI/js/pages/register-view.js index a0b08fc..72dd1fd 100644 --- a/shine-UI/js/pages/register-view.js +++ b/shine-UI/js/pages/register-view.js @@ -163,6 +163,7 @@ export function render({ navigate }) { words: passwordWords, onInput: (index, value) => { passwordWords[index] = value; + passwordInput.value = composePasswordFromWords(passwordWords); passwordWordsLinked = true; syncDraftState(); updateWordsPreview(); @@ -258,11 +259,13 @@ export function render({ navigate }) { let generationRunId = 0; function getCurrentPassword() { - return passwordMode === 'words' ? composePasswordFromWords(passwordWords) : String(passwordInput.value || ''); + return String(passwordInput.value || ''); } function updateWordsPreview() { - const password = getCurrentPassword(); + const password = passwordMode === 'words' + ? composePasswordFromWords(passwordWords) + : String(passwordInput.value || ''); const text = `Итоговая длина пароля: ${password.length} символов.`; wordsPreview.textContent = text; passwordLengthText.textContent = text; @@ -306,8 +309,8 @@ export function render({ navigate }) { function updatePasswordModeVisibility() { const wordsMode = passwordMode === 'words'; wordsSection.style.display = wordsMode ? 'grid' : 'none'; - if (passwordField) passwordField.style.display = wordsMode ? 'none' : 'grid'; - passwordInputRow.style.display = wordsMode ? 'grid' : 'none'; + if (passwordField) passwordField.style.display = 'grid'; + passwordInputRow.style.display = 'grid'; updateWordsPreview(); } @@ -480,11 +483,11 @@ export function render({ navigate }) { wordInputs.forEach((input) => { input.value = ''; }); - passwordInput.value = ''; + } else { + passwordInput.value = composePasswordFromWords(passwordWords); } - } else { + } else if (passwordWordsLinked) { passwordInput.value = composePasswordFromWords(passwordWords); - passwordWordsLinked = true; } passwordMode = nextMode; updatePasswordModeVisibility(); diff --git a/shine-UI/js/pages/server-settings-view.js b/shine-UI/js/pages/server-settings-view.js index 19dffa4..13c17c1 100644 --- a/shine-UI/js/pages/server-settings-view.js +++ b/shine-UI/js/pages/server-settings-view.js @@ -86,7 +86,9 @@ export function render({ navigate }) { draft.shineServer = resolved.wsUrl; applyStatus(resolved.status, resolved.httpBase); } else { - const next = await checkServerAvailabilityByKey(field.key, input.value); + const next = await checkServerAvailabilityByKey(field.key, input.value, { + solanaEndpoint: draft.solanaServer, + }); applyStatus(next); } } finally { diff --git a/shine-UI/js/services/server-health-service.js b/shine-UI/js/services/server-health-service.js index 828850f..98a11dd 100644 --- a/shine-UI/js/services/server-health-service.js +++ b/shine-UI/js/services/server-health-service.js @@ -1,5 +1,5 @@ import { resolveShineServerByServerLogin } from './shine-server-resolver.js'; -import { SOLANA_ENDPOINT_DEFAULT } from '../solana-programs.js'; +import { state } from '../state.js'; function normalizeUrl(value) { return String(value || '').trim(); @@ -121,12 +121,13 @@ export async function resolveAndCheckShineServerLogin(serverLogin, solanaEndpoin }; } -export async function checkServerAvailabilityByKey(key, url) { +export async function checkServerAvailabilityByKey(key, url, options = {}) { + const selectedSolanaEndpoint = normalizeUrl(options?.solanaEndpoint || state.entrySettings.solanaServer); if (key === 'solanaServer') { return (await checkSolanaRpc(url)) ? 'available' : 'unavailable'; } if (key === 'shineServerLogin') { - return (await resolveAndCheckShineServerLogin(url, SOLANA_ENDPOINT_DEFAULT)).status; + return (await resolveAndCheckShineServerLogin(url, selectedSolanaEndpoint)).status; } if (key === 'shineServer') { return (await checkShineWs(url)) ? 'available' : 'unavailable'; diff --git a/shine-UI/js/state.js b/shine-UI/js/state.js index f5e4cb9..9682397 100644 --- a/shine-UI/js/state.js +++ b/shine-UI/js/state.js @@ -95,16 +95,7 @@ const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com/v1'; function normalizeStoredSolanaServer(value) { const raw = String(value || '').trim(); if (!raw) return DEFAULT_SOLANA_SERVER; - const normalized = raw.replace(/\/+$/u, '').toLowerCase(); - if ( - normalized === 'https://api.devnet.solana.com' - || normalized === 'http://api.devnet.solana.com' - || normalized === 'https://api.mainnet-beta.solana.com' - || normalized === 'http://api.mainnet-beta.solana.com' - ) { - return DEFAULT_SOLANA_SERVER; - } - return raw; + return raw.replace(/\/+$/u, ''); } export function normalizeDmChatId(value) { From be321813fa01fb306cf41e7a102c79bc65ab5935243448c25baefd7d7bcb2feb Mon Sep 17 00:00:00 2001 From: AidarKC Date: Thu, 16 Jul 2026 11:54:21 +0400 Subject: [PATCH 2/4] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D1=82=D1=8C=20test?= =?UTF-8?q?.shineup.me=20=D0=B8=D0=B7=20deploy-=D1=81=D1=85=D0=B5=D0=BC?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 4 +- Deploy/PRODUCTION_SERVERS.md | 3 - Deploy/README.md | 8 +- Deploy/TEST_SERVERS.md | 35 +---- SHiNE-server/AGENTS.md | 9 -- ...06-26_1800_корректное_завершение_за_30с.md | 3 +- VERSION.properties | 4 +- build.gradle | 15 -- deploy_shine-server_test.sh | 128 ------------------ deploy_shine-ui_test.sh | 20 --- ...26-07-09_0815_4_test_servers_devnet_vps.md | 2 +- docs/deploy/README.md | 18 +-- .../deploy/servers/93.170.12.154_rapsberry.md | 41 ------ docs/deploy/test-server/README.md | 2 +- scripts/install_test_caddyfile.sh | 76 ----------- 15 files changed, 12 insertions(+), 356 deletions(-) delete mode 100644 deploy_shine-server_test.sh delete mode 100644 deploy_shine-ui_test.sh delete mode 100644 docs/deploy/servers/93.170.12.154_rapsberry.md delete mode 100644 scripts/install_test_caddyfile.sh diff --git a/AGENTS.md b/AGENTS.md index a5040e9..2019fbc 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -86,10 +86,9 @@ - Обычные коммиты делать стандартным `git commit`; переменная `$GITEA_TOKEN` для коммитов не нужна и не используется. ## Deploy -- Все документы и заметки по деплою хранить в папке `Dev_Docs/deploy/`. +- Все документы и заметки по деплою хранить в папке `Deploy/`. - Production-хост SHiNE: `player@shineup.me` (`178.208.64.62`). - Второй production-хост SHiNE: `player@193.8.215.70` (`server2.shineup.me`). -- Резервный test-хост SHiNE: `player@93.170.12.154` (`test.shineup.me`). - Базовый путь на сервере для SHiNE: `/home/player` (проекты SHiNE размещать в `/home/player/SHiNE/...`). - По возможности все справки, комментарии и примечания в конфигах/документах писать на русском языке. - Для операций `git push` при необходимости использовать токен из переменной окружения `$GITEA_TOKEN`. @@ -99,7 +98,6 @@ - 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`. diff --git a/Deploy/PRODUCTION_SERVERS.md b/Deploy/PRODUCTION_SERVERS.md index fa1613f..a3177b5 100644 --- a/Deploy/PRODUCTION_SERVERS.md +++ b/Deploy/PRODUCTION_SERVERS.md @@ -14,8 +14,6 @@ - домен `server2.shineup.me` - IP `193.8.215.70` -Отдельно резервный хост `test.shineup.me` сейчас помечен как временно неработающий. - ## 1. Основной production-хост - SSH: `player@shineup.me` @@ -89,7 +87,6 @@ Deploy: Не production: -- `test.shineup.me` (`93.170.12.154`) — резервный хост, временно не работает - `t1.shineup.me` - `t2.shineup.me` - `t3.shineup.me` diff --git a/Deploy/README.md b/Deploy/README.md index c9730e0..0f730fc 100644 --- a/Deploy/README.md +++ b/Deploy/README.md @@ -4,7 +4,7 @@ Эта папка служит краткой картой окружений: -- [TEST_SERVERS.md](/home/ai/work/SHiNE/SHiNE-server-sha256/Deploy/TEST_SERVERS.md) — тестовые серверы и стенды; +- [TEST_SERVERS.md](/home/ai/work/SHiNE/SHiNE-server-sha256/Deploy/TEST_SERVERS.md) — тестовые стенды; - [PRODUCTION_SERVERS.md](/home/ai/work/SHiNE/SHiNE-server-sha256/Deploy/PRODUCTION_SERVERS.md) — production-контур и связанные публичные публикации. Ниже краткая сводка. @@ -19,11 +19,6 @@ - `player@193.8.215.70` - домен `server2.shineup.me` - IP `193.8.215.70` -- Временно неработающий резервный test: - - `player@93.170.12.154` - - домен `test.shineup.me` - - IP `93.170.12.154` - ## Отдельный quad-devnet стенд На отдельном VPS `178.208.90.249` подняты 4 независимых test/devnet-инстанса: @@ -36,6 +31,5 @@ ## Важно - Production-контура SHiNE сейчас два: `shineup.me` и `server2.shineup.me`. -- `test.shineup.me` сейчас помечен как временно неработающий резервный test-хост. - `t1..t4.shineup.me` — это отдельные тестовые/devnet-контуры, не production. - Любые изменения на `shineup.me` делать только после отдельного подтверждения пользователя. diff --git a/Deploy/TEST_SERVERS.md b/Deploy/TEST_SERVERS.md index cba51a4..eb214bb 100644 --- a/Deploy/TEST_SERVERS.md +++ b/Deploy/TEST_SERVERS.md @@ -1,6 +1,6 @@ # Тестовые серверы SHiNE -Этот файл описывает тестовые контуры, которые сейчас фигурируют в проекте. +Этот файл описывает тестовые стенды, которые сейчас фигурируют в проекте. ## 1. Исторический `test2`, теперь второй production-сервер @@ -36,33 +36,7 @@ Deploy: - задача `deployUITest2` по умолчанию выкладывает UI на `server2.shineup.me`, а не на `t2.shineup.me`; - при описании окружений перечислять его как второй production-сервер. -## 2. Резервный test-сервер, временно неработающий - -- SSH: `player@93.170.12.154` -- Домен: `test.shineup.me` -- IP: `93.170.12.154` -- Назначение: резервный test - -Структура по проектным докам: - -- каталог SHiNE: `/home/player/SHiNE` -- сервер: `/home/player/SHiNE/shine-server/shine-server.jar` -- UI: `/home/player/SHiNE/shine-ui` -- данные: `/home/player/SHiNE/shine-server/data/` -- логи: `/home/player/SHiNE/shine-server/logs/app.log` - -Deploy: - -- `./gradlew deployServerTest` -- `./gradlew deployUITest` - -Примечания: - -- этот хост резервный; -- сейчас помечен как временно неработающий; -- использовать его без отдельной причины не нужно. - -## 3. Отдельный quad-devnet стенд `t1..t4` +## 2. Отдельный quad-devnet стенд `t1..t4` - VPS: `178.208.90.249` - пользователь: `player` @@ -125,13 +99,12 @@ Operational-нюанс: - при одновременных рестартах возможны `HTTP 429` от `api.devnet.solana.com`; - поэтому сервисы `shine-t1..shine-t4` лучше перезапускать по одному, с паузой. -## 4. Что проверять первым делом +## 3. Что проверять первым делом Для любого test-контура полезны такие быстрые проверки: ```bash curl -I https://server2.shineup.me -curl -I https://test.shineup.me curl -I https://t1.shineup.me curl -I https://t2.shineup.me curl -I https://t3.shineup.me @@ -144,7 +117,7 @@ curl -I https://t4.shineup.me sudo systemctl --no-pager --full status caddy shine-t1 shine-t2 shine-t3 shine-t4 ``` -Для основного/резервного test: +Для второго production-контура: ```bash sudo systemctl --no-pager --full status shine-server caddy diff --git a/SHiNE-server/AGENTS.md b/SHiNE-server/AGENTS.md index 9c1f007..9398147 100644 --- a/SHiNE-server/AGENTS.md +++ b/SHiNE-server/AGENTS.md @@ -70,15 +70,6 @@ Production deploy: Любые изменения на `shineup.me` делать только после отдельного явного подтверждения пользователя. -Резервный test-контур: - -``` -./gradlew deployServerTest -./gradlew deployUITest -``` - -`test.shineup.me` считается резервным тестовым сервером и в обычный deploy не включается. - Логи на проде: - `/home/player/SHiNE/shine-server/logs/app.log` - `/home/player/SHiNE/shine-server/logs/call-delivery-events.log` diff --git a/TODO/2026-06-26_1800_корректное_завершение_за_30с.md b/TODO/2026-06-26_1800_корректное_завершение_за_30с.md index 06ca5f9..d6e24e9 100644 --- a/TODO/2026-06-26_1800_корректное_завершение_за_30с.md +++ b/TODO/2026-06-26_1800_корректное_завершение_за_30с.md @@ -35,6 +35,5 @@ ## Какие документы потом обновить -- `Dev_Docs/deploy/`; +- `Deploy/`; - `Dev_Docs/Blockchain/sync-between-servers.md`, если изменится поведение остановки/восстановления. - diff --git a/VERSION.properties b/VERSION.properties index a2f5226..b56a4b0 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.2.321 -server.version=1.2.293 +client.version=1.2.322 +server.version=1.2.294 diff --git a/build.gradle b/build.gradle index a1a8c46..7d9532e 100644 --- a/build.gradle +++ b/build.gradle @@ -238,21 +238,6 @@ tasks.register('deployUITest2') { 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" diff --git a/deploy_shine-server_test.sh b/deploy_shine-server_test.sh deleted file mode 100644 index bcca202..0000000 --- a/deploy_shine-server_test.sh +++ /dev/null @@ -1,128 +0,0 @@ -#!/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'; \ - sudo chown -R player:player '$REMOTE_SERVER_DIR'; \ - touch '$REMOTE_LOGS_DIR/app.log'; \ - 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-ui_test.sh b/deploy_shine-ui_test.sh deleted file mode 100644 index 411cca3..0000000 --- a/deploy_shine-ui_test.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/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}" - -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 "==> Деплой 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/docs/Pending_Features/2026-07-09_0815_4_test_servers_devnet_vps.md b/docs/Pending_Features/2026-07-09_0815_4_test_servers_devnet_vps.md index 917c2b8..623ef4c 100644 --- a/docs/Pending_Features/2026-07-09_0815_4_test_servers_devnet_vps.md +++ b/docs/Pending_Features/2026-07-09_0815_4_test_servers_devnet_vps.md @@ -36,4 +36,4 @@ ## Примечание Подробная схема размещения описана в: -- [Dev_Docs/deploy/test-server/178.208.90.249_quad_devnet.md](/home/ai/work/SHiNE/SHiNE-server-sha256/Dev_Docs/deploy/test-server/178.208.90.249_quad_devnet.md) +- [docs/deploy/test-server/178.208.90.249_quad_devnet.md](/home/ai/work/SHiNE/SHiNE-server-sha256/docs/deploy/test-server/178.208.90.249_quad_devnet.md) diff --git a/docs/deploy/README.md b/docs/deploy/README.md index f2d66a5..0986ae4 100644 --- a/docs/deploy/README.md +++ b/docs/deploy/README.md @@ -23,32 +23,23 @@ - SSH: `player@193.8.215.70` - Домен: `server2.shineup.me` - IP: `193.8.215.70` -- Reserve test (temporarily down): - - SSH: `player@93.170.12.154` - - Домен: `test.shineup.me` - - IP: `93.170.12.154` - ## Локальные команды - 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` ## Отдельные тестовые VPS - Отдельный стенд с 4 devnet-серверами на одном VPS описан в: - - `Dev_Docs/deploy/test-server/README.md` + - `docs/deploy/test-server/README.md` ## Политика подтверждений - `shineup.me` и `server2.shineup.me` считать production-контурами. - Любые изменения на production-контурах, включая deploy сервера, deploy UI, конфиги, перезапуски и миграции, делать только после отдельного явного подтверждения пользователя. -- `test.shineup.me` считать резервным тестовым хостом, который сейчас временно не работает. - ## Second production deploy (`server2.shineup.me`) - Это второй production-сервер SHiNE. @@ -64,13 +55,6 @@ - `deployUI` / `deployUITest2` публикуют UI в `/home/player/SHiNE/shine-ui` на `193.8.215.70`. - Важно: историческое имя `deployUITest2` вводит в заблуждение. По умолчанию эта задача деплоит на `server2.shineup.me`, а не на `t2.shineup.me`. -## Reserve test deploy (`test.shineup.me`) - -- `test.shineup.me` считается резервным тестовым сервером. -- Сейчас он помечен как временно неработающий. -- Его настройки и адрес не менять без отдельной задачи. -- Задачи `deployServerTest` и `deployUITest` считаются резервными и требуют отдельной причины. - ## UI-деплой и Caddy (обязательно) - Целевая директория UI-деплоя: `/home/player/SHiNE/shine-ui`. diff --git a/docs/deploy/servers/93.170.12.154_rapsberry.md b/docs/deploy/servers/93.170.12.154_rapsberry.md deleted file mode 100644 index 370281d..0000000 --- a/docs/deploy/servers/93.170.12.154_rapsberry.md +++ /dev/null @@ -1,41 +0,0 @@ -# Сервер `93.170.12.154` — резервный test (`test.shineup.me`) - -- Пользователь: `player` -- Каталог SHiNE: `/home/player/SHiNE` -- Домен: `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` - -## Сервисы - -- `shine-server.service` (systemd) -- `caddy.service` (systemd) - -## Статус - -- Резервный тестовый сервер для SHiNE. -- Сейчас помечен как временно неработающий. -- Источник данных для тестовой БД: production `shineup.me`. -- Пока не использовать для обычного deploy. -- Основной прод-сервер: `shineup.me` (`185.229.109.118`). - -## Caddy - -- Конфиг: `/etc/caddy/Caddyfile` -- Настройки: - - `no-store/no-cache` заголовки; - - `try_files {path} /index.html` (SPA fallback); - - `reverse_proxy /ws* -> 127.0.0.1:7070`; - - целевой сайт: `test.shineup.me`. - -## Deploy - -- Резервные задачи: - - `./gradlew deployServerTest` - - `./gradlew deployUITest` -- Эти задачи пока не использовать без отдельной причины. diff --git a/docs/deploy/test-server/README.md b/docs/deploy/test-server/README.md index e51e7ee..33f51f3 100644 --- a/docs/deploy/test-server/README.md +++ b/docs/deploy/test-server/README.md @@ -9,4 +9,4 @@ - внешний HTTPS и маршрутизацию `/ws` обслуживает один общий `Caddy` Детальное описание: -- [178.208.90.249_quad_devnet.md](/home/ai/work/SHiNE/SHiNE-server-sha256/Dev_Docs/deploy/test-server/178.208.90.249_quad_devnet.md) +- [178.208.90.249_quad_devnet.md](/home/ai/work/SHiNE/SHiNE-server-sha256/docs/deploy/test-server/178.208.90.249_quad_devnet.md) diff --git a/scripts/install_test_caddyfile.sh b/scripts/install_test_caddyfile.sh deleted file mode 100644 index 9c47d92..0000000 --- a/scripts/install_test_caddyfile.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/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" From 6fc7d75e173139aafa87ff96c620b84924f59ddb5a0807d062077111089a29be Mon Sep 17 00:00:00 2001 From: AidarKC Date: Thu, 16 Jul 2026 12:08:59 +0400 Subject: [PATCH 3/4] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D1=84=D0=B8=D0=BD=D0=B0=D0=BB=20=D1=80=D0=B5=D0=B3?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B8=20?= =?UTF-8?q?=D0=B0=D0=B2=D1=82=D0=BE=D0=B2=D1=85=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VERSION.properties | 4 +- ...-16_1325_fix_login_guard_precheck_payer.md | 20 ++++ ...жественный_финал_регистрации_и_автовход.md | 24 ++++ shine-UI/js/pages/register-view.js | 10 +- .../js/pages/registration-payment-view.js | 113 +++++++++--------- .../js/services/solana-register-service.js | 6 +- 6 files changed, 105 insertions(+), 72 deletions(-) create mode 100644 docs/Pending_Features/2026-07-16_1325_fix_login_guard_precheck_payer.md create mode 100644 docs/Pending_Features/2026-07-16_1415_торжественный_финал_регистрации_и_автовход.md diff --git a/VERSION.properties b/VERSION.properties index b56a4b0..c1bcca4 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.2.322 -server.version=1.2.294 +client.version=1.2.323 +server.version=1.2.295 diff --git a/docs/Pending_Features/2026-07-16_1325_fix_login_guard_precheck_payer.md b/docs/Pending_Features/2026-07-16_1325_fix_login_guard_precheck_payer.md new file mode 100644 index 0000000..7251c7b --- /dev/null +++ b/docs/Pending_Features/2026-07-16_1325_fix_login_guard_precheck_payer.md @@ -0,0 +1,20 @@ +# Исправление payer для Solana login guard предпроверки + +- статус: `pending` + +## Кратко + +В браузерной предпроверке логина через `shine_login_guard` убран несуществующий test payer-аккаунт. +Для `simulateTransaction` теперь используется существующий `program id` самой `shine_login_guard`. + +## Что проверять + +- на странице регистрации в devnet логин длиной от `5` символов больше не показывает предупреждение: + `предпроверка Solana недоступна: ... AccountNotFound`; +- свободный логин показывает обычный статус `Логин свободен ✅`; +- короткий логин всё ещё корректно классифицируется как недоступный для обычной регистрации. + +## Ожидаемый результат + +- `simulateTransaction` для `shine_login_guard` не падает из-за `AccountNotFound`; +- UI показывает результат on-chain предпроверки без ложного warning. diff --git a/docs/Pending_Features/2026-07-16_1415_торжественный_финал_регистрации_и_автовход.md b/docs/Pending_Features/2026-07-16_1415_торжественный_финал_регистрации_и_автовход.md new file mode 100644 index 0000000..ccf2bb5 --- /dev/null +++ b/docs/Pending_Features/2026-07-16_1415_торжественный_финал_регистрации_и_автовход.md @@ -0,0 +1,24 @@ +# Торжественный финал регистрации и фоновый автовход + +- статус: `pending` + +## Кратко + +После успешной регистрации экран завершения сделан более торжественным. +Убран countdown и кнопка ручного запуска автовхода. +Теперь UI ждёт 5 секунд, затем раз в секунду пробует автоматически войти в аккаунт, пока запись не станет доступна на сервере. + +## Что проверять + +- после регистрации появляется экран с текстом `Поздравляем, регистрация завершена`; +- ниже есть пояснение про ожидание обновления записи в блокчейне; +- отображается строка `Или вы можете` и кнопка `Вернуться в главное меню`; +- если ничего не нажимать, через несколько секунд начинается фоновый автовход без мигающего countdown; +- после появления записи пользователь автоматически попадает в свой аккаунт; +- если нажать `Вернуться в главное меню`, автоматические попытки прекращаются и открывается стартовый экран. + +## Ожидаемый результат + +- финальный экран регистрации выглядит спокойнее и понятнее; +- пользователь не видит лишний таймер и ручную кнопку входа; +- автовход происходит сам, когда сервер уже готов принять логин. diff --git a/shine-UI/js/pages/register-view.js b/shine-UI/js/pages/register-view.js index 72dd1fd..062efab 100644 --- a/shine-UI/js/pages/register-view.js +++ b/shine-UI/js/pages/register-view.js @@ -400,7 +400,6 @@ export function render({ navigate }) { if (runId !== loginCheckRunId) return false; const isFree = !check.exists; let className = ''; - let precheckWarning = ''; if (isFree) { if (promoAccepted) { className = 'promo'; @@ -413,7 +412,7 @@ export function render({ navigate }) { className = precheck.className; } catch (precheckError) { className = 'free'; - precheckWarning = formatSolanaErrorDetails(precheckError); + console.warn('Solana login precheck fallback to free', formatSolanaErrorDetails(precheckError)); } } } @@ -425,12 +424,7 @@ export function render({ navigate }) { } else if (className === 'promo') { setStatusMessage('Логин свободен ✅ Временный код принят', 'is-available'); } else if (className === 'free') { - setStatusMessage( - precheckWarning - ? `Логин свободен ✅ (предпроверка Solana недоступна: ${precheckWarning})` - : 'Логин свободен ✅', - 'is-available', - ); + setStatusMessage('Логин свободен ✅', 'is-available'); } else if (className === 'premium') { setStatusMessage('Логин свободен, но это премиум-логин (покупка через DAO) ❌', 'is-unavailable'); } else if (className === 'company') { diff --git a/shine-UI/js/pages/registration-payment-view.js b/shine-UI/js/pages/registration-payment-view.js index 639b753..9cd3f1d 100644 --- a/shine-UI/js/pages/registration-payment-view.js +++ b/shine-UI/js/pages/registration-payment-view.js @@ -24,7 +24,8 @@ import { defaultServerLogin } from '../deploy-config.js'; export const pageMeta = { id: 'registration-payment-view', title: 'Оплата регистрации', showAppChrome: false }; const MIN_REQUIRED_SOL = 0.01; -const SOLANA_SYNC_WAIT_SEC = 12; +const AUTO_LOGIN_INITIAL_DELAY_MS = 5000; +const AUTO_LOGIN_RETRY_MS = 1000; const EMPTY_PASSWORD_WORDS = Array.from({ length: 12 }, () => ''); function parseBalanceSol(value) { @@ -329,82 +330,76 @@ function renderSolanaDoneStage({ navigate, status, keyBundle }) { const card = screen.querySelector('.card.stack'); if (!card) return; - let remainingSec = SOLANA_SYNC_WAIT_SEC; - let timerId = null; - let loginStarted = false; + let initialDelayId = null; + let retryTimerId = null; + let loginInFlight = false; + let loginCompleted = false; - const info = document.createElement('p'); - info.className = 'auth-copy'; - info.textContent = 'Регистрация завершена успешно.'; + const title = document.createElement('h2'); + title.textContent = 'Поздравляем, регистрация завершена'; + title.style.margin = '0'; const hint = document.createElement('p'); - hint.className = 'meta-muted'; - hint.textContent = 'Нужно подождать 10–15 секунд, пока в блокчейне SHiNE обновится ваша запись о регистрации. После этого мы автоматически войдём в ваш аккаунт.'; + hint.className = 'auth-copy'; + hint.textContent = 'Осталось подождать несколько секунд, пока обновится запись в блокчейне. После этого приложение автоматически войдёт в ваш аккаунт.'; - const timer = document.createElement('p'); - timer.className = 'meta-muted'; - timer.textContent = `Готовим автоматический вход: ${remainingSec} сек`; + const progress = document.createElement('p'); + progress.className = 'meta-muted'; + progress.textContent = 'Подготавливаем автоматический вход...'; - const tryLoginBtn = document.createElement('button'); - tryLoginBtn.className = 'primary-btn'; - tryLoginBtn.type = 'button'; - tryLoginBtn.textContent = 'Входим автоматически...'; - tryLoginBtn.disabled = true; + const altHint = document.createElement('p'); + altHint.className = 'meta-muted'; + altHint.textContent = 'Или вы можете'; - const statusHint = document.createElement('p'); - statusHint.className = 'meta-muted'; - statusHint.textContent = 'Ничего нажимать не нужно. Если сервер ответит раньше, войдём сразу.'; + const backBtn = document.createElement('button'); + backBtn.className = 'ghost-btn'; + backBtn.type = 'button'; + backBtn.textContent = 'Вернуться в главное меню'; - const stopTimer = () => { - if (timerId) { - window.clearInterval(timerId); - timerId = null; + const stopAutoLogin = () => { + if (initialDelayId) { + window.clearTimeout(initialDelayId); + initialDelayId = null; + } + if (retryTimerId) { + window.clearInterval(retryTimerId); + retryTimerId = null; } }; - const startAutoLogin = async () => { - if (loginStarted) return; - loginStarted = true; - stopTimer(); + const tryAutoLogin = async () => { + if (loginCompleted || loginInFlight) return; + loginInFlight = true; + progress.textContent = 'Пробуем автоматически войти в аккаунт...'; status.style.display = 'none'; - timer.textContent = 'Пробуем автоматически войти...'; - tryLoginBtn.textContent = 'Входим...'; try { await completeRegistrationLogin({ navigate, keyBundle }); + loginCompleted = true; + stopAutoLogin(); } catch (error) { - loginStarted = false; - status.className = 'status-line is-unavailable'; - status.textContent = toUserMessage(error, 'Пока не удалось автоматически войти. Попробуйте ещё раз через несколько секунд.'); - status.style.display = ''; - timer.textContent = 'Автовход пока не удался.'; - tryLoginBtn.disabled = false; - tryLoginBtn.textContent = 'Попробовать войти сейчас'; + if (!loginCompleted) { + progress.textContent = 'Ждём обновления записи и скоро попробуем снова...'; + console.warn('Auto login after registration is not ready yet', toUserMessage(error, 'auto-login-wait')); + } + } finally { + loginInFlight = false; } }; - const updateTimerUi = () => { - if (remainingSec > 0) { - timer.textContent = `Готовим автоматический вход: ${remainingSec} сек`; - tryLoginBtn.textContent = `Автовход через ${remainingSec} сек`; - tryLoginBtn.disabled = true; - } else { - timer.textContent = 'Запускаем автоматический вход...'; - tryLoginBtn.textContent = 'Входим...'; - tryLoginBtn.disabled = true; - void startAutoLogin(); - } - }; - - tryLoginBtn.addEventListener('click', async () => { - if (loginStarted) return; - await startAutoLogin(); + backBtn.addEventListener('click', () => { + loginCompleted = true; + stopAutoLogin(); + navigate('start-view'); }); card.innerHTML = ''; - card.append(info, hint, statusHint, timer, tryLoginBtn, status); - updateTimerUi(); - timerId = window.setInterval(() => { - remainingSec -= 1; - updateTimerUi(); - }, 1000); + card.append(title, hint, progress, altHint, backBtn, status); + + initialDelayId = window.setTimeout(() => { + if (loginCompleted) return; + void tryAutoLogin(); + retryTimerId = window.setInterval(() => { + void tryAutoLogin(); + }, AUTO_LOGIN_RETRY_MS); + }, AUTO_LOGIN_INITIAL_DELAY_MS); } diff --git a/shine-UI/js/services/solana-register-service.js b/shine-UI/js/services/solana-register-service.js index 3c91fef..f9717a8 100644 --- a/shine-UI/js/services/solana-register-service.js +++ b/shine-UI/js/services/solana-register-service.js @@ -6,7 +6,6 @@ import { import { loadSolanaWeb3 } from '../vendor/solana-web3-loader.js'; const CLASSIFY_LOGIN_INSTRUCTION_TAG = 1; -const PRECHECK_SIM_PAYER = 'SHiJ58FvbJQJnPEUa5mZNVpWd1ym9CkjjPgeHYzUJmh'; const SHINE_USERS_USER_PDA_SEED_PREFIX = 'user_login='; let solanaLibPromise = null; @@ -86,7 +85,6 @@ export async function precheckLoginClassOnSolana({ login, solanaEndpoint }) { const solana = await loadSolanaLib(); const connection = new solana.Connection(String(solanaEndpoint || ''), 'confirmed'); const loginGuardProgram = new solana.PublicKey(SHINE_LOGIN_GUARD_PROGRAM_ID); - const payer = new solana.PublicKey(PRECHECK_SIM_PAYER); const ix = new solana.TransactionInstruction({ programId: loginGuardProgram, keys: [], @@ -94,7 +92,9 @@ export async function precheckLoginClassOnSolana({ login, solanaEndpoint }) { }); const { blockhash } = await connection.getLatestBlockhash('confirmed'); const v0Message = new solana.TransactionMessage({ - payerKey: payer, + // Для simulateTransaction нужен существующий аккаунт payer. + // Используем сам program id, чтобы не зависеть от внешнего тестового адреса. + payerKey: loginGuardProgram, recentBlockhash: blockhash, instructions: [ix], }).compileToV0Message(); From 85133db4832dc0c8ce5f78d53fd407d276bb3f6cbaa8779fe4a3412dd27fe07f Mon Sep 17 00:00:00 2001 From: AidarKC Date: Thu, 16 Jul 2026 12:15:22 +0400 Subject: [PATCH 4/4] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D1=82=D1=8C?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20pending-=D1=84=D0=B8=D1=87=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VERSION.properties | 4 ++-- ...-15_2115_регистрация_глаз_логин_12_слов.md | 15 ------------ ...915_исправление_регистрации_и_деплой_t2.md | 13 ---------- ...935_rpc_проверки_через_текущий_endpoint.md | 12 ---------- ...lana_endpoint_normalize_and_remove_help.md | 12 ---------- ..._1035_deploy_ui_solana_cluster_endpoint.md | 12 ---------- ...7-16_1105_server2_and_t1_t3_t4_wrappers.md | 12 ---------- ...26-07-16_1125_rename_server2_ui_wrapper.md | 11 --------- ...-16_1325_fix_login_guard_precheck_payer.md | 20 ---------------- ...жественный_финал_регистрации_и_автовход.md | 24 ------------------- 10 files changed, 2 insertions(+), 133 deletions(-) delete mode 100644 docs/Pending_Features/2026-07-15_2115_регистрация_глаз_логин_12_слов.md delete mode 100644 docs/Pending_Features/2026-07-16_0915_исправление_регистрации_и_деплой_t2.md delete mode 100644 docs/Pending_Features/2026-07-16_0935_rpc_проверки_через_текущий_endpoint.md delete mode 100644 docs/Pending_Features/2026-07-16_1010_fix_solana_endpoint_normalize_and_remove_help.md delete mode 100644 docs/Pending_Features/2026-07-16_1035_deploy_ui_solana_cluster_endpoint.md delete mode 100644 docs/Pending_Features/2026-07-16_1105_server2_and_t1_t3_t4_wrappers.md delete mode 100644 docs/Pending_Features/2026-07-16_1125_rename_server2_ui_wrapper.md delete mode 100644 docs/Pending_Features/2026-07-16_1325_fix_login_guard_precheck_payer.md delete mode 100644 docs/Pending_Features/2026-07-16_1415_торжественный_финал_регистрации_и_автовход.md diff --git a/VERSION.properties b/VERSION.properties index c1bcca4..36360fb 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.2.323 -server.version=1.2.295 +client.version=1.2.324 +server.version=1.2.296 diff --git a/docs/Pending_Features/2026-07-15_2115_регистрация_глаз_логин_12_слов.md b/docs/Pending_Features/2026-07-15_2115_регистрация_глаз_логин_12_слов.md deleted file mode 100644 index ed586be..0000000 --- a/docs/Pending_Features/2026-07-15_2115_регистрация_глаз_логин_12_слов.md +++ /dev/null @@ -1,15 +0,0 @@ -# Регистрация: глаз у пароля, автопроверка логина и сохранение связки с 12 словами - -- краткое описание: - На экране регистрации добавлены кнопка-глаз у поля пароля, автопроверка логина с задержкой около 1.5 секунды и сохранение связки между обычным полем пароля и режимом `12 слов`, пока пользователь вручную не изменит пароль. -- что проверять: - Открыть экран регистрации и убедиться, что справа от поля пароля есть квадратная кнопка-глаз, которая переключает скрытый и открытый показ пароля. - Включить режим `Представить пароль в виде 12 слов`, заполнить несколько или все слова, затем выключить режим и проверить, что в поле пароля появился склеенный пароль. - Снова включить режим `12 слов` без ручного редактирования пароля и проверить, что ранее введённые слова восстановились. - После этого вручную изменить пароль в обычном поле и снова включить режим `12 слов` — набор слов должен быть очищен. - Ввести логин и перестать печатать примерно на 1.5 секунды — под полем логина должен автоматически появиться актуальный статус доступности. - Проверить, что кнопка `Проверить логин` находится ниже статуса, а текст про частые вопросы снизу страницы отсутствует. -- ожидаемый результат: - Регистрация ведёт себя предсказуемо: пароль можно показать или скрыть, слова не теряются при простом скрытии режима `12 слов`, а статус логина обновляется автоматически и вручную. -- статус: - pending diff --git a/docs/Pending_Features/2026-07-16_0915_исправление_регистрации_и_деплой_t2.md b/docs/Pending_Features/2026-07-16_0915_исправление_регистрации_и_деплой_t2.md deleted file mode 100644 index 0219daf..0000000 --- a/docs/Pending_Features/2026-07-16_0915_исправление_регистрации_и_деплой_t2.md +++ /dev/null @@ -1,13 +0,0 @@ -# Исправление экрана регистрации и отдельный UI-деплой на `t2.shineup.me` - -- краткое описание: - Исправлен экран регистрации после регрессии: обычное поле пароля, кнопка-глаз и кнопка проверки логина снова должны быть видимы одновременно с режимом `12 слов`. Отдельно UI выложен на `t2.shineup.me` безопасным способом без использования исторического `deployUITest2`. -- что проверять: - Открыть экран регистрации и убедиться, что видны поле логина, статус под ним, кнопка `Проверить логин`, обычное поле пароля и квадратная кнопка-глаз. - Включить режим `12 слов` и убедиться, что блок слов появляется, но обычное поле пароля не исчезает. - Ввести слова и проверить, что длинный составной пароль сразу виден в обычном поле пароля. - Проверить, что `https://t2.shineup.me` отдаёт обновлённый UI с этой правкой. -- ожидаемый результат: - Экран регистрации снова полностью рабочий и на `t2.shineup.me` доступна именно исправленная версия UI. -- статус: - pending diff --git a/docs/Pending_Features/2026-07-16_0935_rpc_проверки_через_текущий_endpoint.md b/docs/Pending_Features/2026-07-16_0935_rpc_проверки_через_текущий_endpoint.md deleted file mode 100644 index 78948fe..0000000 --- a/docs/Pending_Features/2026-07-16_0935_rpc_проверки_через_текущий_endpoint.md +++ /dev/null @@ -1,12 +0,0 @@ -# Проверки серверных настроек через текущий выбранный Solana RPC - -- краткое описание: - Убрано использование `SOLANA_ENDPOINT_DEFAULT` в проверках логина сервера. Теперь проверки должны идти через текущий выбранный пользователем Solana endpoint из настроек. -- что проверять: - Открыть экран настроек входа или серверных настроек. - Поменять `Адрес Solana сервера` на другой endpoint и проверить логин сервера кнопкой `Проверить`. - Убедиться, что результат проверки соответствует именно выбранному RPC, а не значению по умолчанию. -- ожидаемый результат: - Все проверки логина сервера используют текущий выбранный Solana endpoint и не подмешивают дефолтный RPC. -- статус: - pending diff --git a/docs/Pending_Features/2026-07-16_1010_fix_solana_endpoint_normalize_and_remove_help.md b/docs/Pending_Features/2026-07-16_1010_fix_solana_endpoint_normalize_and_remove_help.md deleted file mode 100644 index 36bdd56..0000000 --- a/docs/Pending_Features/2026-07-16_1010_fix_solana_endpoint_normalize_and_remove_help.md +++ /dev/null @@ -1,12 +0,0 @@ -# Исправление нормализации Solana endpoint и удаление старой кнопки справки - -- краткое описание: - Убрана скрытая подмена выбранного Solana endpoint на дефолтный при сохранении настроек входа. Со страницы настроек входа удалена старая маленькая кнопка `?` внизу. -- что проверять: - Открыть настройки входа, ввести свой Solana RPC и сохранить. - Убедиться, что после сохранения endpoint остаётся ровно тем, который был введён, без незаметной подмены. - Проверить, что внизу страницы больше нет маленькой кнопки `?`. -- ожидаемый результат: - Клиент использует именно выбранный пользователем Solana endpoint, а экран настроек входа не содержит старой кнопки справки. -- статус: - pending diff --git a/docs/Pending_Features/2026-07-16_1035_deploy_ui_solana_cluster_endpoint.md b/docs/Pending_Features/2026-07-16_1035_deploy_ui_solana_cluster_endpoint.md deleted file mode 100644 index c067eac..0000000 --- a/docs/Pending_Features/2026-07-16_1035_deploy_ui_solana_cluster_endpoint.md +++ /dev/null @@ -1,12 +0,0 @@ -# UI deploy: подстановка Solana cluster и endpoint - -- краткое описание: - В UI deploy-скрипт добавлена подстановка `defaultSolanaCluster` и `defaultSolanaEndpoint` в `deploy-config.js`. Для production на уровне скриптов используется значение `mainnet`, которое внутри общего deploy-скрипта нормализуется в `mainnet-beta` для совместимости с кодом. Для `t2` выставляется devnet/api.devnet.solana.com. -- что проверять: - Выполнить production UI deploy и проверить, что в опубликованном `js/deploy-config.js` стоят `mainnet-beta` и `https://solana-rpc.publicnode.com`. - Выполнить `t2` UI deploy и проверить, что в опубликованном `js/deploy-config.js` стоят `devnet` и `https://api.devnet.solana.com`. - Убедиться, что логин и адрес сервера при этом тоже подставляются корректно. -- ожидаемый результат: - После деплоя каждый UI-инстанс получает свои правильные Solana defaults без ручной правки файла на сервере. -- статус: - pending diff --git a/docs/Pending_Features/2026-07-16_1105_server2_and_t1_t3_t4_wrappers.md b/docs/Pending_Features/2026-07-16_1105_server2_and_t1_t3_t4_wrappers.md deleted file mode 100644 index 5b826e6..0000000 --- a/docs/Pending_Features/2026-07-16_1105_server2_and_t1_t3_t4_wrappers.md +++ /dev/null @@ -1,12 +0,0 @@ -# Перенос второго production на `server2.shineup.me` и добавление UI-обёрток `t1/t3/t4` - -- краткое описание: - Второй production-контур переименован в документации и UI deploy-скриптах на `server2.shineup.me` с логином `server2shineupme`. Добавлены отдельные UI-обёртки для `t1`, `t3` и `t4`. -- что проверять: - Выполнить `./gradlew deployUI` и убедиться, что deploy идёт на `server2.shineup.me`. - Проверить новые скрипты `deploy_shine-ui_t1.sh`, `deploy_shine-ui_t3.sh`, `deploy_shine-ui_t4.sh`. - Убедиться, что в проектной документации больше нет упоминаний старого домена второго production-контура. -- ожидаемый результат: - Второй production везде обозначен как `server2.shineup.me`, а все четыре devnet UI-инстанса имеют отдельные короткие deploy-обёртки. -- статус: - pending diff --git a/docs/Pending_Features/2026-07-16_1125_rename_server2_ui_wrapper.md b/docs/Pending_Features/2026-07-16_1125_rename_server2_ui_wrapper.md deleted file mode 100644 index 3156a4d..0000000 --- a/docs/Pending_Features/2026-07-16_1125_rename_server2_ui_wrapper.md +++ /dev/null @@ -1,11 +0,0 @@ -# Переименование UI-обёртки второго production в единый формат - -- краткое описание: - UI-обёртка второго production переименована в `deploy_shine-ui_production_server2shineupme.sh`, чтобы имя было единообразным с production-обёрткой основного домена. -- что проверять: - Убедиться, что `./gradlew deployUI` использует новый файл-обёртку. - Проверить, что старое имя `deploy_shine-ui_server2shineupme.sh` больше нигде не используется. -- ожидаемый результат: - Для второго production используется обёртка с именем `deploy_shine-ui_production_server2shineupme.sh`. -- статус: - pending diff --git a/docs/Pending_Features/2026-07-16_1325_fix_login_guard_precheck_payer.md b/docs/Pending_Features/2026-07-16_1325_fix_login_guard_precheck_payer.md deleted file mode 100644 index 7251c7b..0000000 --- a/docs/Pending_Features/2026-07-16_1325_fix_login_guard_precheck_payer.md +++ /dev/null @@ -1,20 +0,0 @@ -# Исправление payer для Solana login guard предпроверки - -- статус: `pending` - -## Кратко - -В браузерной предпроверке логина через `shine_login_guard` убран несуществующий test payer-аккаунт. -Для `simulateTransaction` теперь используется существующий `program id` самой `shine_login_guard`. - -## Что проверять - -- на странице регистрации в devnet логин длиной от `5` символов больше не показывает предупреждение: - `предпроверка Solana недоступна: ... AccountNotFound`; -- свободный логин показывает обычный статус `Логин свободен ✅`; -- короткий логин всё ещё корректно классифицируется как недоступный для обычной регистрации. - -## Ожидаемый результат - -- `simulateTransaction` для `shine_login_guard` не падает из-за `AccountNotFound`; -- UI показывает результат on-chain предпроверки без ложного warning. diff --git a/docs/Pending_Features/2026-07-16_1415_торжественный_финал_регистрации_и_автовход.md b/docs/Pending_Features/2026-07-16_1415_торжественный_финал_регистрации_и_автовход.md deleted file mode 100644 index ccf2bb5..0000000 --- a/docs/Pending_Features/2026-07-16_1415_торжественный_финал_регистрации_и_автовход.md +++ /dev/null @@ -1,24 +0,0 @@ -# Торжественный финал регистрации и фоновый автовход - -- статус: `pending` - -## Кратко - -После успешной регистрации экран завершения сделан более торжественным. -Убран countdown и кнопка ручного запуска автовхода. -Теперь UI ждёт 5 секунд, затем раз в секунду пробует автоматически войти в аккаунт, пока запись не станет доступна на сервере. - -## Что проверять - -- после регистрации появляется экран с текстом `Поздравляем, регистрация завершена`; -- ниже есть пояснение про ожидание обновления записи в блокчейне; -- отображается строка `Или вы можете` и кнопка `Вернуться в главное меню`; -- если ничего не нажимать, через несколько секунд начинается фоновый автовход без мигающего countdown; -- после появления записи пользователь автоматически попадает в свой аккаунт; -- если нажать `Вернуться в главное меню`, автоматические попытки прекращаются и открывается стартовый экран. - -## Ожидаемый результат - -- финальный экран регистрации выглядит спокойнее и понятнее; -- пользователь не видит лишний таймер и ручную кнопку входа; -- автовход происходит сам, когда сервер уже готов принять логин.