{"id":3323,"date":"2026-02-07T21:46:59","date_gmt":"2026-02-07T19:46:59","guid":{"rendered":"https:\/\/www.sinetiqueta.com\/?p=3323"},"modified":"2026-02-08T03:33:44","modified_gmt":"2026-02-08T01:33:44","slug":"mini-cpanel-para-raspberry-pi","status":"publish","type":"post","link":"https:\/\/www.sinetiqueta.com\/?p=3323","title":{"rendered":"mini Cpanel para Raspberry PI"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">&#x1f7e2; Mini cPanel \u2013 Procedimiento Completo para Raspberry Pi 3B<\/h1>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1&#xfe0f;&#x20e3; Instalaci\u00f3n de FileBrowser<\/h2>\n\n\n\n<p>Descarga e instala el binario oficial de FileBrowser:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -fsSL https:\/\/raw.githubusercontent.com\/filebrowser\/get\/master\/get.sh | bash<\/code><\/pre>\n\n\n\n<p>Inicia FileBrowser manualmente por primera vez:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo filebrowser -d \/etc\/filebrowser.db -r \/var\/www\/apps<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Esto crea la base de datos inicial y un usuario <code>admin<\/code> con contrase\u00f1a aleatoria, estate atento y <strong>COPIALA!<\/strong><\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"769\" height=\"159\" src=\"https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/image-3.png\" alt=\"\" class=\"wp-image-3338\" srcset=\"https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/image-3.png 769w, https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/image-3-300x62.png 300w\" sizes=\"auto, (max-width: 769px) 100vw, 769px\" \/><\/figure>\n<\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>Solo escucha en <code>127.0.0.1<\/code> (localhost)<\/li>\n\n\n\n<li>La carpeta ra\u00edz para las apps ser\u00e1 <code>\/var\/www\/apps<\/code><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2&#xfe0f;&#x20e3; Ajuste de permisos para LAN y servicio<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chown www-data:www-data \/etc\/filebrowser.db<br>\nsudo chmod 600 \/etc\/filebrowser.db<br>\nsudo chown -R www-data:www-data \/var\/www\/apps<br>\nsudo chmod -R 750 \/var\/www\/apps<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3&#xfe0f;&#x20e3; Probar acceso desde otro PC de la LAN<\/h2>\n\n\n\n<p>Ejecuta FileBrowser escuchando en todas las IP de la Raspberry:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo -u www-data \/usr\/local\/bin\/filebrowser -d \/etc\/filebrowser.db -r \/var\/www\/apps -a 0.0.0.0 -p 8080<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Desde tu navegador en otro PC de la LAN: <code>http:\/\/IP_DE_LA_RASPI:8080<\/code><\/li>\n\n\n\n<li>Usuario: <code>admin<\/code><\/li>\n\n\n\n<li>Contrase\u00f1a: la que se gener\u00f3 al iniciar FileBrowser<\/li>\n\n\n\n<li>Cambia la contrase\u00f1a al entrar por primera vez<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4&#xfe0f;&#x20e3; Crear scripts de administraci\u00f3n<\/h2>\n\n\n\n<p>Cierra el FileBrowser desde la Raspi: Crtl+C<\/p>\n\n\n\n<p>Crea la carpeta para scripts del mini cPanel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>sudo mkdir -p \/var\/www\/apps\/admin-scripts<br>\nsudo chown -R www-data:www-data \/var\/www\/apps\/admin-scripts<br>\nsudo chmod -R 750 \/var\/www\/apps\/admin-scripts<\/code><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Ejemplos de scripts<\/h3>\n\n\n\n<p>Los puedes crear en la carpeta <strong>admin-scripts<\/strong> directamente desde el FileBrowser<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>reiniciar-php.sh<\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash<br>\ntouch \/tmp\/restart_php_fpm.flag<br>\necho \"Solicitud de reinicio registrada\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ajustar-permisos.sh<\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash<br>\nsudo chown -R www-data:www-data \/var\/www\/apps<br>\nsudo chmod -R 750 \/var\/www\/apps<br>\necho \"Permisos ajustados correctamente\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>backup.sh<\/strong> (definitivo, funciona con sudo)<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash<br>\nsudo mkdir -p \/home\/pi\/backups<br>\nsudo cp -r \/var\/www\/apps \/home\/pi\/backups\/apps_$(date +%Y%m%d_%H%M%S)<br>\necho \"Backup realizado en \/home\/pi\/backups\"<\/code><\/pre>\n\n\n\n<p>Dar permisos de ejecuci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># 1. Aseg\u00farate de que las carpetas superiores permitan el paso<br>\nsudo chmod 755 \/var\/www\/apps<br>\nsudo chmod 755 \/var\/www\/apps\/admin-scripts<br>\n<br>\n# 2. Ahora intenta el chmod de los archivos<br>\nsudo chmod +x \/var\/www\/apps\/admin-scripts\/*.sh<\/code><\/pre>\n\n\n\n<p>Permitir que <code>www-data<\/code> ejecute el script de backup con sudo sin contrase\u00f1a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo visudo<\/code><\/pre>\n\n\n\n<p>A\u00f1adir al final:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>www-data ALL=(ALL) NOPASSWD: \/var\/www\/apps\/admin-scripts\/backup.sh<br>\nwww-data ALL=(ALL) NOPASSWD: \/var\/www\/apps\/admin-scripts\/reiniciar-php.sh<br>\nwww-data ALL=(ALL) NOPASSWD: \/var\/www\/apps\/admin-scripts\/ajustar-permisos.sh<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5&#xfe0f;&#x20e3; Crear mini panel web PHP<\/h2>\n\n\n\n<p>Archivo: <code>\/var\/www\/html\/admin.php<\/code> \u2190 <strong>importante: mover a \/html<\/strong><\/p>\n\n\n\n<p>o<\/p>\n\n\n\n<p>Creamos el archivo directamente en la ruta correcta: sudo nano \/var\/www\/html\/admin.php<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mv \/var\/www\/apps\/admin.php \/var\/www\/html\/<br>\nsudo chown www-data:www-data \/var\/www\/html\/admin.php<br>\nsudo chmod 750 \/var\/www\/html\/admin.php<\/code><\/pre>\n\n\n\n<p>Contenido del archivo (muy b\u00e1sico):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php<br>\nsession_start();<br>\n$secret_pass = \"TU_PASSWORD_SEGURA\"; \/\/ Cambiar antes de producci\u00f3n<br>\n<br>\nif(isset($_POST&#91;'password'])){<br>\n    if($_POST&#91;'password'] === $secret_pass){<br>\n        $_SESSION&#91;'logged_in'] = true;<br>\n    } else {<br>\n        $error = \"Contrase\u00f1a incorrecta\";<br>\n    }<br>\n}<br>\n<br>\nif(!isset($_SESSION&#91;'logged_in'])){<br>\n?&gt;<br>\n&lt;form method=\"POST\"&gt;<br>\n&lt;input type=\"password\" name=\"password\" placeholder=\"Contrase\u00f1a\"&gt;<br>\n&lt;input type=\"submit\" value=\"Entrar\"&gt;<br>\n&lt;?php if(isset($error)) echo \"&lt;p&gt;$error&lt;\/p&gt;\"; ?&gt;<br>\n&lt;\/form&gt;<br>\n&lt;?php<br>\nexit;<br>\n}<br>\n<br>\nfunction runScript($script){<br>\n    $output = shell_exec(\"sudo \/var\/www\/apps\/admin-scripts\/$script 2&gt;&amp;1\");<br>\n    echo \"&lt;pre&gt;$output&lt;\/pre&gt;\";<br>\n}<br>\n<br>\nif(isset($_GET&#91;'action'])){<br>\n    switch($_GET&#91;'action']){<br>\n        case 'reiniciar_php':<br>\n            runScript('reiniciar-php.sh'); break;<br>\n        case 'ajustar_permisos':<br>\n            runScript('ajustar-permisos.sh'); break;<br>\n        case 'backup':<br>\n            runScript('backup.sh'); break;<br>\n    }<br>\n}<br>\n?&gt;<br>\n&lt;h1&gt;Mini cPanel Profesional&lt;\/h1&gt;<br>\n&lt;ul&gt;<br>\n&lt;li&gt;&lt;a href=\"?action=reiniciar_php\"&gt;Reiniciar PHP-FPM&lt;\/a&gt;&lt;\/li&gt;<br>\n&lt;li&gt;&lt;a href=\"?action=ajustar_permisos\"&gt;Ajustar permisos apps&lt;\/a&gt;&lt;\/li&gt;<br>\n&lt;li&gt;&lt;a href=\"?action=backup\"&gt;Hacer backup de JSON + DB&lt;\/a&gt;&lt;\/li&gt;<br>\n&lt;\/ul&gt;<\/code><\/pre>\n\n\n\n<p>Ahora el panel PHP se accede desde:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;IP_DE_LA_RASPI\/admin.php<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6&#xfe0f;&#x20e3; Crear servicio systemd para FileBrowser (ejecuci\u00f3n en segundo plano)<\/h2>\n\n\n\n<p>Archivo: <code>\/etc\/systemd\/system\/filebrowser.service<\/code><\/p>\n\n\n\n<p><code>sudo nano \/etc\/systemd\/system\/filebrowser.service<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Unit]<br>\nDescription=FileBrowser Web Manager<br>\nAfter=network.target<br>\n<br>\n&#91;Service]<br>\nType=simple<br>\nUser=www-data<br>\nGroup=www-data<br>\nExecStart=\/usr\/local\/bin\/filebrowser \\<br>\n  -d \/etc\/filebrowser.db \\<br>\n  -r \/var\/www\/apps \\<br>\n  -a 0.0.0.0 \\<br>\n  -p 8080<br>\nRestart=on-failure<br>\nRestartSec=5<br>\nNoNewPrivileges=true<br>\nPrivateTmp=true<br>\n<br>\n&#91;Install]<br>\nWantedBy=multi-user.target<\/code><\/pre>\n\n\n\n<p>Comprueba que el binario existe:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ls -l \/usr\/local\/bin\/filebrowser<\/code><\/pre>\n\n\n\n<p>Debe existir y ser ejecutable.<\/p>\n\n\n\n<p>Comprueba la base de datos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ls -l \/etc\/filebrowser.db<\/code><\/pre>\n\n\n\n<p>Debe ser propiedad de <code>www-data<\/code>.<\/p>\n\n\n\n<p>Recargar y habilitar:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl daemon-reload<br>\nsudo systemctl enable filebrowser<br>\nsudo systemctl start filebrowser<br>\nsudo systemctl status filebrowser<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Parar \/ arrancar manualmente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl stop filebrowser<br>\nsudo systemctl start filebrowser<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">&#x1f4cc; Nota importante (buenas pr\u00e1cticas)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>NO<\/strong> ejecutes FileBrowser como <code>root<\/code><\/li>\n\n\n\n<li><strong>NO<\/strong> guardes apps en <code>\/var\/www\/html<\/code><\/li>\n\n\n\n<li><code>\/html<\/code> \u2192 solo panel y frontend<\/li>\n\n\n\n<li><code>\/apps<\/code> \u2192 backend, uploads, datos<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">7&#xfe0f;&#x20e3; Seguridad y recomendaciones<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Acceso solo desde LAN<\/li>\n\n\n\n<li>Cambiar la contrase\u00f1a <code>admin<\/code> al entrar por primera vez<\/li>\n\n\n\n<li>Opcional: configurar HTTPS con certificado self-signed<\/li>\n\n\n\n<li>Usar usuario admin separado y <strong>no usar <code>pi<\/code> para administraci\u00f3n<\/strong><\/li>\n\n\n\n<li>Ajustar firewall si es necesario (puerto 8080 abierto solo LAN)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8&#xfe0f;&#x20e3; Estado final<\/h2>\n\n\n\n<p>&#x2705; Gestionas WebApps desde navegador (subida, permisos, estructura)<br>&#x2705; Reinicio de PHP-FPM desde web<br>&#x2705; Backups autom\u00e1ticos de JSON + DB funcionando con sudo<br>&#x2705; Panel seguro solo LAN<br>&#x2705; Escalable: firewall, MariaDB, phpMyAdmin visual<\/p>\n\n\n\n<p class=\"has-large-font-size\">&#x1f409; En la siguiente entrada del Blog&#8230;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A\u00f1adimos herramientas<\/li>\n\n\n\n<li>Mejoramos la UX (User Experience)<\/li>\n\n\n\n<li><\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#x1f7e2; Mini cPanel \u2013 Procedimiento Completo para Raspberry Pi 3B 1&#xfe0f;&#x20e3; Instalaci\u00f3n de FileBrowser Descarga e instala el binario oficial de FileBrowser: Inicia FileBrowser manualmente por primera vez: 2&#xfe0f;&#x20e3; Ajuste de permisos para LAN y servicio 3&#xfe0f;&#x20e3; Probar acceso desde&#8230; <a href=\"https:\/\/www.sinetiqueta.com\/?p=3323\" class=\"readmore\">Leer m\u00e1s<span class=\"screen-reader-text\">mini Cpanel para Raspberry PI<\/span><span class=\"fa fa-angle-double-right\" aria-hidden=\"true\"><\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":3344,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[236],"tags":[500],"class_list":["post-3323","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-raspberry-pi","tag-cpanel","content-layout-excerpt-thumb"],"jetpack_featured_media_url":"https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/Gemini_Generated_Image_ynhdsdynhdsdynhd.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts\/3323","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3323"}],"version-history":[{"count":16,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts\/3323\/revisions"}],"predecessor-version":[{"id":3380,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts\/3323\/revisions\/3380"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/media\/3344"}],"wp:attachment":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3323"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3323"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}