diff --git a/docs/cf-backup/tp41-20260901/app-16aaec78-5951-4cf3-aad5-79f63163b5ea-policies.json b/docs/cf-backup/tp41-20260901/app-16aaec78-5951-4cf3-aad5-79f63163b5ea-policies.json new file mode 100644 index 0000000..0bf81d6 --- /dev/null +++ b/docs/cf-backup/tp41-20260901/app-16aaec78-5951-4cf3-aad5-79f63163b5ea-policies.json @@ -0,0 +1,85 @@ +{ + "result": [ + { + "created_at": "2026-02-28T21:26:56Z", + "decision": "allow", + "exclude": [], + "id": "8e44f5d1-8257-443e-a797-b3de939952ee", + "include": [ + { + "email": { + "email": "christoph@emsenhuber.com" + } + }, + { + "login_method": { + "id": "72c1291b-a38d-4bc7-af97-5dee04a4f84a" + } + }, + { + "login_method": { + "id": "9024c7a6-2d1f-4432-9f48-51593acd1361" + } + } + ], + "name": "christoph", + "require": [], + "connection_rules": { + "rdp": {} + }, + "session_duration": "730h", + "uid": "8e44f5d1-8257-443e-a797-b3de939952ee", + "updated_at": "2026-07-31T07:27:41Z", + "reusable": true, + "precedence": 1 + }, + { + "created_at": "2026-05-09T06:45:22Z", + "decision": "non_identity", + "exclude": [], + "id": "5165d139-8733-4d31-a3a5-f6f1d0fd8643", + "include": [ + { + "ip": { + "ip": "90.146.33.177/32" + } + } + ], + "name": "bf4", + "require": [], + "uid": "5165d139-8733-4d31-a3a5-f6f1d0fd8643", + "updated_at": "2026-08-07T21:36:42Z", + "reusable": true, + "precedence": 2 + }, + { + "created_at": "2026-05-15T13:11:36Z", + "decision": "non_identity", + "exclude": [], + "id": "39fe0e9d-6f63-414d-9d6d-440a7a151f5d", + "include": [ + { + "service_token": { + "token_id": "65f1821a-f134-4e20-aa66-baf31daddbed" + } + } + ], + "name": "claude-mcp", + "require": [], + "uid": "39fe0e9d-6f63-414d-9d6d-440a7a151f5d", + "updated_at": "2026-07-31T15:44:48Z", + "reusable": true, + "precedence": 3 + } + ], + "success": true, + "errors": [], + "messages": [], + "result_info": { + "page": 1, + "per_page": 200, + "count": 3, + "total_count": 3, + "total_pages": 1 + } +} diff --git a/docs/cf-backup/tp41-20260901/app-16aaec78-5951-4cf3-aad5-79f63163b5ea.json b/docs/cf-backup/tp41-20260901/app-16aaec78-5951-4cf3-aad5-79f63163b5ea.json new file mode 100644 index 0000000..fcb49d1 --- /dev/null +++ b/docs/cf-backup/tp41-20260901/app-16aaec78-5951-4cf3-aad5-79f63163b5ea.json @@ -0,0 +1,116 @@ +{ + "result": { + "id": "16aaec78-5951-4cf3-aad5-79f63163b5ea", + "uid": "16aaec78-5951-4cf3-aad5-79f63163b5ea", + "type": "self_hosted", + "name": "*.emsenhuber.net", + "aud": "d5bb8c4852895834a0010d6f63882f140cf27faf41f94374532c1f013a15c02d", + "created_at": "2026-05-05T11:44:38Z", + "updated_at": "2026-05-15T13:30:13Z", + "domain": "*.emsenhuber.net", + "self_hosted_domains": [ + "*.emsenhuber.net" + ], + "destinations": [ + { + "type": "public", + "uri": "*.emsenhuber.net" + } + ], + "app_launcher_visible": true, + "allowed_idps": [], + "tags": [], + "auto_redirect_to_identity": false, + "policies": [ + { + "created_at": "2026-02-28T21:26:56Z", + "decision": "allow", + "exclude": [], + "id": "8e44f5d1-8257-443e-a797-b3de939952ee", + "include": [ + { + "email": { + "email": "christoph@emsenhuber.com" + } + }, + { + "login_method": { + "id": "72c1291b-a38d-4bc7-af97-5dee04a4f84a" + } + }, + { + "login_method": { + "id": "9024c7a6-2d1f-4432-9f48-51593acd1361" + } + } + ], + "name": "christoph", + "require": [], + "connection_rules": { + "rdp": {} + }, + "session_duration": "730h", + "uid": "8e44f5d1-8257-443e-a797-b3de939952ee", + "updated_at": "2026-07-31T07:27:41Z", + "reusable": true, + "precedence": 1 + }, + { + "created_at": "2026-05-09T06:45:22Z", + "decision": "non_identity", + "exclude": [], + "id": "5165d139-8733-4d31-a3a5-f6f1d0fd8643", + "include": [ + { + "ip": { + "ip": "90.146.33.177/32" + } + } + ], + "name": "bf4", + "require": [], + "uid": "5165d139-8733-4d31-a3a5-f6f1d0fd8643", + "updated_at": "2026-08-07T21:36:42Z", + "reusable": true, + "precedence": 2 + }, + { + "created_at": "2026-05-15T13:11:36Z", + "decision": "non_identity", + "exclude": [], + "id": "39fe0e9d-6f63-414d-9d6d-440a7a151f5d", + "include": [ + { + "service_token": { + "token_id": "65f1821a-f134-4e20-aa66-baf31daddbed" + } + } + ], + "name": "claude-mcp", + "require": [], + "uid": "39fe0e9d-6f63-414d-9d6d-440a7a151f5d", + "updated_at": "2026-07-31T15:44:48Z", + "reusable": true, + "precedence": 3 + } + ], + "session_duration": "24h", + "enable_binding_cookie": false, + "http_only_cookie_attribute": false, + "options_preflight_bypass": false, + "oauth_configuration": { + "enabled": false, + "dynamic_client_registration": { + "enabled": true, + "allowed_uris": [ + "https://ha-mcp.emsenhuber.net" + ], + "allow_any_on_localhost": true, + "allow_any_on_loopback": true + } + } + }, + "success": true, + "errors": [], + "messages": [] +} diff --git a/docs/cf-backup/tp41-20260901/app-1dbc45ca-1376-4a0d-b608-69db58f1875c-policies.json b/docs/cf-backup/tp41-20260901/app-1dbc45ca-1376-4a0d-b608-69db58f1875c-policies.json new file mode 100644 index 0000000..22333a4 --- /dev/null +++ b/docs/cf-backup/tp41-20260901/app-1dbc45ca-1376-4a0d-b608-69db58f1875c-policies.json @@ -0,0 +1,34 @@ +{ + "result": [ + { + "created_at": "2026-06-13T08:34:00Z", + "decision": "bypass", + "exclude": [], + "id": "a8129e37-d3c2-456d-8630-3c6a3449d3f2", + "include": [ + { + "everyone": {} + } + ], + "name": "bypass", + "require": [], + "connection_rules": { + "rdp": {} + }, + "uid": "a8129e37-d3c2-456d-8630-3c6a3449d3f2", + "updated_at": "2026-06-13T08:48:05Z", + "reusable": true, + "precedence": 1 + } + ], + "success": true, + "errors": [], + "messages": [], + "result_info": { + "page": 1, + "per_page": 200, + "count": 1, + "total_count": 1, + "total_pages": 1 + } +} diff --git a/docs/cf-backup/tp41-20260901/app-1dbc45ca-1376-4a0d-b608-69db58f1875c.json b/docs/cf-backup/tp41-20260901/app-1dbc45ca-1376-4a0d-b608-69db58f1875c.json new file mode 100644 index 0000000..7547dfb --- /dev/null +++ b/docs/cf-backup/tp41-20260901/app-1dbc45ca-1376-4a0d-b608-69db58f1875c.json @@ -0,0 +1,64 @@ +{ + "result": { + "id": "1dbc45ca-1376-4a0d-b608-69db58f1875c", + "uid": "1dbc45ca-1376-4a0d-b608-69db58f1875c", + "type": "self_hosted", + "name": "hass, vw, gitea", + "aud": "817b2b82d2b1aa9c12de854c7bce9f608b33721f0827cfded68bdc7c5eb92a46", + "created_at": "2026-06-13T08:32:39Z", + "updated_at": "2026-07-12T12:43:25Z", + "domain": "vw.emsenhuber.net", + "self_hosted_domains": [ + "vw.emsenhuber.net", + "hass.emsenhuber.net", + "gitea.emsenhuber.net" + ], + "destinations": [ + { + "type": "public", + "uri": "vw.emsenhuber.net" + }, + { + "type": "public", + "uri": "hass.emsenhuber.net" + }, + { + "type": "public", + "uri": "gitea.emsenhuber.net" + } + ], + "app_launcher_visible": true, + "allowed_idps": [], + "tags": [], + "auto_redirect_to_identity": false, + "policies": [ + { + "created_at": "2026-06-13T08:34:00Z", + "decision": "bypass", + "exclude": [], + "id": "a8129e37-d3c2-456d-8630-3c6a3449d3f2", + "include": [ + { + "everyone": {} + } + ], + "name": "bypass", + "require": [], + "connection_rules": { + "rdp": {} + }, + "uid": "a8129e37-d3c2-456d-8630-3c6a3449d3f2", + "updated_at": "2026-06-13T08:48:05Z", + "reusable": true, + "precedence": 1 + } + ], + "session_duration": "24h", + "enable_binding_cookie": false, + "http_only_cookie_attribute": true, + "options_preflight_bypass": false + }, + "success": true, + "errors": [], + "messages": [] +} diff --git a/docs/cf-backup/tp41-20260901/app-6c32fe23-24d8-433f-b00b-0a3d1558bb30-policies.json b/docs/cf-backup/tp41-20260901/app-6c32fe23-24d8-433f-b00b-0a3d1558bb30-policies.json new file mode 100644 index 0000000..4c55959 --- /dev/null +++ b/docs/cf-backup/tp41-20260901/app-6c32fe23-24d8-433f-b00b-0a3d1558bb30-policies.json @@ -0,0 +1,47 @@ +{ + "result": [ + { + "created_at": "2026-02-28T21:26:56Z", + "decision": "allow", + "exclude": [], + "id": "8e44f5d1-8257-443e-a797-b3de939952ee", + "include": [ + { + "email": { + "email": "christoph@emsenhuber.com" + } + }, + { + "login_method": { + "id": "72c1291b-a38d-4bc7-af97-5dee04a4f84a" + } + }, + { + "login_method": { + "id": "9024c7a6-2d1f-4432-9f48-51593acd1361" + } + } + ], + "name": "christoph", + "require": [], + "connection_rules": { + "rdp": {} + }, + "session_duration": "730h", + "uid": "8e44f5d1-8257-443e-a797-b3de939952ee", + "updated_at": "2026-07-31T07:27:41Z", + "reusable": true, + "precedence": 1 + } + ], + "success": true, + "errors": [], + "messages": [], + "result_info": { + "page": 1, + "per_page": 200, + "count": 1, + "total_count": 1, + "total_pages": 1 + } +} diff --git a/docs/cf-backup/tp41-20260901/app-6c32fe23-24d8-433f-b00b-0a3d1558bb30.json b/docs/cf-backup/tp41-20260901/app-6c32fe23-24d8-433f-b00b-0a3d1558bb30.json new file mode 100644 index 0000000..a4a4ae5 --- /dev/null +++ b/docs/cf-backup/tp41-20260901/app-6c32fe23-24d8-433f-b00b-0a3d1558bb30.json @@ -0,0 +1,54 @@ +{ + "result": { + "id": "6c32fe23-24d8-433f-b00b-0a3d1558bb30", + "uid": "6c32fe23-24d8-433f-b00b-0a3d1558bb30", + "type": "warp", + "name": "Warp Login App", + "aud": "fdfaa967d4118469dc994257f65831caa0162d6c45a14b5205af45e1aeca723b", + "created_at": "2026-06-04T18:48:59Z", + "updated_at": "2026-06-06T16:53:32Z", + "domain": "emsenhuber.cloudflareaccess.com/warp", + "allowed_idps": [], + "session_duration": "24h", + "auto_redirect_to_identity": false, + "policies": [ + { + "created_at": "2026-02-28T21:26:56Z", + "decision": "allow", + "exclude": [], + "id": "8e44f5d1-8257-443e-a797-b3de939952ee", + "include": [ + { + "email": { + "email": "christoph@emsenhuber.com" + } + }, + { + "login_method": { + "id": "72c1291b-a38d-4bc7-af97-5dee04a4f84a" + } + }, + { + "login_method": { + "id": "9024c7a6-2d1f-4432-9f48-51593acd1361" + } + } + ], + "name": "christoph", + "require": [], + "connection_rules": { + "rdp": {} + }, + "session_duration": "730h", + "uid": "8e44f5d1-8257-443e-a797-b3de939952ee", + "updated_at": "2026-07-31T07:27:41Z", + "reusable": true, + "precedence": 1 + } + ], + "tags": [] + }, + "success": true, + "errors": [], + "messages": [] +} diff --git a/docs/cf-backup/tp41-20260901/app-6df5c431-adcf-4dde-805d-4eb22d7c19b4-policies.json b/docs/cf-backup/tp41-20260901/app-6df5c431-adcf-4dde-805d-4eb22d7c19b4-policies.json new file mode 100644 index 0000000..4c55959 --- /dev/null +++ b/docs/cf-backup/tp41-20260901/app-6df5c431-adcf-4dde-805d-4eb22d7c19b4-policies.json @@ -0,0 +1,47 @@ +{ + "result": [ + { + "created_at": "2026-02-28T21:26:56Z", + "decision": "allow", + "exclude": [], + "id": "8e44f5d1-8257-443e-a797-b3de939952ee", + "include": [ + { + "email": { + "email": "christoph@emsenhuber.com" + } + }, + { + "login_method": { + "id": "72c1291b-a38d-4bc7-af97-5dee04a4f84a" + } + }, + { + "login_method": { + "id": "9024c7a6-2d1f-4432-9f48-51593acd1361" + } + } + ], + "name": "christoph", + "require": [], + "connection_rules": { + "rdp": {} + }, + "session_duration": "730h", + "uid": "8e44f5d1-8257-443e-a797-b3de939952ee", + "updated_at": "2026-07-31T07:27:41Z", + "reusable": true, + "precedence": 1 + } + ], + "success": true, + "errors": [], + "messages": [], + "result_info": { + "page": 1, + "per_page": 200, + "count": 1, + "total_count": 1, + "total_pages": 1 + } +} diff --git a/docs/cf-backup/tp41-20260901/app-6df5c431-adcf-4dde-805d-4eb22d7c19b4.json b/docs/cf-backup/tp41-20260901/app-6df5c431-adcf-4dde-805d-4eb22d7c19b4.json new file mode 100644 index 0000000..ec6deb2 --- /dev/null +++ b/docs/cf-backup/tp41-20260901/app-6df5c431-adcf-4dde-805d-4eb22d7c19b4.json @@ -0,0 +1,55 @@ +{ + "result": { + "id": "6df5c431-adcf-4dde-805d-4eb22d7c19b4", + "uid": "6df5c431-adcf-4dde-805d-4eb22d7c19b4", + "type": "app_launcher", + "name": "App Launcher", + "aud": "015e805251579e50a49668775c2255facb5bc56007ce49f90885f4114584bae2", + "created_at": "2026-03-28T16:20:27Z", + "updated_at": "2026-07-08T11:56:56Z", + "domain": "emsenhuber.cloudflareaccess.com", + "allowed_idps": [], + "session_duration": "730h", + "auto_redirect_to_identity": false, + "policies": [ + { + "created_at": "2026-02-28T21:26:56Z", + "decision": "allow", + "exclude": [], + "id": "8e44f5d1-8257-443e-a797-b3de939952ee", + "include": [ + { + "email": { + "email": "christoph@emsenhuber.com" + } + }, + { + "login_method": { + "id": "72c1291b-a38d-4bc7-af97-5dee04a4f84a" + } + }, + { + "login_method": { + "id": "9024c7a6-2d1f-4432-9f48-51593acd1361" + } + } + ], + "name": "christoph", + "require": [], + "connection_rules": { + "rdp": {} + }, + "session_duration": "730h", + "uid": "8e44f5d1-8257-443e-a797-b3de939952ee", + "updated_at": "2026-07-31T07:27:41Z", + "reusable": true, + "precedence": 1 + } + ], + "landing_page_design": {}, + "skip_app_launcher_login_page": false + }, + "success": true, + "errors": [], + "messages": [] +} diff --git a/docs/cf-backup/tp41-20260901/apps-all.json b/docs/cf-backup/tp41-20260901/apps-all.json new file mode 100644 index 0000000..62645c5 --- /dev/null +++ b/docs/cf-backup/tp41-20260901/apps-all.json @@ -0,0 +1,449 @@ +{ + "result": [ + { + "id": "86287661-7b23-4f38-874c-926cab1c0535", + "uid": "86287661-7b23-4f38-874c-926cab1c0535", + "type": "self_hosted", + "name": "Terpenfinder v3 assetlinks", + "aud": "353385474c9665c498f2c2477b0236a14a363aff5a700017ee5def5792587c62", + "created_at": "2026-07-31T07:50:12Z", + "updated_at": "2026-07-31T07:50:12Z", + "domain": "420.teilzeitladen.xyz/.well-known/assetlinks.json", + "self_hosted_domains": [ + "420.teilzeitladen.xyz/.well-known/assetlinks.json" + ], + "destinations": [ + { + "type": "public", + "uri": "420.teilzeitladen.xyz/.well-known/assetlinks.json" + } + ], + "app_launcher_visible": false, + "allowed_idps": [], + "tags": [], + "auto_redirect_to_identity": false, + "policies": [ + { + "created_at": "2026-07-31T07:50:12Z", + "decision": "bypass", + "exclude": [], + "id": "8f7c4929-376b-4e8f-b0cf-36fb4c686d69", + "include": [ + { + "everyone": {} + } + ], + "name": "public-bypass", + "require": [], + "uid": "8f7c4929-376b-4e8f-b0cf-36fb4c686d69", + "updated_at": "2026-07-31T07:50:12Z", + "reusable": false, + "precedence": 1 + } + ], + "session_duration": "730h", + "enable_binding_cookie": false, + "http_only_cookie_attribute": true, + "options_preflight_bypass": false, + "eager_redirect_cookie_setting": true + }, + { + "id": "e6a7991f-466c-4d1d-bac6-4b30fafccce4", + "uid": "e6a7991f-466c-4d1d-bac6-4b30fafccce4", + "type": "self_hosted", + "name": "Terpenfinder v3", + "aud": "e4515f7a7740558bf51ff6056e9c52fec25e67d23607209250a92e10cdf574e7", + "created_at": "2026-06-22T20:47:31Z", + "updated_at": "2026-07-31T07:50:10Z", + "domain": "420.teilzeitladen.xyz", + "self_hosted_domains": [ + "420.teilzeitladen.xyz" + ], + "destinations": [ + { + "type": "public", + "uri": "420.teilzeitladen.xyz" + } + ], + "app_launcher_visible": true, + "allowed_idps": [], + "tags": [], + "auto_redirect_to_identity": false, + "policies": [ + { + "created_at": "2026-02-28T21:26:56Z", + "decision": "allow", + "exclude": [], + "id": "8e44f5d1-8257-443e-a797-b3de939952ee", + "include": [ + { + "email": { + "email": "christoph@emsenhuber.com" + } + }, + { + "login_method": { + "id": "72c1291b-a38d-4bc7-af97-5dee04a4f84a" + } + }, + { + "login_method": { + "id": "9024c7a6-2d1f-4432-9f48-51593acd1361" + } + } + ], + "name": "christoph", + "require": [], + "connection_rules": { + "rdp": {} + }, + "session_duration": "730h", + "uid": "8e44f5d1-8257-443e-a797-b3de939952ee", + "updated_at": "2026-07-31T07:27:41Z", + "reusable": true, + "precedence": 1 + }, + { + "created_at": "2026-03-06T20:11:40Z", + "decision": "allow", + "exclude": [], + "id": "99839886-4ef1-4bad-8cc6-dc864d4dceeb", + "include": [ + { + "email": { + "email": "angelikahy@outlook.de" + } + }, + { + "login_method": { + "id": "9024c7a6-2d1f-4432-9f48-51593acd1361" + } + }, + { + "ip": { + "ip": "10.95.10.0/24" + } + }, + { + "ip": { + "ip": "94.154.138.0/24" + } + } + ], + "name": "geli", + "require": [], + "connection_rules": { + "rdp": {} + }, + "session_duration": "730h", + "uid": "99839886-4ef1-4bad-8cc6-dc864d4dceeb", + "updated_at": "2026-07-31T07:27:53Z", + "reusable": true, + "precedence": 2 + }, + { + "created_at": "2026-07-27T11:37:45Z", + "decision": "non_identity", + "exclude": [], + "id": "bf7d2e5e-3a53-4af1-a64c-a0f0d00703dc", + "include": [ + { + "service_token": { + "token_id": "1082bad1-6a25-4188-bf6b-220075679e0f" + } + } + ], + "name": "terpene-svc", + "require": [], + "uid": "bf7d2e5e-3a53-4af1-a64c-a0f0d00703dc", + "updated_at": "2026-08-05T18:33:01Z", + "reusable": true, + "precedence": 3 + } + ], + "session_duration": "730h", + "enable_binding_cookie": false, + "http_only_cookie_attribute": true, + "options_preflight_bypass": false + }, + { + "id": "1dbc45ca-1376-4a0d-b608-69db58f1875c", + "uid": "1dbc45ca-1376-4a0d-b608-69db58f1875c", + "type": "self_hosted", + "name": "hass, vw, gitea", + "aud": "817b2b82d2b1aa9c12de854c7bce9f608b33721f0827cfded68bdc7c5eb92a46", + "created_at": "2026-06-13T08:32:39Z", + "updated_at": "2026-07-12T12:43:25Z", + "domain": "vw.emsenhuber.net", + "self_hosted_domains": [ + "vw.emsenhuber.net", + "hass.emsenhuber.net", + "gitea.emsenhuber.net" + ], + "destinations": [ + { + "type": "public", + "uri": "vw.emsenhuber.net" + }, + { + "type": "public", + "uri": "hass.emsenhuber.net" + }, + { + "type": "public", + "uri": "gitea.emsenhuber.net" + } + ], + "app_launcher_visible": true, + "allowed_idps": [], + "tags": [], + "auto_redirect_to_identity": false, + "policies": [ + { + "created_at": "2026-06-13T08:34:00Z", + "decision": "bypass", + "exclude": [], + "id": "a8129e37-d3c2-456d-8630-3c6a3449d3f2", + "include": [ + { + "everyone": {} + } + ], + "name": "bypass", + "require": [], + "connection_rules": { + "rdp": {} + }, + "uid": "a8129e37-d3c2-456d-8630-3c6a3449d3f2", + "updated_at": "2026-06-13T08:48:05Z", + "reusable": true, + "precedence": 1 + } + ], + "session_duration": "24h", + "enable_binding_cookie": false, + "http_only_cookie_attribute": true, + "options_preflight_bypass": false + }, + { + "id": "6df5c431-adcf-4dde-805d-4eb22d7c19b4", + "uid": "6df5c431-adcf-4dde-805d-4eb22d7c19b4", + "type": "app_launcher", + "name": "App Launcher", + "aud": "015e805251579e50a49668775c2255facb5bc56007ce49f90885f4114584bae2", + "created_at": "2026-03-28T16:20:27Z", + "updated_at": "2026-07-08T11:56:56Z", + "domain": "emsenhuber.cloudflareaccess.com", + "allowed_idps": [], + "session_duration": "730h", + "auto_redirect_to_identity": false, + "policies": [ + { + "created_at": "2026-02-28T21:26:56Z", + "decision": "allow", + "exclude": [], + "id": "8e44f5d1-8257-443e-a797-b3de939952ee", + "include": [ + { + "email": { + "email": "christoph@emsenhuber.com" + } + }, + { + "login_method": { + "id": "72c1291b-a38d-4bc7-af97-5dee04a4f84a" + } + }, + { + "login_method": { + "id": "9024c7a6-2d1f-4432-9f48-51593acd1361" + } + } + ], + "name": "christoph", + "require": [], + "connection_rules": { + "rdp": {} + }, + "session_duration": "730h", + "uid": "8e44f5d1-8257-443e-a797-b3de939952ee", + "updated_at": "2026-07-31T07:27:41Z", + "reusable": true, + "precedence": 1 + } + ], + "landing_page_design": {}, + "skip_app_launcher_login_page": false + }, + { + "id": "6c32fe23-24d8-433f-b00b-0a3d1558bb30", + "uid": "6c32fe23-24d8-433f-b00b-0a3d1558bb30", + "type": "warp", + "name": "Warp Login App", + "aud": "fdfaa967d4118469dc994257f65831caa0162d6c45a14b5205af45e1aeca723b", + "created_at": "2026-06-04T18:48:59Z", + "updated_at": "2026-06-06T16:53:32Z", + "domain": "emsenhuber.cloudflareaccess.com/warp", + "allowed_idps": [], + "session_duration": "24h", + "auto_redirect_to_identity": false, + "policies": [ + { + "created_at": "2026-02-28T21:26:56Z", + "decision": "allow", + "exclude": [], + "id": "8e44f5d1-8257-443e-a797-b3de939952ee", + "include": [ + { + "email": { + "email": "christoph@emsenhuber.com" + } + }, + { + "login_method": { + "id": "72c1291b-a38d-4bc7-af97-5dee04a4f84a" + } + }, + { + "login_method": { + "id": "9024c7a6-2d1f-4432-9f48-51593acd1361" + } + } + ], + "name": "christoph", + "require": [], + "connection_rules": { + "rdp": {} + }, + "session_duration": "730h", + "uid": "8e44f5d1-8257-443e-a797-b3de939952ee", + "updated_at": "2026-07-31T07:27:41Z", + "reusable": true, + "precedence": 1 + } + ], + "tags": [] + }, + { + "id": "16aaec78-5951-4cf3-aad5-79f63163b5ea", + "uid": "16aaec78-5951-4cf3-aad5-79f63163b5ea", + "type": "self_hosted", + "name": "*.emsenhuber.net", + "aud": "d5bb8c4852895834a0010d6f63882f140cf27faf41f94374532c1f013a15c02d", + "created_at": "2026-05-05T11:44:38Z", + "updated_at": "2026-05-15T13:30:13Z", + "domain": "*.emsenhuber.net", + "self_hosted_domains": [ + "*.emsenhuber.net" + ], + "destinations": [ + { + "type": "public", + "uri": "*.emsenhuber.net" + } + ], + "app_launcher_visible": true, + "allowed_idps": [], + "tags": [], + "auto_redirect_to_identity": false, + "policies": [ + { + "created_at": "2026-02-28T21:26:56Z", + "decision": "allow", + "exclude": [], + "id": "8e44f5d1-8257-443e-a797-b3de939952ee", + "include": [ + { + "email": { + "email": "christoph@emsenhuber.com" + } + }, + { + "login_method": { + "id": "72c1291b-a38d-4bc7-af97-5dee04a4f84a" + } + }, + { + "login_method": { + "id": "9024c7a6-2d1f-4432-9f48-51593acd1361" + } + } + ], + "name": "christoph", + "require": [], + "connection_rules": { + "rdp": {} + }, + "session_duration": "730h", + "uid": "8e44f5d1-8257-443e-a797-b3de939952ee", + "updated_at": "2026-07-31T07:27:41Z", + "reusable": true, + "precedence": 1 + }, + { + "created_at": "2026-05-09T06:45:22Z", + "decision": "non_identity", + "exclude": [], + "id": "5165d139-8733-4d31-a3a5-f6f1d0fd8643", + "include": [ + { + "ip": { + "ip": "90.146.33.177/32" + } + } + ], + "name": "bf4", + "require": [], + "uid": "5165d139-8733-4d31-a3a5-f6f1d0fd8643", + "updated_at": "2026-08-07T21:36:42Z", + "reusable": true, + "precedence": 2 + }, + { + "created_at": "2026-05-15T13:11:36Z", + "decision": "non_identity", + "exclude": [], + "id": "39fe0e9d-6f63-414d-9d6d-440a7a151f5d", + "include": [ + { + "service_token": { + "token_id": "65f1821a-f134-4e20-aa66-baf31daddbed" + } + } + ], + "name": "claude-mcp", + "require": [], + "uid": "39fe0e9d-6f63-414d-9d6d-440a7a151f5d", + "updated_at": "2026-07-31T15:44:48Z", + "reusable": true, + "precedence": 3 + } + ], + "session_duration": "24h", + "enable_binding_cookie": false, + "http_only_cookie_attribute": false, + "options_preflight_bypass": false, + "oauth_configuration": { + "enabled": false, + "dynamic_client_registration": { + "enabled": true, + "allowed_uris": [ + "https://ha-mcp.emsenhuber.net" + ], + "allow_any_on_localhost": true, + "allow_any_on_loopback": true + } + } + } + ], + "success": true, + "errors": [], + "messages": [], + "result_info": { + "page": 1, + "per_page": 1000, + "count": 6, + "total_count": 6, + "total_pages": 1 + } +} diff --git a/docs/cf-backup/tp41-20260901/identity_providers.json b/docs/cf-backup/tp41-20260901/identity_providers.json new file mode 100644 index 0000000..433e774 --- /dev/null +++ b/docs/cf-backup/tp41-20260901/identity_providers.json @@ -0,0 +1,68 @@ +{ + "result": [ + { + "id": "72c1291b-a38d-4bc7-af97-5dee04a4f84a", + "type": "github", + "uid": "72c1291b-a38d-4bc7-af97-5dee04a4f84a", + "name": "github", + "version": "2c72ea4133061227e63696fb2559488b", + "config": { + "client_id": "Ov23li2h96hAkGRPJXYV", + "redirect_url": "https://emsenhuber.cloudflareaccess.com/cdn-cgi/access/callback" + }, + "scim_config": { + "scim_base_url": "https://emsenhuber.cloudflareaccess.com/scim/72c1291b-a38d-4bc7-af97-5dee04a4f84a", + "enabled": false, + "user_deprovision": false, + "seat_deprovision": false, + "group_member_deprovision": false, + "identity_update_behavior": "no_action" + } + }, + { + "id": "9024c7a6-2d1f-4432-9f48-51593acd1361", + "type": "onetimepin", + "uid": "9024c7a6-2d1f-4432-9f48-51593acd1361", + "name": "", + "version": "04b0d281756f552d156faa58ce97f913", + "config": { + "redirect_url": "https://emsenhuber.cloudflareaccess.com/cdn-cgi/access/callback" + }, + "scim_config": { + "enabled": false, + "user_deprovision": false, + "seat_deprovision": false, + "group_member_deprovision": false + } + }, + { + "id": "c7571880-2c63-4b66-a52a-0051802f7444", + "type": "google", + "uid": "c7571880-2c63-4b66-a52a-0051802f7444", + "name": "google", + "version": "6c1595b3026ae3196c70977c3924befb", + "config": { + "client_id": "276709275903-b3q55lsj203v4strbhh5mub76cib867e.apps.googleusercontent.com", + "redirect_url": "https://emsenhuber.cloudflareaccess.com/cdn-cgi/access/callback" + }, + "scim_config": { + "scim_base_url": "https://emsenhuber.cloudflareaccess.com/scim/c7571880-2c63-4b66-a52a-0051802f7444", + "enabled": false, + "user_deprovision": false, + "seat_deprovision": false, + "group_member_deprovision": false, + "identity_update_behavior": "no_action" + } + } + ], + "success": true, + "errors": [], + "messages": [], + "result_info": { + "page": 1, + "per_page": 200, + "count": 3, + "total_count": 3, + "total_pages": 1 + } +} diff --git a/docs/cf-backup/tp41-20260901/organizations.json b/docs/cf-backup/tp41-20260901/organizations.json new file mode 100644 index 0000000..5966035 --- /dev/null +++ b/docs/cf-backup/tp41-20260901/organizations.json @@ -0,0 +1,29 @@ +{ + "result": { + "auth_domain": "emsenhuber.cloudflareaccess.com", + "created_at": "2024-02-22T13:41:46Z", + "login_design": { + "background_color": "#eeeeee" + }, + "name": "bf4.cloudflareaccess.com", + "updated_at": "2026-07-09T17:34:55Z", + "is_ui_read_only": false, + "has_migrated_private_apps": true, + "allow_authenticate_via_warp": false, + "warp_auth_non_browser_401": false, + "cache_device_posture": true, + "deny_unmatched_requests": false, + "deny_unmatched_requests_exempted_zone_names": [], + "mfa_config": { + "allowed_authenticators": [ + "biometrics", + "security_key", + "totp" + ], + "session_duration": "24h" + } + }, + "success": true, + "errors": [], + "messages": [] +} diff --git a/docs/cf-backup/tp41-20260901/service_tokens.json b/docs/cf-backup/tp41-20260901/service_tokens.json new file mode 100644 index 0000000..d9b6b8a --- /dev/null +++ b/docs/cf-backup/tp41-20260901/service_tokens.json @@ -0,0 +1,51 @@ +{ + "result": [ + { + "client_id": "ad1b47dee8ba9625eebb30247d163dda.access", + "created_at": "2026-05-15T13:09:45Z", + "expires_at": "2027-05-15T13:19:03Z", + "id": "65f1821a-f134-4e20-aa66-baf31daddbed", + "name": "claude-mcp", + "updated_at": "2026-07-31T14:32:11Z", + "duration": "8760h", + "client_secret_version": 4, + "previous_client_secret_expires_at": "2026-07-31T14:32:11Z", + "enabled": true + }, + { + "client_id": "e8a56791f7f534f3eaff8629d8fe902c.access", + "created_at": "2026-07-27T11:36:26Z", + "expires_at": "2027-08-05T18:32:14Z", + "id": "a6be7efa-8367-446d-99b8-67f25f173371", + "name": "terpene-verify", + "updated_at": "2026-08-05T18:32:14Z", + "duration": "8760h", + "last_seen_at": "2026-08-02T20:49:21Z", + "client_secret_version": 3, + "previous_client_secret_expires_at": "2026-07-31T10:00:00Z", + "enabled": true + }, + { + "client_id": "0ec06d3a6dc6d689c13407591b286e5b.access", + "created_at": "2026-08-05T18:32:36Z", + "expires_at": "2027-08-05T18:32:36Z", + "id": "1082bad1-6a25-4188-bf6b-220075679e0f", + "name": "terpene-verify-v2", + "updated_at": "2026-08-05T18:32:36Z", + "duration": "8760h", + "last_seen_at": "2026-08-27T12:47:30Z", + "client_secret_version": 1, + "enabled": true + } + ], + "success": true, + "errors": [], + "messages": [], + "result_info": { + "page": 1, + "per_page": 1000, + "count": 3, + "total_count": 3, + "total_pages": 1 + } +} diff --git a/docs/handoff-20260901-tp25-ap2-verdacht.md b/docs/handoff-20260901-tp25-ap2-verdacht.md new file mode 100644 index 0000000..d58bbef --- /dev/null +++ b/docs/handoff-20260901-tp25-ap2-verdacht.md @@ -0,0 +1,54 @@ +# Handoff 2026-09-01 — TP25: Fund E geheilt (sauberes Fenster) + neuer Verdacht `ap2` + +**Kontext:** Christoph meldete um **2026-08-31 23:02** eine WLAN-Störung am Schreibtisch (5G, iPhone, +kein Telefonat). Diese Session hat den Vorfall am Manager `crs326-core` analysiert (alles read-only) +und dabei den Fund-E-Stand korrigiert. Parallel wurde TP39 abgeschlossen (eigener Strang, s. Archiv). + +## Kernbefunde + +### 1. Fund E (`reauthenticating`) ist geheilt — die „GESCHEITERT"-Wertung war kontaminiert +- Core-Uptime `10h41m` @ 01:18 ⇒ letzter Reboot **14:36** (TP27-Upgrade). Der `caps`-Log endet um + 15:57; um 23:02 **kein** caps-Ereignis ⇒ kein Infrastruktur-/Reboot-Burst, echtes Client-Event. +- **Tages-Query** `get_log topics=[wireless] prefix=reauthenticating sinceMinutes=1440` → **total 0**. + Das erste ungestörte Fenster (14:36 → 01:20, **10,7 h**) zeigt **0× reauthenticating**; Baseline 93×. +- Die im Vorgänger-Handoff notierten „124× nach dem Eingriff" fielen in die TP27-Upgrade-Reboots + (viele MACs = Infrastruktur, CLAUDE.md-Gotcha). ⇒ **Hebel 1 (`ft-over-ds=no`) hat sein Ziel erreicht.** + +### 2. Neuer Teilbefund: `ap2` unterperformt (das ist der 23:02-Schmerz, NICHT FT) +AP-Karte (Manager, stabil seit Rejoin 15:57): `cap-wifi5/6 = ap2`, `cap-wifi3/4 = ap3`, +`cap-wifi1/2 = ap1` (funkstill). + +- 23:02: iPhone `F2:62:4C:E1:AF:09` ping-pongt im Sekundentakt `cap-wifi5 ↔ cap-wifi6` = + **ap2s 5G (5220) ↔ ap2s 2,4G (ch11/2462)** — Band-Steering-Thrash auf **demselben** AP. + `disconnected, not responding` um 22:37:40 (−76) und **23:01:00** (−82). Roam-Feldstärke −75…−88 dBm. +- 🔴 **Christophs Fakt:** iPhone ↔ ap2 nur **2 m**, gleicher Raum, ap2 auf 2,3 m. Bei 2 m wären + −35…−45 dBm normal. −80 auf 2 m ⇒ **kein Coverage-, kein FT-Problem**. +- **0 Clients auf ap2 aktuell**, alle 29 auf ap3 → die Clients meiden ap2. +- Verdacht: **ap2s Funk selbst** (RF/Antenne/HW) und/oder **DTU-Störung auf ap2/ch11** + (Transaktion `TP17.1-dtu-pin-ap2`, `54:F2:9F:12:51:F0`, −59 dBm auf ap2s 2,4-Radio). + +**In-situ-Diagnose nötig** (nachts nicht messbar, Phone idle auf ap3): Registration-Signal live prüfen, +während ein Client auf ap2 hängt. Kandidaten-Eingriffe: DTU-Pin lösen/verlegen; `dirtyvader-main` auf +ap2 temporär deaktivieren (ap3 übernimmt Schreibtisch); ap2-Antenne/HW prüfen. **Keine Änderung ohne +diese Messung.** + +## Offen / nächster Schritt + +**Hebel 1 committen** (Transaktion `TP25-fund-e-ft-over-ds`, Scope `wifi-security`, Ablauf 2026-09-03). +Der Commit ist eine **git-push-Kette** und wartet auf Christophs Go: + +1. `nautobot/mikrotik_routeros.j2` **Z. 220**: `sec-main` `ft-over-ds=yes` → `ft-over-ds=no`. +2. Template-Repo nach Nautobot syncen (Golden-Config-Git-Repository). +3. `python3 nautobot/gc-configplan.py --refresh-compliance` (Backup → Intended → Compliance). +4. `python3 nautobot/gc-transaktion.py commit --change-id TP25-fund-e-ft-over-ds` + (verweigert, solange `wifi-security` noch driftet — deshalb Schritt 1–3 zuerst). + +🔴 Schritt 1 ist ein `git push` (Backup-Guard + Christophs Commit-Hinweis-Regel) und Schritt 2–4 sind +Live-Nautobot-Jobs — bewusst **nicht autonom** ausgeführt. Geräte-Backup `pre-tp25-funde-ftoverds.backup` +liegt auf dem Core. `wifi-security` wird ohnehin **nicht deployt** (Passphrasen `<>` im +Template, Z. 189–196) — der Commit ist reine Soll↔Live-Angleichung, kein Geräte-Write. + +## Werkzeug-Notiz +- AP-Zuordnung: `/interface wifi radio print terse proplist=cap,radio-mac,interface` am Manager. +- reauth-Zählung: `get_log` mit `prefix=reauthenticating` (nicht `list_wifi_interfaces` — leakt PSKs). +- Kanäle: `/interface wifi print detail` je `cap-wifiN` (Frequenz + Band im `channel.`-Block). diff --git a/docs/teilprojekte-archiv.md b/docs/teilprojekte-archiv.md index 683c15b..ef4f27c 100644 --- a/docs/teilprojekte-archiv.md +++ b/docs/teilprojekte-archiv.md @@ -62,6 +62,7 @@ teuerste Eigenschaft der Datei zerstört, um ihr billigstes Problem zu lösen. B | [TP27](#tp27) | RouterBOOT-Firmware auf 7.24 nachziehen | ✅ DURCH (2026-08-17/18) | | [TP28](#tp28) | WLAN über CAPsMAN auf `crs326-core` | ↩️ **wieder geöffnet 2026-08-30** (ap3) — Volltext in [teilprojekte.md](teilprojekte.md#tp28) | | [TP-R](#tp-r) | Router-Capabilities-Sweep | FERTIG (docs/research/routeros-capabilities.md) | +| [TP39](#tp39) | LXC-Hygiene pve: Resolver-Altlasten, `networking.service`, DB-Reverse-Lookup | ✅ ABGESCHLOSSEN (2026-09-01) — pve+NAS-Sweep grün | Dazu am Ende: **[TP25 (Langfassung)](#tp25-lang)** — die Messchronik und die Funde A–E im Volltext. TP25 selbst ist **nicht** abgeschlossen und steht weiter in `teilprojekte.md`; nur seine 394 Zeilen @@ -1697,3 +1698,82 @@ FT kaschierte das bisher als „Roaming" statt „schwache Abdeckung". 2026-08-13 gemessen: ap1 25→2, ap2 7→14). **Nicht während eines Calls deployen.** `/system backup` je AP vorher. - **Abh.:** TP22 ✅ (GC-Deploy-Pipeline). Übernimmt den offenen Rest von **TP3.3**, verwandt **TP3.2** (Coverage-Doku `docs/wifi-p750w-coverage-and-map.md`). **Kein Blocker für TP5/TP6** — läuft parallel. + + + +### TP39 — LXC-Hygiene auf pve: Resolver-Altlasten, `networking.service`, DB-Reverse-Lookup ▸ ✅ **ABGESCHLOSSEN (2026-09-01)** + +**Auslöser:** ein 10-Sekunden-Hänger auf `gitea`, gefunden am Rand des TP16.3-§5-Flips. Er hatte mit +dem Flip nichts zu tun, war aber nur deshalb sichtbar, weil zum ersten Mal jemand systematisch +gemessen hat. Beim Beheben kam eine zweite, unabhängige Altlast zum Vorschein. Beide sind +**Hygiene an denselben pve-LXCs** und gehören in **ein** Wartungsfenster — deshalb ein TP, nicht zwei. + +#### Was am 2026-09-01 bereits erledigt ist (Ausgangslage, nicht Aufgabe) + +- **Ursache des Hängers:** MariaDB (LXC **302**, `10.40.20.23`) hatte `skip-name-resolve` + **auskommentiert** ⇒ Reverse-Lookup bei **jeder neuen Verbindung**; `/etc/resolv.conf` zeigte auf + den **toten** `10.40.41.254` (VLAN1-Altschema). **Gemessen: 10.010 ms je Lookup.** + Pool-Verbindungen waren schnell ⇒ das Symptom wirkte sporadisch. +- **Blast-Radius, per Verbindungstabelle belegt:** an dieser DB hängen **Vaultwarden (`.127`), + Home Assistant (`.105`) und gitea (`.157`)**. +- **Fix ausgerollt** (`pct set --nameserver 10.40.20.1` + Reboot) für **fünf** LXCs: + `302 mariadb`, `102 mqtt5`, `106 influxdb2`, `107 redis`, `150 iob-exposed`. + **Nachher: Lookup 21–24 ms, gitea 0 von 25 Proben langsam** (vorher ~10 % bei 10,1 s). + +#### Scope (alle Punkte erledigt) + +1. ✅ **ERLEDIGT 2026-09-01: `skip-name-resolve` aktiviert.** Vorher `mysql.user` gelesen (User gab + den DB-Zugang per `/root/.my.cnf`) — **kein einziger Grant lautet auf einen DNS-Hostnamen**, alle + sind `%` / IP-Literal / `localhost`. Damit kann `skip-name-resolve` niemanden aussperren; der + Reverse-Lookup war reiner Ballast. Gesetzt als eigenes Drop-in + `/etc/mysql/mariadb.conf.d/90-skip-name-resolve.cnf` (nicht die `#`-Zeile in `50-server.cnf` + editiert — Paket-Update-stabil), `@@skip_name_resolve=1` nach Neustart verifiziert. + **Wirkung: gitea/vw/hass je 0 von 12 frischen Anfragen langsam, max 0,25 s.** Alle drei Clients + danach wieder verbunden. Die Ursache ist damit **beseitigt**, nicht nur entschärft. + 🔴 **Sicherheitsvorfall dabei:** die `.my.cnf` trug `password ` **ohne `=`**, die Maskierung + griff nicht ⇒ das **root-DB-Passwort ist ins Transkript geraten** und gehört rotiert (→ TP30). +2. ✅ **ERLEDIGT 2026-09-01: `networking.service` + `ifupdown-wait-online.service` in `101`, `102`, + `106`, `107` repariert.** **Ursache — dieselbe Altlast wie beim Resolver:** in + `/etc/network/interfaces` standen noch `auto`-Stanzas aus dem **alten VLAN1-Schema** + (`eth0` → `10.40.41.x`) und aus früheren Versuchen (`veth16`, `veth24`, ein Tippfehler `eth01`) — + **alle auf Interfaces, die es im Container nicht gibt.** `ifup -a` scheiterte daran, während das + echte `veth20` sauber hochkam: „failed" bei funktionierendem Netz. + **Fix:** nur die toten Stanzas entfernt (Backup je Container: + `/etc/network/interfaces.bak-20260901`), `lo`/`veth20`/`veth20.2` unangetastet. + **Beweis ist ein echter Neustart, nicht der Servicestatus:** `106` neu gestartet ⇒ **influxdb kam + nach 5 s von selbst hoch**, `networking active`, **null** fehlgeschlagene Units. Genau der Fall, + der vorher scheiterte. + 🔑 **Nicht durch die Session verursacht:** `101` wurde vor dem Fix nie angefasst und zeigte dasselbe + Bild — die Container liefen nur 13+ Tage ohne Neustart, deshalb war es unsichtbar. + 🟡 **Rest, bewusst liegen gelassen:** `run-rpc_pipefs.mount` (101, 150) und + `proxmox-regenerate-snakeoil.service` (108) — vorbestehend, ohne Bezug zu Netz oder DNS. +3. ✅ **ERLEDIGT 2026-09-01 (im selben Fenster aufgetaucht): LXC 302 war zu 100 % voll** (62/65 GB), + Rootfs `+30G` online gewachsen ⇒ 95 GB / 69 %, MariaDB lief durch. 🔴 **Das ist ein Puffer, kein + Fix:** 59 GB davon sind die `homeassistant`-DB (`states.ibd` allein **41 GB**), die unbegrenzt + wächst (~1 GB/Tag) — die dauerhafte Lösung ist HA-seitig und liegt in **TP40**. +4. ✅ **ERLEDIGT 2026-09-01: Resolver-Sweep durchgezogen — pve UND NAS.** **pve:** alle 13 LXCs + (`101,102,105,106,107,108,110,111,112,130,150,302,400`) tragen `nameserver 10.40.20.1`, **kein + `.41.254` mehr** — nicht nur die fünf geänderten. **NAS (DS923) via Portainer-API ep14:** alle + 20 Container gelistet, keiner mit `.41.254`-DNS-Override; alle laufenden lösen über den + Embedded-Resolver (`127.0.0.11`) in **66–110 ms** auf (rc=0), inkl. Grenzfall `gitea` (erstellt + 2026-07-10, um den Host-Fix herum) — **kein eingefrorener Dead-Resolver**, kein Recreate nötig. + NAS-Host `/etc/resolv.conf` = `10.40.20.1`. Als **wiederkehrende Kontrolle** bleibt der Sweep als + CLAUDE.md-Gotcha verankert (pve-Einzeiler + Synology-DSM-Fallstrick von 2026-07-10). +5. ✅ **ERLEDIGT 2026-09-01: Abnahme-Regel festgeschrieben.** „Vor jedem geplanten LXC-Neustart + `systemctl --failed` lesen und danach die **Ports gegen vorher** vergleichen" steht als + CLAUDE.md-Gotcha (Fall `influxdb2` wäre sonst still durchgerutscht). + +#### Abhängigkeiten + +- Keine blockierenden. Punkt 1 brauchte **DB-Credentials** (siehe **TP30**, Credential-Bestand). +- Punkt 2 war unabhängig und lief zuerst. + +#### Abgrenzung + +- **Nicht** TP16.3: dort geht es um cloudflared/Tunnel: der DNS-Fund kam nur *dabei* ans Licht. +- **Nicht** TP14.2a: das war 2026-07-10 derselbe Fehlertyp an **anderen** Hosts (NAS + LXC 400) und + ist abgeschlossen. **Dass er hier erneut auftrat, ist genau die Begründung für Punkt 4:** + die Klasse wurde damals an den bekannten Stellen behoben, nie im Bestand gesucht. +- **Nicht** TP31/TP34 (Caddy) und nicht TP11 (Monitoring) — obwohl gilt: ein Monitoring, das + DB-Verbindungszeiten kennt, hätte diesen Fall Monate früher gezeigt. +- **Nicht** TP40: der HA-Recorder-Wildwuchs (Punkt 3) ist HA-seitig und ein eigenes TP. diff --git a/docs/teilprojekte.md b/docs/teilprojekte.md index fd55211..27eaa67 100644 --- a/docs/teilprojekte.md +++ b/docs/teilprojekte.md @@ -46,10 +46,17 @@ liest, liest ihn als Erstes: er wird bei jeder Änderung mitgezogen, nicht nur d 🚫 **§6 (Abbau) bewusst NICHT** — die drei Alttunnel bleiben als Rückfallebene (healthy/8). 🔴 **Christoph hat den Flip ausdrücklich vorgezogen freigegeben** („aus Gründen"); die 7-Tage-Regel betrifft ohnehin §6, nicht den Flip. +- 🆕 **TP39 ABGESCHLOSSEN + archiviert (2026-09-01):** letzter offener Punkt — der Resolver-Sweep — + ist durch: **pve alle 13 LXCs** auf `10.40.20.1`, und die **DS923-Container via Portainer** (ep14) + gegengeprüft — kein `.41.254`-Override, alle laufenden lösen in **66–110 ms** auf (inkl. Grenzfall + `gitea`, erstellt 2026-07-10), kein eingefrorener Dead-Resolver, kein Recreate nötig. Die + Abnahme-Regel („vor jedem LXC-Reboot `systemctl --failed` + Port-Vergleich") steht als + CLAUDE.md-Gotcha, der Sweep ist als wiederkehrende Kontrolle dort verankert. **Volltext → Archiv.** + 🔴 Rest offen nur in **anderen** TPs: root-DB-PW-Rotation (→ TP30), HA-Recorder-Retention (→ TP40). - 🆕 **TP39 fast durch (2026-09-01):** `skip-name-resolve` auf der MariaDB **aktiviert** (mysql.user vorher geprüft — kein Hostname-Grant, gefahrlos; Wirkung: gitea/vw/hass 0 von 36 frischen Anfragen langsam). LXC 302 war **100 % voll** → `+30G` online (95 GB/69 %). 🔴 **root-DB-Passwort dabei ins - Transkript geraten** (`.my.cnf` ohne `=`), zu rotieren (→ TP30). Offen in TP39: nur noch der Sweep. + Transkript geraten** (`.my.cnf` ohne `=`), zu rotieren (→ TP30). - 🆕 **TP40 angelegt (2026-09-01, User-Okay):** HA-Recorder-Retention — die `homeassistant`-DB frisst 59 GB (`states.ibd` **41 GB**), unbegrenzt gewachsen. Das `+30G` aus TP39 ist ein Puffer; die dauerhafte Lösung (`purge_keep_days`, `exclude`, `purge repack`) ist HA-seitig und **Christophs @@ -259,6 +266,23 @@ liest, liest ihn als Erstes: er wird bei jeder Änderung mitgezogen, nicht nur d in den TP5-Kollektor (`10.40.20.18:514`); `/system logging` steht unter der **27. ComplianceRule** `system-logging`. Vorher nur Ringpuffer → ein seit Wochen gemeldeter iPhone-Abbruch war rückwirkend nicht diagnostizierbar. +- 🟢 **TP25 Fund E — Hebel 1 wirkt DOCH, im sauberen Fenster (Stand 2026-09-01 ~01:20):** die + „GESCHEITERT"-Wertung darunter beruhte auf 08:09–14:36, also **vor** dem 14:36-Core-Reboot und + mitten in den TP27-Upgrade-Reboots (Infrastruktur-Burst, viele MACs). Das **erste ungestörte + Fenster** — seit dem Reboot 14:36 bis 01:20, **10,7 h** — zeigt am Manager **0× `reauthenticating`** + (Tages-Query `sinceMinutes=1440`, `prefix=reauthenticating`, total 0), Baseline war 93×. + ⇒ Das reauth-Symptom ist **weg**; die 124× fielen in die Upgrade-Reboots. **Empfehlung: Hebel 1 + committen** (`ft-over-ds=no` ins Template Z.220, dann Nautobot-Resync + Compliance + `gc-transaktion + commit`) — **git-push-Kette, wartet auf Christophs Go.** +- 🔴 **ABER: neuer Teilbefund am 23:02 (2026-08-31) — `ap2` unterperformt, NICHT FT.** Christoph am + Schreibtisch, 5G, kein Telefonat. Log: iPhone `F2:62:4C:E1:AF:09` ping-pongt im Sekundentakt + `cap-wifi5 ↔ cap-wifi6` = **beide Radios von ap2** (5G 5220 ↔ 2,4G ch11/2462, Band-Steering-Thrash + auf demselben AP), `disconnected, not responding` um 22:37:40 und 23:01:00. Feldstärke **−75…−88 dBm + — bei laut Christoph 2 m Abstand** (ap2 auf 2,3 m, gleicher Raum). Bei 2 m wären −35…−45 normal. + Aktuell **0 Clients auf ap2**, alle 29 auf ap3. ⇒ kein Coverage-/FT-Problem, sondern **ap2s Funk + selbst** (RF/Antenne/HW) und/oder die **DTU-Störung auf ap2/ch11** (Transaktion `TP17.1-dtu-pin-ap2`, + −59 dBm auf ap2s 2,4-Radio). Als eigener 🔬-Unterpunkt geführt, In-situ zu messen. Handoff: + [`handoff-20260901-tp25-ap2-verdacht.md`](handoff-20260901-tp25-ap2-verdacht.md). - 🔴 **TP25 Fund E — Hebel 1 ist GESCHEITERT (Stand 2026-08-31 nachmittags):** `sec-main` steht am Core auf **`ft=yes ft-over-ds=no`** (seit 08:09), aber das Symptom blieb: **124× `reauthenticating` nach dem Eingriff** und **zwei von Christoph erlebte Ausfälle** — 13:16 (Videocall bricht ab, @@ -426,7 +450,7 @@ nachmessen und dann entscheiden**. Blocker gibt es keine mehr. TP5 ist in der Na > | TP20.1 | 🔜 | Vaultwarden → Platform-PG | — | > | TP23 | ✅ | DNS-Policy (Stufe 1+2 ✅) | 2026-08-26 | > | TP24 | 🔜 | DC-USV | — | -> | TP25 | 🔬 | WLAN-Stabilisierung (Kern ✅) — **Fund E offen, Hebel 1 `ft-over-ds=no` läuft, Messung bis 09-01** | 2026-08-31 | +> | TP25 | 🔬 | WLAN-Stabilisierung (Kern ✅) — **Fund E reauth geheilt (0×/10,7 h), Hebel 1 commit-bereit; NEU ap2 unterperformt (2 m/−80, In-situ)** | 2026-09-01 | > | TP28 | ✅ | WLAN/CAPsMAN — dritter AP `ap3` (cAP ax) **live** | 2026-08-30 | > | TP29 | 💡 | Anwesenheitserkennung (Idee) | — | > | TP30 | 🔜 | Credentials (Etappe 1 ✅, Rest gebündelt) | — | @@ -438,9 +462,8 @@ nachmessen und dann entscheiden**. Blocker gibt es keine mehr. TP5 ist in der Na > | TP36 | 🔜 | SSoT via Nautobot für teilprojekte.md-Live-Daten + Datei-Aufteilung | — | > | TP37 | 🔜 | Nautobot als Netzwerkdoku: Hosts/Container/Dienste + CF-Connectoren (Okay 08-30) | — | > | TP38 | 🔜 | OOB-Mgmt: untagged-VLAN99-Port je Switch | — | -> | TP39 | ⏳ | LXC-Hygiene pve (Resolver ✅, `networking.service` ✅, `skip-name-resolve` ✅, Resize ✅ 09-01 — offen: nur Sweep) | — | > | TP40 | 🔜 | HA-Recorder-Retention: 41 GB `states` beschneiden (Okay 09-01) | — | -> | — | — | **34 archivierte TPs** in `teilprojekte-archiv.md` | — | +> | — | — | **35 archivierte TPs** in `teilprojekte-archiv.md` (inkl. TP39 ✅ 2026-09-01) | — | ### TP5.1 — DNS-Visibility & Flow-Observability für Low-Trust-Geräte (Airfryer-Fall) ▸ vorgemerkt - **Kontext (2026-07-08/09):** Airfryer „airschreier" (Philips/Versuni, ESP, `10.40.30.180`) bekam per DHCP-Option 6 `dns 1.1.1.1` als Override, weil das OTA-Update über den ap1-DoH-Gateway-Pfad nicht durchging (DoH-Latenz beim primitiven ESP-Stack — **kein** Content-Block, via Gateway-Logs bewiesen, s. `memory/ref_esp_ota_doh_not_block`). Nebenwirkung: public **1.1.1.1 = anonymer Consumer-Resolver ≠ accountgebundener Gateway-DoH** (`px35ynlol3.cloudflare-gateway.com`) → **DNS-Sicht auf das Gerät weg**, Gerät umgeht zudem die Filterung. @@ -1428,7 +1451,7 @@ des Dimmers (= Lichtausfall in Diele UG/Wohnzimmer) wurde daraufhin **nicht** au - **Abh.:** keine harten. **TP15 ✅** (die zu versorgende Hardware steht und hat DC-Eingänge). Verwandt: **TP18** (Garage-Nodes brauchen je Site eine Stromversorgung), **TP11** (USV-Zustand ins Monitoring). **Kein Blocker für TP5/TP6.** - **Historie:** war bis 2026-08-16 Unterpunkt von TP15 („🔋 DC-USV: MeanWell LRS-150-48 + DDR-120-48 + LiFePO4 20Ah (~€190), 48V-Bus; CRS326 DC-input passt"). Vollständige Recherche inkl. Schaltbild, Effizienzvergleich und Gerätetabelle: `docs/hw-refresh-requirements.md §9` (+ §10 D/E/F für die offenen Fragen). -### TP25 — WLAN-Stabilisierung ▸ 🔬 **FUND E OFFEN, HEBEL 1 LÄUFT (2026-08-31 08:09): `ft-over-ds=no` auf `sec-main`, Messung bis 2026-09-01** · Kern erledigt: 🟢 **(2026-08-22) Dead Spot Terrasse repariert** (43 % → 9 % Verlust, 20,4 s → 1,0 s). **Fund F ✅ aufgelöst (08-24, geräteseitig — kein Netzfehler)**, **5-GHz-Umfeldscan ✅ (08-24)**, Kanalplan für AP 3 ✅ gerechnet. Offen nur noch die Umsetzung, wenn der dritte AP kommt. Nicht mehr kritischer Pfad — Sammel-TP für Christophs Beobachtungen 1–6 +### TP25 — WLAN-Stabilisierung ▸ 🔬 **FUND E: reauth im sauberen Fenster geheilt (0×/10,7 h, 2026-09-01) → Hebel 1 commit-bereit; NEU: ap2 unterperformt (2 m/−80 dBm, 23:02-Befund) als eigener In-situ-Unterpunkt** · Kern erledigt: 🟢 **(2026-08-22) Dead Spot Terrasse repariert** (43 % → 9 % Verlust, 20,4 s → 1,0 s). **Fund F ✅ aufgelöst (08-24, geräteseitig — kein Netzfehler)**, **5-GHz-Umfeldscan ✅ (08-24)**, Kanalplan für AP 3 ✅ gerechnet. Offen nur noch die Umsetzung, wenn der dritte AP kommt. Nicht mehr kritischer Pfad — Sammel-TP für Christophs Beobachtungen 1–6 > 📚 **Kondensiert am 2026-08-23 (Doku-Session, Punkt F).** Dieser Abschnitt war mit 394 Zeilen > 18 % der Datei. Die **Langfassung steht vollständig und unverändert** im Archiv: > [`teilprojekte-archiv.md` → TP25 (Langfassung)](teilprojekte-archiv.md#tp25-lang) — Messchronik (A)–(G), @@ -1800,6 +1823,39 @@ die Redundanzfrage oben. - **Abh.:** TP22 ✅ (GC-Deploy-Pipeline). Verwandt **TP3.2** (`docs/wifi-p750w-coverage-and-map.md`), **TP29** (nutzt dieselbe Datenquelle als Sensor). **Kein Blocker für irgendetwas.** +#### 🔬 Fund E — 2026-09-01: Hebel 1 wirkt im sauberen Fenster + neuer Teilbefund `ap2` + +**Anlass:** Christoph meldete **2026-08-31 23:02** eine Störung am Schreibtisch (5G, iPhone, kein +Telefonat). Analyse (alles read-only am Manager `crs326-core`): + +- **AP-Karte** (stabil seit letztem CAP-Rejoin 15:57, kein Rejoin danach — Attribution belastbar): + `cap-wifi5/6 = ap2`, `cap-wifi3/4 = ap3`, `cap-wifi1/2 = ap1` (funkstill, Radios da, 0 Clients). +- **23:02-Ereignis:** iPhone `F2:62:4C:E1:AF:09` ping-pongt im Sekundentakt `cap-wifi5 ↔ cap-wifi6` + = **ap2s 5G (5220) ↔ ap2s 2,4G (ch11/2462)** — Band-Steering-Thrash auf **demselben** AP, plus + `disconnected, not responding` um 22:37:40 (−76) und **23:01:00** (−82). Feldstärke der Roams + **−75…−88 dBm**. +- 🔴 **Christophs Fakt kippt die Coverage-Deutung:** iPhone und **ap2 nur 2 m** entfernt, gleicher + Raum, ap2 auf 2,3 m. Bei 2 m Sicht wären −35…−45 dBm normal. −80 auf 2 m ist **kein** Coverage- + und **kein** FT-Problem. Dazu: **aktuell 0 Clients auf ap2**, alle 29 auf ap3 — die Clients *meiden* + ap2. ⇒ **ap2s Funk selbst unterperformt** (RF/Antenne/HW) und/oder die **DTU-Störung auf ap2/ch11** + (Transaktion `TP17.1-dtu-pin-ap2`, Wechselrichter `54:F2:9F:12:51:F0` mit −59 dBm auf ap2s 2,4-Radio). +- **In-situ zu messen** (nachts nicht möglich — Phone idle auf ap3): Registration-Signal live prüfen, + während ein Client auf ap2 hängt; Kandidaten-Eingriffe — DTU-Pin lösen/verlegen, `dirtyvader-main` + auf ap2 temporär deaktivieren (ap3 übernimmt den Schreibtisch), ap2-Antenne/HW prüfen. **Keine + Änderung ohne diese Messung.** + +**Fund E (`reauthenticating`) ist davon getrennt und im sauberen Fenster geheilt:** seit dem +14:36-Core-Reboot bis 01:20 (**10,7 h, ungestört**) **0× `reauthenticating`** (`sinceMinutes=1440`, +`prefix=reauthenticating`, total 0), Baseline 93×. Die „GESCHEITERT/124×"-Wertung fiel in die +TP27-Upgrade-Reboots (Infrastruktur-Burst über viele MACs). ⇒ **Hebel 1 hat sein Ziel erreicht.** + +**Commit-Weg (wartet auf Christophs Go — git-push-Kette):** Template `nautobot/mikrotik_routeros.j2` +**Z. 220** `sec-main` von `ft-over-ds=yes` → `ft-over-ds=no`; dann Template-Repo nach Nautobot syncen, +`gc-configplan.py --refresh-compliance` (Backup→Intended→Compliance), dann +`gc-transaktion.py commit --change-id TP25-fund-e-ft-over-ds`. Danach `wifi-security` wieder driftfrei. +🔴 Kreuzt git-push (Backup-Guard + Commit-Hinweis-Regel) und Live-Nautobot-Jobs — **nicht autonom.** +Handoff: [`handoff-20260901-tp25-ap2-verdacht.md`](handoff-20260901-tp25-ap2-verdacht.md). + ### TP28 — WLAN über CAPsMAN auf `crs326-core` ▸ ✅ **ap3 LIVE (2026-08-30)** — wieder geöffnet und durchgezogen @@ -2732,78 +2788,6 @@ folgenden Absicherungen dazu, und die Entscheidung darüber in die Umsetzungs-Se --- -### TP39 — LXC-Hygiene auf pve: Resolver-Altlasten, `networking.service`, DB-Reverse-Lookup ▸ 🔜 **ANGELEGT 2026-09-01 (User-Okay erteilt)** - -**Auslöser:** ein 10-Sekunden-Hänger auf `gitea`, gefunden am Rand des TP16.3-§5-Flips. Er hatte mit -dem Flip nichts zu tun, war aber nur deshalb sichtbar, weil zum ersten Mal jemand systematisch -gemessen hat. Beim Beheben kam eine zweite, unabhängige Altlast zum Vorschein. Beide sind -**Hygiene an denselben pve-LXCs** und gehören in **ein** Wartungsfenster — deshalb ein TP, nicht zwei. - -#### Was am 2026-09-01 bereits erledigt ist (Ausgangslage, nicht Aufgabe) - -- **Ursache des Hängers:** MariaDB (LXC **302**, `10.40.20.23`) hatte `skip-name-resolve` - **auskommentiert** ⇒ Reverse-Lookup bei **jeder neuen Verbindung**; `/etc/resolv.conf` zeigte auf - den **toten** `10.40.41.254` (VLAN1-Altschema). **Gemessen: 10.010 ms je Lookup.** - Pool-Verbindungen waren schnell ⇒ das Symptom wirkte sporadisch. -- **Blast-Radius, per Verbindungstabelle belegt:** an dieser DB hängen **Vaultwarden (`.127`), - Home Assistant (`.105`) und gitea (`.157`)**. -- **Fix ausgerollt** (`pct set --nameserver 10.40.20.1` + Reboot) für **fünf** LXCs: - `302 mariadb`, `102 mqtt5`, `106 influxdb2`, `107 redis`, `150 iob-exposed`. - **Nachher: Lookup 21–24 ms, gitea 0 von 25 Proben langsam** (vorher ~10 % bei 10,1 s). - -#### Scope (was dieses TP noch zu tun hat) - -1. ✅ **ERLEDIGT 2026-09-01: `skip-name-resolve` aktiviert.** Vorher `mysql.user` gelesen (User gab - den DB-Zugang per `/root/.my.cnf`) — **kein einziger Grant lautet auf einen DNS-Hostnamen**, alle - sind `%` / IP-Literal / `localhost`. Damit kann `skip-name-resolve` niemanden aussperren; der - Reverse-Lookup war reiner Ballast. Gesetzt als eigenes Drop-in - `/etc/mysql/mariadb.conf.d/90-skip-name-resolve.cnf` (nicht die `#`-Zeile in `50-server.cnf` - editiert — Paket-Update-stabil), `@@skip_name_resolve=1` nach Neustart verifiziert. - **Wirkung: gitea/vw/hass je 0 von 12 frischen Anfragen langsam, max 0,25 s.** Alle drei Clients - danach wieder verbunden. Die Ursache ist damit **beseitigt**, nicht nur entschärft. - 🔴 **Sicherheitsvorfall dabei:** die `.my.cnf` trug `password ` **ohne `=`**, die Maskierung - griff nicht ⇒ das **root-DB-Passwort ist ins Transkript geraten** und gehört rotiert (→ TP30). -2. ✅ **ERLEDIGT 2026-09-01: `networking.service` + `ifupdown-wait-online.service` in `101`, `102`, - `106`, `107` repariert.** **Ursache — dieselbe Altlast wie beim Resolver:** in - `/etc/network/interfaces` standen noch `auto`-Stanzas aus dem **alten VLAN1-Schema** - (`eth0` → `10.40.41.x`) und aus früheren Versuchen (`veth16`, `veth24`, ein Tippfehler `eth01`) — - **alle auf Interfaces, die es im Container nicht gibt.** `ifup -a` scheiterte daran, während das - echte `veth20` sauber hochkam: „failed" bei funktionierendem Netz. - **Fix:** nur die toten Stanzas entfernt (Backup je Container: - `/etc/network/interfaces.bak-20260901`), `lo`/`veth20`/`veth20.2` unangetastet. - **Beweis ist ein echter Neustart, nicht der Servicestatus:** `106` neu gestartet ⇒ **influxdb kam - nach 5 s von selbst hoch**, `networking active`, **null** fehlgeschlagene Units. Genau der Fall, - der vorher scheiterte. - 🔑 **Nicht durch die Session verursacht:** `101` wurde vor dem Fix nie angefasst und zeigte dasselbe - Bild — die Container liefen nur 13+ Tage ohne Neustart, deshalb war es unsichtbar. - 🟡 **Rest, bewusst liegen gelassen:** `run-rpc_pipefs.mount` (101, 150) und - `proxmox-regenerate-snakeoil.service` (108) — vorbestehend, ohne Bezug zu Netz oder DNS. -3. ✅ **ERLEDIGT 2026-09-01 (im selben Fenster aufgetaucht): LXC 302 war zu 100 % voll** (62/65 GB), - Rootfs `+30G` online gewachsen ⇒ 95 GB / 69 %, MariaDB lief durch. 🔴 **Das ist ein Puffer, kein - Fix:** 59 GB davon sind die `homeassistant`-DB (`states.ibd` allein **41 GB**), die unbegrenzt - wächst (~1 GB/Tag) — die dauerhafte Lösung ist HA-seitig und liegt in **TP40**. -4. 🟡 **Resolver-Sweep als wiederkehrende Kontrolle**, nicht als Einmalaktion — und über pve hinaus: - die **NAS-Container** sind nach derselben Logik zu prüfen (der DSM-Fallstrick von 2026-07-10: - „Allgemein"-DNS ≠ was `dockerd` liest, laufende Container frieren den Upstream beim Erstellen ein). - Sweep über pve: `for c in $(pct list|awk 'NR>1{print $1}'); do pct exec $c -- grep ^nameserver /etc/resolv.conf; done` -5. 🟡 **Abnahme-Regel festschreiben:** vor jedem geplanten LXC-Neustart `systemctl --failed` lesen - und danach die **Ports gegen vorher** vergleichen — sonst verliert man still einen Dienst - (genau so wäre `influxdb2` durchgerutscht). - -#### Abhängigkeiten - -- Keine blockierenden. Punkt 1 braucht **DB-Credentials** (siehe **TP30**, Credential-Bestand). -- Punkt 2 ist unabhängig und kann zuerst. - -#### Abgrenzung - -- **Nicht** TP16.3: dort geht es um cloudflared/Tunnel: der DNS-Fund kam nur *dabei* ans Licht. -- **Nicht** TP14.2a: das war 2026-07-10 derselbe Fehlertyp an **anderen** Hosts (NAS + LXC 400) und - ist abgeschlossen. **Dass er hier erneut auftrat, ist genau die Begründung für Punkt 3:** - die Klasse wurde damals an den bekannten Stellen behoben, nie im Bestand gesucht. -- **Nicht** TP31/TP34 (Caddy) und nicht TP11 (Monitoring) — obwohl gilt: ein Monitoring, das - DB-Verbindungszeiten kennt, hätte diesen Fall Monate früher gezeigt. - ### TP40 — Home-Assistant-Recorder-Retention: die 41-GB-`states`-Tabelle beschneiden ▸ 🔜 **ANGELEGT 2026-09-01 (User-Okay erteilt)** **Auslöser:** LXC 302 (MariaDB) lief am 2026-09-01 auf **100 %** voll. Sofortmassnahme war `+30G`