🐳 Portainer Skill "Docker containers? I'll handle them from my lily pad." 🐸 --- πŸ“– What Does This Skill Do? The Portainer Skill gives you control over your Docker infrastructure through Portainer's REST API. Manage containers, stacks, and deployments without touching the web UI. Features: - πŸ“Š Status β€” Check Portainer server status - πŸ–₯️ Endpoints β€” List all Docker environments - πŸ“¦ Containers β€” List, start, stop, restart containers - πŸ“š Stacks β€” List and manage Docker Compose stacks - πŸ”„ Redeploy β€” Pull from git and redeploy stacks - πŸ“œ Logs β€” View container logs --- βš™οΈ Requirements | What…

\\t'\n ;;\n \n stacks)\n api_get \"/stacks\" | jq -r '.[] | \"\\(.Id): \\(.Name) - \\(if .Status == 1 then \"βœ“ active\" else \"βœ— inactive\" end)\"'\n ;;\n \n stack-info)\n STACK_ID=\"$2\"\n if [[ -z \"$STACK_ID\" ]]; then\n echo \"Usage: portainer.sh stack-info \u003cstack-id>\"\n exit 1\n fi\n api_get \"/stacks/$STACK_ID\" | jq '{Id, Name, Status, EndpointId, GitConfig: .GitConfig.URL, UpdateDate: (.UpdateDate | todate)}'\n ;;\n \n redeploy)\n STACK_ID=\"$2\"\n if [[ -z \"$STACK_ID\" ]]; then\n echo \"Usage: portainer.sh redeploy \u003cstack-id> [endpoint-id]\"\n exit 1\n fi\n \n # Get stack info for env vars and endpoint\n STACK_INFO=$(api_get \"/stacks/$STACK_ID\")\n ENDPOINT_ID=$(echo \"$STACK_INFO\" | jq -r '.EndpointId')\n ENV_VARS=$(echo \"$STACK_INFO\" | jq -c '.Env')\n GIT_CRED_ID=$(echo \"$STACK_INFO\" | jq -r '.GitConfig.Authentication.GitCredentialID // 0')\n \n PAYLOAD=$(jq -n \\\n --argjson env \"$ENV_VARS\" \\\n --argjson gitCredId \"$GIT_CRED_ID\" \\\n '{env: $env, prune: false, pullImage: true, repositoryAuthentication: true, repositoryGitCredentialID: $gitCredId}')\n \n RESULT=$(api_put \"/stacks/$STACK_ID/git/redeploy?endpointId=$ENDPOINT_ID\" \"$PAYLOAD\")\n \n if echo \"$RESULT\" | jq -e '.Id' > /dev/null 2>&1; then\n STACK_NAME=$(echo \"$RESULT\" | jq -r '.Name')\n echo \"βœ“ Stack '$STACK_NAME' redeployed successfully\"\n else\n echo \"βœ— Redeploy failed:\"\n echo \"$RESULT\" | jq -r '.message // .details // .'\n exit 1\n fi\n ;;\n \n start)\n ENDPOINT=\"${3:-4}\"\n CONTAINER=\"$2\"\n if [[ -z \"$CONTAINER\" ]]; then\n echo \"Usage: portainer.sh start \u003ccontainer-name> [endpoint-id]\"\n exit 1\n fi\n # Get container ID\n CONTAINER_ID=$(api_get \"/endpoints/$ENDPOINT/docker/containers/json?all=true\" | jq -r \".[] | select(.Names[0] == \\\"/$CONTAINER\\\") | .Id\")\n if [[ -z \"$CONTAINER_ID\" ]]; then\n echo \"βœ— Container '$CONTAINER' not found\"\n exit 1\n fi\n api_post \"/endpoints/$ENDPOINT/docker/containers/$CONTAINER_ID/start\" \"{}\" > /dev/null\n echo \"βœ“ Container '$CONTAINER' started\"\n ;;\n \n stop)\n ENDPOINT=\"${3:-4}\"\n CONTAINER=\"$2\"\n if [[ -z \"$CONTAINER\" ]]; then\n echo \"Usage: portainer.sh stop \u003ccontainer-name> [endpoint-id]\"\n exit 1\n fi\n CONTAINER_ID=$(api_get \"/endpoints/$ENDPOINT/docker/containers/json?all=true\" | jq -r \".[] | select(.Names[0] == \\\"/$CONTAINER\\\") | .Id\")\n if [[ -z \"$CONTAINER_ID\" ]]; then\n echo \"βœ— Container '$CONTAINER' not found\"\n exit 1\n fi\n api_post \"/endpoints/$ENDPOINT/docker/containers/$CONTAINER_ID/stop\" \"{}\" > /dev/null\n echo \"βœ“ Container '$CONTAINER' stopped\"\n ;;\n \n restart)\n ENDPOINT=\"${3:-4}\"\n CONTAINER=\"$2\"\n if [[ -z \"$CONTAINER\" ]]; then\n echo \"Usage: portainer.sh restart \u003ccontainer-name> [endpoint-id]\"\n exit 1\n fi\n CONTAINER_ID=$(api_get \"/endpoints/$ENDPOINT/docker/containers/json?all=true\" | jq -r \".[] | select(.Names[0] == \\\"/$CONTAINER\\\") | .Id\")\n if [[ -z \"$CONTAINER_ID\" ]]; then\n echo \"βœ— Container '$CONTAINER' not found\"\n exit 1\n fi\n api_post \"/endpoints/$ENDPOINT/docker/containers/$CONTAINER_ID/restart\" \"{}\" > /dev/null\n echo \"βœ“ Container '$CONTAINER' restarted\"\n ;;\n \n logs)\n ENDPOINT=\"${3:-4}\"\n CONTAINER=\"$2\"\n TAIL=\"${4:-100}\"\n if [[ -z \"$CONTAINER\" ]]; then\n echo \"Usage: portainer.sh logs \u003ccontainer-name> [endpoint-id] [tail-lines]\"\n exit 1\n fi\n CONTAINER_ID=$(api_get \"/endpoints/$ENDPOINT/docker/containers/json?all=true\" | jq -r \".[] | select(.Names[0] == \\\"/$CONTAINER\\\") | .Id\")\n if [[ -z \"$CONTAINER_ID\" ]]; then\n echo \"βœ— Container '$CONTAINER' not found\"\n exit 1\n fi\n curl -s -H \"$AUTH_HEADER\" \"$API/endpoints/$ENDPOINT/docker/containers/$CONTAINER_ID/logs?stdout=true&stderr=true&tail=$TAIL\" | strings\n ;;\n \n *)\n echo \"Portainer CLI - Control Docker via Portainer API\"\n echo \"\"\n echo \"Usage: portainer.sh \u003ccommand> [args]\"\n echo \"\"\n echo \"Commands:\"\n echo \" status Show Portainer version\"\n echo \" endpoints List all environments\"\n echo \" containers [endpoint] List containers (default endpoint: 4)\"\n echo \" stacks List all stacks\"\n echo \" stack-info \u003cid> Show stack details\"\n echo \" redeploy \u003cstack-id> Pull and redeploy a stack\"\n echo \" start \u003ccontainer> Start a container\"\n echo \" stop \u003ccontainer> Stop a container\"\n echo \" restart \u003ccontainer> Restart a container\"\n echo \" logs \u003ccontainer> [ep] [n] Show container logs (last n lines)\"\n echo \"\"\n echo \"Environment:\"\n echo \" PORTAINER_URL Portainer server URL\"\n echo \" PORTAINER_API_KEY API access token\"\n ;;\nesac\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":7003,"content_sha256":"1f7df625b74f2bb0257b0ac45d8068e5ec209295a6691b36a110b899328926da"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"🐳 Portainer Skill","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":" ╔═══════════════════════════════════════════════════════════╗\n β•‘ β•‘\n β•‘ 🐳 P O R T A I N E R C O N T R O L C L I 🐳 β•‘\n β•‘ β•‘\n β•‘ Manage Docker containers via Portainer API β•‘\n β•‘ Start, stop, deploy, redeploy β•‘\n β•‘ β•‘\n β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Docker containers? I'll handle them from my lily pad.\"","type":"text","marks":[{"type":"em"}]},{"text":" 🐸","type":"text"}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"πŸ“– What Does This Skill Do?","type":"text"}]},{"type":"paragraph","content":[{"text":"The ","type":"text"},{"text":"Portainer Skill","type":"text","marks":[{"type":"strong"}]},{"text":" gives you control over your Docker infrastructure through Portainer's REST API. Manage containers, stacks, and deployments without touching the web UI.","type":"text"}]},{"type":"paragraph","content":[{"text":"Features:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"πŸ“Š ","type":"text"},{"text":"Status","type":"text","marks":[{"type":"strong"}]},{"text":" β€” Check Portainer server status","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"πŸ–₯️ ","type":"text"},{"text":"Endpoints","type":"text","marks":[{"type":"strong"}]},{"text":" β€” List all Docker environments","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"πŸ“¦ ","type":"text"},{"text":"Containers","type":"text","marks":[{"type":"strong"}]},{"text":" β€” List, start, stop, restart containers","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"πŸ“š ","type":"text"},{"text":"Stacks","type":"text","marks":[{"type":"strong"}]},{"text":" β€” List and manage Docker Compose stacks","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"πŸ”„ ","type":"text"},{"text":"Redeploy","type":"text","marks":[{"type":"strong"}]},{"text":" β€” Pull from git and redeploy stacks","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"πŸ“œ ","type":"text"},{"text":"Logs","type":"text","marks":[{"type":"strong"}]},{"text":" β€” View container logs","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"βš™οΈ Requirements","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"What","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Details","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Portainer","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Version 2.x with API access","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Tools","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"curl","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"jq","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Auth","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"API Access Token","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Setup","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Get API Token from Portainer:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Log into Portainer web UI","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Click username β†’ My Account","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Scroll to \"Access tokens\" β†’ Add access token","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Copy the token (you won't see it again!)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Configure credentials:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Add to ~/.clawdbot/.env\nPORTAINER_URL=https://your-portainer-server:9443\nPORTAINER_API_KEY=ptr_your_token_here","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Ready!","type":"text","marks":[{"type":"strong"}]},{"text":" πŸš€","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"πŸ› οΈ Commands","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"status","type":"text","marks":[{"type":"code_inline"}]},{"text":" β€” Check Portainer Server","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"./portainer.sh status","type":"text"}]},{"type":"paragraph","content":[{"text":"Output:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Portainer v2.27.3","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"endpoints","type":"text","marks":[{"type":"code_inline"}]},{"text":" β€” List Environments","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"./portainer.sh endpoints","type":"text"}]},{"type":"paragraph","content":[{"text":"Output:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"3: portainer (local) - βœ“ online\n4: production (remote) - βœ“ online","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"containers","type":"text","marks":[{"type":"code_inline"}]},{"text":" β€” List Containers","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# List containers on default endpoint (4)\n./portainer.sh containers\n\n# List containers on specific endpoint\n./portainer.sh containers 3","type":"text"}]},{"type":"paragraph","content":[{"text":"Output:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"steinbergerraum-web-1 running Up 2 days\ncora-web-1 running Up 6 weeks\nminecraft running Up 6 weeks (healthy)","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"stacks","type":"text","marks":[{"type":"code_inline"}]},{"text":" β€” List All Stacks","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"./portainer.sh stacks","type":"text"}]},{"type":"paragraph","content":[{"text":"Output:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"25: steinbergerraum - βœ“ active\n33: cora - βœ“ active\n35: minecraft - βœ“ active\n4: pulse-website - βœ— inactive","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"stack-info","type":"text","marks":[{"type":"code_inline"}]},{"text":" β€” Stack Details","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"./portainer.sh stack-info 25","type":"text"}]},{"type":"paragraph","content":[{"text":"Output:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"Id\": 25,\n \"Name\": \"steinbergerraum\",\n \"Status\": 1,\n \"EndpointId\": 4,\n \"GitConfig\": \"https://github.com/user/repo\",\n \"UpdateDate\": \"2026-01-25T08:44:56Z\"\n}","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"redeploy","type":"text","marks":[{"type":"code_inline"}]},{"text":" β€” Pull & Redeploy Stack πŸ”„","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"./portainer.sh redeploy 25","type":"text"}]},{"type":"paragraph","content":[{"text":"Output:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"βœ“ Stack 'steinbergerraum' redeployed successfully","type":"text"}]},{"type":"paragraph","content":[{"text":"This will:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Pull latest code from git","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Rebuild containers if needed","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Restart the stack","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"start","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"stop","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"restart","type":"text","marks":[{"type":"code_inline"}]},{"text":" β€” Container Control","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Start a container\n./portainer.sh start steinbergerraum-web-1\n\n# Stop a container\n./portainer.sh stop steinbergerraum-web-1\n\n# Restart a container\n./portainer.sh restart steinbergerraum-web-1\n\n# Specify endpoint (default: 4)\n./portainer.sh restart steinbergerraum-web-1 4","type":"text"}]},{"type":"paragraph","content":[{"text":"Output:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"βœ“ Container 'steinbergerraum-web-1' restarted","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"logs","type":"text","marks":[{"type":"code_inline"}]},{"text":" β€” View Container Logs","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Last 100 lines (default)\n./portainer.sh logs steinbergerraum-web-1\n\n# Last 50 lines\n./portainer.sh logs steinbergerraum-web-1 4 50","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"🎯 Example Workflows","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"πŸš€ \"Deploy Website Update\"","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# After merging PR\n./portainer.sh redeploy 25\n./portainer.sh logs steinbergerraum-web-1 4 20","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"πŸ”§ \"Debug Container\"","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"./portainer.sh containers\n./portainer.sh logs cora-web-1\n./portainer.sh restart cora-web-1","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"πŸ“Š \"System Overview\"","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"./portainer.sh status\n./portainer.sh endpoints\n./portainer.sh containers\n./portainer.sh stacks","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"πŸ”§ Troubleshooting","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"❌ \"Authentication required / Repository not found\"","type":"text"}]},{"type":"paragraph","content":[{"text":"Problem:","type":"text","marks":[{"type":"strong"}]},{"text":" Stack redeploy fails with git auth error","type":"text"}]},{"type":"paragraph","content":[{"text":"Solution:","type":"text","marks":[{"type":"strong"}]},{"text":" The stack needs ","type":"text"},{"text":"repositoryGitCredentialID","type":"text","marks":[{"type":"code_inline"}]},{"text":" parameter. The script handles this automatically by reading from the existing stack config.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"❌ \"Container not found\"","type":"text"}]},{"type":"paragraph","content":[{"text":"Problem:","type":"text","marks":[{"type":"strong"}]},{"text":" Container name doesn't match","type":"text"}]},{"type":"paragraph","content":[{"text":"Solution:","type":"text","marks":[{"type":"strong"}]},{"text":" Use exact name from ","type":"text"},{"text":"./portainer.sh containers","type":"text","marks":[{"type":"code_inline"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Include the full name: ","type":"text"},{"text":"steinbergerraum-web-1","type":"text","marks":[{"type":"code_inline"}]},{"text":" not ","type":"text"},{"text":"steinbergerraum","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Names are case-sensitive","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"❌ \"PORTAINER_URL and PORTAINER_API_KEY must be set\"","type":"text"}]},{"type":"paragraph","content":[{"text":"Problem:","type":"text","marks":[{"type":"strong"}]},{"text":" Credentials not configured","type":"text"}]},{"type":"paragraph","content":[{"text":"Solution:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Add to ~/.clawdbot/.env\necho \"PORTAINER_URL=https://your-server:9443\" >> ~/.clawdbot/.env\necho \"PORTAINER_API_KEY=ptr_your_token\" >> ~/.clawdbot/.env","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"πŸ”— Integration with Clawd","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"\"Redeploy the website\"\nβ†’ ./portainer.sh redeploy 25\n\n\"Show me running containers\"\nβ†’ ./portainer.sh containers\n\n\"Restart the Minecraft server\"\nβ†’ ./portainer.sh restart minecraft\n\n\"What stacks do we have?\"\nβ†’ ./portainer.sh stacks","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"πŸ“œ Changelog","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Version","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Date","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Changes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1.0.0","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2026-01-25","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Initial release","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"🐸 Credits","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":" @..@\n (----)\n( >__\u003c ) \"Containers are just fancy lily pads\n ^^ ^^ for your code to hop around!\"","type":"text"}]},{"type":"paragraph","content":[{"text":"Author:","type":"text","marks":[{"type":"strong"}]},{"text":" Andy Steinberger (with help from his Clawdbot Owen the Frog 🐸)","type":"text"},{"type":"br"},{"text":"Powered by:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"Portainer","type":"text","marks":[{"type":"link","attrs":{"href":"https://portainer.io/","title":null}}]},{"text":" API","type":"text"},{"type":"br"},{"text":"Part of:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"Clawdbot","type":"text","marks":[{"type":"link","attrs":{"href":"https://clawdhub.com","title":null}}]},{"text":" Skills Collection","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"paragraph","content":[{"text":"\u003cdiv align=\"center\">","type":"text"}]},{"type":"paragraph","content":[{"text":"Made with πŸ’š for the Clawdbot Community","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"Ribbit!","type":"text","marks":[{"type":"em"}]},{"text":" 🐸","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"\u003c/div>","type":"text"}]}]},"metadata":{"date":"2026-06-05","name":"portainer","author":"@skillopedia","source":{"stars":609,"repo_name":"awesome-openclaw-skills","origin_url":"https://github.com/sundial-org/awesome-openclaw-skills/blob/HEAD/skills/portainer/SKILL.md","repo_owner":"sundial-org","body_sha256":"dc1abaf04261520fa4126e1ac9fb8b5c3a8df0511811969f3832c4f1b3a05b4f","cluster_key":"841a95aff8923f070d2acc7f6fc72eb571b7b08764605b80f943650f3dca6fdc","clean_bundle":{"format":"clean-skill-bundle-v1","source":"sundial-org/awesome-openclaw-skills/skills/portainer/SKILL.md","attachments":[{"id":"bf7c4361-2310-5642-8d59-a45967f917d0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/bf7c4361-2310-5642-8d59-a45967f917d0/attachment.sh","path":"portainer.sh","size":7003,"sha256":"1f7df625b74f2bb0257b0ac45d8068e5ec209295a6691b36a110b899328926da","contentType":"application/x-sh; charset=utf-8"}],"bundle_sha256":"03c28e31c59b65e94af5be49ecade2c9bba0e8b9620213b0da29c064779c7341","attachment_count":1,"text_attachments":1,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":2,"skill_md_path":"skills/portainer/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"devops-infrastructure","category_label":"DevOps"},"exact_dupes_collapsed_into_this":1},"version":"v1","category":"devops-infrastructure","metadata":{"clawdbot":{"emoji":"🐳","requires":{"env":["PORTAINER_API_KEY"],"bins":["curl","jq"]},"primaryEnv":"PORTAINER_API_KEY"}},"import_tag":"clean-skills-v1","description":"Control Docker containers and stacks via Portainer API. List containers, start/stop/restart, view logs, and redeploy stacks from git."}},"renderedAt":1782987342699}

🐳 Portainer Skill "Docker containers? I'll handle them from my lily pad." 🐸 --- πŸ“– What Does This Skill Do? The Portainer Skill gives you control over your Docker infrastructure through Portainer's REST API. Manage containers, stacks, and deployments without touching the web UI. Features: - πŸ“Š Status β€” Check Portainer server status - πŸ–₯️ Endpoints β€” List all Docker environments - πŸ“¦ Containers β€” List, start, stop, restart containers - πŸ“š Stacks β€” List and manage Docker Compose stacks - πŸ”„ Redeploy β€” Pull from git and redeploy stacks - πŸ“œ Logs β€” View container logs --- βš™οΈ Requirements | What…