=== STEP_034A VM121 WG ACCESS INVENTORY === timestamp=20260708-113335 mode=read-only goal: inventory VM121 WG Access / paid peer tooling before creating any test paid peer secrets_policy: redact env/secrets; do not publish private keys, tokens, passwords, DB URLs === SSH reachability VM121 === vm121_ssh_ok=1 wg-access-dev Wed Jul 8 11:33:35 UTC 2026 === VM121 read-only inventory === === host === Static hostname: wg-access-dev Icon name: computer-vm Chassis: vm 🖴 Machine ID: 77d49de3db2c42c5bf86c710d46598ce Boot ID: c4fcbf0979094920a962569908a62306 Virtualization: kvm Operating System: Debian GNU/Linux 12 (bookworm) Kernel: Linux 6.1.0-50-cloud-amd64 Architecture: x86-64 Hardware Vendor: QEMU Hardware Model: Standard PC _i440FX + PIIX, 1996_ Firmware Version: rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org Linux wg-access-dev 6.1.0-50-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.176-1 (2026-07-02) x86_64 GNU/Linux Wed Jul 8 11:33:36 UTC 2026 uid=0(root) gid=0(root) groups=0(root) === network brief === lo UNKNOWN 127.0.0.1/8 ::1/128 eth0 UP 192.168.30.83/24 fe80::be24:11ff:fef2:726c/64 docker0 DOWN 172.17.0.1/16 fe80::40ed:39ff:fe1e:b82b/64 br-0dd299da43cc UP 172.18.0.1/16 fe80::f880:d8ff:fe29:4fce/64 wg-mgts UNKNOWN 10.250.100.121/32 vethc12e993@if2 UP fe80::2055:55ff:fe3c:e9f9/64 veth4015e30@if2 UP fe80::9c84:feff:fef4:9069/64 default via 192.168.30.1 dev eth0 proto static 10.71.100.0/24 dev wg-mgts scope link 10.250.100.1 dev wg-mgts scope link 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 172.18.0.0/16 dev br-0dd299da43cc proto kernel scope link src 172.18.0.1 192.168.30.0/24 dev eth0 proto kernel scope link src 192.168.30.83 === important directories existence === drwxr-xr-x 9 root root 4096 Jul 6 18:56 /opt/wg-access missing /opt/router-ops drwxr-xr-x 4 root root 4096 Jul 4 10:18 /opt/wg-access/backend missing /opt/wg-access/frontend missing /opt/wg-access/scripts missing /opt/wg-access/tools missing /opt/wg-access/smoke missing /opt/wg-access/status missing /root/wg-access missing /root/router-ops-backups === /opt/wg-access tree, depth 4, no file contents === -rw------- root:root 214 2026-07-04 13:21 /opt/wg-access/agent/agent.env.BEFORE_REAL_SSH_WG_SET.20260704-132120 -rw------- root:root 341 2026-07-04 15:16 /opt/wg-access/.env.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636 -rw------- root:root 347 2026-07-06 18:33 /opt/wg-access/agent/agent.env -rw------- root:root 348 2026-07-04 13:21 /opt/wg-access/agent/agent.env.BEFORE_MGTS_REMOTE_HOST_20260706-183324 -rw------- root:root 411 2026-07-04 13:08 /opt/wg-access/agent/ssh/wg_access_agent_ed25519 -rw------- root:root 45 2026-07-04 13:14 /opt/wg-access/manual-tests/client_test_001.key -rw------- root:root 45 2026-07-04 13:14 /opt/wg-access/manual-tests/client_test_001.psk -rw------- root:root 541 2026-07-06 18:50 /opt/wg-access/.env.BEFORE_MGTS_CLIENTCFG_20260706-185140 -rw------- root:root 541 2026-07-06 18:51 /opt/wg-access/.env -rw------- root:root 546 2026-07-04 15:54 /opt/wg-access/.env.BEFORE_MGTS_CLIENTCFG_20260706-185027 -rw-r--r-- root:root 0 2026-07-04 10:16 /opt/wg-access/STEP_002_BACKEND_DB_OK -rw-r--r-- root:root 0 2026-07-04 10:16 /opt/wg-access/current -rw-r--r-- root:root 0 2026-07-06 18:48 /opt/wg-access/tmp/mgts-smoke-20260706-184120/allowed-ips-after-cancel.txt -rw-r--r-- root:root 0 2026-07-06 18:55 /opt/wg-access/26.1.2 -rw-r--r-- root:root 103 2026-07-04 13:08 /opt/wg-access/agent/ssh/wg_access_agent_ed25519.pub -rw-r--r-- root:root 11907 2026-07-04 18:20 /opt/wg-access/backups/step026a/admin.py.20260704-182045.bak -rw-r--r-- root:root 1214 2026-07-04 16:07 /opt/wg-access/STATUS-STEP-020C_AGENT_TIMER_REAL_PERIODIC_OK.txt -rw-r--r-- root:root 1235 2026-07-04 15:20 /opt/wg-access/STATUS-STEP-016_CLIENT_CONFIG_RESPONSE_OK.txt -rw-r--r-- root:root 1268 2026-07-04 13:29 /opt/wg-access/STATUS-STEP-012_REAL_AGENT_PROVISION_VM100_OK.txt -rw-r--r-- root:root 1296 2026-07-04 13:35 /opt/wg-access/STATUS-STEP-013_WG_HANDSHAKE_VM121_TO_VM100_OK.txt -rw-r--r-- root:root 1375 2026-07-04 10:18 /opt/wg-access/backend/alembic/env.py -rw-r--r-- root:root 13837 2026-07-04 18:20 /opt/wg-access/backend/app/api/admin.py -rw-r--r-- root:root 1391 2026-07-04 15:14 /opt/wg-access/STATUS-STEP-015_DISABLE_DEPROVISION_OK.txt -rw-r--r-- root:root 1544 2026-07-04 15:27 /opt/wg-access/STATUS-STEP-017_GENERATED_CLIENT_CONFIG_HANDSHAKE_OK.txt -rw-r--r-- root:root 1548 2026-07-04 13:48 /opt/wg-access/STATUS-STEP-014_AGENT_RECONCILE_SYNC_OK.txt -rw-r--r-- root:root 1690 2026-07-04 16:03 /opt/wg-access/STATUS-STEP-019B_CLEAN_POOL_SMOKE_OK.txt -rw-r--r-- root:root 1743 2026-07-04 17:38 /opt/wg-access/STATUS-STEP-023A_DEV_ENDPOINT_GUARD_OK.txt -rw-r--r-- root:root 1794857 2026-07-06 18:48 /opt/wg-access/agent/logs/agent.log -rw-r--r-- root:root 18 2026-07-04 16:29 /opt/wg-access/backend/app/services/__init__.py -rw-r--r-- root:root 1883 2026-07-04 17:56 /opt/wg-access/STATUS-STEP-024A_ADMIN_USER_VIEW_OK.txt -rw-r--r-- root:root 1958 2026-07-04 15:57 /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt -rw-r--r-- root:root 1962 2026-07-04 16:24 /opt/wg-access/STATUS-STEP-020D_TIMER_AUTO_PROVISION_DEPROVISION_OK.txt -rw-r--r-- root:root 1977 2026-07-04 17:25 /opt/wg-access/STATUS-STEP-022B_DEV_ENDPOINT_USES_SHARED_WG_SERVICE_OK.txt -rw-r--r-- root:root 199 2026-07-04 16:05 /opt/wg-access/backups/step020b/wg-access-agent.timer.20260704-160536.bak -rw-r--r-- root:root 199 2026-07-04 16:06 /opt/wg-access/backups/step020c/wg-access-agent.timer.20260704-160647.bak -rw-r--r-- root:root 20193 2026-07-08 11:29 /opt/wg-access/maintenance-logs/expire-subscriptions.20260708.log -rw-r--r-- root:root 2029 2026-07-04 16:34 /opt/wg-access/STATUS-STEP-021C_ADMIN_SUBSCRIPTION_FLOW_OK.txt -rw-r--r-- root:root 218 2026-07-06 18:41 /opt/wg-access/tmp/mgts-smoke-20260706-184120/smoke.env -rw-r--r-- root:root 2223 2026-07-04 15:12 /opt/wg-access/backend/app/api/admin.py.BEFORE_DISABLE_PEER.20260704-151253 -rw-r--r-- root:root 231 2026-07-04 10:17 /opt/wg-access/backend/app/models/__init__.py -rw-r--r-- root:root 2388 2026-07-04 13:25 /opt/wg-access/backend/app/api/dev.py.BEFORE_REAL_WG_KEYS.20260704-132545 -rw-r--r-- root:root 25032 2026-07-05 23:59 /opt/wg-access/maintenance-logs/expire-subscriptions.20260705.log -rw-r--r-- root:root 2533 2026-07-06 19:00 /opt/wg-access/STATUS-STEP-028A_MGTS_WG_PAID_E2E_OK.txt -rw-r--r-- root:root 2549 2026-07-04 17:27 /opt/wg-access/backups/step023a/dev.py.20260704-172733.bak -rw-r--r-- root:root 261 2026-07-04 10:30 /opt/wg-access/backend/app/config.py -rw-r--r-- root:root 261 2026-07-04 17:27 /opt/wg-access/backups/step023a/config.py.20260704-172733.bak -rw-r--r-- root:root 2780 2026-07-04 18:14 /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt -rw-r--r-- root:root 2791 2026-07-04 17:27 /opt/wg-access/backend/app/api/dev.py -rw-r--r-- root:root 2833 2026-07-04 18:24 /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt -rw-r--r-- root:root 303 2026-07-06 18:41 /opt/wg-access/tmp/mgts-smoke-20260706-184120/client.conf -rw-r--r-- root:root 306 2026-07-04 16:05 /opt/wg-access/backups/step020b/wg-access-agent.service.20260704-160536.bak -rw-r--r-- root:root 310 2026-07-06 18:47 /opt/wg-access/tmp/mgts-smoke-20260706-184120/client.mgts.conf -rw-r--r-- root:root 3169 2026-07-04 16:29 /opt/wg-access/backend/app/services/wireguard.py -rw-r--r-- root:root 3169 2026-07-04 16:36 /opt/wg-access/backups/step022a/wireguard.py.20260704-163658.bak -rw-r--r-- root:root 3174 2026-07-04 13:39 /opt/wg-access/backend/app/api/agent.py.BEFORE_AGENT_PEERS_SYNC.20260704-133954 -rw-r--r-- root:root 3283 2026-07-04 15:16 /opt/wg-access/backend/app/api/dev.py.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636 -rw-r--r-- root:root 3338 2026-07-04 16:29 /opt/wg-access/backups/step021b/admin.py.20260704-162930.bak -rw-r--r-- root:root 351 2026-07-04 10:20 /opt/wg-access/backend/app/db/session.py -rw-r--r-- root:root 366 2026-07-06 18:39 /opt/wg-access/tmp/mgts-smoke-20260706-183921/create.json -rw-r--r-- root:root 3789 2026-07-04 13:39 /opt/wg-access/backend/app/api/agent.py -rw-r--r-- root:root 41976 2026-07-07 23:56 /opt/wg-access/maintenance-logs/expire-subscriptions.20260707.log -rw-r--r-- root:root 42280 2026-07-06 23:58 /opt/wg-access/maintenance-logs/expire-subscriptions.20260706.log -rw-r--r-- root:root 444 2026-07-04 10:14 /opt/wg-access/STATUS-STEP-002-BACKEND-DB-OK.txt -rw-r--r-- root:root 4448 2026-07-04 15:52 /opt/wg-access/backups/step018b/dev.py.20260704-155255.bak -rw-r--r-- root:root 45 2026-07-04 13:14 /opt/wg-access/manual-tests/client_test_001.pub -rw-r--r-- root:root 460 2026-07-06 18:48 /opt/wg-access/agent/state/active-peers.json -rw-r--r-- root:root 4626 2026-07-04 15:52 /opt/wg-access/backups/step018b/peers.20260704-155255.sql -rw-r--r-- root:root 5352 2026-07-04 16:29 /opt/wg-access/backups/step021b/dev.py.20260704-162930.bak -rw-r--r-- root:root 5352 2026-07-04 16:36 /opt/wg-access/backups/step022a/dev.py.20260704-163658.bak -rw-r--r-- root:root 5789 2026-07-06 18:39 /opt/wg-access/tmp/mgts-smoke-20260706-183921/peers-before.json -rw-r--r-- root:root 5836 2026-07-04 10:18 /opt/wg-access/backend/alembic/versions/0001_initial_schema.py -rw-r--r-- root:root 5916 2026-07-04 15:54 /opt/wg-access/backups/step018b/core.py.20260704-155437.bak -rw-r--r-- root:root 60 2026-07-06 18:41 /opt/wg-access/tmp/mgts-smoke-20260706-184120/allowed-ips-after-enable.txt -rw-r--r-- root:root 6001 2026-07-04 15:54 /opt/wg-access/backend/app/models/core.py -rw-r--r-- root:root 604 2026-07-04 10:18 /opt/wg-access/backend/alembic.ini -rw-r--r-- root:root 6163 2026-07-04 17:47 /opt/wg-access/backups/step024a/admin.py.20260704-174718.bak -rw-r--r-- root:root 664 2026-07-04 13:11 /opt/wg-access/STATUS-STEP-010_AGENT_SSH_TO_VM100_OK.txt -rw-r--r-- root:root 669 2026-07-04 10:29 /opt/wg-access/STATUS-STEP-005_API_DB_OK.txt -rw-r--r-- root:root 743 2026-07-04 10:34 /opt/wg-access/STATUS-STEP-006_AGENT_PULL_API_OK.txt -rw-r--r-- root:root 757 2026-07-04 13:17 /opt/wg-access/STATUS-STEP-011_MANUAL_WG_SET_VM100_OK.txt -rw-r--r-- root:root 788 2026-07-04 10:31 /opt/wg-access/backend/app/main.py -rw-r--r-- root:root 809 2026-07-06 18:41 /opt/wg-access/tmp/mgts-smoke-20260706-184120/create.json -rw-r--r-- root:root 813 2026-07-04 10:43 /opt/wg-access/STATUS-STEP-008_AGENT_TIMER_OK.txt -rw-r--r-- root:root 83 2026-07-04 10:17 /opt/wg-access/backend/app/db/base.py -rw-r--r-- root:root 875 2026-07-04 10:38 /opt/wg-access/STATUS-STEP-007_AGENT_DRY_RUN_OK.txt -rw-r--r-- root:root 899 2026-07-06 18:56 /opt/wg-access/DEFERRED_TASKS.md -rw-r--r-- root:root 928 2026-07-04 16:00 /opt/wg-access/STATUS-STEP-019A_TEST_PEERS_CLEANED_OK.txt -rw-r--r-- root:root 951 2026-07-04 13:25 /opt/wg-access/docker-compose.yml.BEFORE_REAL_WG_KEYS.20260704-132545 -rw-r--r-- root:root 964 2026-07-04 13:25 /opt/wg-access/docker-compose.yml -rw-r--r-- root:root 9964 2026-07-04 18:06 /opt/wg-access/backups/step025a/admin.py.20260704-180655.bak -rwxr-xr-x root:root 10349 2026-07-04 13:45 /opt/wg-access/agent/wg_access_agent.py -rwxr-xr-x root:root 4817 2026-07-04 13:21 /opt/wg-access/agent/wg_access_agent.py.BEFORE_REAL_SSH_WG_SET.20260704-132120 -rwxr-xr-x root:root 7492 2026-07-04 13:45 /opt/wg-access/agent/wg_access_agent.py.BEFORE_RECONCILE_SYNC.20260704-134532 drwx------ root:root 4096 2026-07-04 13:08 /opt/wg-access/agent/ssh drwxr-xr-x root:root 4096 2026-07-04 10:11 /opt/wg-access/deploy drwxr-xr-x root:root 4096 2026-07-04 10:18 /opt/wg-access/backend drwxr-xr-x root:root 4096 2026-07-04 10:18 /opt/wg-access/backend/alembic drwxr-xr-x root:root 4096 2026-07-04 10:18 /opt/wg-access/backend/alembic/__pycache__ drwxr-xr-x root:root 4096 2026-07-04 10:18 /opt/wg-access/backend/alembic/versions drwxr-xr-x root:root 4096 2026-07-04 10:18 /opt/wg-access/backend/alembic/versions/__pycache__ drwxr-xr-x root:root 4096 2026-07-04 10:18 /opt/wg-access/backend/app/models drwxr-xr-x root:root 4096 2026-07-04 10:20 /opt/wg-access/backend/app/db drwxr-xr-x root:root 4096 2026-07-04 10:21 /opt/wg-access/backend/app/db/__pycache__ drwxr-xr-x root:root 4096 2026-07-04 10:31 /opt/wg-access/backend/app/__pycache__ drwxr-xr-x root:root 4096 2026-07-04 10:37 /opt/wg-access/agent/logs drwxr-xr-x root:root 4096 2026-07-04 13:14 /opt/wg-access/manual-tests drwxr-xr-x root:root 4096 2026-07-04 13:45 /opt/wg-access/agent/__pycache__ drwxr-xr-x root:root 4096 2026-07-04 15:16 /opt/wg-access/backend/app/api drwxr-xr-x root:root 4096 2026-07-04 15:54 /opt/wg-access/backend/app/models/__pycache__ drwxr-xr-x root:root 4096 2026-07-04 15:54 /opt/wg-access/backups/step018b drwxr-xr-x root:root 4096 2026-07-04 16:05 /opt/wg-access/backups/step020b drwxr-xr-x root:root 4096 2026-07-04 16:06 /opt/wg-access/backups/step020c drwxr-xr-x root:root 4096 2026-07-04 16:29 /opt/wg-access/backend/app drwxr-xr-x root:root 4096 2026-07-04 16:29 /opt/wg-access/backend/app/services drwxr-xr-x root:root 4096 2026-07-04 16:29 /opt/wg-access/backend/app/services/__pycache__ drwxr-xr-x root:root 4096 2026-07-04 16:29 /opt/wg-access/backups/step021b drwxr-xr-x root:root 4096 2026-07-04 16:36 /opt/wg-access/backups/step022a drwxr-xr-x root:root 4096 2026-07-04 17:27 /opt/wg-access/backups/step023a drwxr-xr-x root:root 4096 2026-07-04 17:47 /opt/wg-access/backups/step024a drwxr-xr-x root:root 4096 2026-07-04 18:06 /opt/wg-access/backups/step025a drwxr-xr-x root:root 4096 2026-07-04 18:20 /opt/wg-access/backend/app/api/__pycache__ drwxr-xr-x root:root 4096 2026-07-04 18:20 /opt/wg-access/backups drwxr-xr-x root:root 4096 2026-07-04 18:20 /opt/wg-access/backups/step026a drwxr-xr-x root:root 4096 2026-07-06 18:33 /opt/wg-access/agent drwxr-xr-x root:root 4096 2026-07-06 18:39 /opt/wg-access/tmp/mgts-smoke-20260706-183921 drwxr-xr-x root:root 4096 2026-07-06 18:41 /opt/wg-access/tmp drwxr-xr-x root:root 4096 2026-07-06 18:48 /opt/wg-access/agent/state drwxr-xr-x root:root 4096 2026-07-06 18:48 /opt/wg-access/tmp/mgts-smoke-20260706-184120 drwxr-xr-x root:root 4096 2026-07-06 18:56 /opt/wg-access drwxr-xr-x root:root 4096 2026-07-08 00:02 /opt/wg-access/maintenance-logs === scripts/tools candidates === /opt/wg-access/.env /opt/wg-access/.env.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636 /opt/wg-access/.env.BEFORE_MGTS_CLIENTCFG_20260706-185027 /opt/wg-access/.env.BEFORE_MGTS_CLIENTCFG_20260706-185140 /opt/wg-access/26.1.2 /opt/wg-access/DEFERRED_TASKS.md /opt/wg-access/STATUS-STEP-002-BACKEND-DB-OK.txt /opt/wg-access/STATUS-STEP-005_API_DB_OK.txt /opt/wg-access/STATUS-STEP-006_AGENT_PULL_API_OK.txt /opt/wg-access/STATUS-STEP-007_AGENT_DRY_RUN_OK.txt /opt/wg-access/STATUS-STEP-008_AGENT_TIMER_OK.txt /opt/wg-access/STATUS-STEP-010_AGENT_SSH_TO_VM100_OK.txt /opt/wg-access/STATUS-STEP-011_MANUAL_WG_SET_VM100_OK.txt /opt/wg-access/STATUS-STEP-012_REAL_AGENT_PROVISION_VM100_OK.txt /opt/wg-access/STATUS-STEP-013_WG_HANDSHAKE_VM121_TO_VM100_OK.txt /opt/wg-access/STATUS-STEP-014_AGENT_RECONCILE_SYNC_OK.txt /opt/wg-access/STATUS-STEP-015_DISABLE_DEPROVISION_OK.txt /opt/wg-access/STATUS-STEP-016_CLIENT_CONFIG_RESPONSE_OK.txt /opt/wg-access/STATUS-STEP-017_GENERATED_CLIENT_CONFIG_HANDSHAKE_OK.txt /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt /opt/wg-access/STATUS-STEP-019A_TEST_PEERS_CLEANED_OK.txt /opt/wg-access/STATUS-STEP-019B_CLEAN_POOL_SMOKE_OK.txt /opt/wg-access/STATUS-STEP-020C_AGENT_TIMER_REAL_PERIODIC_OK.txt /opt/wg-access/STATUS-STEP-020D_TIMER_AUTO_PROVISION_DEPROVISION_OK.txt /opt/wg-access/STATUS-STEP-021C_ADMIN_SUBSCRIPTION_FLOW_OK.txt /opt/wg-access/STATUS-STEP-022B_DEV_ENDPOINT_USES_SHARED_WG_SERVICE_OK.txt /opt/wg-access/STATUS-STEP-023A_DEV_ENDPOINT_GUARD_OK.txt /opt/wg-access/STATUS-STEP-024A_ADMIN_USER_VIEW_OK.txt /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt /opt/wg-access/STATUS-STEP-028A_MGTS_WG_PAID_E2E_OK.txt /opt/wg-access/STEP_002_BACKEND_DB_OK /opt/wg-access/agent/__pycache__/wg_access_agent.cpython-311.pyc /opt/wg-access/agent/agent.env /opt/wg-access/agent/agent.env.BEFORE_MGTS_REMOTE_HOST_20260706-183324 /opt/wg-access/agent/agent.env.BEFORE_REAL_SSH_WG_SET.20260704-132120 /opt/wg-access/agent/logs/agent.log /opt/wg-access/agent/ssh/wg_access_agent_ed25519 /opt/wg-access/agent/ssh/wg_access_agent_ed25519.pub /opt/wg-access/agent/state/active-peers.json /opt/wg-access/agent/wg_access_agent.py /opt/wg-access/agent/wg_access_agent.py.BEFORE_REAL_SSH_WG_SET.20260704-132120 /opt/wg-access/agent/wg_access_agent.py.BEFORE_RECONCILE_SYNC.20260704-134532 /opt/wg-access/backend/alembic.ini /opt/wg-access/backend/alembic/__pycache__/env.cpython-312.pyc /opt/wg-access/backend/alembic/env.py /opt/wg-access/backend/alembic/versions/0001_initial_schema.py /opt/wg-access/backend/app/__pycache__/config.cpython-312.pyc /opt/wg-access/backend/app/__pycache__/main.cpython-312.pyc /opt/wg-access/backend/app/api/admin.py /opt/wg-access/backend/app/api/admin.py.BEFORE_DISABLE_PEER.20260704-151253 /opt/wg-access/backend/app/api/agent.py /opt/wg-access/backend/app/api/agent.py.BEFORE_AGENT_PEERS_SYNC.20260704-133954 /opt/wg-access/backend/app/api/dev.py /opt/wg-access/backend/app/api/dev.py.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636 /opt/wg-access/backend/app/api/dev.py.BEFORE_REAL_WG_KEYS.20260704-132545 /opt/wg-access/backend/app/config.py /opt/wg-access/backend/app/db/base.py /opt/wg-access/backend/app/db/session.py /opt/wg-access/backend/app/main.py /opt/wg-access/backend/app/models/__init__.py /opt/wg-access/backend/app/models/core.py /opt/wg-access/backend/app/services/__init__.py /opt/wg-access/backend/app/services/wireguard.py /opt/wg-access/backups/step018b/core.py.20260704-155437.bak /opt/wg-access/backups/step018b/dev.py.20260704-155255.bak /opt/wg-access/backups/step018b/peers.20260704-155255.sql /opt/wg-access/backups/step020b/wg-access-agent.service.20260704-160536.bak /opt/wg-access/backups/step020b/wg-access-agent.timer.20260704-160536.bak /opt/wg-access/backups/step020c/wg-access-agent.timer.20260704-160647.bak /opt/wg-access/backups/step021b/admin.py.20260704-162930.bak /opt/wg-access/backups/step021b/dev.py.20260704-162930.bak /opt/wg-access/backups/step022a/dev.py.20260704-163658.bak /opt/wg-access/backups/step022a/wireguard.py.20260704-163658.bak /opt/wg-access/backups/step023a/config.py.20260704-172733.bak /opt/wg-access/backups/step023a/dev.py.20260704-172733.bak /opt/wg-access/backups/step024a/admin.py.20260704-174718.bak /opt/wg-access/backups/step025a/admin.py.20260704-180655.bak /opt/wg-access/backups/step026a/admin.py.20260704-182045.bak /opt/wg-access/current /opt/wg-access/docker-compose.yml /opt/wg-access/docker-compose.yml.BEFORE_REAL_WG_KEYS.20260704-132545 /opt/wg-access/maintenance-logs/expire-subscriptions.20260705.log /opt/wg-access/maintenance-logs/expire-subscriptions.20260706.log /opt/wg-access/maintenance-logs/expire-subscriptions.20260707.log /opt/wg-access/maintenance-logs/expire-subscriptions.20260708.log /opt/wg-access/manual-tests/client_test_001.key /opt/wg-access/manual-tests/client_test_001.psk /opt/wg-access/manual-tests/client_test_001.pub /opt/wg-access/tmp/mgts-smoke-20260706-183921/create.json /opt/wg-access/tmp/mgts-smoke-20260706-183921/peers-before.json /opt/wg-access/tmp/mgts-smoke-20260706-184120/allowed-ips-after-cancel.txt /opt/wg-access/tmp/mgts-smoke-20260706-184120/allowed-ips-after-enable.txt /opt/wg-access/tmp/mgts-smoke-20260706-184120/client.conf /opt/wg-access/tmp/mgts-smoke-20260706-184120/client.mgts.conf /opt/wg-access/tmp/mgts-smoke-20260706-184120/create.json /opt/wg-access/tmp/mgts-smoke-20260706-184120/smoke.env /usr/local/sbin/wg-access-expire-subscriptions.sh /root/.sudo_as_admin_successful === executable tool summaries === ### /usr/local/sbin/wg-access-expire-subscriptions.sh -rwxr-xr-x 1 root root 1247 Jul 5 10:19 /usr/local/sbin/wg-access-expire-subscriptions.sh #!/usr/bin/env bash set -euo pipefail URL="${WG_ACCESS_EXPIRE_URL:-http://127.0.0.1:18080/admin/maintenance/expire-subscriptions}" LOG_DIR="/opt/wg-access/maintenance-logs" LOCK="/run/wg-access-expire-subscriptions.lock" mkdir -p "$LOG_DIR" ts="$(date -Is)" out="$LOG_DIR/expire-subscriptions.$(date +%Y%m%d).log" { echo "== $ts expire-subscriptions ==" flock -n 9 || { echo "another expire-subscriptions run is already active" exit 0 } rm -f /tmp/wg-access-expire-subscriptions.out /tmp/wg-access-expire-subscriptions.err code= curl -fsS \ -m 30 \ -X POST \ -o /tmp/wg-access-expire-subscriptions.out \ -w "%{http_code}" \ "$URL" 2>/tmp/wg-access-expire-subscriptions.err || true )" echo "http_code= if [ -s /tmp/wg-access-expire-subscriptions.out ]; then cat /tmp/wg-access-expire-subscriptions.out echo fi if [ -s /tmp/wg-access-expire-subscriptions.err ]; then echo "stderr:" cat /tmp/wg-access-expire-subscriptions.err fi rm -f /tmp/wg-access-expire-subscriptions.out /tmp/wg-access-expire-subscriptions.err case "$code" in 2*) exit 0 ;; *) echo "ERROR: expire-subscriptions failed"; exit 1 ;; esac } 9>"$LOCK" | tee -a "$out" === git / source status, if present === === docker containers === NAMES IMAGE STATUS PORTS wgaccess-backend python:3.12-slim Up 41 hours 0.0.0.0:18080->8000/tcp wgaccess-postgres postgres:16-alpine Up 41 hours (healthy) 127.0.0.1:15432->5432/tcp === docker compose files, redacted === --- REDACTED FILE: /opt/wg-access/docker-compose.yml --- services: postgres: image: postgres:16-alpine container_name: wgaccess-postgres restart: unless-stopped env_file: - .env volumes: - wgaccess_pgdata:/var/lib/postgresql/data ports: - "127.0.0.1:15432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U wg_access -d wg_access"] interval: 10s timeout: 5s retries: 5 backend: image: python:3.12-slim container_name: wgaccess-backend restart: unless-stopped working_dir: /app volumes: - ./backend:/app env_file: - .env ports: - "0.0.0.0:${BACKEND_PORT:-18080}:8000" command: > sh -c " pip install --no-cache-dir fastapi uvicorn psycopg[binary] sqlalchemy alembic pydantic-settings email-validator cryptography && uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload " depends_on: postgres: condition: service_healthy volumes: wgaccess_pgdata: === env files, keys only/redacted === ### /opt/wg-access/.env -rw------- 1 root root 541 Jul 6 18:51 /opt/wg-access/.env POSTGRES_DB= POSTGRES_USER= POSTGRES_PASSWORD= DATABASE_URL= APP_SECRET= BACKEND_PORT= ENVIRONMENT= AGENT_TOKEN= WG_SERVER_PUBLIC_KEY= WG_CLIENT_ENDPOINT= WG_CLIENT_ALLOWED_IPS= WG_CLIENT_POOL_CIDR= WG_CLIENT_FIRST_IP= ### /opt/wg-access/.env.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636 -rw------- 1 root root 341 Jul 4 15:16 /opt/wg-access/.env.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636 POSTGRES_DB= POSTGRES_USER= POSTGRES_PASSWORD= DATABASE_URL= APP_SECRET= BACKEND_PORT= ENVIRONMENT= AGENT_TOKEN= ### /opt/wg-access/.env.BEFORE_MGTS_CLIENTCFG_20260706-185027 -rw------- 1 root root 546 Jul 4 15:54 /opt/wg-access/.env.BEFORE_MGTS_CLIENTCFG_20260706-185027 POSTGRES_DB= POSTGRES_USER= POSTGRES_PASSWORD= DATABASE_URL= APP_SECRET= BACKEND_PORT= ENVIRONMENT= AGENT_TOKEN= WG_SERVER_PUBLIC_KEY= WG_CLIENT_ENDPOINT= WG_CLIENT_ALLOWED_IPS= WG_CLIENT_POOL_CIDR= WG_CLIENT_FIRST_IP= ### /opt/wg-access/.env.BEFORE_MGTS_CLIENTCFG_20260706-185140 -rw------- 1 root root 541 Jul 6 18:50 /opt/wg-access/.env.BEFORE_MGTS_CLIENTCFG_20260706-185140 POSTGRES_DB= POSTGRES_USER= POSTGRES_PASSWORD= DATABASE_URL= APP_SECRET= BACKEND_PORT= ENVIRONMENT= AGENT_TOKEN= WG_SERVER_PUBLIC_KEY= WG_CLIENT_ENDPOINT= WG_CLIENT_ALLOWED_IPS= WG_CLIENT_POOL_CIDR= WG_CLIENT_FIRST_IP= ### /opt/wg-access/agent/agent.env -rw------- 1 root root 347 Jul 6 18:33 /opt/wg-access/agent/agent.env BACKEND_URL= NODE_ID= AGENT_TOKEN= STATE_FILE= LOG_FILE= REMOTE_HOST= REMOTE_USER= REMOTE_SSH_KEY= REMOTE_WG_INTERFACE= ### /opt/wg-access/tmp/mgts-smoke-20260706-184120/smoke.env -rw-r--r-- 1 root root 218 Jul 6 18:41 /opt/wg-access/tmp/mgts-smoke-20260706-184120/smoke.env WORK= SUB_ID= PEER_ID= TUNNEL_IP= PUBLIC_KEY= === systemd wg-access services/timers === docker.service loaded active running Docker Application Container Engine wg-access-agent.service loaded inactive dead WG Access Agent real poller wg-access-expire-subscriptions.service loaded inactive dead WG Access expire subscriptions maintenance wg-access-expire-subscriptions.timer loaded active waiting Run WG Access expire subscriptions maintenance periodically ### systemctl status wg-access-expire-subscriptions.service ○ wg-access-expire-subscriptions.service - WG Access expire subscriptions maintenance Loaded: loaded (/etc/systemd/system/wg-access-expire-subscriptions.service; static) Active: inactive (dead) since Wed 2026-07-08 11:29:13 UTC; 4min 22s ago TriggeredBy: ● wg-access-expire-subscriptions.timer Process: 742468 ExecStart=/usr/local/sbin/wg-access-expire-subscriptions.sh (code=exited, status=0/SUCCESS) Main PID: 742468 (code=exited, status=0/SUCCESS) CPU: 20ms Jul 08 11:29:13 wg-access-dev systemd[1]: Starting wg-access-expire-subscriptions.service - WG Access expire subscriptions maintenance... Jul 08 11:29:13 wg-access-dev wg-access-expire-subscriptions.sh[742473]: == 2026-07-08T11:29:13+00:00 expire-subscriptions == Jul 08 11:29:13 wg-access-dev wg-access-expire-subscriptions.sh[742473]: http_code=200 Jul 08 11:29:13 wg-access-dev wg-access-expire-subscriptions.sh[742473]: {"expired_subscription_count":0,"disabled_peer_count":0,"job_ids":[],"subscription_ids":[]} Jul 08 11:29:13 wg-access-dev systemd[1]: wg-access-expire-subscriptions.service: Deactivated successfully. Jul 08 11:29:13 wg-access-dev systemd[1]: Finished wg-access-expire-subscriptions.service - WG Access expire subscriptions maintenance. ### unit cat wg-access-expire-subscriptions.service # /etc/systemd/system/wg-access-expire-subscriptions.service [Unit] Description=WG Access expire subscriptions maintenance Wants=network-online.target After=network-online.target docker.service wg-access-agent.service [Service] Type=oneshot ExecStart=/usr/local/sbin/wg-access-expire-subscriptions.sh User=root Group=root ### systemctl status wg-access-expire-subscriptions.timer ● wg-access-expire-subscriptions.timer - Run WG Access expire subscriptions maintenance periodically Loaded: loaded (/etc/systemd/system/wg-access-expire-subscriptions.timer; enabled; preset: enabled) Active: active (waiting) since Sun 2026-07-05 10:19:47 UTC; 3 days ago Trigger: Wed 2026-07-08 11:34:42 UTC; 1min 6s left Triggers: ● wg-access-expire-subscriptions.service Jul 05 10:19:47 wg-access-dev systemd[1]: Started wg-access-expire-subscriptions.timer - Run WG Access expire subscriptions maintenance periodically. ### unit cat wg-access-expire-subscriptions.timer # /etc/systemd/system/wg-access-expire-subscriptions.timer [Unit] Description=Run WG Access expire subscriptions maintenance periodically [Timer] OnBootSec=2min OnUnitActiveSec=5min AccuracySec=30s RandomizedDelaySec=30s Persistent=true [Install] WantedBy=timers.target ### systemctl status wg-access-backend.service ### unit cat wg-access-backend.service ### systemctl status wg-access-agent.service ○ wg-access-agent.service - WG Access Agent real poller Loaded: loaded (/etc/systemd/system/wg-access-agent.service; static) Active: inactive (dead) since Mon 2026-07-06 18:48:38 UTC; 1 day 16h ago Process: 440716 ExecStart=/opt/wg-access/agent/wg_access_agent.py (code=exited, status=0/SUCCESS) Main PID: 440716 (code=exited, status=0/SUCCESS) CPU: 134ms Jul 06 18:48:38 wg-access-dev wg_access_agent.py[440716]: [2026-07-06T18:48:38.432384+00:00] fetched pending jobs: 1 Jul 06 18:48:38 wg-access-dev wg_access_agent.py[440716]: [2026-07-06T18:48:38.432485+00:00] starting job_id=c2d55542-713c-4cb2-9040-7d64bdf511bb action=disable_peer Jul 06 18:48:38 wg-access-dev wg_access_agent.py[440716]: [2026-07-06T18:48:38.904617+00:00] remote stdout: interface: wg_paid Jul 06 18:48:38 wg-access-dev wg_access_agent.py[440716]: public key: FD1J+KVZ965pCjgtO0YWxJsKANY9uz6v1P54JLkiZzY= Jul 06 18:48:38 wg-access-dev wg_access_agent.py[440716]: private key: (hidden) Jul 06 18:48:38 wg-access-dev wg_access_agent.py[440716]: listening port: 51830 Jul 06 18:48:38 wg-access-dev wg_access_agent.py[440716]: [2026-07-06T18:48:38.905015+00:00] REAL disable_peer peer_id=3d03a7a2-c009-48a4-b6ff-214326d26fc0 Jul 06 18:48:38 wg-access-dev wg_access_agent.py[440716]: [2026-07-06T18:48:38.911811+00:00] completed job_id=c2d55542-713c-4cb2-9040-7d64bdf511bb status=completed attempts=1 Jul 06 18:48:38 wg-access-dev systemd[1]: wg-access-agent.service: Deactivated successfully. Jul 06 18:48:38 wg-access-dev systemd[1]: Finished wg-access-agent.service - WG Access Agent real poller. ### unit cat wg-access-agent.service # /etc/systemd/system/wg-access-agent.service [Unit] Description=WG Access Agent real poller After=network-online.target docker.service Wants=network-online.target [Service] Type=oneshot User=root WorkingDirectory=/opt/wg-access/agent Environment=WG_ACCESS_AGENT_ENV=/opt/wg-access/agent/agent.env ExecStart=/opt/wg-access/agent/wg_access_agent.py === cron === /etc/cron.d: total 12 drwxr-xr-x 2 root root 4096 Jun 15 04:54 . drwxr-xr-x 72 root root 4096 Jul 4 10:45 .. -rw-r--r-- 1 root root 201 Jun 6 2025 e2scrub_all /etc/cron.daily: total 20 drwxr-xr-x 2 root root 4096 Jun 15 04:56 . drwxr-xr-x 72 root root 4096 Jul 4 10:45 .. -rwxr-xr-x 1 root root 1478 May 25 2023 apt-compat -rwxr-xr-x 1 root root 123 Dec 16 2025 dpkg -rwxr-xr-x 1 root root 1395 Mar 12 2023 man-db /etc/cron.weekly: total 12 drwxr-xr-x 2 root root 4096 Jun 15 04:56 . drwxr-xr-x 72 root root 4096 Jul 4 10:45 .. -rwxr-xr-x 1 root root 1055 Mar 12 2023 man-db === backend/API health candidates === ### http://127.0.0.1:8000/health curl: (7) Failed to connect to 127.0.0.1 port 8000 after 0 ms: Couldn't connect to server curl_rc=0 ### http://127.0.0.1:8080/health curl: (7) Failed to connect to 127.0.0.1 port 8080 after 0 ms: Couldn't connect to server curl_rc=0 ### http://localhost:8000/health curl: (7) Failed to connect to localhost port 8000 after 0 ms: Couldn't connect to server curl_rc=0 ### http://localhost:8080/health curl: (7) Failed to connect to localhost port 8080 after 0 ms: Couldn't connect to server curl_rc=0 === openapi/admin endpoints if unauthenticated local fetch works === ### http://127.0.0.1:8000/openapi.json paths openapi_fetch_failed: ### http://127.0.0.1:8080/openapi.json paths openapi_fetch_failed: === database/docker volumes hints, no data dump === DRIVER VOLUME NAME local wg-access_wgaccess_pgdata "Image": "sha256:423ed6ab25b1921a477529254bfeeabf5855151dc2c3141699a1bfc852199fbf", "Name": "/wgaccess-backend", "Name": "unless-stopped", "Name": "overlayfs" "Source": "/opt/wg-access/backend", "Destination": "/app", "Mode": "rw", "Image": "python:3.12-slim", "IPAddress": "172.18.0.3", "Image": "sha256:e013e867e712fec275706a6c51c966f0bb0c93cfa8f51000f85a15f9865a28cb", "Name": "/wgaccess-postgres", "Name": "unless-stopped", "Name": "overlayfs" "Name": "wg-access_wgaccess_pgdata", "Source": "/var/lib/docker/volumes/wg-access_wgaccess_pgdata/_data", "Destination": "/var/lib/postgresql/data", "Mode": "rw", "Image": "postgres:16-alpine", "IPAddress": "172.18.0.2", === status/smoke files === /opt/wg-access/STATUS-STEP-002-BACKEND-DB-OK.txt /opt/wg-access/STATUS-STEP-005_API_DB_OK.txt /opt/wg-access/STATUS-STEP-006_AGENT_PULL_API_OK.txt /opt/wg-access/STATUS-STEP-007_AGENT_DRY_RUN_OK.txt /opt/wg-access/STATUS-STEP-008_AGENT_TIMER_OK.txt /opt/wg-access/STATUS-STEP-010_AGENT_SSH_TO_VM100_OK.txt /opt/wg-access/STATUS-STEP-011_MANUAL_WG_SET_VM100_OK.txt /opt/wg-access/STATUS-STEP-012_REAL_AGENT_PROVISION_VM100_OK.txt /opt/wg-access/STATUS-STEP-013_WG_HANDSHAKE_VM121_TO_VM100_OK.txt /opt/wg-access/STATUS-STEP-014_AGENT_RECONCILE_SYNC_OK.txt /opt/wg-access/STATUS-STEP-015_DISABLE_DEPROVISION_OK.txt /opt/wg-access/STATUS-STEP-016_CLIENT_CONFIG_RESPONSE_OK.txt /opt/wg-access/STATUS-STEP-017_GENERATED_CLIENT_CONFIG_HANDSHAKE_OK.txt /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt /opt/wg-access/STATUS-STEP-019A_TEST_PEERS_CLEANED_OK.txt /opt/wg-access/STATUS-STEP-019B_CLEAN_POOL_SMOKE_OK.txt /opt/wg-access/STATUS-STEP-020C_AGENT_TIMER_REAL_PERIODIC_OK.txt /opt/wg-access/STATUS-STEP-020D_TIMER_AUTO_PROVISION_DEPROVISION_OK.txt /opt/wg-access/STATUS-STEP-021C_ADMIN_SUBSCRIPTION_FLOW_OK.txt /opt/wg-access/STATUS-STEP-022B_DEV_ENDPOINT_USES_SHARED_WG_SERVICE_OK.txt /opt/wg-access/STATUS-STEP-023A_DEV_ENDPOINT_GUARD_OK.txt /opt/wg-access/STATUS-STEP-024A_ADMIN_USER_VIEW_OK.txt /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt /opt/wg-access/STATUS-STEP-028A_MGTS_WG_PAID_E2E_OK.txt /opt/wg-access/STEP_002_BACKEND_DB_OK /opt/wg-access/tmp/mgts-smoke-20260706-183921/create.json /opt/wg-access/tmp/mgts-smoke-20260706-183921/peers-before.json /opt/wg-access/tmp/mgts-smoke-20260706-184120/allowed-ips-after-cancel.txt /opt/wg-access/tmp/mgts-smoke-20260706-184120/allowed-ips-after-enable.txt /opt/wg-access/tmp/mgts-smoke-20260706-184120/client.conf /opt/wg-access/tmp/mgts-smoke-20260706-184120/client.mgts.conf /opt/wg-access/tmp/mgts-smoke-20260706-184120/create.json /opt/wg-access/tmp/mgts-smoke-20260706-184120/smoke.env === selected README/docs heads === === UCI pending not applicable, but local pending/gitrepo check done === === STEP_034A RESULT === remote_rc=0 wg_access_dir_lines=288 tooling_related_lines=359 docker_related_lines=365 health_related_lines=97 env_redacted_lines=63 decision=PASS_VM121_WG_ACCESS_INVENTORY