{"id":51548179,"url":"https://github.com/cyucelen/ignite","last_synced_at":"2026-07-09T20:31:46.200Z","repository":{"id":368728845,"uuid":"1094166617","full_name":"cyucelen/ignite","owner":"cyucelen","description":"Fast, reliable API for on-demand Docker containers. Built for AI agents, automation workflows, and dynamic compute workloads ⚡️","archived":false,"fork":false,"pushed_at":"2025-11-12T14:05:10.000Z","size":1748,"stargazers_count":11,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-02T00:30:44.570Z","etag":null,"topics":["agents","ai","ai-agents","container-management","docker","dynamic-compute","on-demand-containers","workflow-automation"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cyucelen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-11T10:49:46.000Z","updated_at":"2025-12-04T09:42:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/cyucelen/ignite","commit_stats":null,"previous_names":["cyucelen/ignite"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/cyucelen/ignite","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cyucelen%2Fignite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cyucelen%2Fignite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cyucelen%2Fignite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cyucelen%2Fignite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cyucelen","download_url":"https://codeload.github.com/cyucelen/ignite/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cyucelen%2Fignite/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35312540,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-09T02:00:07.329Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agents","ai","ai-agents","container-management","docker","dynamic-compute","on-demand-containers","workflow-automation"],"created_at":"2026-07-09T20:31:46.027Z","updated_at":"2026-07-09T20:31:46.187Z","avatar_url":"https://github.com/cyucelen.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"assets/ignite.png\" alt=\"Ignite Logo\" width=\"120\"/\u003e\n  \u003ch1\u003eIgnite\u003c/h1\u003e\n  \u003cp\u003e\u003cstrong\u003eFast, reliable API for on-demand Docker containers\u003c/strong\u003e\u003c/p\u003e\n  \u003cp\u003eBuilt for AI agents, automation workflows, and dynamic compute workloads\u003c/p\u003e\n\u003c/div\u003e\n\n## Why Ignite?\n\nFly.io and similar managed platforms are excellent for on-demand workloads, but suffer from reliability issues—containers sometimes fail to start without clear errors, and managing edge cases can be difficult. Complex orchestration solutions like Kubernetes work well but are overkill for simple on-demand container management.\n\n**Ignite bridges this gap** with a lightweight, self-hosted API that provides:\n\n- **Fast startup times**: Containers launch quickly with automatic image pulling and caching\n- **Predictable reliability**: Robust error handling with specific codes for all failure modes\n- **Full control**: Customize container lifecycle, resource limits, and cleanup behavior\n- **Zero complexity**: Simple REST API—no cluster management, no configuration overhead\n- **Built-in Web UI**: Real-time monitoring dashboard with live metrics, logs, and container management\n\n## Perfect For\n\n### AI Agent Workloads\n\nRun containerized AI agents on-demand for tasks like:\n\n- **Meeting bots**: Spin up agents to join video calls, take notes, and transcribe conversations\n- **Web scrapers**: Launch browser automation agents with Playwright/Selenium in isolated containers\n- **Code executors**: Run untrusted user code safely in sandboxed environments\n- **Data processors**: Process large datasets with temporary compute instances that auto-cleanup\n\n**Example**: Your AI assistant needs to join a Zoom meeting. With Ignite, you can:\n```bash\n# Provision a meeting bot container instantly\ncurl -X POST http://localhost:3000/api/containers \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"image\": \"meeting-bot:latest\",\n    \"command\": [\"python\", \"join_meeting.py\"],\n    \"environment\": {\n      \"ZOOM_MEETING_ID\": \"123-456-789\",\n      \"BOT_NAME\": \"AI Note Taker\"\n    }\n  }'\n```\n\nThe container automatically cleans up when the meeting ends—no manual intervention required.\n\n## Key Features\n\n- **Lightning Fast**: Start containers quickly with automatic image pulling and caching. No pre-pulling required—just specify any Docker image and go.\n- **Rock Solid**: Intelligent error handling with specific codes for image pull failures (404, 401, 429, 503, 504, 507). Clear diagnostics for all failure modes.\n- **Zero Maintenance**: Containers automatically clean up on process exit. No resource leaks, no manual cleanup scripts, no orphaned containers.\n- **Built-in Observability**: Real-time WebSocket updates for container lifecycle events. Web UI with live metrics, logs, and status tracking.\n\n## Quick Start\n\n### Prerequisites\n\n- Docker installed and running\n- Go 1.21+ (for building from source)\n\n### Installation\n\n```bash\n# Clone and build\ngit clone https://github.com/cyucelen/ignite.git\ncd ignite\ngo build -o ignite cmd/api/main.go\n\n# Run\nPORT=3000 MAX_CONTAINERS=50 ./ignite\n```\n\n### Docker Installation\n\n```bash\n# Build image\ndocker build -t ignite:latest .\n\n# Run with Docker\ndocker run -d \\\n  -p 3000:3000 \\\n  -v /var/run/docker.sock:/var/run/docker.sock \\\n  -e MAX_CONTAINERS=50 \\\n  ignite:latest\n```\n\n### First Container\n\n```bash\n# Create a container\ncurl -X POST http://localhost:3000/api/containers \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"image\": \"alpine:latest\",\n    \"command\": [\"echo\", \"Hello from Ignite!\"],\n    \"environment\": {\n      \"MY_VAR\": \"my_value\"\n    }\n  }'\n\n# Response (201 Created)\n{\n  \"id\": \"abc123\",\n  \"image\": \"alpine:latest\",\n  \"state\": \"creating\",\n  \"created_at\": \"2025-11-11T12:00:00Z\"\n}\n\n# Check status\ncurl http://localhost:3000/api/containers/abc123\n\n# View all containers\ncurl http://localhost:3000/api/containers\n\n# Stop and remove\ncurl -X DELETE http://localhost:3000/api/containers/abc123\n```\n\n## API Reference\n\n### Create Container\n\n**POST** `/api/containers`\n\n```json\n{\n  \"image\": \"python:3.11-slim\",\n  \"command\": [\"python\", \"script.py\"],\n  \"environment\": {\n    \"API_KEY\": \"secret\",\n    \"DEBUG\": \"true\"\n  },\n  \"registryAuth\": {\n    \"username\": \"myuser\",\n    \"password\": \"mypass\"\n  }\n}\n```\n\n**Response Codes:**\n- `201`: Container created successfully\n- `400`: Invalid request (missing image, malformed JSON)\n- `401`: Private image requires authentication\n- `404`: Image not found in registry\n- `429`: Container limit reached or registry rate limit\n- `503`: Registry unreachable\n- `504`: Image pull timeout\n- `507`: Insufficient disk space\n\n### List Containers\n\n**GET** `/api/containers`\n\nReturns all active containers with current state, uptime, and resource usage.\n\n### Get Container Status\n\n**GET** `/api/containers/{id}`\n\n```json\n{\n  \"id\": \"abc123\",\n  \"image\": \"python:3.11-slim\",\n  \"state\": \"running\",\n  \"created_at\": \"2025-11-11T12:00:00Z\",\n  \"started_at\": \"2025-11-11T12:00:05Z\",\n  \"exit_code\": null,\n  \"metrics\": {\n    \"cpu_percent\": 12.5,\n    \"memory_usage_mb\": 128,\n    \"memory_limit_mb\": 512,\n    \"uptime_seconds\": 42\n  }\n}\n```\n\n### Stop Container\n\n**DELETE** `/api/containers/{id}`\n\nGracefully stops and removes the container. Sends SIGTERM, waits for clean shutdown, then force-kills if needed.\n\n### Health Check\n\n**GET** `/api/health`\n\n```json\n{\n  \"status\": \"healthy\",\n  \"docker_connected\": true,\n  \"active_containers\": 3,\n  \"max_containers\": 50\n}\n```\n\n### WebSocket Events\n\n**GET** `/api/ws/containers`\n\nReal-time container events:\n- `container.created`\n- `container.started`\n- `container.exited`\n- `container.removed`\n- `metrics.update` (CPU, memory, network)\n\n### Private Registry Images\n\nIgnite supports pulling images from **GitHub Container Registry (GHCR)** for private repositories. Support for additional registries (Docker Hub, AWS ECR, Google GCR) is planned for future releases.\n\n#### Authentication\n\nTo use private images from GHCR, provide registry credentials in the `registryAuth` field:\n\n```bash\ncurl -X POST http://localhost:3000/api/containers \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"image\": \"ghcr.io/your-org/private-image:latest\",\n    \"command\": [\"python\", \"app.py\"],\n    \"registryAuth\": {\n      \"username\": \"your-github-username\",\n      \"password\": \"ghp_your_personal_access_token\"\n    }\n  }'\n```\n\n#### Creating a GitHub Personal Access Token\n\n1. Go to GitHub Settings → Developer settings → Personal access tokens → Tokens (classic)\n2. Click \"Generate new token (classic)\"\n3. Select scopes: `read:packages` (required for pulling private images)\n4. Copy the generated token (starts with `ghp_`)\n5. Use your GitHub username and the token in `registryAuth`\n\n**Note**: The `password` field accepts GitHub Personal Access Tokens, not your GitHub account password.\n\n#### Error Codes\n\n- **401**: Authentication failed (invalid username or token)\n- **404**: Image not found (check repository name and permissions)\n- **429**: Rate limit exceeded (authenticate to increase limit)\n\n## Configuration\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `PORT` | `3000` | HTTP server port |\n| `MAX_CONTAINERS` | `50` | Maximum concurrent containers |\n| `DOCKER_HOST` | `unix:///var/run/docker.sock` | Docker daemon socket |\n| `CONTAINER_TIMEOUT` | `300` | Seconds before force-stop |\n| `IMAGE_PULL_TIMEOUT` | `5m` | Max image pull time (2m-15m) |\n| `SHUTDOWN_TIMEOUT` | `30` | Graceful shutdown timeout (seconds) |\n\n## Use Case Examples\n\n### AI Meeting Bot\n\n```python\nimport requests\n\n# Start meeting bot when scheduled event begins\nresponse = requests.post('http://localhost:3000/api/containers', json={\n    'image': 'ghcr.io/company/meeting-bot:latest',\n    'command': ['python', 'bot.py', '--meeting-id', meeting_id],\n    'environment': {\n        'ZOOM_API_KEY': os.getenv('ZOOM_API_KEY'),\n        'OPENAI_API_KEY': os.getenv('OPENAI_API_KEY'),\n        'MEETING_DURATION': '60',\n    },\n    'registryAuth': {\n        'username': os.getenv('GHCR_USER'),\n        'password': os.getenv('GHCR_TOKEN')\n    }\n})\n\ncontainer_id = response.json()['id']\n\n# Bot automatically exits when meeting ends\n# Container auto-cleans up on exit\n```\n\n### Automated Code Execution\n\n```javascript\n// Execute user-submitted code in isolated container\nconst result = await fetch('http://localhost:3000/api/containers', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: JSON.stringify({\n    image: 'node:18-alpine',\n    command: ['node', '-e', userCode],\n    environment: {\n      EXECUTION_TIMEOUT: '30',\n      MEMORY_LIMIT: '256m'\n    }\n  })\n});\n\nconst { id } = await result.json();\n\n// Poll for completion or subscribe to WebSocket for updates\n```\n\n## Web UI\n\nAccess the web dashboard at `http://localhost:3000` to:\n\n- View all containers with real-time status updates\n- Monitor CPU, memory, and network usage\n- Stream container logs\n- Start, stop, and remove containers\n- Track lifecycle events and state transitions\n\nThe UI connects via WebSocket for instant updates without polling.\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"assets/webui.png\" alt=\"Ignite Web UI\" width=\"800\"/\u003e\n\u003c/div\u003e\n\n## Comparison with Alternatives\n\n| Feature | Ignite | Fly.io | AWS Fargate | Kubernetes |\n|---------|--------|--------|-------------|------------|\n| **Setup Complexity** | **Minimal** | Low | Medium | High |\n| **Self-hosted** | ✅ | ❌ | ❌ | ✅ |\n| **Cost** | **Free** | $$$$ | $$$ | Free* |\n| **Learning Curve** | **Simple** | Medium | Medium | Steep |\n| **Best For** | Simple on-demand | Global edge | AWS ecosystem | Large-scale orchestration |\n\n*Kubernetes is free but requires significant infrastructure and operational overhead\n\nIgnite excels at **simple, ephemeral workloads** where you need on-demand containers without the complexity of full orchestration platforms.\n\n## Development\n\n```bash\n# Run tests\ngo test ./...\n\n# Run with coverage\ngo test ./... -coverprofile=coverage.out\ngo tool cover -html=coverage.out\n\n# Lint code\ngolangci-lint run\n\n# Build for production\nCGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o ignite cmd/api/main.go\n```\n\n## Troubleshooting\n\n### Container fails to start\n\nCheck Docker daemon:\n```bash\ndocker ps  # Verify Docker is running\ncurl http://localhost:3000/api/health  # Check API health\n```\n\n### Image pull errors\n\n- **404**: Image name/tag incorrect\n- **401**: Private image needs `registryAuth`\n- **429**: Registry rate limit—wait or authenticate\n- **507**: Free up disk space: `docker system prune`\n\n### Container limit reached\n\nIncrease `MAX_CONTAINERS` or wait for existing containers to finish.\n\n### Permission denied on Docker socket\n\nEnsure Ignite has access to `/var/run/docker.sock`:\n```bash\n# Add user to docker group\nsudo usermod -aG docker $USER\n\n# Or run with elevated permissions (not recommended for production)\n```\n\n## Contributing\n\nContributions welcome! Please:\n\n1. Fork the repository\n2. Create a feature branch\n3. Add tests for new functionality\n4. Ensure `go test ./...` passes\n5. Submit a pull request\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcyucelen%2Fignite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcyucelen%2Fignite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcyucelen%2Fignite/lists"}