Compare commits

...

4 Commits

Author SHA1 Message Date
Sergey Antropoff 2d05bf230f Обновить bundled install_server.sh с официального get.hy2.sh
Синхронизация локальной копии после проверки SHA256.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 09:02:06 +03:00
Sergey Antropoff 0f273d2d42 Добавить make index: пересборка output/index.html из локальных экспортов
Отдельный playbook на localhost читает server-info.yml, обновляет
общий каталог и открывает его в браузере без обращения к VPS.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 08:56:04 +03:00
Sergey Antropoff 4813cf35b2 fix: корректный make status при inactive и без -o
systemctl is-active с rc≠0 больше не дублирует inactive;
убран deprecated флаг -o.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 08:46:17 +03:00
Sergey Antropoff 0c819bdfa4 Улучшить вывод make status: кратко и без логов journal
Одна строка на хост (active/not installed, since, PID, RAM);
хост без установки больше не валит весь make.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 08:31:51 +03:00
4 changed files with 43 additions and 10 deletions
+22 -4
View File
@@ -32,7 +32,7 @@ BOLD := \033[1m
NC := \033[0m NC := \033[0m
.PHONY: help init check ping status \ .PHONY: help init check ping status \
install update export uninstall \ install update export index uninstall \
vault-init vault-encrypt vault-edit vault-view vault-init vault-encrypt vault-edit vault-view
help: ## Показать справку help: ## Показать справку
@@ -48,6 +48,7 @@ help: ## Показать справку
@echo " make install" @echo " make install"
@echo " make install LIMIT=vps-de" @echo " make install LIMIT=vps-de"
@echo " make update LIMIT=vps-nl" @echo " make update LIMIT=vps-nl"
@echo " make index"
@echo " make uninstall LIMIT=vps-de" @echo " make uninstall LIMIT=vps-de"
@echo "" @echo ""
@@ -67,14 +68,27 @@ init: ## Создать inventory, group_vars и .vault_pass из примеро
check: ## Проверить синтаксис playbook check: ## Проверить синтаксис playbook
$(ANSIBLE) playbook.yml --syntax-check $(VAULT_ARGS) $(ANSIBLE) playbook.yml --syntax-check $(VAULT_ARGS)
$(ANSIBLE) playbook-uninstall.yml --syntax-check $(VAULT_ARGS) $(ANSIBLE) playbook-uninstall.yml --syntax-check $(VAULT_ARGS)
$(ANSIBLE) playbook-index.yml --syntax-check $(VAULT_ARGS)
ping: ## Проверить SSH-доступ ко всем VPS ping: ## Проверить SSH-доступ ко всем VPS
$(ANSIBLE_ADHOC) hysteria2_servers -m ping $(ANSIBLE_OPTS) $(ANSIBLE_ADHOC) hysteria2_servers -m ping $(ANSIBLE_OPTS)
status: ## Статус hysteria-server на VPS status: ## Краткий статус hysteria-server на VPS
@ANSIBLE_DEPRECATION_WARNINGS=False ANSIBLE_STDOUT_CALLBACK=minimal \
$(ANSIBLE_ADHOC) hysteria2_servers -m shell \ $(ANSIBLE_ADHOC) hysteria2_servers -m shell \
-a "systemctl status hysteria-server --no-pager || systemctl status hysteria2 --no-pager" \ -a 'UNIT=""; \
-b $(VAULT_ARGS) $(if $(LIMIT),--limit $(LIMIT),) if systemctl cat hysteria-server.service >/dev/null 2>&1; then UNIT=hysteria-server; \
elif systemctl cat hysteria2.service >/dev/null 2>&1; then UNIT=hysteria2; fi; \
if [ -z "$$UNIT" ]; then echo "not installed"; exit 0; fi; \
STATE=$$(systemctl is-active "$$UNIT" 2>/dev/null || true); \
[ -n "$$STATE" ] || STATE=inactive; \
SINCE=$$(systemctl show -p ActiveEnterTimestamp --value "$$UNIT" 2>/dev/null); \
PID=$$(systemctl show -p MainPID --value "$$UNIT" 2>/dev/null); \
MEM=$$(systemctl show -p MemoryCurrent --value "$$UNIT" 2>/dev/null); \
case "$$MEM" in ""|"[not set]"|"0"|"n/a") MEM="-";; *) MEM="$$((MEM/1024/1024))M";; esac; \
echo "$$UNIT: $$STATE | since $$SINCE | PID $$PID | RAM $$MEM"; \
[ "$$STATE" = "active" ]' \
-b $(ANSIBLE_OPTS)
install: check ## Установить Hysteria2 на VPS (+ URL и QR локально) install: check ## Установить Hysteria2 на VPS (+ URL и QR локально)
$(ANSIBLE) playbook.yml --tags install $(ANSIBLE_OPTS) $(ANSIBLE) playbook.yml --tags install $(ANSIBLE_OPTS)
@@ -85,6 +99,10 @@ update: check ## Обновить бинарник, перекатить кон
export: check ## Только перевыпустить URL и QR (без изменений на сервере) export: check ## Только перевыпустить URL и QR (без изменений на сервере)
$(ANSIBLE) playbook.yml --tags export $(ANSIBLE_OPTS) $(ANSIBLE) playbook.yml --tags export $(ANSIBLE_OPTS)
index: check ## Пересобрать output/index.html из локальных server-info.yml и открыть в браузере
$(ANSIBLE) playbook-index.yml $(VAULT_ARGS) \
$(if $(EXTRA_VARS),--extra-vars "$(EXTRA_VARS)",)
uninstall: ## Полностью удалить Hysteria2 с VPS (только uninstall, без install/update) uninstall: ## Полностью удалить Hysteria2 с VPS (только uninstall, без install/update)
@echo "$(YELLOW)Будет выполнено удаление Hysteria2$(NC) $(if $(LIMIT),на $(LIMIT),на всех серверах)" @echo "$(YELLOW)Будет выполнено удаление Hysteria2$(NC) $(if $(LIMIT),на $(LIMIT),на всех серверах)"
@read -p "Продолжить? [y/N] " c; [[ "$$c" =~ ^[Yy]$$ ]] || exit 1 @read -p "Продолжить? [y/N] " c; [[ "$$c" =~ ^[Yy]$$ ]] || exit 1
+6 -2
View File
@@ -69,10 +69,11 @@ make install # → output/index.html откроется в браузере
| `make init` | Создать конфиги из `.example` и `.vault_pass` | | `make init` | Создать конфиги из `.example` и `.vault_pass` |
| `make check` | Проверить синтаксис playbook | | `make check` | Проверить синтаксис playbook |
| `make ping` | Проверить SSH к VPS | | `make ping` | Проверить SSH к VPS |
| `make status` | `systemctl status hysteria-server` | | `make status` | Краткий статус: active / not installed, uptime, PID, RAM |
| `make install` | Установка masquerade + экспорт URL/QR/HTML | | `make install` | Установка masquerade + экспорт URL/QR/HTML |
| `make update` | Обновить бинарник и конфиг; экспорт только для новых/изменённых пользователей | | `make update` | Обновить бинарник и конфиг; экспорт только для новых/изменённых пользователей |
| `make export` | Только экспорт (URL, QR, HTML) без изменений на сервере | | `make export` | Только экспорт (URL, QR, HTML) без изменений на сервере |
| `make index` | Пересобрать `output/index.html` из локальных `server-info.yml` и открыть в браузере |
| `make uninstall` | Полное удаление с VPS + `output/<server>/` + пересборка `output/index.html` | | `make uninstall` | Полное удаление с VPS + `output/<server>/` + пересборка `output/index.html` |
| `make vault-init` | Создать `.vault_pass`, включить `vault_password_file` в `ansible.cfg` | | `make vault-init` | Создать `.vault_pass`, включить `vault_password_file` в `ansible.cfg` |
| `make vault-encrypt` | Зашифровать `vault.yml` | | `make vault-encrypt` | Зашифровать `vault.yml` |
@@ -84,6 +85,7 @@ make install LIMIT=vps-de
make install LIMIT=vps-nl # только новый сервер — старые не трогаются make install LIMIT=vps-nl # только новый сервер — старые не трогаются
make update LIMIT=vps-nl make update LIMIT=vps-nl
make export make export
make index # только пересобрать общий каталог из output/
make uninstall LIMIT=vps-de make uninstall LIMIT=vps-de
make update EXTRA_VARS='hysteria2_force_export=true' # перевыпустить URL/QR для всех make update EXTRA_VARS='hysteria2_force_export=true' # перевыпустить URL/QR для всех
make install EXTRA_VARS='hysteria2_force_export=true' # то же при install make install EXTRA_VARS='hysteria2_force_export=true' # то же при install
@@ -351,7 +353,9 @@ HTML-страницы показывают:
- QR-коды; - QR-коды;
- ссылки на файлы и страницы серверов. - ссылки на файлы и страницы серверов.
После `make install`, `make update` и `make export` **`output/index.html` автоматически открывается в браузере** (macOS: `open`, Linux: `xdg-open`). После `make install`, `make update`, `make export` и `make index` **`output/index.html` автоматически открывается в браузере** (macOS: `open`, Linux: `xdg-open`).
`make index` не ходит на VPS: только читает `output/*/server-info.yml` и пересобирает общий каталог.
Отключить: `hysteria2_open_browser: false` в `group_vars/all.yml` или `EXTRA_VARS`. Отключить: `hysteria2_open_browser: false` в `group_vars/all.yml` или `EXTRA_VARS`.
+11
View File
@@ -0,0 +1,11 @@
---
- name: Rebuild global output index from local exports
hosts: localhost
connection: local
gather_facts: true
become: false
tasks:
- name: Generate output/index.html and open in browser
ansible.builtin.include_role:
name: hysteria2
tasks_from: export_global.yml
+4 -4
View File
@@ -38,7 +38,7 @@ HY2_API_BASE_URL="https://api.hy2.io/v1"
# curl command line flags. # curl command line flags.
# To using a proxy, please specify ALL_PROXY in the environ variable, such like: # To using a proxy, please specify ALL_PROXY in the environ variable, such like:
# export ALL_PROXY=socks5h://192.0.2.1:1080 # export ALL_PROXY=socks5h://192.0.2.1:1080
CURL_FLAGS=(-L -f -q --retry 5 --retry-delay 10 --retry-max-time 60) CURL_FLAGS=(-q -L -f --retry 5 --retry-delay 10 --retry-max-time 60)
### ###
@@ -1027,10 +1027,10 @@ perform_install_hysteria_home_legacy() {
} }
perform_install() { perform_install() {
local _is_frash_install local _is_fresh_install
local _is_upgrade_from_hysteria1 local _is_upgrade_from_hysteria1
if ! is_hysteria_installed; then if ! is_hysteria_installed; then
_is_frash_install=1 _is_fresh_install=1
elif is_hysteria1_version "$(get_installed_version)"; then elif is_hysteria1_version "$(get_installed_version)"; then
_is_upgrade_from_hysteria1=1 _is_upgrade_from_hysteria1=1
fi fi
@@ -1067,7 +1067,7 @@ perform_install() {
echo echo
echo "$(tgreen)Installed version is up-to-date, there is nothing to do.$(treset)" echo "$(tgreen)Installed version is up-to-date, there is nothing to do.$(treset)"
echo echo
elif [[ -n "$_is_frash_install" ]]; then elif [[ -n "$_is_fresh_install" ]]; then
echo echo
echo -e "$(tbold)Congratulation! Hysteria 2 has been successfully installed on your server.$(treset)" echo -e "$(tbold)Congratulation! Hysteria 2 has been successfully installed on your server.$(treset)"
echo echo