From 0fb1147eb7cbc0827431e743a6375945637ddb76f69e578627768923bb7cd2bd Mon Sep 17 00:00:00 2001 From: AidarKC Date: Fri, 10 Jul 2026 11:57:33 +0400 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D1=84=D0=B8=D0=BA=D1=81=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BD=D0=B0=D0=BA=D0=BE?= =?UTF-8?q?=D0=BF=D0=BB=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=B8=D0=B7=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=20deploy=20?= =?UTF-8?q?=D0=B8=20devnet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Deploy/PRODUCTION_SERVERS.md | 72 ++++++++ Deploy/README.md | 40 ++++ Deploy/TEST_SERVERS.md | 149 +++++++++++++++ ...1225_devnet_topup_izolirovan_ot_mainnet.md | 14 -- ...26-07-09_0815_4_test_servers_devnet_vps.md | 39 ++++ ...-07-09_1415_turn_только_один_живой_узел.md | 16 ++ Dev_Docs/deploy/README.md | 5 + .../test-server/178.208.90.249_quad_devnet.md | 173 ++++++++++++++++++ Dev_Docs/deploy/test-server/README.md | 12 ++ .../utils/config/SolanaProgramsConfig.java | 19 +- .../src/main/resources/application.properties | 12 +- VERSION.properties | 4 +- shine-UI/js/deploy-config.js | 2 + shine-UI/js/solana-programs.js | 8 +- .../server-ui/js/create-server-pda-page.js | 3 +- shine-UI/server-ui/js/read-pda-page.js | 5 + .../server-ui/js/update-server-pda-page.js | 3 +- ...-08_15-10-08_transfer_dao_authorities.json | 21 +++ 18 files changed, 564 insertions(+), 33 deletions(-) create mode 100644 Deploy/PRODUCTION_SERVERS.md create mode 100644 Deploy/README.md create mode 100644 Deploy/TEST_SERVERS.md delete mode 100644 Dev_Docs/Pending_Features/2026-07-08_1225_devnet_topup_izolirovan_ot_mainnet.md create mode 100644 Dev_Docs/Pending_Features/2026-07-09_0815_4_test_servers_devnet_vps.md create mode 100644 Dev_Docs/Pending_Features/2026-07-09_1415_turn_только_один_живой_узел.md create mode 100644 Dev_Docs/deploy/test-server/178.208.90.249_quad_devnet.md create mode 100644 Dev_Docs/deploy/test-server/README.md create mode 100644 shine-solana/shine/create-SHiNE-DAO/local/runs/2026-07-08_15-10-08_transfer_dao_authorities.json diff --git a/Deploy/PRODUCTION_SERVERS.md b/Deploy/PRODUCTION_SERVERS.md new file mode 100644 index 0000000..77f98af --- /dev/null +++ b/Deploy/PRODUCTION_SERVERS.md @@ -0,0 +1,72 @@ +# Production-серверы SHiNE + +## Короткий ответ + +По текущим данным репозитория у SHiNE формально описан **один production-хост**: + +- `player@shineup.me` +- домен `shineup.me` +- IP `185.229.109.118` + +Второй отдельный production-хост в текущих проектных инструкциях **не описан**. +Остальные известные серверы в репозитории относятся к test-контурам. + +## 1. Основной production-хост + +- SSH: `player@shineup.me` +- домен: `shineup.me` +- IP: `185.229.109.118` +- пользователь: `player` +- базовый путь: `/home/player` + +Основные каталоги: + +- проект SHiNE: `/home/player/SHiNE` +- серверный jar: `/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` + +Сервисы: + +- `shine-server.service` +- `caddy.service` + +Caddy: + +- активный конфиг: `/home/player/SHiNE/caddy/Caddyfile` +- UI root: `/home/player/SHiNE/shine-ui` +- `/ws` проксируется на `127.0.0.1:7070` + +Deploy: + +- `./gradlew deployServerProduction` +- `./gradlew deployUIProduction` + +Правило: + +- любые изменения на `shineup.me` делать только после отдельного подтверждения пользователя. + +## 2. Связанные публичные production-публикации на том же хосте + +На этом же production-хосте есть отдельная публикация для `shine_payments`: + +- каталог: `/home/player/sites/test-solana-tickets.shineup.me` +- домены: + - `https://test-solana-tickets.shineup.me` + - `https://test-solana-tickets.shiningpeople.ru` + +Это не второй production-хост SHiNE, а отдельный сайт на том же сервере. + +## 3. Какие серверы не считать production + +Не production: + +- `t.shineup.me` (`193.8.215.70`) — основной test +- `test.shineup.me` (`93.170.12.154`) — резервный test +- `t1.shineup.me` +- `t2.shineup.me` +- `t3.shineup.me` +- `t4.shineup.me` + +Если позже появится второй отдельный production-хост, его нужно явно добавить в этот файл. diff --git a/Deploy/README.md b/Deploy/README.md new file mode 100644 index 0000000..a7d0b34 --- /dev/null +++ b/Deploy/README.md @@ -0,0 +1,40 @@ +# Deploy + +Подробности о том, где что задеплоено в SHiNE, нужно искать в папке `Deploy/`. + +Эта папка служит краткой картой окружений: + +- [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-контур и связанные публичные публикации. + +Ниже краткая сводка. + +## Основные публичные контуры + +- Production SHiNE: + - `player@shineup.me` + - домен `shineup.me` + - IP `185.229.109.118` +- Main test: + - `player@193.8.215.70` + - домен `t.shineup.me` + - IP `193.8.215.70` +- Reserve test: + - `player@93.170.12.154` + - домен `test.shineup.me` + - IP `93.170.12.154` + +## Отдельный quad-devnet стенд + +На отдельном VPS `178.208.90.249` подняты 4 независимых test/devnet-инстанса: + +- `t1.shineup.me` +- `t2.shineup.me` +- `t3.shineup.me` +- `t4.shineup.me` + +## Важно + +- Формально production-хост SHiNE в текущем репозитории описан один: `shineup.me`. +- `t.shineup.me`, `test.shineup.me`, `t1..t4.shineup.me` — это тестовые контуры, не production. +- Любые изменения на `shineup.me` делать только после отдельного подтверждения пользователя. diff --git a/Deploy/TEST_SERVERS.md b/Deploy/TEST_SERVERS.md new file mode 100644 index 0000000..5b32d70 --- /dev/null +++ b/Deploy/TEST_SERVERS.md @@ -0,0 +1,149 @@ +# Тестовые серверы SHiNE + +Этот файл описывает тестовые контуры, которые сейчас фигурируют в проекте. + +## 1. Основной test-сервер + +- SSH: `player@193.8.215.70` +- Домен: `t.shineup.me` +- IP: `193.8.215.70` +- Назначение: основной test для обычных `deployServer` / `deployUI` + +Структура: + +- каталог 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` + +Сервисы: + +- `shine-server.service` +- `caddy.service` + +Deploy: + +- `./gradlew deployServer` +- `./gradlew deployServerTest2` +- `./gradlew deployUI` +- `./gradlew deployUITest2` + +Примечания: + +- это основной тестовый контур; +- default deploy по проекту должен идти сюда; +- тестовая БД синхронизируется от production `shineup.me`. + +## 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` + +- VPS: `178.208.90.249` +- пользователь: `player` +- назначение: 4 независимых SHiNE-инстанса на Solana `devnet` + +Домены и логины: + +- `server_t1` -> `https://t1.shineup.me` +- `server_t2` -> `https://t2.shineup.me` +- `server_t3` -> `https://t3.shineup.me` +- `server_t4` -> `https://t4.shineup.me` + +Каталоги: + +- `/home/player/t1/server` +- `/home/player/t1/UI` +- `/home/player/t2/server` +- `/home/player/t2/UI` +- `/home/player/t3/server` +- `/home/player/t3/UI` +- `/home/player/t4/server` +- `/home/player/t4/UI` + +Подробная памятка на самом VPS: + +- `/home/player/Agents.md` + +Порты и systemd: + +- `t1` -> `7101` -> `shine-t1.service` +- `t2` -> `7102` -> `shine-t2.service` +- `t3` -> `7103` -> `shine-t3.service` +- `t4` -> `7104` -> `shine-t4.service` + +Что важно по конфигу каждого инстанса: + +- отдельный `/home/player/tX/server/application.properties` +- `server.port=710X` +- `server.SHiNE.login=server_tX` +- `db.path=data/shine.sqlite` +- `solana.cluster=devnet` +- `solana.rpcUrl=https://api.devnet.solana.com` +- `server.ui.indexPath=/home/player/tX/UI/index.html` +- `server.info.url=https://tX.shineup.me` + +UI каждого инстанса: + +- живёт в отдельной копии `shine-UI`; +- использует свой `js/deploy-config.js`; +- по умолчанию смотрит именно на свой `tX.shineup.me`. + +Caddy на стенде: + +- конфиг: `/etc/caddy/Caddyfile` +- статика: `/home/player/tX/UI` +- `/ws` проксируется на `127.0.0.1:710X` + +Operational-нюанс: + +- при одновременных рестартах возможны `HTTP 429` от `api.devnet.solana.com`; +- поэтому сервисы `shine-t1..shine-t4` лучше перезапускать по одному, с паузой. + +## 4. Что проверять первым делом + +Для любого test-контура полезны такие быстрые проверки: + +```bash +curl -I https://t.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 +curl -I https://t4.shineup.me +``` + +Для quad-devnet VPS: + +```bash +sudo systemctl --no-pager --full status caddy shine-t1 shine-t2 shine-t3 shine-t4 +``` + +Для основного/резервного test: + +```bash +sudo systemctl --no-pager --full status shine-server caddy +``` diff --git a/Dev_Docs/Pending_Features/2026-07-08_1225_devnet_topup_izolirovan_ot_mainnet.md b/Dev_Docs/Pending_Features/2026-07-08_1225_devnet_topup_izolirovan_ot_mainnet.md deleted file mode 100644 index 06cb8e2..0000000 --- a/Dev_Docs/Pending_Features/2026-07-08_1225_devnet_topup_izolirovan_ot_mainnet.md +++ /dev/null @@ -1,14 +0,0 @@ -# Изоляция страницы DEVNET пополнения от mainnet - -- краткое описание фичи: - Страница `shine-UI/js/pages/devnet-topup-view.js` переведена на полностью автономную работу только с `https://api.devnet.solana.com`. Проверка баланса и перевод SOL на этой странице больше не используют общие Solana-настройки UI. -- что именно проверять: - 1. Открыть страницу `devnet-topup-view` с параметром `wallet`. - 2. Убедиться, что на странице отображается сеть `DEVNET`. - 3. Проверить, что балансы отправителя и получателя читаются из devnet. - 4. Выполнить перевод и убедиться, что транзакция проходит именно в devnet. - 5. Убедиться, что изменение глобального Solana endpoint в других экранах UI не влияет на эту страницу. -- ожидаемый результат: - Страница всегда показывает devnet-балансы и отправляет перевод только через devnet, независимо от глобального RPC в приложении. -- статус: - pending diff --git a/Dev_Docs/Pending_Features/2026-07-09_0815_4_test_servers_devnet_vps.md b/Dev_Docs/Pending_Features/2026-07-09_0815_4_test_servers_devnet_vps.md new file mode 100644 index 0000000..917c2b8 --- /dev/null +++ b/Dev_Docs/Pending_Features/2026-07-09_0815_4_test_servers_devnet_vps.md @@ -0,0 +1,39 @@ +# 4 тестовых SHiNE-сервера на одном VPS (`178.208.90.249`) + +- статус: `pending` + +## Кратко + +Поднят отдельный тестовый стенд: +- `t1.shineup.me` +- `t2.shineup.me` +- `t3.shineup.me` +- `t4.shineup.me` + +Каждый домен ведёт на свой SHiNE-инстанс под пользователем `player`, все инстансы работают через Solana `devnet`. + +## Что проверять + +- UI каждого домена открывается без ошибок: + - `https://t1.shineup.me` + - `https://t2.shineup.me` + - `https://t3.shineup.me` + - `https://t4.shineup.me` +- регистрация/логин клиента может работать через каждый из этих серверов +- WebSocket-подключение реально идёт на свой инстанс, а не в соседний +- чтение PDA и server-ui формы по умолчанию используют `devnet` +- межсерверный sync после ручных тестов действительно использует `access_servers/sync_servers` +- не происходит путаницы данных между `t1/t2/t3/t4` + +## Ожидаемый результат + +- каждый домен работает независимо +- у каждого инстанса своя БД и свои локальные данные +- `Caddy` корректно проксирует `/ws` на `7101..7104` +- серверы не падают после старта +- если devnet RPC временно даёт `429`, последовательный рестарт по одному инстансу позволяет подтянуть `sync_servers` + +## Примечание + +Подробная схема размещения описана в: +- [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) diff --git a/Dev_Docs/Pending_Features/2026-07-09_1415_turn_только_один_живой_узел.md b/Dev_Docs/Pending_Features/2026-07-09_1415_turn_только_один_живой_узел.md new file mode 100644 index 0000000..e5eec33 --- /dev/null +++ b/Dev_Docs/Pending_Features/2026-07-09_1415_turn_только_один_живой_узел.md @@ -0,0 +1,16 @@ +Lf dc` hfm# TURN: только один живой узел для звонков + +- краткое описание: + - в серверном конфиге оставлен только один TURN-узел `185.229.109.118:3478` для ICE-конфига звонков; + - мёртвый узел `93.170.12.154:3478` убран из локальной конфигурации и test-деплоя `t2`. +- что проверять: + - открыть два клиента на `t2.shineup.me`; + - начать аудиозвонок между ними; + - убедиться, что `GetCallIceConfig` отдаёт только TURN `185.229.109.118`; + - убедиться, что звонок выходит из стадии `connecting` и появляется `call_connected` либо как минимум `relay`-кандидаты в клиентской диагностике. +- ожидаемый результат: + - клиентам больше не предлагается `93.170.12.154`; + - звонок проходит стабильнее, чем до изменения; + - в серверных логах нет новых `incoming_failed/outgoing_failed` только из-за нерабочего TURN. +- статус: + - pending diff --git a/Dev_Docs/deploy/README.md b/Dev_Docs/deploy/README.md index d87045f..4ee7859 100644 --- a/Dev_Docs/deploy/README.md +++ b/Dev_Docs/deploy/README.md @@ -38,6 +38,11 @@ - Reserve test UI deploy: `./gradlew deployUITest` - Локальный запуск: `./gradlew startLocal` +## Отдельные тестовые VPS + +- Отдельный стенд с 4 devnet-серверами на одном VPS описан в: + - `Dev_Docs/deploy/test-server/README.md` + ## Политика подтверждений - `shineup.me` — production. diff --git a/Dev_Docs/deploy/test-server/178.208.90.249_quad_devnet.md b/Dev_Docs/deploy/test-server/178.208.90.249_quad_devnet.md new file mode 100644 index 0000000..adda81e --- /dev/null +++ b/Dev_Docs/deploy/test-server/178.208.90.249_quad_devnet.md @@ -0,0 +1,173 @@ +# VPS `178.208.90.249` (`player`) — 4 тестовых SHiNE-сервера на devnet + +## Назначение + +Этот VPS используется как отдельный тестовый стенд для одновременного запуска 4 SHiNE-серверов: +- `server_t1` → `https://t1.shineup.me` +- `server_t2` → `https://t2.shineup.me` +- `server_t3` → `https://t3.shineup.me` +- `server_t4` → `https://t4.shineup.me` + +Все 4 инстанса работают через Solana `devnet`. + +## Каталоги + +Структура в домашней папке пользователя `player`: +- `/home/player/t1/server` +- `/home/player/t1/UI` +- `/home/player/t2/server` +- `/home/player/t2/UI` +- `/home/player/t3/server` +- `/home/player/t3/UI` +- `/home/player/t4/server` +- `/home/player/t4/UI` + +Дополнительно: +- подробная памятка на самом сервере: `/home/player/Agents.md` + +## Порты и systemd + +Соответствие инстансов: +- `t1` → localhost `7101` → `shine-t1.service` +- `t2` → localhost `7102` → `shine-t2.service` +- `t3` → localhost `7103` → `shine-t3.service` +- `t4` → localhost `7104` → `shine-t4.service` + +Каждый unit запускает один и тот же jar: +- `/home/player/tX/server/shine-server.jar` + +Рабочая директория каждого unit: +- `/home/player/tX/server` + +Это важно, потому что сервер читает внешний `application.properties` именно из текущей рабочей директории. + +## Конфиги сервера + +У каждого инстанса свой файл: +- `/home/player/tX/server/application.properties` + +Ключевые параметры в нём: +- `server.port=710X` +- `server.SHiNE.login=server_tX` +- `db.path=data/shine.sqlite` +- `solana.cluster=devnet` +- `solana.rpcUrl=https://api.devnet.solana.com` +- `server.ui.indexPath=/home/player/tX/UI/index.html` +- `server.info.url=https://tX.shineup.me` +- `server.info.origin=devnet` + +Важно: +- Program ID SHiNE одинаковые для mainnet и devnet. +- Поэтому для перевода инстанса на devnet достаточно правильных `solana.cluster` и `solana.rpcUrl`. + +## Конфиги UI + +У каждого домена лежит отдельная копия `shine-UI`. + +В каждой копии меняется `js/deploy-config.js`: +- `defaultServerLogin=server_tX` +- `defaultServerAddress=tX.shineup.me` +- `defaultSolanaCluster=devnet` +- `defaultSolanaEndpoint=https://api.devnet.solana.com` + +За счёт этого: +- UI по умолчанию открывает именно свой сервер +- `server-ui` формы по умолчанию используют именно `devnet` + +## Caddy + +Конфиг: +- `/etc/caddy/Caddyfile` + +Логика по каждому сайту одинаковая: +- статические файлы берутся из `/home/player/tX/UI` +- путь `/ws` проксируется на `127.0.0.1:710X` + +Права доступа: +- каталог `/home/player` и `/home/player/tX` должен быть доступен на `+x` для чтения через Caddy +- все каталоги и файлы в `/home/player/tX/UI` должны быть читаемы пользователем `caddy` + +## Что уже проверено + +После настройки было подтверждено: +- `https://t1.shineup.me` отвечает `HTTP 200` +- `https://t2.shineup.me` отвечает `HTTP 200` +- `https://t3.shineup.me` отвечает `HTTP 200` +- `https://t4.shineup.me` отвечает `HTTP 200` +- `Caddy` успешно выпустил сертификаты Let's Encrypt на все 4 домена +- все 4 процесса Java слушают свои порты `7101..7104` +- в логах есть строка `WS сервер запущен на ws://localhost:710X/ws` + +## Важный operational-нюанс + +Официальный `https://api.devnet.solana.com` может отдавать `HTTP 429`, если несколько инстансов одновременно делают bootstrap PDA/sync-серверов на старте. + +На практике это уже проявилось: +- `t3` и `t4` подтянули `sync_servers` сразу +- `t1` и `t2` на первом одновременном старте словили `429` +- после последовательного рестарта `shine-t1` и `shine-t2` они тоже успешно сохранили `sync_servers` + +Если после очередного деплоя какой-то инстанс не подтянул `sync_servers`, сначала делать не массовый рестарт, а по одному: + +```bash +sudo systemctl restart shine-t1 +sleep 8 +sudo systemctl restart shine-t2 +sleep 8 +sudo systemctl restart shine-t3 +sleep 8 +sudo systemctl restart shine-t4 +``` + +## Как обновлять сервер + +1. Локально собрать jar: + +```bash +./gradlew shadowJar +``` + +2. Залить `SHiNE-server/build/libs/shine-server.jar` в каждый нужный каталог: +- `/home/player/t1/server/shine-server.jar` +- `/home/player/t2/server/shine-server.jar` +- `/home/player/t3/server/shine-server.jar` +- `/home/player/t4/server/shine-server.jar` + +3. Если менялся runtime-конфиг, обновить соответствующий `application.properties`. + +4. Перезапускать сервисы лучше по одному, с паузой, чтобы снизить шанс `429` от devnet RPC. + +## Как обновлять UI + +1. Взять свежую локальную папку `shine-UI/`. +2. Для каждой копии подставить свой `deploy-config.js`. +3. Скопировать файлы в `/home/player/tX/UI/`. +4. Проверить права чтения для Caddy. + +## Полезные команды на VPS + +Проверка сервисов: + +```bash +sudo systemctl --no-pager --full status caddy shine-t1 shine-t2 shine-t3 shine-t4 +``` + +Перезапуск одного инстанса: + +```bash +sudo systemctl restart shine-t1 +``` + +Логи одного инстанса: + +```bash +tail -n 200 /home/player/t1/server/logs/app.log +sudo journalctl -u shine-t1 -n 200 --no-pager +``` + +Проверка Caddy: + +```bash +sudo caddy validate --config /etc/caddy/Caddyfile +curl -I https://t1.shineup.me +``` diff --git a/Dev_Docs/deploy/test-server/README.md b/Dev_Docs/deploy/test-server/README.md new file mode 100644 index 0000000..e51e7ee --- /dev/null +++ b/Dev_Docs/deploy/test-server/README.md @@ -0,0 +1,12 @@ +# Тестовый VPS с 4 SHiNE-серверами + +В этой папке описан отдельный тестовый VPS `178.208.90.249`, на котором подняты 4 независимых SHiNE-инстанса под доменами `t1.shineup.me` ... `t4.shineup.me`. + +Текущая основная схема: +- пользователь на VPS: `player` +- все 4 инстанса работают через `devnet` +- каждый инстанс имеет свой каталог `server`, свой каталог `UI`, свой `systemd` unit и свой localhost-порт +- внешний 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) diff --git a/SHiNE-server/shine-server-config/src/main/java/utils/config/SolanaProgramsConfig.java b/SHiNE-server/shine-server-config/src/main/java/utils/config/SolanaProgramsConfig.java index 3901c18..61149af 100644 --- a/SHiNE-server/shine-server-config/src/main/java/utils/config/SolanaProgramsConfig.java +++ b/SHiNE-server/shine-server-config/src/main/java/utils/config/SolanaProgramsConfig.java @@ -1,15 +1,18 @@ package utils.config; /** - * Публичные адреса Solana-программ SHiNE (жёстко зафиксированы для mainnet). - * Секреты на сервере не хранятся. + * Публичные адреса Solana-программ SHiNE. + * Program ID одинаковые для mainnet/devnet, а cluster/RPC должны + * переопределяться через application.properties конкретного инстанса. */ public final class SolanaProgramsConfig { private SolanaProgramsConfig() {} - public static final String SOLANA_CLUSTER = "mainnet-beta"; - public static final String SOLANA_RPC_URL = "https://api.mainnet-beta.solana.com"; + private static final AppConfig CONFIG = AppConfig.getInstance(); + + public static final String SOLANA_CLUSTER = getParam("solana.cluster", "mainnet-beta"); + public static final String SOLANA_RPC_URL = getParam("solana.rpcUrl", "https://api.mainnet-beta.solana.com"); // Программа регистрации пользователей (shine_users), задеплоена в mainnet. public static final String SHINE_USERS_PROGRAM_ID = "SHiNEPr1APdAgNBteUyBXcNovaHctpSjUu8oH2ZJdN6"; @@ -17,4 +20,12 @@ public final class SolanaProgramsConfig { // Отдельно фиксируем адреса связанной инфраструктуры, чтобы UI/сервер ссылались одинаково. public static final String SHINE_LOGIN_GUARD_PROGRAM_ID = "SHiGxGsXGioQYCYhchQ5R7KWoxN5UjFAFsucPf6sfnh"; public static final String SHINE_PAYMENTS_PROGRAM_ID = "SHiPmXbM9Fs9khzRUW3TGKsS2W84aqaXTxs3ZkajW9v"; + + private static String getParam(String key, String defaultValue) { + String value = CONFIG.getParam(key); + if (value == null || value.isBlank()) { + return defaultValue; + } + return value.trim(); + } } diff --git a/SHiNE-server/src/main/resources/application.properties b/SHiNE-server/src/main/resources/application.properties index f258963..36d062e 100644 --- a/SHiNE-server/src/main/resources/application.properties +++ b/SHiNE-server/src/main/resources/application.properties @@ -1,6 +1,8 @@ server.1port=7070 db.path=data/shine.sqlite server.SHiNE.login=shineupme +solana.cluster=mainnet-beta +solana.rpcUrl=https://api.mainnet-beta.solana.com # ------------------------------------------------------------ # Межсерверная синхронизация: как создавать локальную запись пользователя, @@ -56,18 +58,12 @@ call.ice.turn.password= # Каждый блок описывает один TURN-узел. Новые узлы добавляются по индексу. # Приоритет авторизации на узел: sharedSecret -> статические username/password. # ------------------------------------------------------------ -call.ice.turn.servers.1.id=promo-node-93 -call.ice.turn.servers.1.urls=turn:93.170.12.154:3478?transport=udp,turn:93.170.12.154:3478?transport=tcp +call.ice.turn.servers.1.id=shineup-main-185 +call.ice.turn.servers.1.urls=turn:185.229.109.118:3478?transport=udp,turn:185.229.109.118:3478?transport=tcp call.ice.turn.servers.1.sharedSecret=def6d444734d380d2f67a9d345b1debf985eaba0973c343e392c060d97c30106 call.ice.turn.servers.1.username= call.ice.turn.servers.1.password= -call.ice.turn.servers.2.id=shineup-main-185 -call.ice.turn.servers.2.urls=turn:185.229.109.118:3478?transport=udp,turn:185.229.109.118:3478?transport=tcp -call.ice.turn.servers.2.sharedSecret=def6d444734d380d2f67a9d345b1debf985eaba0973c343e392c060d97c30106 -call.ice.turn.servers.2.username= -call.ice.turn.servers.2.password= - # ------------------------------------------------------------ # Временные debug HTTP API для тестирования соединений # true - endpoint'ы /debug/ws/* включены (только при наличии .debug-token) diff --git a/VERSION.properties b/VERSION.properties index 1ee7dcb..9d3ea52 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.2.303 -server.version=1.2.282 +client.version=1.2.304 +server.version=1.2.283 diff --git a/shine-UI/js/deploy-config.js b/shine-UI/js/deploy-config.js index 4fa5068..cb6a5c3 100644 --- a/shine-UI/js/deploy-config.js +++ b/shine-UI/js/deploy-config.js @@ -5,3 +5,5 @@ export const defaultServerLogin = 'shineupme'; export const defaultServerAddress = 'shineup.me'; export const defaultServerHttp = `https://${defaultServerAddress}`; export const defaultServerWs = `wss://${defaultServerAddress}/ws`; +export const defaultSolanaCluster = 'mainnet-beta'; +export const defaultSolanaEndpoint = 'https://solana-rpc.publicnode.com'; diff --git a/shine-UI/js/solana-programs.js b/shine-UI/js/solana-programs.js index f085083..7654ab0 100644 --- a/shine-UI/js/solana-programs.js +++ b/shine-UI/js/solana-programs.js @@ -1,6 +1,8 @@ -export const SOLANA_CLUSTER = 'mainnet-beta'; -// Для браузерного UI используем endpoint, который не режет JSON-RPC по Origin. -export const SOLANA_ENDPOINT_DEFAULT = 'https://solana-rpc.publicnode.com'; +import { defaultSolanaCluster, defaultSolanaEndpoint } from './deploy-config.js'; + +export const SOLANA_CLUSTER = defaultSolanaCluster; +// Для браузерного UI endpoint выбирается на уровне deploy-config.js конкретного инстанса. +export const SOLANA_ENDPOINT_DEFAULT = defaultSolanaEndpoint; // Единый файл актуальных Solana Program ID для UI-части SHiNE. // При смене адресов обновлять этот файл и все его потребители внутри shine-UI. diff --git a/shine-UI/server-ui/js/create-server-pda-page.js b/shine-UI/server-ui/js/create-server-pda-page.js index 25c6e8f..3733f06 100644 --- a/shine-UI/server-ui/js/create-server-pda-page.js +++ b/shine-UI/server-ui/js/create-server-pda-page.js @@ -16,7 +16,7 @@ import { validateLoginOrThrow, wireDeviceAddressPreview, } from './server-ui-shared.js'; -import { defaultServerAddress, defaultServerLogin } from '../../js/deploy-config.js'; +import { defaultServerAddress, defaultServerLogin, defaultSolanaEndpoint } from '../../js/deploy-config.js'; const fieldMap = { masterSecret: 'masterSecret', @@ -37,6 +37,7 @@ wireDeviceAddressPreview(fieldMap); $('password').value = ''; $('login').placeholder = defaultServerLogin; $('serverAddress').placeholder = defaultServerAddress; +$('endpoint').value = defaultSolanaEndpoint; $('btnTopupDevnet').addEventListener('click', () => { try { diff --git a/shine-UI/server-ui/js/read-pda-page.js b/shine-UI/server-ui/js/read-pda-page.js index 7cc8fb7..5c21041 100644 --- a/shine-UI/server-ui/js/read-pda-page.js +++ b/shine-UI/server-ui/js/read-pda-page.js @@ -1,6 +1,7 @@ import { readShineUserPdaByRef } from '../../js/services/shine-user-pda-service.js'; import { bytesToBase58 } from '../../js/services/crypto-utils.js'; import { $, clearStatus, formatBigInt, formatTimestamp, setStatus } from './server-ui-shared.js'; +import { defaultSolanaEndpoint } from '../../js/deploy-config.js'; function hex(bytes) { const data = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes || []); @@ -12,6 +13,10 @@ function base58(bytes) { return bytesToBase58(data); } +if ($('endpoint')) { + $('endpoint').value = defaultSolanaEndpoint; +} + function renderRows(rows) { const container = $('summaryRows'); container.innerHTML = ''; diff --git a/shine-UI/server-ui/js/update-server-pda-page.js b/shine-UI/server-ui/js/update-server-pda-page.js index d86a67d..69e82eb 100644 --- a/shine-UI/server-ui/js/update-server-pda-page.js +++ b/shine-UI/server-ui/js/update-server-pda-page.js @@ -22,7 +22,7 @@ import { validateLoginOrThrow, wireDeviceAddressPreview, } from './server-ui-shared.js'; -import { defaultServerAddress, defaultServerLogin } from '../../js/deploy-config.js'; +import { defaultServerAddress, defaultServerLogin, defaultSolanaEndpoint } from '../../js/deploy-config.js'; const fieldMap = { masterSecret: 'masterSecret', @@ -100,6 +100,7 @@ wireDeviceAddressPreview(fieldMap); $('password').value = ''; $('login').placeholder = defaultServerLogin; $('serverAddress').placeholder = defaultServerAddress; +$('endpoint').value = defaultSolanaEndpoint; resetExpectedKeysUi(); $('btnTopupDevnet').addEventListener('click', () => { diff --git a/shine-solana/shine/create-SHiNE-DAO/local/runs/2026-07-08_15-10-08_transfer_dao_authorities.json b/shine-solana/shine/create-SHiNE-DAO/local/runs/2026-07-08_15-10-08_transfer_dao_authorities.json new file mode 100644 index 0000000..65ceca0 --- /dev/null +++ b/shine-solana/shine/create-SHiNE-DAO/local/runs/2026-07-08_15-10-08_transfer_dao_authorities.json @@ -0,0 +1,21 @@ +{ + "createdAt": "2026-07-08T11:10:08.590Z", + "cluster": "mainnet-beta", + "realmName": "SHiNE DAO", + "governanceProgramId": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw", + "issuer": "SHiJ58FvbJQJnPEUa5mZNVpWd1ym9CkjjPgeHYzUJmh", + "governingMint": "SHi1KQ9BdJTmzwy5aPJQs8QB4er4Ka8HaJTQcyE4gY1", + "realm": "FcMg5G3RpAYvW3vvztrcMuFXifWYR3HYiTuPfVgwuN4K", + "governance": "9EEcpw6JK74CqMAsQ46LUhKu7AqX274TDuaAdoDwpbBh", + "mintAuthorityBefore": "SHiJ58FvbJQJnPEUa5mZNVpWd1ym9CkjjPgeHYzUJmh", + "freezeAuthorityBefore": "SHiJ58FvbJQJnPEUa5mZNVpWd1ym9CkjjPgeHYzUJmh", + "metadataUpdateAuthorityBefore": "SHiJ58FvbJQJnPEUa5mZNVpWd1ym9CkjjPgeHYzUJmh", + "realmAuthorityBefore": "SHiJ58FvbJQJnPEUa5mZNVpWd1ym9CkjjPgeHYzUJmh", + "mintAuthorityAfter": "9EEcpw6JK74CqMAsQ46LUhKu7AqX274TDuaAdoDwpbBh", + "freezeAuthorityAfter": "9EEcpw6JK74CqMAsQ46LUhKu7AqX274TDuaAdoDwpbBh", + "realmAuthorityAfter": "9EEcpw6JK74CqMAsQ46LUhKu7AqX274TDuaAdoDwpbBh", + "metadataUpdateAuthorityAfter": "SHiJ58FvbJQJnPEUa5mZNVpWd1ym9CkjjPgeHYzUJmh", + "txTransferAuthorities": "4QrYB8xne3MSrPjJiUBFy2xrukmyV18qBzSmcWaBr3LRdbUetxbgdYJvbw18mjgweLYKML39VpGTMhJW2GMZqsfi", + "txSetRealmAuthority": "5GgbwX7YYveKumXpFDBytJbfsqiPhhzvFaxNaByqYbXtP8WNgjw24uWvYPTGp2gCukhdMbLyXi3nieyNrAwuz1V6", + "txSetMetadataUpdateAuthority": "a3wNDpx743sTZB2ckH2w6yIuj3uW7aivTIR2OSwUgFkv8jYvmhaH4rV0KuHU5/gPzTJOyDBDOyiUaqXcDfGKCw==" +} \ No newline at end of file