{"skill":{"slug":"mysql-manager","displayName":"Mysql Manager","summary":"Manage a shared MySQL Docker container for local dev environments. Handles container lifecycle, database creation/removal, and cross-instance data dumps. Des...","description":"---\nname: MySQL Manager\nslug: mysql-manager\nversion: 1.1.0\ndescription: \"Manage a shared MySQL Docker container for local dev environments. Handles container lifecycle, database creation/removal, and cross-instance data dumps. Designed to work alongside proxy-manager and worktree-manager.\"\nchangelog: \"v1.1.0: Fix dump to avoid sh -c/backtick shell injection (now uses two docker exec), validate all DB names against strict regex, unify password variable (MYSQL_ROOT_PASSWORD takes precedence over MYSQL_ROOT_PASS), warn on default password, bind host port to 127.0.0.1, pin image to mysql:8.0.36.\"\ntriggers:\n  - \"start mysql\"\n  - \"stop mysql\"\n  - \"mysql status\"\n  - \"create database\"\n  - \"criar banco\"\n  - \"remover banco\"\n  - \"drop database\"\n  - \"dump database\"\n  - \"copiar banco\"\n  - \"mysql-manager\"\nmetadata: {\"clawdbot\":{\"emoji\":\"🗄\",\"requires\":{\"bins\":[\"docker\"]},\"os\":[\"linux\",\"darwin\"]}}\n---\n\n# MySQL Manager\n\nManages the shared MySQL Docker container used by local dev instances.\n\n## Architecture\n\n```\nmysql-manager/\n├── docker-compose.yml   # MySQL 8.0 container\n└── run.sh               # lifecycle + db admin CLI\n```\n\nThe MySQL container runs on the shared Docker network (`nginx-proxy_net` by default), making it accessible to all app containers by hostname (`codai_db`). Data is persisted in a named volume (`mysql_data`).\n\n## Commands\n\n```bash\n./run.sh start                    # start MySQL container\n./run.sh stop                     # stop container (data persists in volume)\n./run.sh status                   # container status + list databases\n./run.sh wait                     # block until MySQL is ready (for scripts)\n./run.sh create-db <name>         # CREATE DATABASE IF NOT EXISTS\n./run.sh drop-db <name>           # DROP DATABASE (interactive confirm)\n./run.sh dump <src> <dest>        # mysqldump src | mysql dest\n./run.sh list-dbs                 # SHOW DATABASES (filtered)\n```\n\n## How to Execute Tasks\n\n### Start MySQL for the first time\n```bash\ncd mysql-manager && ./run.sh start\n```\nOn first run, Docker creates the volume and initializes `codai_main`.\n\n### Create a database for a new instance\n```bash\n./run.sh create-db codai_alpha\n```\n\n### Snapshot main database into a new instance\n```bash\n./run.sh dump codai_main codai_alpha\n```\n\n### Remove a worktree database\n```bash\n./run.sh drop-db codai_alpha   # prompts for confirmation\n```\n\n### Check status\n```bash\n./run.sh status\n```\n\n## Startup Order\n\nStart MySQL **before** starting any app instances:\n1. `proxy-manager`: `./run.sh start`  (creates the shared Docker network)\n2. `mysql-manager`: `./run.sh start`  (joins the shared network)\n3. `worktree-manager`: `./run.sh start <instance>`\n\n## Configuration\n\nSet via environment variables or a `.env` file in `mysql-manager/`:\n\n| Variable               | Default           | Purpose                          |\n|------------------------|-------------------|----------------------------------|\n| `MYSQL_CONTAINER`      | `codai_db`        | Container name                   |\n| `MYSQL_ROOT_PASSWORD`  | `secret`          | MySQL root password (primary)    |\n| `MYSQL_ROOT_PASS`      | *(fallback)*      | Legacy alias; `MYSQL_ROOT_PASSWORD` takes precedence |\n| `MYSQL_MAIN_DB`        | `codai_main`      | Primary database name            |\n| `MYSQL_PORT`           | `3307`            | Host port (maps to 3306)         |\n| `CODAI_NETWORK`        | `nginx-proxy_net` | Shared Docker network name       |\n\n## Rules\n\n- Never drop `MYSQL_MAIN_DB` — it is the source of truth for snapshots.\n- The `drop-db` command always prompts for confirmation.\n- Database names are validated against `^[a-z][a-z0-9_]{0,62}$` before any SQL or shell operation.\n- `stop` preserves data in the Docker volume. Use `docker compose down -v` only when you intentionally want to delete persisted data.\n- The container uses `restart: unless-stopped` — it will resume after a Docker daemon restart. Run `./run.sh stop` when done.\n- The host port (`MYSQL_PORT`) is bound to `127.0.0.1` only. Set a non-default `MYSQL_ROOT_PASSWORD` on shared machines.\n- The container name (`codai_db`) is the hostname used by backend apps to connect.\n\n## Related Plugins\n\n- `proxy-manager` — manages the nginx-proxy that routes traffic to app instances (start this first)\n- `worktree-manager` — manages app instances and git worktrees (depends on this plugin)\n","topics":["MySQL","Database","Docker"],"tags":{"latest":"1.0.2"},"stats":{"comments":0,"downloads":385,"installsAllTime":14,"installsCurrent":1,"stars":0,"versions":3},"createdAt":1778325506598,"updatedAt":1778492885325},"latestVersion":{"version":"1.0.2","createdAt":1778421456699,"changelog":"No user-facing changes in version 1.0.2.\n\n- Internal metadata updated; no functional or documentation changes.","license":"MIT-0"},"metadata":{"setup":[],"os":["linux","darwin"],"systems":null},"owner":{"handle":"pereirajair","userId":"s17ayja6zg12t1dv98gn9tsg3986dtdv","displayName":"Jair Pereira","image":"https://avatars.githubusercontent.com/u/1306512?v=4"},"moderation":null}