{"id":50809471,"url":"https://github.com/cristiancorreau/litehost-panel","last_synced_at":"2026-06-13T03:14:34.637Z","repository":{"id":362612611,"uuid":"1259984297","full_name":"cristiancorreau/litehost-panel","owner":"cristiancorreau","description":"Lightweight self-hosted FastAPI control panel: provisions WordPress/static/Coolify sites behind nginx with wildcard SSL, manages PHP-FPM, MySQL, backups, a web file manager, metrics and a docs wiki.","archived":false,"fork":false,"pushed_at":"2026-06-05T04:39:37.000Z","size":131,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-05T05:18:14.422Z","etag":null,"topics":["control-panel","coolify","fastapi","hosting","nginx","php-fpm","python","self-hosted","web-hosting","wordpress"],"latest_commit_sha":null,"homepage":"https://cristiancorreau.github.io/litehost-panel/","language":"Python","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/cristiancorreau.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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":"2026-06-05T03:43:32.000Z","updated_at":"2026-06-05T04:39:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/cristiancorreau/litehost-panel","commit_stats":null,"previous_names":["cristiancorreau/litehost-panel"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/cristiancorreau/litehost-panel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cristiancorreau%2Flitehost-panel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cristiancorreau%2Flitehost-panel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cristiancorreau%2Flitehost-panel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cristiancorreau%2Flitehost-panel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cristiancorreau","download_url":"https://codeload.github.com/cristiancorreau/litehost-panel/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cristiancorreau%2Flitehost-panel/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34270552,"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-06-13T02:00:06.617Z","response_time":62,"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":["control-panel","coolify","fastapi","hosting","nginx","php-fpm","python","self-hosted","web-hosting","wordpress"],"created_at":"2026-06-13T03:14:34.323Z","updated_at":"2026-06-13T03:14:34.610Z","avatar_url":"https://github.com/cristiancorreau.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"docs/banner.svg\" alt=\"LiteHost Panel\" width=\"100%\"\u003e\n\n\u003ch3\u003ePanel de control \u003cem\u003eself-hosted\u003c/em\u003e y ligero para administrar muchos sitios en un solo servidor.\u003c/h3\u003e\n\n\u003cp\u003e\nAprovisiona sitios \u003cb\u003eWordPress\u003c/b\u003e, \u003cb\u003eestáticos\u003c/b\u003e y apps de \u003cb\u003eCoolify\u003c/b\u003e como subdominios\ndetrás de \u003cb\u003enginx\u003c/b\u003e con SSL wildcard — y gestiona PHP-FPM, MySQL, backups, archivos y\ndocumentación desde una sola interfaz.\n\u003c/p\u003e\n\n\u003cp\u003e\n\u003ca href=\"#-quick-start\"\u003e\u003cstrong\u003eEmpezar »\u003c/strong\u003e\u003c/a\u003e\n\u0026middot;\n\u003ca href=\"#-características\"\u003eFeatures\u003c/a\u003e\n\u0026middot;\n\u003ca href=\"#-arquitectura\"\u003eArquitectura\u003c/a\u003e\n\u0026middot;\n\u003ca href=\"https://github.com/cristiancorreau/litehost-panel/issues/new\"\u003eReportar bug\u003c/a\u003e\n\u003c/p\u003e\n\n[![CI](https://github.com/cristiancorreau/litehost-panel/actions/workflows/ci.yml/badge.svg)](https://github.com/cristiancorreau/litehost-panel/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-22c55e.svg)](LICENSE)\n[![Python](https://img.shields.io/badge/Python-3.11+-3776AB?logo=python\u0026logoColor=white)](https://www.python.org/)\n[![FastAPI](https://img.shields.io/badge/FastAPI-009688?logo=fastapi\u0026logoColor=white)](https://fastapi.tiangolo.com)\n[![nginx](https://img.shields.io/badge/nginx-009639?logo=nginx\u0026logoColor=white)](https://nginx.org)\n![Self-hosted](https://img.shields.io/badge/self--hosted-0b1120?logo=linux\u0026logoColor=white)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-a78bfa.svg)](CONTRIBUTING.md)\n[![GitHub stars](https://img.shields.io/github/stars/cristiancorreau/litehost-panel?style=social)](https://github.com/cristiancorreau/litehost-panel/stargazers)\n\n\u003c/div\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e📖 Tabla de contenidos\u003c/b\u003e\u003c/summary\u003e\n\n- [¿Por qué?](#-por-qué)\n- [Características](#-características)\n- [Arquitectura](#-arquitectura)\n- [Entorno recomendado](#-entorno-recomendado)\n- [Quick start](#-quick-start)\n- [Configuración](#-configuración)\n- [El helper privilegiado](#-el-helper-privilegiado)\n- [Seguridad](#-seguridad)\n- [Stack](#-stack)\n- [Contribuir](#-contribuir)\n- [Licencia](#-licencia)\n\n\u003c/details\u003e\n\n## 💡 ¿Por qué?\n\nMontar varios WordPress, landings estáticas y apps Docker en un mismo VPS suele terminar en\nuna maraña de vhosts escritos a mano, certificados, sockets de PHP y dumps de MySQL dispersos.\n**LiteHost Panel** pone todo eso detrás de una UI simple: creas un subdominio, eliges el tipo\nde sitio y el panel se encarga del docroot, la base de datos, el vhost de nginx, el SSL y el\nbackup automático al borrar. Sin agentes, sin nube — un solo proceso FastAPI en tu servidor.\n\n\u003e [!NOTE]\n\u003e Este proyecto nació como herramienta interna de un servidor de laboratorio y se publica para\n\u003e la comunidad. Los valores del entorno original fueron reemplazados por placeholders\n\u003e (`example.com`, `appuser`, IPs de documentación) y **todo es configurable por variables de\n\u003e entorno**. Adáptalo a tu infraestructura antes de usarlo.\n\n## ✨ Características\n\n| | Característica | Qué hace |\n|---|---|---|\n| 🟢 | **Sitios WordPress** | Descarga el core, crea BD + usuario MySQL, escribe `wp-config.php`, genera el vhost y corre `wp core install` vía WP-CLI. |\n| 🔵 | **Sitios estáticos** | Docroot + vhost listos, con instrucciones de subida (scp / zip). |\n| ♻️ | **Restore Duplicator** | Desde un paquete subido o desde disco, con reescritura de URLs (`wp search-replace`). |\n| 🟣 | **Apps / servicios Coolify** | Registra un subdominio que hace `proxy_pass` a un puerto del host (rango 8101–8200) gestionado por Coolify. |\n| 🌐 | **Gestor de vhosts nginx** | Inventario en vivo de `sites-enabled`, plantillas `php` / `static` / `proxy`, habilitar/eliminar, cambiar PHP por sitio. |\n| ⚙️ | **PHP-FPM** | Ver y editar parámetros del pool (`pm`, `memory_limit`, uploads…) por versión. |\n| 💾 | **Backups \u0026 restore** | `mysqldump` + `tar` del docroot al borrar un sitio, restaurable desde el panel. |\n| 📂 | **Gestor de archivos** | Navegar / editar / subir / permisos dentro de `/var/www` (acotado y seguro). |\n| 📊 | **Métricas** | CPU, RAM, disco y uso por sitio. |\n| 📚 | **Mini-wiki** | Páginas markdown editables (incluye docs de arquitectura y de multitenancy con Supabase). |\n| 🪧 | **Landing autogenerada** | Index del dominio base con tarjetas de los sitios activos. |\n\n## 🏗 Arquitectura\n\nEl panel corre como un **usuario sin privilegios**. Cada acción que requiere root se delega en\nun único helper auditable (`sw-panel-helper`) autorizado por una regla de `sudoers` acotada.\n\n```mermaid\nflowchart LR\n    User([🌐 Navegador]) --\u003e|HTTPS| Nginx\n\n    subgraph Server [Servidor Linux · nginx en 80/443]\n      Nginx[\"nginx\u003cbr/\u003evhost por subdominio\u003cbr/\u003eSSL wildcard\"]\n      Nginx --\u003e|panel.dominio| Panel[\"LiteHost Panel\u003cbr/\u003eFastAPI · uvicorn :9080\"]\n      Nginx --\u003e|*.dominio · WordPress| PHP[\"PHP-FPM\u003cbr/\u003e7.4 / 8.x sockets\"]\n      Nginx --\u003e|*.dominio · estático| Disk[\"/var/www/\u0026lt;fqdn\u0026gt;\"]\n      Nginx --\u003e|*.dominio · apps| Coolify[\"Coolify\u003cbr/\u003e127.0.0.1:8101-8200\"]\n\n      Panel -. sudo -n .-\u003e Helper[\"sw-panel-helper\u003cbr/\u003e(acción privilegiada)\"]\n      Helper --\u003e Nginx\n      Helper --\u003e PHP\n      Helper --\u003e MySQL[(MySQL / MariaDB)]\n      Helper --\u003e Disk\n    end\n\n    classDef panel fill:#052e1a,stroke:#22c55e,color:#bbf7d0;\n    classDef infra fill:#0b1120,stroke:#334155,color:#e2e8f0;\n    class Panel panel;\n    class Nginx,PHP,Disk,Coolify,Helper,MySQL infra;\n```\n\n## 🖥 Entorno recomendado\n\nProbado en **Ubuntu Server 22.04 LTS**. Este es el stack de referencia:\n\n| Componente | Recomendado | Notas |\n|---|---|---|\n| **Sistema operativo** | **Ubuntu Server 22.04 LTS** (Jammy) | También funciona en 24.04 LTS. 64-bit. |\n| **Python** | 3.10+ | 22.04 trae 3.10; 24.04 trae 3.12. |\n| **nginx** | 1.18+ | Reverse proxy y vhosts. |\n| **PHP-FPM** | 7.4 + 8.1–8.4 (vía PPA `ondrej/php`) | Multi-versión seleccionable por sitio. |\n| **Base de datos** | MySQL 8.0 *o* MariaDB 10.6+ | El servidor de referencia usa MySQL 8.0. |\n| **certbot** | 1.21+ | Certificado **wildcard** por desafío DNS. |\n| **RAM** | 2 GB mínimo · 4 GB+ recomendado | Más si usas Coolify/Supabase. |\n| **Red / acceso** | root o `sudo`, puertos 80/443 públicos | DNS con wildcard `*.tu-dominio` → servidor. |\n\n\u003e [!TIP]\n\u003e El instalador (`install.sh`) puede añadir el PPA `ondrej/php` e instalar todas las\n\u003e versiones de PHP por ti. Si lo haces a mano:\n\u003e ```bash\n\u003e sudo add-apt-repository -y ppa:ondrej/php \u0026\u0026 sudo apt update\n\u003e sudo apt install php7.4-fpm php8.1-fpm php8.2-fpm php8.3-fpm php8.4-fpm\n\u003e ```\n\nUn **VPS de 2 vCPU / 4 GB RAM** con Ubuntu 22.04 LTS es un punto de partida cómodo para\nalojar varios WordPress + sitios estáticos.\n\n## 🚀 Quick start\n\n\u003e **Requisitos:** Linux con `nginx`, `php-fpm` (7.4 / 8.x), `mysql`/`mariadb`, `certbot`\n\u003e (SSL wildcard) y Python 3.10+. Opcional: [Coolify](https://coolify.io/) para apps Docker.\n\u003e DNS con un wildcard `*.tu-dominio` apuntando al servidor. Ver\n\u003e [Entorno recomendado](#-entorno-recomendado).\n\n### Opción A · Instalador interactivo (recomendado)\n\nUn asistente paso a paso que instala dependencias, crea el venv, te pregunta cada valor,\n**genera el hash bcrypt y el secreto**, y deja listos el `.env`, el helper, sudoers, el\nservicio systemd y el vhost de nginx:\n\n```bash\ngit clone https://github.com/cristiancorreau/litehost-panel.git /opt/sw-panel\ncd /opt/sw-panel\nsudo ./install.sh\n```\n\n```text\n  LiteHost Panel · instalador\n  ---------------------------------------------\n  ▸ Paso 4/8 · Configuración del panel\n    — Acceso al panel —\n    Usuario administrador del panel [admin]:\n    Contraseña del administrador:\n    — Dominio —\n    Dominio base de los subdominios (wildcard *.dominio) [lab.example.com]:\n  ✓ Hash bcrypt de la contraseña generado\n  ✓ Servicio sw-panel activo (127.0.0.1:9080)\n```\n\n¿Solo quieres (re)generar la configuración? `sudo ./install.sh --env-only`\n\n### Opción B · Manual\n\n\u003cdetails\u003e\n\u003csummary\u003ePasos manuales equivalentes\u003c/summary\u003e\n\n```bash\n# 1) Código y entorno virtual\ngit clone https://github.com/cristiancorreau/litehost-panel.git /opt/sw-panel\ncd /opt/sw-panel\npython3 -m venv venv \u0026\u0026 ./venv/bin/pip install -r requirements.txt\n\n# 2) Configuración (genera hash y secreto siguiendo los comentarios)\nsudo mkdir -p /etc/sw-panel\nsudo cp .env.example /etc/sw-panel/panel.env\nsudo nano /etc/sw-panel/panel.env\n\n# 3) Helper privilegiado + sudoers\nsudo install -o root -g root -m 0750 deploy/sw-panel-helper /usr/local/bin/sw-panel-helper\nsudo install -o root -g root -m 0440 deploy/sudoers.sw-panel /etc/sudoers.d/sw-panel\nsudo visudo -cf /etc/sudoers.d/sw-panel\n\n# 4) Servicio systemd\nsudo cp deploy/sw-panel.service /etc/systemd/system/\nsudo systemctl daemon-reload \u0026\u0026 sudo systemctl enable --now sw-panel\n\n# 5) Vhost del panel (edita server_name + rutas SSL)\nsudo cp deploy/nginx-panel.conf.example /etc/nginx/sites-available/panel.conf\nsudo ln -s /etc/nginx/sites-available/panel.conf /etc/nginx/sites-enabled/\nsudo nginx -t \u0026\u0026 sudo systemctl reload nginx\n```\n\n\u003c/details\u003e\n\nEl panel queda en **`https://panel.\u003ctu-dominio\u003e`**, protegido con HTTP Basic.\n\n## 🔧 Configuración\n\nTodo vive en `panel.env` (ver [`.env.example`](.env.example)).\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eVariables de entorno\u003c/b\u003e\u003c/summary\u003e\n\n| Variable | Default | Para qué |\n|---|---|---|\n| `PANEL_ADMIN_USER` | `admin` | Usuario del login. |\n| `PANEL_ADMIN_PASSWORD_HASH` | — | Hash **bcrypt** de la contraseña. |\n| `PANEL_SESSION_SECRET` | `change-me` | Secreto de sesión. |\n| `PANEL_LAB_DOMAIN` | `lab.example.com` | Dominio base de los subdominios. |\n| `PANEL_SYSTEM_USER` | `appuser` | Usuario dueño de `/home/\u003cuser\u003e` (uploads/backups). |\n| `MYSQL_ROOT_USER` / `MYSQL_ROOT_PASS` | `root` / — | Credenciales para crear BDs. |\n| `MYSQL_HOST` | `localhost` | Host de MySQL/MariaDB. |\n| `PANEL_DEFAULT_PHP` | `8.3` | PHP por defecto para sitios nuevos. |\n| `COOLIFY_API_URL` / `COOLIFY_API_TOKEN` | — | Integración opcional con Coolify. |\n| `COOLIFY_PORT_START` / `COOLIFY_PORT_END` | `8101` / `8200` | Rango de puertos para apps. |\n\nGenera el hash y el secreto:\n\n```bash\npython3 -c \"from passlib.hash import bcrypt; print(bcrypt.hash('TU_PASSWORD'))\"\npython3 -c \"import secrets; print(secrets.token_urlsafe(48))\"\n```\n\n\u003c/details\u003e\n\n## 🛡 El helper privilegiado\n\n[`deploy/sw-panel-helper`](deploy/sw-panel-helper) es una **implementación de referencia** que\nexpone subcomandos acotados (nginx, docroots, gestor de archivos limitado a `/var/www`, backups,\nphp-fpm, servicios, WP-CLI). El panel jamás ejecuta root directamente: solo invoca este helper\nvía `sudo -n`. Es el componente con privilegios — **audítalo y ajústalo a tu entorno antes de\nproducción**.\n\n## 🔒 Seguridad\n\n- Usa una contraseña fuerte y cambia `PANEL_SESSION_SECRET`.\n- Sirve el panel **siempre tras HTTPS**.\n- La regla de `sudoers` debe apuntar **solo** a `sw-panel-helper`.\n- El gestor de archivos está restringido a `/var/www`; revisa los guardas si amplías rutas.\n\n## 🧰 Stack\n\n`FastAPI` · `Uvicorn` · `Jinja2` · `SQLAlchemy` + `SQLite` · `PyMySQL` · `passlib/bcrypt` ·\n`httpx` — sobre `nginx`, `PHP-FPM`, `MySQL/MariaDB` y, opcionalmente, `Coolify`.\n\n## 🤝 Contribuir\n\nLos PRs son bienvenidos. Para cambios grandes, abre primero un *issue* para discutir la idea.\nAl ser una herramienta de infraestructura, presta especial atención al `sw-panel-helper` y a\nlos límites de rutas/permisos. Lee la **[guía de contribución](CONTRIBUTING.md)** para el\nentorno de desarrollo, el estilo de código y el proceso de PR.\n\n## 📄 Licencia\n\nDistribuido bajo licencia **MIT**. Ver [`LICENSE`](LICENSE).\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\u003csub\u003eHecho con ☕ y FastAPI · si te resulta útil, deja una ⭐\u003c/sub\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcristiancorreau%2Flitehost-panel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcristiancorreau%2Flitehost-panel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcristiancorreau%2Flitehost-panel/lists"}