Files
inecs 4da326c533 make index и install/update: единый стиль страниц серверов и каталога
Пересборка HTML серверов из server-info.yml; сетка карточек и вид
как у главной. Тот же pipeline после install/update/export.
2026-07-23 09:35:43 +03:00

134 lines
6.6 KiB
Makefile
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ═══════════════════════════════════════════════════════════════════════════════
# Hysteria2 Ansible — Makefile
# ═══════════════════════════════════════════════════════════════════════════════
SHELL := /bin/bash
.DEFAULT_GOAL := help
export EDITOR="nano"
ANSIBLE ?= ansible-playbook
ANSIBLE_ADHOC ?= ansible
INVENTORY ?= inventory/hosts.yml
LIMIT ?=
EXTRA_VARS ?=
TAGS ?=
ASK_PASS ?=
# vault: .vault_pass или интерактивный ввод
VAULT_FILE := .vault_pass
VAULT_ARGS := $(if $(wildcard $(VAULT_FILE)),--vault-password-file $(VAULT_FILE),)
ANSIBLE_OPTS := $(VAULT_ARGS) \
$(if $(LIMIT),--limit $(LIMIT),) \
$(if $(EXTRA_VARS),--extra-vars "$(EXTRA_VARS)",) \
$(if $(ASK_BECOME_PASS),--ask-become-pass,) \
$(if $(ASK_PASS),--ask-pass,)
CYAN := \033[0;36m
GREEN := \033[0;32m
YELLOW := \033[1;33m
BOLD := \033[1m
NC := \033[0m
.PHONY: help init check ping status \
install update export index uninstall \
vault-init vault-encrypt vault-edit vault-view
help: ## Показать справку
@echo ""
@echo "$(BOLD)Hysteria2 Ansible$(NC)"
@echo ""
@grep -E '^[a-zA-Z0-9_-]+:.*##' $(MAKEFILE_LIST) | \
awk 'BEGIN {FS = ":.*## "}; {printf " $(CYAN)%-16s$(NC) %s\n", $$1, $$2}'
@echo ""
@echo " $(YELLOW)Примеры:$(NC)"
@echo " make init"
@echo " make vault-init && make vault-encrypt"
@echo " make install"
@echo " make install LIMIT=vps-de"
@echo " make update LIMIT=vps-nl"
@echo " make index"
@echo " make uninstall LIMIT=vps-de"
@echo ""
init: ## Создать inventory, group_vars и .vault_pass из примеров
@test -f inventory/hosts.yml || cp inventory/hosts.yml.example inventory/hosts.yml
@test -f group_vars/all.yml || cp group_vars/all.yml.example group_vars/all.yml
@test -f group_vars/hysteria2_servers/vars.yml || cp group_vars/hysteria2_servers/vars.yml.example group_vars/hysteria2_servers/vars.yml
@test -f group_vars/hysteria2_servers/vault.yml || cp group_vars/hysteria2_servers/vault.yml.example group_vars/hysteria2_servers/vault.yml
@test -f .vault_pass || (openssl rand -base64 32 > .vault_pass && chmod 600 .vault_pass)
@grep -q 'vault_password_file' ansible.cfg || \
(echo "" >> ansible.cfg && echo "vault_password_file = .vault_pass" >> ansible.cfg)
@echo "$(GREEN)Готово. Отредактируйте:$(NC)"
@echo " inventory/hosts.yml"
@echo " group_vars/all.yml"
@echo " group_vars/hysteria2_servers/vault.yml → затем: make vault-encrypt"
check: ## Проверить синтаксис playbook
$(ANSIBLE) playbook.yml --syntax-check $(VAULT_ARGS)
$(ANSIBLE) playbook-uninstall.yml --syntax-check $(VAULT_ARGS)
$(ANSIBLE) playbook-index.yml --syntax-check $(VAULT_ARGS)
ping: ## Проверить SSH-доступ ко всем VPS
$(ANSIBLE_ADHOC) hysteria2_servers -m ping $(ANSIBLE_OPTS)
status: ## Краткий статус hysteria-server на VPS
@ANSIBLE_DEPRECATION_WARNINGS=False ANSIBLE_STDOUT_CALLBACK=minimal \
$(ANSIBLE_ADHOC) hysteria2_servers -m shell \
-a 'UNIT=""; \
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 локально)
$(ANSIBLE) playbook.yml --tags install $(ANSIBLE_OPTS)
update: check ## Обновить бинарник, перекатить конфиг, перевыпустить URL/QR
$(ANSIBLE) playbook.yml --tags update --extra-vars "hysteria2_wait_for_acme=false hysteria2_upgrade_system=false" $(ANSIBLE_OPTS)
export: check ## Только перевыпустить URL и QR (без изменений на сервере)
$(ANSIBLE) playbook.yml --tags export $(ANSIBLE_OPTS)
index: check ## Пересобрать HTML серверов + output/index.html и открыть в браузере
$(ANSIBLE) playbook-index.yml $(VAULT_ARGS) \
$(if $(EXTRA_VARS),--extra-vars "$(EXTRA_VARS)",)
uninstall: ## Полностью удалить Hysteria2 с VPS (только uninstall, без install/update)
@echo "$(YELLOW)Будет выполнено удаление Hysteria2$(NC) $(if $(LIMIT),на $(LIMIT),на всех серверах)"
@read -p "Продолжить? [y/N] " c; [[ "$$c" =~ ^[Yy]$$ ]] || exit 1
$(ANSIBLE) playbook-uninstall.yml --tags uninstall $(ANSIBLE_OPTS)
vault-init: ## Создать .vault_pass и включить vault_password_file в ansible.cfg
@test -f .vault_pass || (openssl rand -base64 32 > .vault_pass && chmod 600 .vault_pass)
@if ! grep -q '^vault_password_file' ansible.cfg; then \
sed -i.bak 's/# vault_password_file/vault_password_file/' ansible.cfg; \
rm -f ansible.cfg.bak; \
fi
@echo "$(GREEN).vault_pass готов$(NC)"
vault-encrypt: vault-init ## Зашифровать group_vars/hysteria2_servers/vault.yml
@if [ ! -f group_vars/hysteria2_servers/vault.yml ]; then \
echo "$(YELLOW)Сначала: make init$(NC)"; exit 1; \
fi
@if grep -q 'ANSIBLE_VAULT' group_vars/hysteria2_servers/vault.yml 2>/dev/null; then \
echo "vault.yml уже зашифрован"; \
else \
ansible-vault encrypt group_vars/hysteria2_servers/vault.yml --vault-password-file $(VAULT_FILE); \
fi
vault-edit: vault-init ## Редактировать зашифрованный vault
ansible-vault edit group_vars/hysteria2_servers/vault.yml --vault-password-file $(VAULT_FILE)
vault-view: vault-init ## Показать содержимое vault (расшифровка)
ansible-vault view group_vars/hysteria2_servers/vault.yml --vault-password-file $(VAULT_FILE)