Commit Graph
32 Commits
Author SHA1 Message Date
Viktor Baranov 3770870e32 feat: add ability to restore server backups 2026-09-04 13:39:56 +03:00
Public relations & Virtual technology 2dbaf78048 Merge branch 'main' into feature/self-service-upstream 2026-09-01 18:23:47 +03:00
Максимов Владимир Сергеевич 6b937b463b Merge pull request #108 from leonidorlov-hash/feat/install-used-port-awareness
# Conflicts:
#	translations/en.json
#	translations/fa.json
#	translations/fr.json
#	translations/ru.json
#	translations/zh.json
2026-09-01 17:23:38 +03:00
Максимов Владимир Сергеевич cc56be4317 Merge pull request #106 from leonidorlov-hash/feat/peer-speed-limit
# Conflicts:
#	templates/server.html
#	translations/en.json
#	translations/fa.json
#	translations/fr.json
#	translations/ru.json
#	translations/zh.json
2026-09-01 17:22:30 +03:00
Public relations & Virtual technology 9bf44a75c3 Merge branch 'main' into feat/awg-special-junk-mtu-dns 2026-09-01 16:20:05 +03:00
Public relations & Virtual technology 317e5d7ad6 Merge pull request #105 from Almeonamy/feat/searchable-user-select
Add substring search to the assign-to-user picker
2026-09-01 16:06:38 +03:00
Public relations & Virtual technology 929b293811 Merge branch 'main' into feat/net-tuning 2026-09-01 15:48:27 +03:00
hellandClaude Opus 5 92bcf7bb9e Name and package Xray connections the way AmneziaVPN reads them
Three separate problems, none of them new to this branch.

The vless link carried the connection's own label in its fragment, and
vless::Deserialize hands that fragment to extractXrayConfig as the server
description -- so an imported key showed up as "Connection". It now carries
the same node-plus-container name the AmneziaWG configs got.

The `vpn://` key was base64 of the vless link, which the client cannot read:
extractConfigFromData only routes a *bare* `vless://` string to the Xray
branch, and once it is wrapped nothing recognises the payload. That is where
the ErrorCode 900 (ImportInvalidConfigError) came from, and it predates this
branch -- main wraps every protocol the same way.

The QR had the same shape of problem from the other side:
extractConfigFromQr only reaches extractConfigFromData when checkConfigFormat
already recognises the text, and a bare vless link matches none of its
patterns, so a link in a QR code is unreachable however well it scans.

So Xray now goes through the same Amnezia config format as AmneziaWG:
build_xray_client_config ports serialization::vless::Deserialize, wraps its
output the way extractXrayConfig would, and the result feeds both the `vpn://`
key and the QR frame series. Four frames for a typical reality link.

The plain-format QR is still there for v2rayNG and friends, so its label is no
longer "WireGuard".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 14:46:45 +07:00
hellandClaude Opus 5 af87995c87 Fix the protocol card header and make the QR scannable
Two problems with the previous commit's UI.

The header row of a protocol card is a bare space-between flex with no gap,
so the third control button ran straight into the protocol icon on the AWG
cards -- the only ones that get an AWG button. Give the row a gap and let the
button group wrap instead of pushing into the icon.

And the QR: a whole config in one code lands at version 19 raw or 26 wrapped,
while the Android scanner builds ImageAnalysis.Builder() with no
ResolutionSelector and so reads 640x480 frames -- two to three pixels per
module. Emit the frame series ImportController::parseQrCodeChunk reassembles
instead: qint16 magic 1984, quint8 total, quint8 index and the slice as a
QDataStream QByteArray, each frame base64url'd into its own code. At 144 bytes
a frame every code stays under 55x55 modules and decoded at every scale tried
against a simulated VGA capture, including ones where the single code failed.

The WireGuard format stays a single static code, since a raw config is what
AmneziaWG and wg-quick read and it cannot be chunked.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 02:37:45 +07:00
hellandClaude Opus 5 1fbcba5c48 Name the server in the vpn:// key and QR code
A plain WireGuard config cannot carry a name: extractWireGuardConfig() in
the client overwrites description with nextAvailableServerName(), so every
imported key lands as "Server 1". Wrap the config into Amnezia's own server
config format instead, which keeps whatever description it is given, and
name it after the node and the container it came from -- "prx-40 AWG3".

The encoding matches ExportController::generateVpnUrl: base64url of
qCompress'd JSON, the size prefix included. The QR payload carries no
vpn:// prefix, because extractConfigFromQr() feeds the scanned text
straight to QByteArray::fromBase64, which drops ':' and '/' but keeps
'v', 'p' and 'n' and would shift the whole payload by three characters.

AmneziaWG and wg-quick only understand the raw config, so the QR panel
gets a format switch rather than replacing what it shows. The named
payload is about half again as long -- QR version 23 instead of 18 --
so it is drawn a little larger.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 02:09:31 +07:00
leonidorlov-hash 3847a5667d feat(install): used-port awareness when installing protocols
Previously the install modal defaulted to a fixed port and only avoided
ports of same-family instances, so installing e.g. AWG3 on a host where
AWG2 already held 55424 failed mid-install with a half-created broken
container ('port is already allocated').

- GET /api/servers/{id}/used-ports: real listening UDP/TCP ports via ss
- api_install_protocol: reject a busy port upfront with a clear error
  naming the owning process, before any docker run
- Install modal: fetches used ports, auto-suggests the first free port,
  live-validates manual input (red field + hint + disabled Install button)
- new translation key port_in_use_by (en/ru/fr/fa/zh)
2026-08-29 04:41:06 +03:00
leonidorlov-hash 58e976121f feat(awg): trash button to clear a peer's connection-flood warnings
The torrent-detection warning block under a peer now has a 🗑 button that
wipes the recorded warning history for that peer (conn_warnings.json is
keyed by peer IP; backend resolves the IP from clientsTable).
Adds POST /api/servers/{id}/connections/clear_warnings and
clear_warnings / warnings_cleared translation keys.
2026-08-29 01:12:31 +03:00
leonidorlov-hash c59ccd36e2 feat: per-peer speed limit (Mbps, step 0.1, 0=unlimited) for AmneziaWG
- awg_manager: set_speed_limit() applies tc HTB (egress) + ingress policer
  inside container for peer IPv4/IPv6; limits persisted to bwlimits file and
  re-applied on container start
- maxSpeed stored in clientsTable userData
- UI: speed badge on peer card, speed field with label in rename dialog
- translations: en/ru/fr/fa/zh
2026-08-29 01:10:41 +03:00
Алексей ЦыганковandClaude Opus 5 133dc2bff6 Add substring search to the "assign to user" picker
On a panel with a few dozen users, picking one when creating a connection
means scrolling a plain <select> and reading every entry — there is no way
to type a name.

Adds a small dependency-free searchable select and applies it to the user
picker in the Add Connection modal. It's progressive enhancement: the
native <select> stays in the DOM as the source of truth, so `.value`,
programmatic assignment and `change` listeners keep working exactly as
before (server.html reads `connectionUserId.value` unchanged).

- static/js/searchable-select.js: opt-in via `data-searchable`, with
  case-insensitive substring filtering, keyboard navigation
  (arrows/Enter/Escape/Tab), an empty state, and ARIA combobox roles
- styles built entirely from existing CSS variables, so light/dark themes
  and RTL follow the rest of the panel
- labels come from `data-search-*` attributes, so strings stay in the
  templates; new keys added to all five locales

No jQuery/select2: the panel ships no jQuery today, and pulling in two
libraries for one dropdown seemed a poor trade against ~300 lines of
vanilla JS.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 18:20:15 +07:00
leonidorlov-hash 24a8d19dc3 feat(awg): container network tuning, host BBR, and tuning status modal
Container image (Dockerfile):
- writes sysctl tuning into /etc/sysctl.conf (64MB socket buffers,
  netdev_max_backlog, somaxconn, tcp_fastopen=3, tcp_mtu_probing, etc.),
  same set the AmneziaVPN client uses, minus hybla which needs a kernel
  module on the host
- start.sh applies it via 'sysctl -p' at container start (Alpine does
  not apply sysctl.conf by itself)
- docker run gets --ulimit nofile=51200:51200 (limits.conf has no
  effect on containers)

Host (new setup_host_tuning() step in install_protocol):
- enables BBR + fq qdisc, loads tcp_bbr if needed, persists via
  /etc/sysctl.d/99-awp-bbr.conf and /etc/modules-load.d/awp-bbr.conf
- silently skipped when the kernel lacks BBR

UI:
- new 'Host tuning' button in the server status bar opens a modal with
  live host sysctls (congestion control, qdisc, conntrack usage,
  backlog, somaxconn) and per-AWG-container values (buffers, fastopen,
  mtu_probing, nofile) + container online status
- adds POST /api/servers/{id}/host_tuning and host_tuning translations
2026-08-28 02:36:32 +03:00
leonidorlov-hash d6c6d50ffe feat(awg): per-peer connection flood warnings (torrent detection)
- Count conntrack entries per peer IP from /proc/net/nf_conntrack (no extra
  packages on the host), matching against the instance subnet
- Record a warning when a peer exceeds 600 simultaneous connections,
  at most one per hour per peer, keeping the last 5 events; persisted in
  conn_warnings.json inside the container data dir (volume-backed)
- Render warnings under the client meta row (.conn-warnings/.conn-warning,
  no inline styles), localized via new conn_warning_text key (en/ru/fr/fa/zh)
- Show peer internal IP next to the client name (.client-ip)
2026-08-28 00:10:01 +03:00
hellandClaude Opus 5 026b7712f3 Merge branch 'main' into feat/awg-special-junk-mtu-dns
v1.6.0 landed the same fix for the unbound `dns1`/`dns2` in the client
config builders that this branch carries, and wires in the dual-stack
`address_line`/`dns_line` the same way. Merged as-is; the MTU lookup
from this branch stays on top of it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-26 19:11:14 +07:00
hellandClaude Opus 5 bbe2a6e95b Add MTU, DNS and I1-I5 fields to the UI
The install dialog gains an AmneziaWG section, and installed AWG
protocols gain an "AWG" button next to the raw config editor that opens
the same fields for editing. A "Default" button fills I1 with the packet
the desktop client uses, so the common case is one click.

AWG Legacy predates special junk packets, so it only gets MTU and DNS.

The dialog says outright that changes apply to configs generated from
now on: a client that already imported a config keeps its old values,
because the values live in the config it holds.

fr/zh/fa strings are machine-written and want a native reader.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-25 14:03:48 +07:00
Viktor Baranov 4816c36581 i18n: add self-service translation keys for all languages 2026-08-25 09:12:31 +03:00
Максимов Владимир Сергеевич dec0e90d11 v1.6.0
Fixed merge requests
Reset user traffic consumption
Implemented automatic backups
2026-08-24 19:14:04 +03:00
Максимов Владимир Сергеевич 7f07205062 Revert "v1.6.0"
This reverts commit e1cdb90bb2.
2026-08-24 19:05:32 +03:00
Максимов Владимир Сергеевич e1cdb90bb2 v1.6.0
Fixed merge requests
Reset user traffic consumption
Implemented automatic backups
2026-08-24 18:56:30 +03:00
Public relations & Virtual technology dd84f14f72 Merge branch 'main' into feat/awg-3.1 2026-08-24 16:54:18 +03:00
hellandClaude Opus 5 4acf79a0b5 Describe what 3.1 adds instead of reusing the 2.0 text
The awg3 card reused awg_desc, which talks about awg-go and S3/S4 — true
of 2.0 as well, so the card said nothing about what the newer protocol
actually changes. Give it its own key naming the 3.x additions: header
protection, content padding and randomized timings.

_t() falls back to the key itself rather than to English, so the string is
added to all five locales at once.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-24 17:25:35 +07:00
leonidorlov-hash 83cd8a4941 i18n: config_saved (fa) 2026-08-05 03:06:46 +03:00
leonidorlov-hash fb366ee6e3 i18n: rename keys (fa) 2026-08-05 02:20:53 +03:00
Public relations & Virtual technology dd8bda3ac1 Version 1.5.0
Added Cloudflare WARP support
Added Market Templates
Added Multi-protocol support
Fixed SOCKS5 management
Added NGINX + Let's Encrypt integration
Updated built-in configuration editor
Added Backup / Migrate protocols (Alpha)
Added Admin Telegram bot role
2026-07-09 17:53:38 +03:00
Public relations & Virtual technology a62f9587ef Add public tunnels and fix protocol connection bugs
Add public tunnel management and fix connection stability issues

- Add Tunnels block to settings with Local Server, Cloudflare Quick Tunnel, and ngrok support
- Implement one-click tunnel install, enable, stop, and delete actions
- Persist tunnel PID and public URL state across panel restarts
- Improve tunnel process detection and cleanup on Windows, Linux, and Docker
- Add tunnel translations and README documentation

- Fix settings save 422 when server list is empty and Remnawave auto-create is disabled
- Fix AWG Legacy config path resolution by detecting actual wg0.conf/awg0.conf inside container
- Fix Xray client add/toggle/remove flow to use runtime API without restarting the container
- Fix WireGuard Show config calls by routing get_client_config through the unified manager adapter
2026-06-19 19:28:51 +03:00
Public relations & Virtual technology 29def95df8 v1.4.3
Add SOCKS5 support
Add AdGuard Home integration
Add node status and latency tracking
Add drag-and-drop server management
Upgrade Xray from v1.8 to v26.3.27 with backward compatibility
Fix Telemt dependency installation
Extend Telegram bot to support all protocols
Improve server cleanup process
Enhance API structure (system routes moved to a separate group)
Add JWT token generation for external integrations
2026-05-04 16:01:06 +03:00
Public relations & Virtual technology 5b40445442 v1.3.0
* Added support for AmneziaDNS
* Added traffic reset functionality
* Fixed hideConnectionsSection is not defined error and false “Connection Error” when clearing the server
* Added basic management features (restart, delete, poll, clear)
* Fixed AWG 2.0 connection generation
* Optimized Check Server polling speed (now queries all protocols and services in parallel over a single SSH connection; ~5–6x faster)
2026-04-02 13:43:59 +03:00
Public relations & Virtual technology 6c4a512a0d Add support AWG 2.0 and other.
* Added support for Amnezia 2.0
* Added support for native installation of Amnezia 2.0
* Added display of messages when attempting to view files created by a native application
* Improved polling of native installation servers while preserving active protocols
* Added editing of the main config file via the web panel
2026-03-23 14:48:03 +03:00
Public relations & Virtual technology 814feeda06 Simple Enjoy 2026-03-16 15:39:35 +03:00