{"id":49320297,"url":"https://github.com/ftsiadimos/simpledockerwebui","last_synced_at":"2026-04-26T17:04:23.621Z","repository":{"id":305595719,"uuid":"1023307909","full_name":"ftsiadimos/SimpleDockerWebui","owner":"ftsiadimos","description":"Straightforward interface to control the containers for your docker home server.","archived":false,"fork":false,"pushed_at":"2026-04-21T18:01:03.000Z","size":2379,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-21T19:37:03.032Z","etag":null,"topics":["containers","docker","web"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ftsiadimos.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-07-21T00:50:04.000Z","updated_at":"2026-04-21T18:01:08.000Z","dependencies_parsed_at":"2025-07-21T02:35:11.704Z","dependency_job_id":"93dec1bb-409f-4935-a8fd-653c301b9299","html_url":"https://github.com/ftsiadimos/SimpleDockerWebui","commit_stats":null,"previous_names":["ftsiadimos/simpledockerwebui"],"tags_count":34,"template":false,"template_full_name":null,"purl":"pkg:github/ftsiadimos/SimpleDockerWebui","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ftsiadimos%2FSimpleDockerWebui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ftsiadimos%2FSimpleDockerWebui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ftsiadimos%2FSimpleDockerWebui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ftsiadimos%2FSimpleDockerWebui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ftsiadimos","download_url":"https://codeload.github.com/ftsiadimos/SimpleDockerWebui/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ftsiadimos%2FSimpleDockerWebui/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32305043,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T09:34:17.070Z","status":"ssl_error","status_checked_at":"2026-04-26T09:34:00.993Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["containers","docker","web"],"created_at":"2026-04-26T17:04:22.975Z","updated_at":"2026-04-26T17:04:23.615Z","avatar_url":"https://github.com/ftsiadimos.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🐳 LightDockerWebUI\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"app/static/dockermanager.png\" alt=\"LightDockerWebUI Logo\" width=\"120\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eA lightweight, elegant web interface for Docker container management\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://hub.docker.com/r/ftsiadimos/lightdockerwebui\"\u003e\u003cimg src=\"https://img.shields.io/docker/pulls/ftsiadimos/lightdockerwebui?style=flat-square\u0026logo=docker\" alt=\"Docker Pulls\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://ghcr.io/ftsiadimos/simpledockerwebui\"\u003e\u003cimg src=\"https://img.shields.io/badge/GHCR-available-blue?style=flat-square\u0026logo=github\" alt=\"GHCR Available\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/ftsiadimos/lightdockerwebui/blob/main/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square\" alt=\"License: MIT\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.python.org/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Python-3.10+-3776AB.svg?style=flat-square\u0026logo=python\u0026logoColor=white\" alt=\"Python\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://flask.palletsprojects.com/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Flask-3.x-000000.svg?style=flat-square\u0026logo=flask\" alt=\"Flask\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://getbootstrap.com/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Bootstrap-5.3-7952B3.svg?style=flat-square\u0026logo=bootstrap\u0026logoColor=white\" alt=\"Bootstrap\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## 🎯 Overview\n\nLightDockerWebUI is a **clean, fast, and simple** web-based Docker management tool designed for home servers, development environments, and small deployments. No complex setup — just run and manage your containers from any browser.\n\n\n\n## ✨ Features\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\"\u003e\n\n### 📊 Dashboard\n- Real-time container status\n- Quick status indicators (running, stopped, paused)\n- Port mappings with clickable links\n- Container images and names at a glance\n\n\u003c/td\u003e\n\u003ctd width=\"50%\"\u003e\n\n### 🎮 Container Control\n- **Start** / **Stop** / **Restart** containers\n- **Delete** containers with confirmation\n- Bulk actions on selected containers\n- Instant feedback with flash messages\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\"\u003e\n\n### 📝 Live Logs\n- Real-time log streaming\n- Auto-scroll with manual override\n- Timestamp display\n- Search and filter logs\n\n\u003c/td\u003e\n\u003ctd width=\"50%\"\u003e\n\n### 💻 Web Terminal\n- Interactive shell access:\n  - Full server SSH terminal (via **Terminal** under Configuration)\n  - Interactive container shell (full PTY via `xterm.js`) accessible from **Containers → Terminal**\n\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\"\u003e\n\n### 🌐 Multi-Server Support\n- Connect to multiple Docker hosts\n- Easy server switching via dropdown\n- Local socket or remote TCP\n- Persistent server configuration\n\n\u003c/td\u003e\n\u003ctd width=\"50%\"\u003e\n\n### 📱 Responsive Design\n- Mobile-friendly interface\n- Tablet optimized\n- Touch-friendly controls\n- Works on any screen size\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\"\u003e\n\n### 🔀 GitOps for Compose\n- Clone a git repo with docker-compose files\n- Browse, create, edit, and delete compose projects\n- Save \u0026 push changes back to Gitea/GitHub\n- Deploy or stop projects directly from the UI\n- Auto-push on save (optional)\n- Gitea Actions CI/CD integration\n\n\u003c/td\u003e\n\u003ctd width=\"50%\"\u003e\n\n### 🧹 Resource Management\n- **Images**: Browse all images, prune dangling\n- **Volumes**: List and prune unused volumes\n- **Networks**: View attached containers, prune empty\n- Reclaimed space reporting after prune\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n## Screenshot\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"mis/image.webp\" alt=\"Dashboard\" width=\"90%\" /\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cem\u003eDashboard — View and manage all containers\u003c/em\u003e\u003c/p\u003e\n\n---\n\n## 📦 Installation Options\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e🐳 Docker (Recommended)\u003c/b\u003e\u003c/summary\u003e\n\n```bash\n# Pull and run using Docker Hub\ndocker pull ftsiadimos/lightdockerwebui:latest\n\ndocker run -d --restart unless-stopped \\\n-p 8008:8008 \\\n--name=DockerManager \\\n-v $(pwd)/instance:/app/instance \\\nftsiadimos/lightdockerwebui:latest\n\n# or pull from GitHub Container Registry\n# (repository is named \"simpledockerwebui\" there)\ndocker pull ghcr.io/ftsiadimos/simpledockerwebui:latest\n\ndocker run -d --restart unless-stopped \\\n-p 8008:8008 \\\n--name=DockerManager \\\n-v $(pwd)/instance:/app/instance \\\nghcr.io/ftsiadimos/simpledockerwebui:latest\n```\n\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e📄 Docker Compose\u003c/b\u003e\u003c/summary\u003e\n\n```yaml\n# docker-compose.yml\nversion: '3.8'\n\nservices:\n  DockerManager:\n    image: ftsiadimos/lightdockerwebui:latest  # or ghcr.io/ftsiadimos/simpledockerwebui:latest\n    container_name: DockerManager\n    ports:\n      - \"8008:8008\"\n    volumes:\n      - ./instance:/app/instance\n    restart: unless-stopped\n```\n\n```bash\ndocker-compose up -d\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e🦾 ARM64 Support\u003c/b\u003e\u003c/summary\u003e\n\n```bash\n# Build for both amd64 and arm64 (requires docker buildx + QEMU enabled)\ndocker buildx build --platform linux/amd64,linux/arm64 -t ghcr.io/ftsiadimos/simpledockerwebui:latest --push .\n\n# Run the arm64 image on arm64 host (or with qemu emulation on amd64)\ndocker run --platform linux/arm64 -d --restart unless-stopped -p 8008:8008 -v $(pwd)/instance:/app/instance ghcr.io/ftsiadimos/simpledockerwebui:latest\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e🐍 From Source (Development)\u003c/b\u003e\u003c/summary\u003e\n\n```bash\n# Clone repository\ngit clone https://github.com/ftsiadimos/lightdockerwebui.git\ncd lightdockerwebui\n\n# Create virtual environment\npython -m venv venv\nsource venv/bin/activate  # Windows: venv\\Scripts\\activate\n\n# Install dependencies\npip install -r requirements.txt\n\n# Run application\nflask run --host=0.0.0.0 --port=8008\n```\n\n\u003c/details\u003e\n\n---\n\n## ⚙️ Configuration\n\n### Connecting to Docker Hosts\n\nLightDockerWebUI supports **multiple Docker servers**. Configure them through the web UI:\n\n1. Click **Config** in the navigation bar\n2. Add servers with a display name and connection details:\n   - **Local**: Leave host empty to use `/var/run/docker.sock`\n   - **Remote**: Enter IP/hostname and port (default: 2375 or 2376)\n3. Select the active server from the dropdown\n\n### Server Terminal (SSH)\n\n- A full interactive **server terminal** is available via the **Terminal** menu (under Configuration)\n- Container terminals are full PTY shells (using `xterm.js`) available from the **Containers** page; the legacy limited command terminal has been removed\n\n### Environment Variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| \\`FLASK_DEBUG\\` | \\`0\\` | Enable debug mode (development only) |\n| \\`SECRET_KEY\\` | (random) | Flask secret key for sessions |\n| \\`SQLALCHEMY_DATABASE_URI\\` | \\`sqlite:///serverinfo.db\\` | Database connection string |\n## 🛰️ API: `/api/stats`\n\nLightDockerWebUI now exposes a lightweight JSON API for dashboard metrics.\n\n- `GET /api/stats` returns a JSON object with:\n  - `servers_count`\n  - `containers_count`\n  - `running_count`\n  - `images_count`\n  - `total_images`\n  - `total_images_size_gb`\n  - `networks_count`\n  - `volumes_count`\n  - `compose_stacks_count`\n  - `recent_activity`\n\n### Example usage\n\n```bash\n# get full metric object\ncurl -s http://localhost:8008/api/stats | jq .\n\n# get total images\ncurl -s http://localhost:8008/api/stats | jq '.total_images'\n\n# get total image size in GB\ncurl -s http://localhost:8008/api/stats | jq -r '.total_images_size_gb'\n\n# single summary line\ncurl -s http://localhost:8008/api/stats | jq -r '\"images=\\(.total_images) size=\\(.total_images_size_gb)\"'\n```\n\n### Note for custom host/port\n\nIf the app is not on localhost:8008, change to your host, e.g.:\n\n```bash\ncurl -s http://docker.myserver:5000/api/stats | jq .\n```\n\n### (Optional) Unix socket Access using netcat + HTTP over socket\n\n```bash\nprintf 'GET /api/stats HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n' | socat - UNIX-CONNECT:/var/run/docker.sock | jq .\n```\n### Exposing Remote Docker Daemon\n\nTo manage containers on a remote host, enable TCP on the Docker daemon:\n\n```bash\n# Create systemd override\nsudo mkdir -p /etc/systemd/system/docker.service.d\nsudo tee /etc/systemd/system/docker.service.d/override.conf \u003c\u003c EOF\n[Service]\nExecStart=\nExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375\nEOF\n\n# Reload and restart\nsudo systemctl daemon-reload\nsudo systemctl restart docker\n```\n\n\u003e ⚠️ **Security Warning**: Use TLS (port 2376) for production. Unencrypted connections should only be used on trusted networks.\n\n---\n\n## 🔀 GitOps for Compose\n\nLightDockerWebUI can manage docker-compose projects from a **git repository** (Gitea, GitHub, etc.), giving you a full GitOps workflow:\n\n### Setup\n\n1. Go to **Settings** → **Git Repository (GitOps)**\n2. Enter your repository HTTPS URL and a Personal Access Token\n3. Choose the branch (default: `main`) and enable **Auto-push** if desired\n4. Click **Save \u0026 Clone** — the repo is cloned locally\n\n### Usage\n\n- **Browse** — Navigate to **Git Compose** in the sidebar to see all compose projects\n- **Create** — Click \"New Project\" to scaffold a new project folder with a template `docker-compose.yml`\n- **Edit** — Open any compose file in the built-in editor with YAML validation\n- **Deploy / Stop** — Deploy or stop projects directly to the connected Docker host\n- **Delete** — Remove compose projects from the repo\n- **Save \u0026 Push** — Changes are committed and pushed to your git remote (automatically if auto-push is on)\n\n### Gitea Actions Integration\n\nFor automatic deployment on push, see the [Gitea Actions example](docs/gitea-actions-example.md) which provides ready-to-use CI/CD workflows.\n\n### Architecture Notes\n\n- Compose files are stored in `instance/gitops-repo/` (persisted via the Docker volume mount `./instance:/app/instance`)\n- The app uses the Docker CLI with `DOCKER_HOST` to deploy to remote Docker daemons\n- Git operations use the `git` CLI (installed in the Docker image) with PAT authentication\n\n---\n\n## 🏗️ Project Structure\n\n```\nlightdockerwebui/\n├── app/\n│   ├── __init__.py          # Flask application factory\n│   ├── main.py              # Routes, WebSocket handlers\n│   ├── models.py            # SQLAlchemy models (DockerServer, GitRepoConfig)\n│   ├── forms.py             # WTForms (AddServer, SelectServer, GitRepo)\n│   ├── git_service.py       # Git operations (clone, pull, commit, push)\n│   ├── static/              # CSS, JavaScript, images\n│   └── templates/           # Jinja2 HTML templates\n├── docs/                    # Documentation (rendered in-app)\n├── config.py                # Flask configuration classes\n├── start.py                 # Application entry point\n├── requirements.txt         # Python dependencies\n├── Dockerfile               # Container build file\n└── docker-compose.yml       # Compose configuration\n```\n\n---\n\n## 🛠️ Development\n\n```bash\n# Clone and setup\ngit clone https://github.com/ftsiadimos/lightdockerwebui.git\ncd lightdockerwebui\npython -m venv venv \u0026\u0026 source venv/bin/activate\npip install -r requirements.txt\n\n# Run with hot reload\nexport FLASK_DEBUG=1\nflask run --host=0.0.0.0 --port=8008\n```\n\n### Production deployment tips ⚙️\n\nFor production use we recommend running Gunicorn with the threaded worker class and a higher timeout to avoid workers being killed during occasional slow operations. Example command:\n\n```bash\n# Example Gunicorn command (used in Dockerfile / docker-compose)\n/usr/local/bin/gunicorn -b :8008 -k gthread --workers 3 --threads 4 --timeout 120 start:app\n```\n\nAlso ensure the Docker Python SDK is available in the environment where the app runs (needed to talk to Docker):\n\n```bash\npip install docker\n```\n\n### Tech Stack\n\n- **Backend**: Flask 3.x, Flask-SQLAlchemy, Flask-Sock\n- **Frontend**: Bootstrap 5.3, DataTables, jQuery\n- **Database**: SQLite (persistent server configuration)\n- **Container**: Docker SDK for Python\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome! Here's how:\n\n1. **Fork** the repository\n2. **Create** a feature branch: \\`git checkout -b feature/awesome-feature\\`\n3. **Commit** changes: \\`git commit -m 'Add awesome feature'\\`\n4. **Push** to branch: \\`git push origin feature/awesome-feature\\`\n5. **Open** a Pull Request\n\n---\n\n## 📄 License\n\nThis project is licensed under the **MIT License** — see [LICENSE](LICENSE) for details.\n\n---\n\n## 💬 Support \u0026 Links\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/ftsiadimos/lightdockerwebui/issues\"\u003e🐛 Report Bug\u003c/a\u003e •\n  \u003ca href=\"https://github.com/ftsiadimos/lightdockerwebui/discussions\"\u003e💡 Request Feature\u003c/a\u003e •\n  \u003ca href=\"https://hub.docker.com/r/ftsiadimos/lightdockerwebui\"\u003e🐳 Docker Hub\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  ⭐ \u003cstrong\u003eStar this repo if you find it useful!\u003c/strong\u003e ⭐\n\u003c/p\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n  Made with ❤️ by \u003ca href=\"https://github.com/ftsiadimos\"\u003eFotis Tsiadimos\u003c/a\u003e\n\u003c/p\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fftsiadimos%2Fsimpledockerwebui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fftsiadimos%2Fsimpledockerwebui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fftsiadimos%2Fsimpledockerwebui/lists"}