{
  "schemaVersion": "1.0",
  "item": {
    "slug": "arcane-docker-manager",
    "name": "Personal Docker Manager",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/cougz/arcane-docker-manager",
    "canonicalUrl": "https://clawhub.ai/cougz/arcane-docker-manager",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/arcane-docker-manager",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=arcane-docker-manager",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/arcane-docker-manager"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/arcane-docker-manager",
    "agentPageUrl": "https://openagent3.xyz/skills/arcane-docker-manager/agent",
    "manifestUrl": "https://openagent3.xyz/skills/arcane-docker-manager/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/arcane-docker-manager/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Overview",
        "body": "This skill enables you to interact with your Arcane Docker Management API to manage Docker containers, compose stacks, templates, networks, volumes, images, and system monitoring. Arcane is a comprehensive Docker management platform with a REST API."
      },
      {
        "title": "When to Use This Skill",
        "body": "Use this skill when the user requests any of the following:\n\nManaging Docker containers (list, start, stop, restart, remove, inspect)\nManaging Docker Compose stacks (deploy, update, remove, view logs)\nWorking with Docker templates (create, deploy, manage)\nManaging Docker images (list, pull, remove, prune)\nManaging Docker networks and volumes\nMonitoring system resources and Docker statistics\nManaging user accounts and API keys\nViewing system logs and events"
      },
      {
        "title": "Base URL",
        "body": "The API base URL should be configured by the user. Default: http://localhost:3552/api"
      },
      {
        "title": "Authentication",
        "body": "Arcane supports two authentication methods:\n\nBearer Token (JWT): Obtained via login endpoint\nAPI Key: Long-lived authentication using X-API-Key header\n\nGetting a Bearer Token\n\ncurl -X POST \"$BASE_URL/auth/login\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"username\": \"admin\",\r\n    \"password\": \"your_password\"\r\n  }'\n\nResponse includes token, refreshToken, and expiresAt.\n\nUsing API Keys\n\nAPI keys can be created and managed through the /apikeys endpoints. Use the X-API-Key header for authentication."
      },
      {
        "title": "1. Container Management",
        "body": "List Containers\n\n# Get all containers\r\ncurl -X GET \"$BASE_URL/containers\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Filter by status\r\ncurl -X GET \"$BASE_URL/containers?status=running\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Search containers\r\ncurl -X GET \"$BASE_URL/containers?search=nginx\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nContainer Operations\n\n# Start container\r\ncurl -X POST \"$BASE_URL/containers/{id}/start\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Stop container\r\ncurl -X POST \"$BASE_URL/containers/{id}/stop\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Restart container\r\ncurl -X POST \"$BASE_URL/containers/{id}/restart\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Remove container\r\ncurl -X DELETE \"$BASE_URL/containers/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get container details\r\ncurl -X GET \"$BASE_URL/containers/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get container logs\r\ncurl -X GET \"$BASE_URL/containers/{id}/logs?tail=100\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get container stats\r\ncurl -X GET \"$BASE_URL/containers/{id}/stats\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nAdvanced Container Operations\n\n# Execute command in container\r\ncurl -X POST \"$BASE_URL/containers/{id}/exec\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"command\": [\"ls\", \"-la\"],\r\n    \"workingDir\": \"/app\"\r\n  }'\r\n\r\n# Rename container\r\ncurl -X POST \"$BASE_URL/containers/{id}/rename\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"new-container-name\"\r\n  }'\r\n\r\n# Update container resources\r\ncurl -X POST \"$BASE_URL/containers/{id}/update\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"cpuShares\": 512,\r\n    \"memory\": 536870912,\r\n    \"restartPolicy\": \"unless-stopped\"\r\n  }'"
      },
      {
        "title": "2. Docker Compose Stack Management",
        "body": "List Stacks\n\ncurl -X GET \"$BASE_URL/stacks\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nDeploy Stack from Template\n\ncurl -X POST \"$BASE_URL/stacks\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"my-stack\",\r\n    \"templateId\": \"template-id\",\r\n    \"envVars\": {\r\n      \"PORT\": \"8080\",\r\n      \"DATABASE_URL\": \"postgres://...\"\r\n    }\r\n  }'\n\nDeploy Stack from Compose File\n\ncurl -X POST \"$BASE_URL/stacks\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"my-stack\",\r\n    \"composeContent\": \"version: \\\"3.8\\\"\\nservices:\\n  web:\\n    image: nginx:latest\\n    ports:\\n      - \\\"80:80\\\"\"\r\n  }'\n\nStack Operations\n\n# Get stack details\r\ncurl -X GET \"$BASE_URL/stacks/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Update stack\r\ncurl -X PUT \"$BASE_URL/stacks/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"envVars\": {\r\n      \"PORT\": \"9090\"\r\n    }\r\n  }'\r\n\r\n# Remove stack\r\ncurl -X DELETE \"$BASE_URL/stacks/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Start stack\r\ncurl -X POST \"$BASE_URL/stacks/{id}/start\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Stop stack\r\ncurl -X POST \"$BASE_URL/stacks/{id}/stop\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Restart stack\r\ncurl -X POST \"$BASE_URL/stacks/{id}/restart\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get stack logs\r\ncurl -X GET \"$BASE_URL/stacks/{id}/logs?tail=100\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Pull latest images for stack\r\ncurl -X POST \"$BASE_URL/stacks/{id}/pull\" \\\r\n  -H \"Authorization: Bearer $TOKEN\""
      },
      {
        "title": "3. Template Management",
        "body": "List Templates\n\ncurl -X GET \"$BASE_URL/templates\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nCreate Template\n\ncurl -X POST \"$BASE_URL/templates\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"nginx-template\",\r\n    \"description\": \"Basic nginx web server\",\r\n    \"content\": \"version: \\\"3.8\\\"\\nservices:\\n  web:\\n    image: nginx:{{VERSION}}\\n    ports:\\n      - \\\"{{PORT}}:80\\\"\",\r\n    \"variables\": [\r\n      {\r\n        \"name\": \"VERSION\",\r\n        \"description\": \"Nginx version\",\r\n        \"defaultValue\": \"latest\"\r\n      },\r\n      {\r\n        \"name\": \"PORT\",\r\n        \"description\": \"Host port\",\r\n        \"defaultValue\": \"80\"\r\n      }\r\n    ],\r\n    \"category\": \"web-servers\",\r\n    \"tags\": [\"nginx\", \"web\"]\r\n  }'\n\nTemplate Operations\n\n# Get template\r\ncurl -X GET \"$BASE_URL/templates/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Update template\r\ncurl -X PUT \"$BASE_URL/templates/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"updated-template-name\",\r\n    \"description\": \"Updated description\"\r\n  }'\r\n\r\n# Delete template\r\ncurl -X DELETE \"$BASE_URL/templates/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get template content with parsed variables\r\ncurl -X GET \"$BASE_URL/templates/{id}/content\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nGlobal Template Variables\n\n# Get global variables\r\ncurl -X GET \"$BASE_URL/templates/global-variables\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Update global variables\r\ncurl -X PUT \"$BASE_URL/templates/global-variables\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"GLOBAL_DOMAIN\": \"example.com\",\r\n    \"GLOBAL_NETWORK\": \"traefik-public\"\r\n  }'"
      },
      {
        "title": "4. Image Management",
        "body": "List Images\n\ncurl -X GET \"$BASE_URL/images\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nPull Image\n\ncurl -X POST \"$BASE_URL/images/pull\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"image\": \"nginx:latest\"\r\n  }'\n\nImage Operations\n\n# Get image details\r\ncurl -X GET \"$BASE_URL/images/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Remove image\r\ncurl -X DELETE \"$BASE_URL/images/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Prune unused images\r\ncurl -X POST \"$BASE_URL/images/prune\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Search images in registry\r\ncurl -X GET \"$BASE_URL/images/search?term=nginx\" \\\r\n  -H \"Authorization: Bearer $TOKEN\""
      },
      {
        "title": "5. Network Management",
        "body": "List Networks\n\ncurl -X GET \"$BASE_URL/networks\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nCreate Network\n\ncurl -X POST \"$BASE_URL/networks\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"my-network\",\r\n    \"driver\": \"bridge\",\r\n    \"internal\": false,\r\n    \"attachable\": true\r\n  }'\n\nNetwork Operations\n\n# Get network details\r\ncurl -X GET \"$BASE_URL/networks/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Remove network\r\ncurl -X DELETE \"$BASE_URL/networks/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Connect container to network\r\ncurl -X POST \"$BASE_URL/networks/{id}/connect\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"containerId\": \"container-id\"\r\n  }'\r\n\r\n# Disconnect container from network\r\ncurl -X POST \"$BASE_URL/networks/{id}/disconnect\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"containerId\": \"container-id\"\r\n  }'\r\n\r\n# Prune unused networks\r\ncurl -X POST \"$BASE_URL/networks/prune\" \\\r\n  -H \"Authorization: Bearer $TOKEN\""
      },
      {
        "title": "6. Volume Management",
        "body": "List Volumes\n\ncurl -X GET \"$BASE_URL/volumes\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nCreate Volume\n\ncurl -X POST \"$BASE_URL/volumes\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"my-volume\",\r\n    \"driver\": \"local\",\r\n    \"labels\": {\r\n      \"project\": \"my-app\"\r\n    }\r\n  }'\n\nVolume Operations\n\n# Get volume details\r\ncurl -X GET \"$BASE_URL/volumes/{name}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Remove volume\r\ncurl -X DELETE \"$BASE_URL/volumes/{name}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Prune unused volumes\r\ncurl -X POST \"$BASE_URL/volumes/prune\" \\\r\n  -H \"Authorization: Bearer $TOKEN\""
      },
      {
        "title": "7. System Monitoring",
        "body": "System Information\n\n# Get Docker system info\r\ncurl -X GET \"$BASE_URL/system/info\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get Docker version\r\ncurl -X GET \"$BASE_URL/system/version\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get system stats\r\ncurl -X GET \"$BASE_URL/system/stats\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get disk usage\r\ncurl -X GET \"$BASE_URL/system/df\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nEvents and Logs\n\n# Get system events (streaming)\r\ncurl -X GET \"$BASE_URL/system/events\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get events with filters\r\ncurl -X GET \"$BASE_URL/system/events?since=1609459200&type=container\" \\\r\n  -H \"Authorization: Bearer $TOKEN\""
      },
      {
        "title": "8. User Management",
        "body": "List Users\n\ncurl -X GET \"$BASE_URL/users\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nCreate User\n\ncurl -X POST \"$BASE_URL/users\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"username\": \"newuser\",\r\n    \"email\": \"user@example.com\",\r\n    \"password\": \"securepassword123\",\r\n    \"role\": \"user\"\r\n  }'\n\nUser Operations\n\n# Get user details\r\ncurl -X GET \"$BASE_URL/users/{userId}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Update user\r\ncurl -X PUT \"$BASE_URL/users/{userId}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"email\": \"newemail@example.com\",\r\n    \"role\": \"admin\"\r\n  }'\r\n\r\n# Delete user\r\ncurl -X DELETE \"$BASE_URL/users/{userId}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Change password\r\ncurl -X PUT \"$BASE_URL/auth/password\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"currentPassword\": \"oldpassword\",\r\n    \"newPassword\": \"newpassword123\"\r\n  }'"
      },
      {
        "title": "9. API Key Management",
        "body": "List API Keys\n\ncurl -X GET \"$BASE_URL/apikeys\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nCreate API Key\n\ncurl -X POST \"$BASE_URL/apikeys\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"CI/CD Pipeline Key\",\r\n    \"description\": \"API key for automated deployments\",\r\n    \"expiresAt\": \"2025-12-31T23:59:59Z\"\r\n  }'\n\nAPI Key Operations\n\n# Get API key details\r\ncurl -X GET \"$BASE_URL/apikeys/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Update API key\r\ncurl -X PUT \"$BASE_URL/apikeys/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"Updated Key Name\",\r\n    \"description\": \"Updated description\"\r\n  }'\r\n\r\n# Delete API key\r\ncurl -X DELETE \"$BASE_URL/apikeys/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\""
      },
      {
        "title": "Error Handling",
        "body": "All API responses follow a standard format:\n\n{\r\n  \"success\": true|false,\r\n  \"data\": {...},\r\n  \"message\": \"Success or error message\"\r\n}\n\nError responses use HTTP problem details (RFC 7807):\n\n{\r\n  \"type\": \"about:blank\",\r\n  \"title\": \"Error title\",\r\n  \"status\": 400,\r\n  \"detail\": \"Detailed error message\"\r\n}"
      },
      {
        "title": "Pagination",
        "body": "List endpoints support pagination with these query parameters:\n\nstart: Starting index (default: 0)\nlimit: Items per page (default: 20)\nsort: Column to sort by\norder: Sort direction (asc/desc, default: asc)\nsearch: Search query\n\nResponse includes pagination metadata:\n\n{\r\n  \"success\": true,\r\n  \"data\": [...],\r\n  \"pagination\": {\r\n    \"start\": 0,\r\n    \"limit\": 20,\r\n    \"total\": 100,\r\n    \"hasMore\": true\r\n  }\r\n}"
      },
      {
        "title": "Using Python",
        "body": "When implementing Arcane operations in Python, use the requests library:\n\nimport requests\r\n\r\nBASE_URL = \"http://localhost:3552/api\"\r\nTOKEN = \"your-jwt-token\"\r\n\r\nheaders = {\r\n    \"Authorization\": f\"Bearer {TOKEN}\",\r\n    \"Content-Type\": \"application/json\"\r\n}\r\n\r\n# List containers\r\nresponse = requests.get(f\"{BASE_URL}/containers\", headers=headers)\r\ncontainers = response.json()\r\n\r\n# Deploy stack\r\nstack_data = {\r\n    \"name\": \"my-stack\",\r\n    \"templateId\": \"template-id\",\r\n    \"envVars\": {\r\n        \"PORT\": \"8080\"\r\n    }\r\n}\r\nresponse = requests.post(f\"{BASE_URL}/stacks\", headers=headers, json=stack_data)\r\nresult = response.json()"
      },
      {
        "title": "Using Bash",
        "body": "For simple operations, use curl with error handling:\n\n#!/bin/bash\r\n\r\nBASE_URL=\"http://localhost:3552/api\"\r\nTOKEN=\"your-jwt-token\"\r\n\r\n# Function to make authenticated requests\r\napi_call() {\r\n    local method=$1\r\n    local endpoint=$2\r\n    local data=$3\r\n    \r\n    if [ -z \"$data\" ]; then\r\n        curl -s -X \"$method\" \"$BASE_URL/$endpoint\" \\\r\n            -H \"Authorization: Bearer $TOKEN\"\r\n    else\r\n        curl -s -X \"$method\" \"$BASE_URL/$endpoint\" \\\r\n            -H \"Authorization: Bearer $TOKEN\" \\\r\n            -H \"Content-Type: application/json\" \\\r\n            -d \"$data\"\r\n    fi\r\n}\r\n\r\n# Example: List containers\r\ncontainers=$(api_call GET \"containers\")\r\necho \"$containers\" | jq '.data[] | {id, name, status}'"
      },
      {
        "title": "1. Deploy Application Stack",
        "body": "# 1. Create or select template\r\ntemplate_data = {\r\n    \"name\": \"webapp-template\",\r\n    \"content\": \"version: '3.8'\\nservices:\\n  web:\\n    image: myapp:{{VERSION}}\\n    ports:\\n      - '{{PORT}}:8080'\",\r\n    \"variables\": [\r\n        {\"name\": \"VERSION\", \"defaultValue\": \"latest\"},\r\n        {\"name\": \"PORT\", \"defaultValue\": \"80\"}\r\n    ]\r\n}\r\ntemplate = requests.post(f\"{BASE_URL}/templates\", headers=headers, json=template_data).json()\r\n\r\n# 2. Deploy stack from template\r\nstack_data = {\r\n    \"name\": \"production-webapp\",\r\n    \"templateId\": template[\"data\"][\"id\"],\r\n    \"envVars\": {\r\n        \"VERSION\": \"v1.2.3\",\r\n        \"PORT\": \"8080\"\r\n    }\r\n}\r\nstack = requests.post(f\"{BASE_URL}/stacks\", headers=headers, json=stack_data).json()\r\n\r\n# 3. Monitor deployment\r\nstack_id = stack[\"data\"][\"id\"]\r\nlogs = requests.get(f\"{BASE_URL}/stacks/{stack_id}/logs?tail=50\", headers=headers).json()"
      },
      {
        "title": "2. Scale and Monitor Containers",
        "body": "# Get running containers\r\ncontainers = requests.get(f\"{BASE_URL}/containers?status=running\", headers=headers).json()\r\n\r\n# Get stats for each container\r\nfor container in containers[\"data\"]:\r\n    stats = requests.get(f\"{BASE_URL}/containers/{container['id']}/stats\", headers=headers).json()\r\n    print(f\"{container['name']}: CPU {stats['data']['cpuPercent']:.2f}%, Memory {stats['data']['memoryPercent']:.2f}%\")\r\n\r\n# Update container resources if needed\r\nupdate_data = {\r\n    \"cpuShares\": 1024,\r\n    \"memory\": 1073741824  # 1GB\r\n}\r\nrequests.post(f\"{BASE_URL}/containers/{container_id}/update\", headers=headers, json=update_data)"
      },
      {
        "title": "3. Cleanup and Maintenance",
        "body": "# Prune unused resources\r\nrequests.post(f\"{BASE_URL}/images/prune\", headers=headers)\r\nrequests.post(f\"{BASE_URL}/volumes/prune\", headers=headers)\r\nrequests.post(f\"{BASE_URL}/networks/prune\", headers=headers)\r\n\r\n# Get disk usage before and after\r\ndf_before = requests.get(f\"{BASE_URL}/system/df\", headers=headers).json()\r\n# ... perform cleanup ...\r\ndf_after = requests.get(f\"{BASE_URL}/system/df\", headers=headers).json()"
      },
      {
        "title": "Best Practices",
        "body": "Authentication: Always use API keys for automated scripts and services. Use JWT tokens for interactive sessions.\n\n\nError Handling: Check response status codes and handle errors appropriately:\n\n200: Success\n400: Bad request (validation error)\n401: Unauthorized\n403: Forbidden\n404: Not found\n500: Internal server error\n\n\n\nResource Management:\n\nAlways specify resource limits when creating containers\nUse labels to organize resources\nRegularly prune unused resources\n\n\n\nSecurity:\n\nStore API keys and tokens securely (use environment variables)\nUse HTTPS in production\nImplement proper access controls with user roles\nRotate API keys regularly\n\n\n\nMonitoring:\n\nMonitor container stats regularly\nSet up alerts for resource usage\nReview system logs periodically\n\n\n\nTemplates:\n\nUse variables for configurable values\nDocument template variables clearly\nVersion control your templates\nUse global variables for shared configuration"
      },
      {
        "title": "Common Issues",
        "body": "Authentication Failed\n\nVerify token is not expired (check expiresAt)\nUse refresh token to get new access token\nVerify API key is correct and not expired\n\nContainer Won't Start\n\nCheck container logs: GET /containers/{id}/logs\nInspect container: GET /containers/{id}\nVerify port conflicts and resource availability\n\nStack Deployment Failed\n\nValidate compose file syntax\nCheck template variables are properly defined\nReview stack logs: GET /stacks/{id}/logs\n\nResource Not Found\n\nVerify resource ID is correct\nCheck if resource was deleted\nEnsure proper permissions"
      },
      {
        "title": "Notes",
        "body": "All timestamps are in ISO 8601 format (UTC)\nContainer IDs can be full or short (first 12 characters)\nImage names support full registry paths (registry.example.com/image:tag)\nNetwork and volume names must be unique\nStack names must be unique per user/project"
      },
      {
        "title": "Reference Links",
        "body": "For complete API documentation and schema definitions, refer to the OpenAPI specification provided in the JSON schema."
      }
    ],
    "body": "OpenClaw - Arcane Docker Management Skill\nOverview\n\nThis skill enables you to interact with your Arcane Docker Management API to manage Docker containers, compose stacks, templates, networks, volumes, images, and system monitoring. Arcane is a comprehensive Docker management platform with a REST API.\n\nWhen to Use This Skill\n\nUse this skill when the user requests any of the following:\n\nManaging Docker containers (list, start, stop, restart, remove, inspect)\nManaging Docker Compose stacks (deploy, update, remove, view logs)\nWorking with Docker templates (create, deploy, manage)\nManaging Docker images (list, pull, remove, prune)\nManaging Docker networks and volumes\nMonitoring system resources and Docker statistics\nManaging user accounts and API keys\nViewing system logs and events\nAPI Configuration\nBase URL\n\nThe API base URL should be configured by the user. Default: http://localhost:3552/api\n\nAuthentication\n\nArcane supports two authentication methods:\n\nBearer Token (JWT): Obtained via login endpoint\nAPI Key: Long-lived authentication using X-API-Key header\nGetting a Bearer Token\ncurl -X POST \"$BASE_URL/auth/login\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"username\": \"admin\",\r\n    \"password\": \"your_password\"\r\n  }'\n\n\nResponse includes token, refreshToken, and expiresAt.\n\nUsing API Keys\n\nAPI keys can be created and managed through the /apikeys endpoints. Use the X-API-Key header for authentication.\n\nCore Functionality\n1. Container Management\nList Containers\n# Get all containers\r\ncurl -X GET \"$BASE_URL/containers\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Filter by status\r\ncurl -X GET \"$BASE_URL/containers?status=running\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Search containers\r\ncurl -X GET \"$BASE_URL/containers?search=nginx\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nContainer Operations\n# Start container\r\ncurl -X POST \"$BASE_URL/containers/{id}/start\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Stop container\r\ncurl -X POST \"$BASE_URL/containers/{id}/stop\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Restart container\r\ncurl -X POST \"$BASE_URL/containers/{id}/restart\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Remove container\r\ncurl -X DELETE \"$BASE_URL/containers/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get container details\r\ncurl -X GET \"$BASE_URL/containers/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get container logs\r\ncurl -X GET \"$BASE_URL/containers/{id}/logs?tail=100\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get container stats\r\ncurl -X GET \"$BASE_URL/containers/{id}/stats\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nAdvanced Container Operations\n# Execute command in container\r\ncurl -X POST \"$BASE_URL/containers/{id}/exec\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"command\": [\"ls\", \"-la\"],\r\n    \"workingDir\": \"/app\"\r\n  }'\r\n\r\n# Rename container\r\ncurl -X POST \"$BASE_URL/containers/{id}/rename\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"new-container-name\"\r\n  }'\r\n\r\n# Update container resources\r\ncurl -X POST \"$BASE_URL/containers/{id}/update\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"cpuShares\": 512,\r\n    \"memory\": 536870912,\r\n    \"restartPolicy\": \"unless-stopped\"\r\n  }'\n\n2. Docker Compose Stack Management\nList Stacks\ncurl -X GET \"$BASE_URL/stacks\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nDeploy Stack from Template\ncurl -X POST \"$BASE_URL/stacks\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"my-stack\",\r\n    \"templateId\": \"template-id\",\r\n    \"envVars\": {\r\n      \"PORT\": \"8080\",\r\n      \"DATABASE_URL\": \"postgres://...\"\r\n    }\r\n  }'\n\nDeploy Stack from Compose File\ncurl -X POST \"$BASE_URL/stacks\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"my-stack\",\r\n    \"composeContent\": \"version: \\\"3.8\\\"\\nservices:\\n  web:\\n    image: nginx:latest\\n    ports:\\n      - \\\"80:80\\\"\"\r\n  }'\n\nStack Operations\n# Get stack details\r\ncurl -X GET \"$BASE_URL/stacks/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Update stack\r\ncurl -X PUT \"$BASE_URL/stacks/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"envVars\": {\r\n      \"PORT\": \"9090\"\r\n    }\r\n  }'\r\n\r\n# Remove stack\r\ncurl -X DELETE \"$BASE_URL/stacks/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Start stack\r\ncurl -X POST \"$BASE_URL/stacks/{id}/start\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Stop stack\r\ncurl -X POST \"$BASE_URL/stacks/{id}/stop\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Restart stack\r\ncurl -X POST \"$BASE_URL/stacks/{id}/restart\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get stack logs\r\ncurl -X GET \"$BASE_URL/stacks/{id}/logs?tail=100\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Pull latest images for stack\r\ncurl -X POST \"$BASE_URL/stacks/{id}/pull\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\n3. Template Management\nList Templates\ncurl -X GET \"$BASE_URL/templates\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nCreate Template\ncurl -X POST \"$BASE_URL/templates\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"nginx-template\",\r\n    \"description\": \"Basic nginx web server\",\r\n    \"content\": \"version: \\\"3.8\\\"\\nservices:\\n  web:\\n    image: nginx:{{VERSION}}\\n    ports:\\n      - \\\"{{PORT}}:80\\\"\",\r\n    \"variables\": [\r\n      {\r\n        \"name\": \"VERSION\",\r\n        \"description\": \"Nginx version\",\r\n        \"defaultValue\": \"latest\"\r\n      },\r\n      {\r\n        \"name\": \"PORT\",\r\n        \"description\": \"Host port\",\r\n        \"defaultValue\": \"80\"\r\n      }\r\n    ],\r\n    \"category\": \"web-servers\",\r\n    \"tags\": [\"nginx\", \"web\"]\r\n  }'\n\nTemplate Operations\n# Get template\r\ncurl -X GET \"$BASE_URL/templates/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Update template\r\ncurl -X PUT \"$BASE_URL/templates/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"updated-template-name\",\r\n    \"description\": \"Updated description\"\r\n  }'\r\n\r\n# Delete template\r\ncurl -X DELETE \"$BASE_URL/templates/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get template content with parsed variables\r\ncurl -X GET \"$BASE_URL/templates/{id}/content\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nGlobal Template Variables\n# Get global variables\r\ncurl -X GET \"$BASE_URL/templates/global-variables\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Update global variables\r\ncurl -X PUT \"$BASE_URL/templates/global-variables\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"GLOBAL_DOMAIN\": \"example.com\",\r\n    \"GLOBAL_NETWORK\": \"traefik-public\"\r\n  }'\n\n4. Image Management\nList Images\ncurl -X GET \"$BASE_URL/images\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nPull Image\ncurl -X POST \"$BASE_URL/images/pull\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"image\": \"nginx:latest\"\r\n  }'\n\nImage Operations\n# Get image details\r\ncurl -X GET \"$BASE_URL/images/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Remove image\r\ncurl -X DELETE \"$BASE_URL/images/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Prune unused images\r\ncurl -X POST \"$BASE_URL/images/prune\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Search images in registry\r\ncurl -X GET \"$BASE_URL/images/search?term=nginx\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\n5. Network Management\nList Networks\ncurl -X GET \"$BASE_URL/networks\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nCreate Network\ncurl -X POST \"$BASE_URL/networks\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"my-network\",\r\n    \"driver\": \"bridge\",\r\n    \"internal\": false,\r\n    \"attachable\": true\r\n  }'\n\nNetwork Operations\n# Get network details\r\ncurl -X GET \"$BASE_URL/networks/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Remove network\r\ncurl -X DELETE \"$BASE_URL/networks/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Connect container to network\r\ncurl -X POST \"$BASE_URL/networks/{id}/connect\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"containerId\": \"container-id\"\r\n  }'\r\n\r\n# Disconnect container from network\r\ncurl -X POST \"$BASE_URL/networks/{id}/disconnect\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"containerId\": \"container-id\"\r\n  }'\r\n\r\n# Prune unused networks\r\ncurl -X POST \"$BASE_URL/networks/prune\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\n6. Volume Management\nList Volumes\ncurl -X GET \"$BASE_URL/volumes\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nCreate Volume\ncurl -X POST \"$BASE_URL/volumes\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"my-volume\",\r\n    \"driver\": \"local\",\r\n    \"labels\": {\r\n      \"project\": \"my-app\"\r\n    }\r\n  }'\n\nVolume Operations\n# Get volume details\r\ncurl -X GET \"$BASE_URL/volumes/{name}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Remove volume\r\ncurl -X DELETE \"$BASE_URL/volumes/{name}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Prune unused volumes\r\ncurl -X POST \"$BASE_URL/volumes/prune\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\n7. System Monitoring\nSystem Information\n# Get Docker system info\r\ncurl -X GET \"$BASE_URL/system/info\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get Docker version\r\ncurl -X GET \"$BASE_URL/system/version\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get system stats\r\ncurl -X GET \"$BASE_URL/system/stats\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get disk usage\r\ncurl -X GET \"$BASE_URL/system/df\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nEvents and Logs\n# Get system events (streaming)\r\ncurl -X GET \"$BASE_URL/system/events\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Get events with filters\r\ncurl -X GET \"$BASE_URL/system/events?since=1609459200&type=container\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\n8. User Management\nList Users\ncurl -X GET \"$BASE_URL/users\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nCreate User\ncurl -X POST \"$BASE_URL/users\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"username\": \"newuser\",\r\n    \"email\": \"user@example.com\",\r\n    \"password\": \"securepassword123\",\r\n    \"role\": \"user\"\r\n  }'\n\nUser Operations\n# Get user details\r\ncurl -X GET \"$BASE_URL/users/{userId}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Update user\r\ncurl -X PUT \"$BASE_URL/users/{userId}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"email\": \"newemail@example.com\",\r\n    \"role\": \"admin\"\r\n  }'\r\n\r\n# Delete user\r\ncurl -X DELETE \"$BASE_URL/users/{userId}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Change password\r\ncurl -X PUT \"$BASE_URL/auth/password\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"currentPassword\": \"oldpassword\",\r\n    \"newPassword\": \"newpassword123\"\r\n  }'\n\n9. API Key Management\nList API Keys\ncurl -X GET \"$BASE_URL/apikeys\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nCreate API Key\ncurl -X POST \"$BASE_URL/apikeys\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"CI/CD Pipeline Key\",\r\n    \"description\": \"API key for automated deployments\",\r\n    \"expiresAt\": \"2025-12-31T23:59:59Z\"\r\n  }'\n\nAPI Key Operations\n# Get API key details\r\ncurl -X GET \"$BASE_URL/apikeys/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\r\n\r\n# Update API key\r\ncurl -X PUT \"$BASE_URL/apikeys/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"name\": \"Updated Key Name\",\r\n    \"description\": \"Updated description\"\r\n  }'\r\n\r\n# Delete API key\r\ncurl -X DELETE \"$BASE_URL/apikeys/{id}\" \\\r\n  -H \"Authorization: Bearer $TOKEN\"\n\nImplementation Guidelines\nError Handling\n\nAll API responses follow a standard format:\n\n{\r\n  \"success\": true|false,\r\n  \"data\": {...},\r\n  \"message\": \"Success or error message\"\r\n}\n\n\nError responses use HTTP problem details (RFC 7807):\n\n{\r\n  \"type\": \"about:blank\",\r\n  \"title\": \"Error title\",\r\n  \"status\": 400,\r\n  \"detail\": \"Detailed error message\"\r\n}\n\nPagination\n\nList endpoints support pagination with these query parameters:\n\nstart: Starting index (default: 0)\nlimit: Items per page (default: 20)\nsort: Column to sort by\norder: Sort direction (asc/desc, default: asc)\nsearch: Search query\n\nResponse includes pagination metadata:\n\n{\r\n  \"success\": true,\r\n  \"data\": [...],\r\n  \"pagination\": {\r\n    \"start\": 0,\r\n    \"limit\": 20,\r\n    \"total\": 100,\r\n    \"hasMore\": true\r\n  }\r\n}\n\nUsing Python\n\nWhen implementing Arcane operations in Python, use the requests library:\n\nimport requests\r\n\r\nBASE_URL = \"http://localhost:3552/api\"\r\nTOKEN = \"your-jwt-token\"\r\n\r\nheaders = {\r\n    \"Authorization\": f\"Bearer {TOKEN}\",\r\n    \"Content-Type\": \"application/json\"\r\n}\r\n\r\n# List containers\r\nresponse = requests.get(f\"{BASE_URL}/containers\", headers=headers)\r\ncontainers = response.json()\r\n\r\n# Deploy stack\r\nstack_data = {\r\n    \"name\": \"my-stack\",\r\n    \"templateId\": \"template-id\",\r\n    \"envVars\": {\r\n        \"PORT\": \"8080\"\r\n    }\r\n}\r\nresponse = requests.post(f\"{BASE_URL}/stacks\", headers=headers, json=stack_data)\r\nresult = response.json()\n\nUsing Bash\n\nFor simple operations, use curl with error handling:\n\n#!/bin/bash\r\n\r\nBASE_URL=\"http://localhost:3552/api\"\r\nTOKEN=\"your-jwt-token\"\r\n\r\n# Function to make authenticated requests\r\napi_call() {\r\n    local method=$1\r\n    local endpoint=$2\r\n    local data=$3\r\n    \r\n    if [ -z \"$data\" ]; then\r\n        curl -s -X \"$method\" \"$BASE_URL/$endpoint\" \\\r\n            -H \"Authorization: Bearer $TOKEN\"\r\n    else\r\n        curl -s -X \"$method\" \"$BASE_URL/$endpoint\" \\\r\n            -H \"Authorization: Bearer $TOKEN\" \\\r\n            -H \"Content-Type: application/json\" \\\r\n            -d \"$data\"\r\n    fi\r\n}\r\n\r\n# Example: List containers\r\ncontainers=$(api_call GET \"containers\")\r\necho \"$containers\" | jq '.data[] | {id, name, status}'\n\nCommon Workflows\n1. Deploy Application Stack\n# 1. Create or select template\r\ntemplate_data = {\r\n    \"name\": \"webapp-template\",\r\n    \"content\": \"version: '3.8'\\nservices:\\n  web:\\n    image: myapp:{{VERSION}}\\n    ports:\\n      - '{{PORT}}:8080'\",\r\n    \"variables\": [\r\n        {\"name\": \"VERSION\", \"defaultValue\": \"latest\"},\r\n        {\"name\": \"PORT\", \"defaultValue\": \"80\"}\r\n    ]\r\n}\r\ntemplate = requests.post(f\"{BASE_URL}/templates\", headers=headers, json=template_data).json()\r\n\r\n# 2. Deploy stack from template\r\nstack_data = {\r\n    \"name\": \"production-webapp\",\r\n    \"templateId\": template[\"data\"][\"id\"],\r\n    \"envVars\": {\r\n        \"VERSION\": \"v1.2.3\",\r\n        \"PORT\": \"8080\"\r\n    }\r\n}\r\nstack = requests.post(f\"{BASE_URL}/stacks\", headers=headers, json=stack_data).json()\r\n\r\n# 3. Monitor deployment\r\nstack_id = stack[\"data\"][\"id\"]\r\nlogs = requests.get(f\"{BASE_URL}/stacks/{stack_id}/logs?tail=50\", headers=headers).json()\n\n2. Scale and Monitor Containers\n# Get running containers\r\ncontainers = requests.get(f\"{BASE_URL}/containers?status=running\", headers=headers).json()\r\n\r\n# Get stats for each container\r\nfor container in containers[\"data\"]:\r\n    stats = requests.get(f\"{BASE_URL}/containers/{container['id']}/stats\", headers=headers).json()\r\n    print(f\"{container['name']}: CPU {stats['data']['cpuPercent']:.2f}%, Memory {stats['data']['memoryPercent']:.2f}%\")\r\n\r\n# Update container resources if needed\r\nupdate_data = {\r\n    \"cpuShares\": 1024,\r\n    \"memory\": 1073741824  # 1GB\r\n}\r\nrequests.post(f\"{BASE_URL}/containers/{container_id}/update\", headers=headers, json=update_data)\n\n3. Cleanup and Maintenance\n# Prune unused resources\r\nrequests.post(f\"{BASE_URL}/images/prune\", headers=headers)\r\nrequests.post(f\"{BASE_URL}/volumes/prune\", headers=headers)\r\nrequests.post(f\"{BASE_URL}/networks/prune\", headers=headers)\r\n\r\n# Get disk usage before and after\r\ndf_before = requests.get(f\"{BASE_URL}/system/df\", headers=headers).json()\r\n# ... perform cleanup ...\r\ndf_after = requests.get(f\"{BASE_URL}/system/df\", headers=headers).json()\n\nBest Practices\n\nAuthentication: Always use API keys for automated scripts and services. Use JWT tokens for interactive sessions.\n\nError Handling: Check response status codes and handle errors appropriately:\n\n200: Success\n400: Bad request (validation error)\n401: Unauthorized\n403: Forbidden\n404: Not found\n500: Internal server error\n\nResource Management:\n\nAlways specify resource limits when creating containers\nUse labels to organize resources\nRegularly prune unused resources\n\nSecurity:\n\nStore API keys and tokens securely (use environment variables)\nUse HTTPS in production\nImplement proper access controls with user roles\nRotate API keys regularly\n\nMonitoring:\n\nMonitor container stats regularly\nSet up alerts for resource usage\nReview system logs periodically\n\nTemplates:\n\nUse variables for configurable values\nDocument template variables clearly\nVersion control your templates\nUse global variables for shared configuration\nTroubleshooting\nCommon Issues\n\nAuthentication Failed\n\nVerify token is not expired (check expiresAt)\nUse refresh token to get new access token\nVerify API key is correct and not expired\n\nContainer Won't Start\n\nCheck container logs: GET /containers/{id}/logs\nInspect container: GET /containers/{id}\nVerify port conflicts and resource availability\n\nStack Deployment Failed\n\nValidate compose file syntax\nCheck template variables are properly defined\nReview stack logs: GET /stacks/{id}/logs\n\nResource Not Found\n\nVerify resource ID is correct\nCheck if resource was deleted\nEnsure proper permissions\nNotes\nAll timestamps are in ISO 8601 format (UTC)\nContainer IDs can be full or short (first 12 characters)\nImage names support full registry paths (registry.example.com/image:tag)\nNetwork and volume names must be unique\nStack names must be unique per user/project\nReference Links\n\nFor complete API documentation and schema definitions, refer to the OpenAPI specification provided in the JSON schema."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/cougz/arcane-docker-manager",
    "publisherUrl": "https://clawhub.ai/cougz/arcane-docker-manager",
    "owner": "cougz",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/arcane-docker-manager",
    "downloadUrl": "https://openagent3.xyz/downloads/arcane-docker-manager",
    "agentUrl": "https://openagent3.xyz/skills/arcane-docker-manager/agent",
    "manifestUrl": "https://openagent3.xyz/skills/arcane-docker-manager/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/arcane-docker-manager/agent.md"
  }
}