Add Salamander obfs branch: replace masquerade with packet obfuscation.

- ACME TLS challenge on 443 (no port 80 or nginx decoy)
- Auto-generate and persist obfs password per server
- Update client export, HTML catalog, and vault examples
- Document Salamander vs main and ACME auto-renewal in README
This commit is contained in:
Sergey Antropoff
2026-07-01 02:17:22 +03:00
parent 6f96a26bed
commit 0aec9e6e54
19 changed files with 365 additions and 182 deletions
@@ -160,6 +160,17 @@
font-weight: 600;
}
.server-link:hover { background: var(--accent-soft); border-color: var(--accent); }
.badge-salamander {
display: inline-block;
margin-top: 0.35rem;
padding: 0.2rem 0.6rem;
border-radius: 999px;
font-size: 0.72rem;
font-weight: 700;
background: var(--accent-soft-2);
color: var(--accent-2);
}
.server-obfs { margin-top: 0.75rem; width: 100%; }
.users-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
@@ -286,8 +297,8 @@
</head>
<body>
<header class="hero">
<h1>Hysteria2</h1>
<p>Общий каталог VPN-подключений</p>
<h1>Hysteria2 · Salamander</h1>
<p>Общий каталог VPN-подключений с обфускацией Salamander</p>
<div class="stats">
<div class="stat"><span>{{ hysteria2_global_servers | length }}</span> серверов</div>
<div class="stat"><span>{{ total_users }}</span> пользователей</div>
@@ -307,6 +318,18 @@
<div>
<h2>{{ server.name | e }}</h2>
<p class="domain">{{ server.domain | e }}:{{ server.port }}</p>
<span class="badge-salamander">Salamander</span>
{% if server.obfs_password | default('') | length > 0 %}
<div class="field server-obfs">
<label for="obfs-{{ server.dir | e }}">Пароль обфускации</label>
<div class="input-row">
<input type="text" id="obfs-{{ server.dir | e }}" value="{{ server.obfs_password | e }}" readonly>
<button type="button" class="btn-copy" onclick="copyField('obfs-{{ server.dir | e }}', this)" title="Копировать obfs-password" aria-label="Копировать obfs-password">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>
</button>
</div>
</div>
{% endif %}
</div>
<a class="server-link" href="{{ server.dir | e }}/index.html">Страница сервера →</a>
</div>