feat: add Docker health-state HTTP endpoint for Swarm Health Watchdog

- Python HTTP server on 0.0.0.0:18809
- GET /health -> all monitored containers (JSON)
- GET /health/<name> -> single container
- Monitors: brave-search, kokoro-tts, litellm, litellm-db, n8n-agent, searxng, whisper-server
- Returns status, health, restart count via docker inspect
- systemd user service for auto-start

Task: t_461f71fe
This commit is contained in:
William Valentin
2026-05-13 14:29:25 -07:00
parent aea9042cce
commit 9fdd29f7b7
1272 changed files with 863206 additions and 16973 deletions
+7 -68
View File
@@ -1,15 +1,6 @@
{
"version": 1,
"profiles": {
"litellm:default": {
"type": "api_key",
"provider": "litellm",
"keyRef": {
"source": "file",
"provider": "filemain",
"id": "/authProfiles/main/litellm:default/key"
}
},
"github-copilot:github": {
"type": "token",
"provider": "github-copilot",
@@ -20,13 +11,6 @@
"provider": "anthropic",
"token": "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"
},
"openai-codex:default": {
"type": "oauth",
"provider": "openai-codex",
"access": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjE5MzQ0ZTY1LWJiYzktNDRkMS1hOWQwLWY5NTdiMDc5YmQwZSIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSJdLCJjbGllbnRfaWQiOiJhcHBfRU1vYW1FRVo3M2YwQ2tYYVhwN2hyYW5uIiwiZXhwIjoxNzc1NDA0ODI1LCJodHRwczovL2FwaS5vcGVuYWkuY29tL2F1dGgiOnsiY2hhdGdwdF9hY2NvdW50X2lkIjoiYzA2MmNmNmItYmIxOS00ZDA4LWE2ZTMtYTRlNGYxNzdlN2UxIiwiY2hhdGdwdF9hY2NvdW50X3VzZXJfaWQiOiJ1c2VyLVVYdm00MVRKUW5TQmxkZEhYeDZ6SGxFa19fYzA2MmNmNmItYmIxOS00ZDA4LWE2ZTMtYTRlNGYxNzdlN2UxIiwiY2hhdGdwdF9jb21wdXRlX3Jlc2lkZW5jeSI6Im5vX2NvbnN0cmFpbnQiLCJjaGF0Z3B0X3BsYW5fdHlwZSI6InBsdXMiLCJjaGF0Z3B0X3VzZXJfaWQiOiJ1c2VyLVVYdm00MVRKUW5TQmxkZEhYeDZ6SGxFayIsImxvY2FsaG9zdCI6dHJ1ZSwidXNlcl9pZCI6InVzZXItVVh2bTQxVEpRblNCbGRkSFh4NnpIbEVrIn0sImh0dHBzOi8vYXBpLm9wZW5haS5jb20vbWZhIjp7InJlcXVpcmVkIjoieWVzIn0sImh0dHBzOi8vYXBpLm9wZW5haS5jb20vcHJvZmlsZSI6eyJlbWFpbCI6IndpbGxpYW0udmFsZW50aW4uaW5mb0BnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0sImlhdCI6MTc3NDU0MDgyNCwiaXNzIjoiaHR0cHM6Ly9hdXRoLm9wZW5haS5jb20iLCJqdGkiOiJjZjY0NmUwOS1hNTIyLTQ3OWQtYTVkNy04YmE2MjEwNmRjMmMiLCJuYmYiOjE3NzQ1NDA4MjQsInB3ZF9hdXRoX3RpbWUiOjE3NzQ1NDA4MTc3MzksInNjcCI6WyJvcGVuaWQiLCJwcm9maWxlIiwiZW1haWwiLCJvZmZsaW5lX2FjY2VzcyJdLCJzZXNzaW9uX2lkIjoiYXV0aHNlc3NfcU8zaFJjVENYMDQxS3BPSGt1aUtOVHFQIiwic2wiOnRydWUsInN1YiI6Imdvb2dsZS1vYXV0aDJ8MTA2MzM3Njg2NTgzNTkyODA4MDE3In0.7YWYM64rXEyAYPN_7BiTHt7U5Ly_E0EF1LFKP3sJTu7df4vmEMP5kwA5vIpkaaZyddsqbRhXsai4x_mo410UGl56shcoAulR46qJlFvF6Fae0iPQZ_pQyxghnomUrvE_gDKV5VShuvAB11r04RiYdATHYLajwKsaxvl19s1aXanX2yyLYus0dTdX-cLEatD5OSkIR_8k6yNJF3TyMDCidVdR4Eqkm8arZC3jAc_F_3gsb20cNxp7z7ybza017cL_EOwkrby0jW4l_ab0jXNIXU5j11OaIjd3ZUtxnQU2At3rhplZNRgtgWVn84VlXKQFkZnW-zG8eiZj9WaaPdm4utOqq38mNfDaR9NxLZ-yQ1GYKHqn86eFQunxjXYMszHKA7FsElrGnRwiDMbFFpA2bXFVa6zUs2CcM_MA2riHQLYCU0zglQL9s7xgwgn1ZqdRYZTRjNtR2PIoNzrdqAhy5TIfPtFb27seH5KUyct0Mqc9ZREs6VnG3OTBLUdD8qJYCvHfdBtBjJTc0cXnFOXCO-BekfE5xazceJYdQgjO1tljY5b0DsVSbJjXuIOE6wA2AgiBecrO6uxX2w2DNRgm1yMDQmepibnPwg0UasAvMSigTuOOQtgxVz8Y9gqf-z4H67a7CIh5Op8z_rYOfewVjUZ5Ok7l9hvgDXm8O2RlsfE",
"refresh": "rt_6c2ESjxgMd6f8j1RFreVYsmxwFyUaBfvo_ZCihN_s40.AF5LoBIKU-zs-0Hinnz1Dp4FBBrxIwQ2txZBdj6aeic",
"expires": 1775404825013
},
"zai:default": {
"type": "api_key",
"provider": "zai",
@@ -36,59 +20,14 @@
"type": "token",
"provider": "anthropic",
"token": "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"
}
},
"lastGood": {
"litellm": "litellm:default",
"openai-codex": "openai-codex:default",
"anthropic": "anthropic:manual",
"github-copilot": "github-copilot:github",
"zai": "zai:default"
},
"usageStats": {
"litellm:default": {
"lastUsed": 1774146240157,
"errorCount": 2,
"failureCounts": {
"billing": 2
},
"lastFailureAt": 1774464853910,
"disabledUntil": 1774482776360,
"disabledReason": "billing"
},
"github-copilot:github": {
"errorCount": 1,
"lastUsed": 1774579951624,
"failureCounts": {
"rate_limit": 1
},
"lastFailureAt": 1774583383193,
"cooldownUntil": 1774583443193
},
"anthropic:manual": {
"errorCount": 1,
"lastUsed": 1774435478002,
"lastFailureAt": 1774583441408,
"failureCounts": {
"rate_limit": 1
},
"cooldownUntil": 1774583501408
},
"openai-codex:default": {
"errorCount": 0,
"lastUsed": 1774855017119
},
"anthropic:default": {
"errorCount": 1,
"failureCounts": {
"rate_limit": 1
},
"lastFailureAt": 1774583413860,
"cooldownUntil": 1774583473860
},
"zai:default": {
"errorCount": 0,
"lastUsed": 1774583354509
"openai-codex:william.valentin.info@gmail.com": {
"type": "oauth",
"provider": "openai-codex",
"access": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjE5MzQ0ZTY1LWJiYzktNDRkMS1hOWQwLWY5NTdiMDc5YmQwZSIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSJdLCJjbGllbnRfaWQiOiJhcHBfRU1vYW1FRVo3M2YwQ2tYYVhwN2hyYW5uIiwiZXhwIjoxNzc3NzQ4MDkzLCJodHRwczovL2FwaS5vcGVuYWkuY29tL2F1dGgiOnsiYW1yIjpbIm90cCIsIm1mYSIsInVybjpvcGVuYWk6YW1yOm90cF90b3RwIl0sImNoYXRncHRfYWNjb3VudF9pZCI6ImMwNjJjZjZiLWJiMTktNGQwOC1hNmUzLWE0ZTRmMTc3ZTdlMSIsImNoYXRncHRfYWNjb3VudF91c2VyX2lkIjoidXNlci1VWHZtNDFUSlFuU0JsZGRIWHg2ekhsRWtfX2MwNjJjZjZiLWJiMTktNGQwOC1hNmUzLWE0ZTRmMTc3ZTdlMSIsImNoYXRncHRfY29tcHV0ZV9yZXNpZGVuY3kiOiJub19jb25zdHJhaW50IiwiY2hhdGdwdF9wbGFuX3R5cGUiOiJwbHVzIiwiY2hhdGdwdF91c2VyX2lkIjoidXNlci1VWHZtNDFUSlFuU0JsZGRIWHg2ekhsRWsiLCJsb2NhbGhvc3QiOnRydWUsInVzZXJfaWQiOiJ1c2VyLVVYdm00MVRKUW5TQmxkZEhYeDZ6SGxFayJ9LCJodHRwczovL2FwaS5vcGVuYWkuY29tL21mYSI6eyJyZXF1aXJlZCI6InllcyJ9LCJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiJ3aWxsaWFtLnZhbGVudGluLmluZm9AZ21haWwuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9LCJpYXQiOjE3NzY4ODQwOTMsImlzcyI6Imh0dHBzOi8vYXV0aC5vcGVuYWkuY29tIiwianRpIjoiODVmYmJkYTQtZjE4Mi00Y2VmLTk4ZDQtZmU0NWM5Nzc2NDliIiwibmJmIjoxNzc2ODg0MDkzLCJwd2RfYXV0aF90aW1lIjoxNzc2ODg0MDgxOTc3LCJzY3AiOlsib3BlbmlkIiwicHJvZmlsZSIsImVtYWlsIiwib2ZmbGluZV9hY2Nlc3MiXSwic2Vzc2lvbl9pZCI6ImF1dGhzZXNzX1FqT1FlRmFOSkNRbk0xU083OXdxREdteiIsInNsIjp0cnVlLCJzdWIiOiJnb29nbGUtb2F1dGgyfDEwNjMzNzY4NjU4MzU5MjgwODAxNyJ9.7G_S9EHgi7jIIQxfG7zy3IE3xOkb5HLaJ8oHQ3pw5KjNEsHRBlQmZ7uN7vXcvMcKP-oYxMHy6OBMe7PLS_Ji__tLUmh9J_ifGBFj8e9BWvOSabgLeC0W17Gr9Y4AYxo3zifZtJJV5lCmWR6vksMafU24Hvouo-qbo5vDfUU6iyuHvOx4wWScYeQxGtNASguKkL0k2vvb5nSFuKefG4ZhKjHj3bzTbNii_Ec18uVr7PqEC1bqNyZqSrnm11KycpXvxYjl5gS-xowXZosOgown_qxu5YVu9g15_oWwLl9iI3wjtN-beO9IAPXP3TuqXY5qT590H9fsPUFyuPbRdRFUwSq8uU_5ILjyd61Prq2HmRP-qsUG0aMpGzQkfpR9bPiiCvOejJ1nD30SJPY7TwfAvJ7K-Rj84yEfKi6DtjBoM2PQsGcmT8q9Cd3RCvgnogr8DxlSrrsjxdmE-Lk-qf0hUdquiB6tLMmPBUjcaYABJPrwIfrtsynY0rez6nKcVHIUUGNmEUnJDTwCweqXuqvSac00qRHNzPG8scz167yR16geDllVh2OdN36n7iuOjU3XzMVRn-dnrRbApMu62kKrF4ocY_ZhlBrJEd7N0jp_cd9j3tby6x1QFLZ7v8QSp03J9XE5IDP6u4TnXggblpjrQAJ_03GzCZH5apfhxHzO3tw",
"refresh": "rt_a0zIAX4bE-d4O_GXQaakIFn526NdwyGgdkGiW7AKkuU.wETraghg_gKyRezlDvkwKIXVokJ1FF1CXKgDNj-vMpE",
"expires": 1777748092355,
"email": "william.valentin.info@gmail.com"
}
}
}