portainer

SKILL.md

🐳 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:

    # Add to ~/.thinkfleetbot/.env
    PORTAINER_URL=https://your-portainer-server:9443
    PORTAINER_API_KEY=ptr_your_token_here
    
  3. Ready! πŸš€


πŸ› οΈ Commands

status β€” Check Portainer Server

./portainer.sh status

Output:

Portainer v2.27.3

endpoints β€” List Environments

./portainer.sh endpoints

Output:

3: portainer (local) - βœ“ online
4: production (remote) - βœ“ online

containers β€” List Containers

# 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

./portainer.sh stacks

Output:

25: steinbergerraum - βœ“ active
33: cora - βœ“ active
35: minecraft - βœ“ active
4: pulse-website - βœ— inactive

stack-info β€” Stack Details

./portainer.sh stack-info 25

Output:

{
  "Id": 25,
  "Name": "steinbergerraum",
  "Status": 1,
  "EndpointId": 4,
  "GitConfig": "https://github.com/user/repo",
  "UpdateDate": "2026-01-25T08:44:56Z"
}

redeploy β€” Pull & Redeploy Stack πŸ”„

./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

# 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

# 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"

# After merging PR
./portainer.sh redeploy 25
./portainer.sh logs steinbergerraum-web-1 4 20

πŸ”§ "Debug Container"

./portainer.sh containers
./portainer.sh logs cora-web-1
./portainer.sh restart cora-web-1

πŸ“Š "System Overview"

./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:

# Add to ~/.thinkfleetbot/.env
echo "PORTAINER_URL=https://your-server:9443" >> ~/.thinkfleetbot/.env
echo "PORTAINER_API_KEY=ptr_your_token" >> ~/.thinkfleetbot/.env

πŸ”— Integration with ThinkFleet

"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 ThinkFleetBot Owen the Frog 🐸)
Powered by: Portainer API
Part of: ThinkFleetBot Skills Collection


Made with πŸ’š for the ThinkFleetBot Community

Ribbit! 🐸

Weekly Installs
2
First Seen
13 days ago
Installed on
opencode2
gemini-cli2
claude-code2
github-copilot2
codex2
kimi-cli2