Introduction
# š³ Portainer Skill
``` āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā ā ā š³ P O R T A I N E R C O N T R O L C L I š³ ā ā ā ā Manage Docker containers via Portainer API ā ā Start, stop, deploy, redeploy ā ā ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ```
> *"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 | Details | |------|---------| | **Portainer** | Version 2.x with API access | | **Tools** | `curl`, `jq` | | **Auth** | API Access Token |
### Setup
1. **Get API Token from Portainer:** - Log into Portainer web UI - Click username ā My Account - Scroll to "Access tokens" ā Add access token - Copy the token (you won't see it again!)
2. **Configure credentials:** ```bash # Add to ~/.clawdbot/.env PORTAINER_URL=https://your-portainer-server:9443 PORTAINER_API_KEY=ptr_your_token_here ```
3. **Ready!** š
---
## š ļø Commands
### `status` ā Check Portainer Server
```bash ./portainer.sh status ```
**Output:** ``` Portainer v2.27.3 ```
---
### `endpoints` ā List Environments
```bash ./portainer.sh endpoints ```
**Output:** ``` 3: portainer (local) - ā online 4: production (remote) - ā online ```
---
### `containers` ā List Containers
```bash # List containers on default endpoint (4) ./portainer.sh containers
# List containers on specific endpoint ./portainer.sh containers 3 ```
**Output:** ``` steinbergerraum-web-1 running Up 2 days cora-web-1 running Up 6 weeks minecraft running Up 6 weeks (healthy) ```
---
### `stacks` ā List All Stacks
```bash ./portainer.sh stacks ```
**Output:** ``` 25: steinbergerraum - ā active 33: cora - ā active 35: minecraft - ā active 4: pulse-website - ā inactive ```
---
### `stack-info` ā Stack Details
```bash ./portainer.sh stack-info 25 ```
**Output:** ```json { "Id": 25, "Name": "steinbergerraum", "Status": 1, "EndpointId": 4, "GitConfig": "https://github.com/user/repo", "UpdateDate": "2026-01-25T08:44:56Z" } ```
---
### `redeploy` ā Pull & Redeploy Stack š
```bash ./portainer.sh redeploy 25 ```
**Output:** ``` ā Stack 'steinbergerraum' redeployed successfully ```
This will: 1. Pull latest code from git 2. Rebuild containers if needed 3. Restart the stack
---
### `start` / `stop` / `restart` ā Container Control
```bash # Start a container ./portainer.sh start steinbergerraum-web-1
# Stop a container ./portainer.sh stop steinbergerraum-web-1
# Restart a container ./portainer.sh restart steinbergerraum-web-1
# Specify endpoint (default: 4) ./portainer.sh restart steinbergerraum-web-1 4 ```
**Output:** ``` ā Container 'steinbergerraum-web-1' restarted ```
---
### `logs` ā View Container Logs
```bash # Last 100 lines (default) ./portainer.sh logs steinbergerraum-web-1
# Last 50 lines ./portainer.sh logs steinbergerraum-web-1 4 50 ```
---
## šÆ Example Workflows
### š "Deploy Website Update" ```bash # After merging PR ./portainer.sh redeploy 25 ./portainer.sh logs steinbergerraum-web-1 4 20 ```
### š§ "Debug Container" ```bash ./portainer.sh containers ./portainer.sh logs cora-web-1 ./portainer.sh restart cora-web-1 ```
### š "System Overview" ```bash ./portainer.sh status ./portainer.sh endpoints ./portainer.sh containers ./portainer.sh stacks ```
---
## š§ Troubleshooting
### ā "Authentication required / Repository not found"
**Problem:** Stack redeploy fails with git auth error
**Solution:** The stack needs `repositoryGitCredentialID` parameter. The script handles this automatically by reading from the existing stack config.
---
### ā "Container not found"
**Problem:** Container name doesn't match
**Solution:** Use exact name from `./portainer.sh containers`: - Include the full name: `steinbergerraum-web-1` not `steinbergerraum` - Names are case-sensitive
---
### ā "PORTAINER_URL and PORTAINER_API_KEY must be set"
**Problem:** Credentials not configured
**Solution:** ```bash # Add to ~/.clawdbot/.env echo "PORTAINER_URL=https://your-server:9443" >> ~/.clawdbot/.env echo "PORTAINER_API_KEY=ptr_your_token" >> ~/.clawdbot/.env ```
---
## š Integration with Clawd
``` "Redeploy the website" ā ./portainer.sh redeploy 25
"Show me running containers" ā ./portainer.sh containers
"Restart the Minecraft server" ā ./portainer.sh restart minecraft
"What stacks do we have?" ā ./portainer.sh stacks ```
---
## š Changelog
| Version | Date | Changes | |---------|------|---------| | 1.0.0 | 2026-01-25 | Initial release |
---
## šø Credits
``` @..@ (----) ( >__< ) "Containers are just fancy lily pads ^^ ^^ for your code to hop around!" ```
**Author:** Andy Steinberger (with help from his Clawdbot Owen the Frog šø) **Powered by:** [Portainer](https://portainer.io/) API **Part of:** [Clawdbot](https://clawdhub.com) Skills Collection
---
<div align="center">
**Made with š for the Clawdbot Community**
*Ribbit!* šø
</div>