Back to Skills
    šŸ¦ž

    portainer

    Control Docker containers and stacks via Portainer API.

    By @asteinberger
    View on GitHub
    SKILL.md
    ---
    name: portainer
    description: Control Docker containers and stacks via Portainer API. List containers, start/stop/restart, view logs, and redeploy stacks from git.
    metadata: {"clawdbot":{"emoji":"🐳","requires":{"bins":["curl","jq"],"env":["PORTAINER_API_KEY"]},"primaryEnv":"PORTAINER_API_KEY"}}
    ---
    
    # 🐳 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>