{"id":3313,"date":"2026-02-07T03:14:58","date_gmt":"2026-02-07T01:14:58","guid":{"rendered":"https:\/\/www.sinetiqueta.com\/?p=3313"},"modified":"2026-02-08T00:29:52","modified_gmt":"2026-02-07T22:29:52","slug":"servidor-web-local-con-raspberry-pi","status":"publish","type":"post","link":"https:\/\/www.sinetiqueta.com\/?p=3313","title":{"rendered":"Servidor Web Local con Raspberry PI"},"content":{"rendered":"\n<p>En este caso quiero montar un Servidor Web Local <\/p>\n\n\n\n<p>Lo primero es disponer de una Raspberry PI, para este ejercicio tenemos una del modelo 3B con MicroSD de 32Gb.<\/p>\n\n\n\n<p>Se ha descargado la \u00faltima versi\u00f3n de Raspberry OS Lite x64, para convertila en un <strong>servidor web PHP + MariaDB + phpMyAdmin<\/strong>, <strong>solo en red local<\/strong> (por ahora), si todo va bien, en 20-30minutos, deber\u00eda estar todo operativo&#8230;. pero no, os vais a olvidar de la contrase\u00f1a de algo&#8230; y tendreis que volver a empezar. Palabrta.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">&#x1f9f1; FASE 0 \u2014 Suposiciones<\/h1>\n\n\n\n<p>Asumimos que:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tienes conocimientos\/experiendia en en este mundo<\/li>\n\n\n\n<li>Ya has instalado el SO y activado el acceso por SSH y&#8230;<\/li>\n\n\n\n<li>Ya entras por <strong>SSH<\/strong><\/li>\n\n\n\n<li>El sistema est\u00e1 actualizado<\/li>\n\n\n\n<li>Est\u00e1s como usuario con privilegios<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">&#x1f539; FASE 1 \u2014 Actualizar sistema (base limpia)<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update <br>\nsudo apt upgrade -y<br>\nsudo reboot<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">&#x1f539; FASE 2 \u2014 Instalar NGINX (Servidor Web)<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install nginx -y<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Comprobamos que funciona<\/h3>\n\n\n\n<p>Desde un PC en la misma red, con nuestro navegador preferido: <strong>http:\/\/IP_DE_LA_RASPI<\/strong> &lt;&#8211; para conocer la IP, solo tienes que buscarla en tu router, o con AdvanceIP Scanner, pero si  no, lo m\u00e1s r\u00e1pido es conectarle un cable de video (HDMI) y al acabar de iniciarse, te muestra la IP asignada. (M\u00e1s adelante, veremos para poner una IP fija).<\/p>\n\n\n\n<p>Si todo ha ido bien&#8230; ver\u00edamos esto en nuestro Navagador:<\/p>\n\n\n<div class=\"wp-block-image is-style-default\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"546\" height=\"212\" src=\"https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/image.png\" alt=\"\" class=\"wp-image-3314\" srcset=\"https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/image.png 546w, https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/image-300x116.png 300w\" sizes=\"auto, (max-width: 546px) 100vw, 546px\" \/><\/figure>\n<\/div>\n\n\n<p>&#x1f4cc; Guarda\/Apunta esta ruta:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/var\/www\/html<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">&#x1f539; FASE 3 \u2014 Instalar PHP + PHP-FPM (optimizado)<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install php php-fpm php-cli php-mysql php-json php-curl php-zip php-gd php-mbstring php-xml -y<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Comprobamos versi\u00f3n<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>php -v<\/code><\/pre>\n\n\n\n<p>A d\u00eda de hoy:  <strong>8.4<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PHP <strong>8.4<\/strong>.16 (cli) (built: Dec 18 2025 21:19:25) (NTS)\nCopyright (c) The PHP Group\nBuilt by Debian\nZend Engine v4.4.16, Copyright (c) Zend Technologies\n    with Zend OPcache v<strong>8.4<\/strong>.16, Copyright (c), by Zend Technologies<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">&#x1f539; FASE 4 \u2014 Conectar Nginx con PHP<\/h1>\n\n\n\n<p>Editamos el site por defecto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/nginx\/sites-available\/default<\/code><\/pre>\n\n\n\n<p>Buscamos esta l\u00ednea (en mi caso, l\u00ednea 43):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Add index.php to the list if you are using PHP\n        index index.html index.htm index.nginx-debian.html;<\/code><\/pre>\n\n\n\n<p>Y la dejamos tal que as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Add index.php to the list if you are using PHP\n        index index.php index.html index.htm index.nginx-debian.html;<\/code><\/pre>\n\n\n\n<p>En el mismo archivo, <strong>activamos PHP<\/strong> (dentro del bloque <code>server {}<\/code>), SOLO DEBEMOS REITRAR LAS <strong># <\/strong>y querar\u00eda tal que as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> # pass PHP scripts to FastCGI server\n        #\n        <strong>location ~ \\.php$ {\n                include snippets\/fastcgi-php.conf;<\/strong>\n        #\n        #       # With php-fpm (or other unix sockets):\n              <strong>  fastcgi_pass unix:\/run\/php\/php8.4-fpm.sock;<\/strong>\n        #       # With php-cgi (or other tcp sockets):\n        #       fastcgi_pass 127.0.0.1:9000;\n        <strong>}<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>&#x26a0;&#xfe0f; Si tu PHP es otra versi\u00f3n, compru\u00e9balo con: ls \/run\/php\/<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Reiniciamos servicios<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl restart nginx\nsudo systemctl restart php8.4-fpm<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">&#x1f539; FASE 5 \u2014 Test r\u00e1pido de PHP<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/var\/www\/html\/info.php<\/code><\/pre>\n\n\n\n<p>Se abre un archivo vac\u00edo y escribimos este contenido:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\nphpinfo();<\/code><\/pre>\n\n\n\n<p>Desde el navegador:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;IP_DE_LA_RASPI\/info.php<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"940\" height=\"326\" src=\"https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/image-1.png\" alt=\"\" class=\"wp-image-3315\" srcset=\"https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/image-1.png 940w, https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/image-1-300x104.png 300w, https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/image-1-768x266.png 768w\" sizes=\"auto, (max-width: 940px) 100vw, 940px\" \/><\/figure>\n\n\n\n<p>&#x2714;&#xfe0f; Si ves la p\u00e1gina de PHP \u2192 perfecto<br>Luego <strong>b\u00f3rralo<\/strong> (por seguridad):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo rm \/var\/www\/html\/info.php<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">&#x1f539; FASE 6 \u2014 Instalar MariaDB (MySQL)<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install mariadb-server mariadb-client -y<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Asegurar instalaci\u00f3n:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mysql_secure_installation<\/code><\/pre>\n\n\n\n<p>Respuestas recomendadas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cambiar root password \u2192 <strong>s\u00ed<\/strong><\/li>\n\n\n\n<li>Remove anonymous users \u2192 <strong>s\u00ed<\/strong><\/li>\n\n\n\n<li>Disallow root login remotely \u2192 <strong>s\u00ed<\/strong><\/li>\n\n\n\n<li>Remove test database \u2192 <strong>s\u00ed<\/strong><\/li>\n\n\n\n<li>Reload privilege tables \u2192 <strong>s\u00ed<\/strong><\/li>\n<\/ul>\n\n\n\n<p>2. Si el paso uno da error, lo haremos por otro camino:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1&#xfe0f;&#x20e3; Entra a MariaDB como root del sistema<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mariadb<\/code><\/pre>\n\n\n\n<p>Si entra <strong>sin<\/strong> pedir password \u2192 todo correcto.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2&#xfe0f;&#x20e3; Asegurar el usuario root (m\u00e9todo moderno)<\/h3>\n\n\n\n<p>Ejecuta <strong>tal cual<\/strong>, una a una, sustituyendo \u00abPASSWORD\u00bb por la que quieras, hazlo l\u00ednea por l\u00ednea:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ALTER USER 'root'@'localhost' IDENTIFIED BY 'PASSWORD';\nFLUSH PRIVILEGES;<\/code><\/pre>\n\n\n\n<p>&#x1f4cc; Usa una contrase\u00f1a fuerte y gu\u00e1rdala.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3&#xfe0f;&#x20e3; Eliminar accesos inseguros<\/h3>\n\n\n\n<p>Hazlo l\u00ednea por l\u00ednea:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DELETE FROM mysql.user WHERE User='';\nDROP DATABASE IF EXISTS test;\nDELETE FROM mysql.db WHERE Db='test' OR Db='test\\\\_%';\nFLUSH PRIVILEGES;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4&#xfe0f;&#x20e3; Salir<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>EXIT;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">&#x1f50e; Comprobaci\u00f3n<\/h2>\n\n\n\n<p>Prueba:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mysql -u root -p<\/code><\/pre>\n\n\n\n<p>Si te pide contrase\u00f1a y entra \u2192 <strong>OK<\/strong>.<\/p>\n\n\n\n<p class=\"has-large-font-size\">&#x1f510; <strong>FASE 6.1 SEGURIDAD<\/strong><\/p>\n\n\n\n<h1 class=\"wp-block-heading has-medium-font-size\">1&#xfe0f;&#x20e3; &#x274c; No usar \u00ab<code>root<\/code>\u00bb en PHP (NUNCA), por eso crearemos un \u00abwebuser\u00bb<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">Qu\u00e9 es <code>root<\/code> en MariaDB<\/h3>\n\n\n\n<p><code>root<\/code> es:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Usuario <strong>total<\/strong><\/li>\n\n\n\n<li>Puede borrar TODAS las bases<\/li>\n\n\n\n<li>Cambiar usuarios<\/li>\n\n\n\n<li>Alterar permisos<\/li>\n\n\n\n<li>Romper el sistema entero<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Qu\u00e9 pasa si usas <code>root<\/code> desde PHP<\/h3>\n\n\n\n<p>Si una WebApp tiene:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Un bug<\/li>\n\n\n\n<li>Un <code>include<\/code> mal hecho<\/li>\n\n\n\n<li>Un <code>eval<\/code><\/li>\n\n\n\n<li>Un <code>upload<\/code> inseguro<\/li>\n\n\n\n<li>Un SQL Injection<\/li>\n<\/ul>\n\n\n\n<p>&#x1f449; <strong>El atacante hereda privilegios root<\/strong><br>&#x1f449; Puede borrar TODAS las bases<br>&#x1f449; Puede crear usuarios ocultos<br>&#x1f449; Puede persistir<\/p>\n\n\n\n<p>&#x1f4cc; Aunque sea red local, <strong>el riesgo existe<\/strong> (malware, dispositivos comprometidos, errores humanos).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">En cambio, usando <code>webuser<\/code><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Acceso <strong>solo a sus bases<\/strong><\/li>\n\n\n\n<li>Sin privilegios administrativos<\/li>\n\n\n\n<li>Da\u00f1os <strong>limitados<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Ejemplo ideal:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GRANT SELECT, INSERT, UPDATE, DELETE \nON app1_db.* \nTO 'webuser'@'localhost';<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">&#x1f3af; Regla de oro<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>PHP = usuario limitado<\/strong><br><strong>Admin = root (solo consola)<\/strong><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading has-medium-font-size\">2&#xfe0f;&#x20e3;  No exponer MariaDB a la red<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">Qu\u00e9 significa \u201cexponer\u201d<\/h3>\n\n\n\n<p>Que MariaDB:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Escuche en <code>0.0.0.0<\/code><\/li>\n\n\n\n<li>Acepte conexiones desde otras m\u00e1quinas<\/li>\n<\/ul>\n\n\n\n<p>Ejemplo peligroso:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>bind-address = 0.0.0.0<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Riesgos reales<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ataques de fuerza bruta<\/li>\n\n\n\n<li>Exploits antiguos<\/li>\n\n\n\n<li>Escaneos autom\u00e1ticos<\/li>\n\n\n\n<li>Malware interno en la LAN<\/li>\n<\/ul>\n\n\n\n<p>&#x1f4cc; MariaDB <strong>no tiene firewall propio<\/strong><br>&#x1f4cc; Es un objetivo habitual<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Configuraci\u00f3n segura (la que queremos)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>bind-address = 127.0.0.1<\/code><\/pre>\n\n\n\n<p>Resultado:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Solo PHP local accede<\/li>\n\n\n\n<li>phpMyAdmin funciona<\/li>\n\n\n\n<li>Nadie desde fuera entra<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfY si alg\u00fan d\u00eda lo necesitas?<\/h3>\n\n\n\n<p>Entonces:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>VPN<\/li>\n\n\n\n<li>SSH tunnel<\/li>\n\n\n\n<li>Firewall estricto<\/li>\n<\/ul>\n\n\n\n<p>Nunca \u201cabrir por abrir\u201d.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading has-medium-font-size\">&#x1f9d1;&#x200d;&#x1f4bb; 3&#xfe0f;&#x20e3; &#x2705; Usar siempre <code>webuser<\/code><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">Qu\u00e9 es <code>webuser<\/code><\/h3>\n\n\n\n<p>Un usuario <strong>hecho para apps<\/strong>, no para <strong>admins<\/strong>.<\/p>\n\n\n\n<p>Caracter\u00edsticas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Solo conecta desde <code>localhost<\/code><\/li>\n\n\n\n<li>Solo accede a sus BDs<\/li>\n\n\n\n<li>Sin <code>GRANT<\/code>, <code>DROP USER<\/code>, etc.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Ejemplo realista<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE DATABASE app1_db;\nCREATE USER 'webuser'@'localhost' IDENTIFIED BY 'password_seguro';\n\nGRANT SELECT, INSERT, UPDATE, DELETE\nON app1_db.*\nTO 'webuser'@'localhost';\n\nFLUSH PRIVILEGES;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Ventaja clave en nuestro escenario (AIStudio de Google + JSON)<\/h3>\n\n\n\n<p>Mis futuros proyectos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Guardan estado en JSON<\/li>\n\n\n\n<li>Usan DB para metadatos<\/li>\n<\/ul>\n\n\n\n<p>&#x1f449; <code>webuser<\/code> <strong>va sobrado<\/strong><br>&#x1f449; Menos RAM<br>&#x1f449; Menos riesgo<br>&#x1f449; M\u00e1s estabilidad<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">&#x1f527;FASE 6.2 CREAR <code>webuser<\/code><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">1&#xfe0f;&#x20e3; Entra como root en mySQL<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>mysql -u root -p<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2&#xfe0f;&#x20e3; Crear el usuario (solo local)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE USER 'webuser'@'localhost' IDENTIFIED BY '<strong>PASSWORD_FUERTE<\/strong>';<\/code><\/pre>\n\n\n\n<p>&#x1f4cc; Usa una contrase\u00f1a fuerte y <strong>gu\u00e1rdala<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3&#xfe0f;&#x20e3; Crear una base \u201ccontenedor\u201d inicial (opcional)<\/h3>\n\n\n\n<p>Si quieres una base com\u00fan:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE DATABASE apps_db\nCHARACTER SET utf8mb4\nCOLLATE utf8mb4_unicode_ci;<\/code><\/pre>\n\n\n\n<p>(O luego hacemos una BD por app, sin problema).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4&#xfe0f;&#x20e3; Dar permisos <strong>limitados y correctos<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, ALTER\nON apps_db.*\nTO 'webuser'@'localhost';<\/code><\/pre>\n\n\n\n<p>&#x26a0;&#xfe0f; <strong>NO<\/strong> damos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>DROP<\/code><\/li>\n\n\n\n<li><code>GRANT OPTION<\/code><\/li>\n\n\n\n<li><code>SUPER<\/code><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">5&#xfe0f;&#x20e3; Aplicar cambios<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>FLUSH PRIVILEGES;\nEXIT;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">&#x1f50e; Verificaci\u00f3n (muy importante)<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>mysql -u webuser -p<\/code><\/pre>\n\n\n\n<p>Luego:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SHOW DATABASES;<\/code><\/pre>\n\n\n\n<p>Debe mostrar:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apps_db<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"271\" height=\"129\" src=\"https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/image-2.png\" alt=\"\" class=\"wp-image-3317\" style=\"aspect-ratio:2.100908540278619;width:341px;height:auto\"\/><\/figure>\n<\/div>\n\n\n<p>Si es as\u00ed \u2192 <strong>perfecto<\/strong> &#x2705;<\/p>\n\n\n\n<p id=\"block-5d53fde3-dbad-46f2-b4cc-f3b9e934aa3f\">Salimos:<\/p>\n\n\n\n<pre id=\"block-9237e7f0-a9ec-4175-90e6-20b26b256036\" class=\"wp-block-code\"><code>exit;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">&#x1f9e0; Estado actual del sistema<\/h1>\n\n\n\n<p>Ahora tenemos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Seguridad correcta incluso en LAN<\/li>\n\n\n\n<li><code>root<\/code> \u2192 solo administraci\u00f3n<\/li>\n\n\n\n<li><code>webuser<\/code> \u2192 WebApps \/ phpMyAdmin<\/li>\n\n\n\n<li>DB lista para trabajar<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">&#x1f539; FASE 7 \u2014 Ajustar MariaDB para Raspberry Pi 3B<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/mysql\/mariadb.conf.d\/50-server.cnf<\/code><\/pre>\n\n\n\n<p>Justo debajo de <strong>[mariadbd]<\/strong> ponermos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># ===============================\n# Optimizaci\u00f3n para Raspberry Pi\n# ===============================\n\n# Escuchar solo en localhost (SEGURIDAD)\nbind-address = 127.0.0.1\n\n# Conexiones\nmax_connections = 20\nthread_cache_size = 8\n\n# Buffers generales\nkey_buffer_size = 16M\ntable_open_cache = 200\ntable_definition_cache = 200\n\n# InnoDB (ajustado a 1GB RAM)\ninnodb_buffer_pool_size = 64M\ninnodb_log_buffer_size = 8M\ninnodb_file_per_table = 1\ninnodb_flush_log_at_trx_commit = 2\n\n# Timeouts\nwait_timeout = 300\ninteractive_timeout = 300\n\n# Desactivar query cache (obsoleto)\nquery_cache_type = 0\nquery_cache_size = 0\n\n# Logs (m\u00ednimos)\nslow_query_log = 0<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">&#x1f9fe; Qu\u00e9 hace cada cosa (explicado r\u00e1pido)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">&#x1f510; Seguridad<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>bind-address = 127.0.0.1<\/code><\/pre>\n\n\n\n<p>&#x1f449; MariaDB <strong>solo accesible localmente<\/strong> (PHP + phpMyAdmin)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">&#x1f9e0; RAM controlada<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>innodb_buffer_pool_size = 64M\nkey_buffer_size = 16M<\/code><\/pre>\n\n\n\n<p>&#x1f449; Suficiente para:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Metadatos<\/li>\n\n\n\n<li>Usuarios<\/li>\n\n\n\n<li>Configuraci\u00f3n<\/li>\n\n\n\n<li>Tablas peque\u00f1as<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">&#x26a1; Rendimiento equilibrado<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>innodb_flush_log_at_trx_commit = 2<\/code><\/pre>\n\n\n\n<p>&#x1f449; Mucho menos I\/O en SD<br>&#x1f449; Riesgo aceptable (solo perder\u00edas la \u00faltima transacci\u00f3n en apag\u00f3n)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">&#x1f6a6; Concurrencia realista<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>max_connections = 20<\/code><\/pre>\n\n\n\n<p>&#x1f449; M\u00e1s que suficiente para tu uso<br>&#x1f449; Evita que MariaDB se coma la RAM<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">&#x1f504; Guardar y reiniciar<\/h2>\n\n\n\n<p>Guarda (<code>CTRL+O<\/code>, <code>ENTER<\/code>) y sal (<code>CTRL+X<\/code>).<\/p>\n\n\n\n<p>Luego:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl restart mariadb<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">&#x1f50e; Verificaci\u00f3n<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl status mariadb<\/code><\/pre>\n\n\n\n<p>Debe mostrar:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Active: active (running)<\/code><\/pre>\n\n\n\n<p>Y prueba:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mysql -u webuser -p<\/code><\/pre>\n\n\n\n<p>Si entra \u2192 <strong>optimizaci\u00f3n correcta<\/strong> &#x2705;<\/p>\n\n\n\n<p>Reinicia:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>exit;\nsudo systemctl restart mariadb<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Ahora tu Raspberry tiene:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MariaDB <strong>ligera<\/strong><\/li>\n\n\n\n<li>RAM bajo control<\/li>\n\n\n\n<li>Seguridad local<\/li>\n\n\n\n<li>Ideal para JSON + WebApps<\/li>\n\n\n\n<li>phpMyAdmin estable<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">&#x1f539; FASE 8 \u2014 Instalar phpMyAdmin<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">1&#xfe0f;&#x20e3; Instalar phpMyAdmin <strong>sin intentar crear la DB autom\u00e1tica<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo DEBIAN_FRONTEND=noninteractive apt install phpmyadmin -y<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Esto evita el error <code>Access denied for user 'root'@'localhost'<\/code> que da el instalador habitual.<\/p>\n<\/blockquote>\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; Enlazar phpMyAdmin a Nginx<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ln -s \/usr\/share\/phpmyadmin \/var\/www\/html\/phpmyadmin<\/code><\/pre>\n\n\n\n<p>Ahora la URL ser\u00e1, y el acceso con el usuario \u00abwebuser\u00bb:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;IP_DE_LA_RASPI\/phpmyadmin<\/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; Configuraci\u00f3n de Nginx para phpMyAdmin<\/h2>\n\n\n\n<p>Edita tu site por defecto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/nginx\/sites-available\/default<\/code><\/pre>\n\n\n\n<p>Agregamos dentro del bloque <code>server { ... }<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server {\nlocation \/phpmyadmin {\n    root \/usr\/share\/;\n    index index.php index.html index.htm;\n    location ~ ^\/phpmyadmin\/(.+\\.php)$ {\n        try_files $uri =404;\n        root \/usr\/share\/;\n        fastcgi_pass unix:\/run\/php\/php8.4-fpm.sock;\n        fastcgi_index index.php;\n        include fastcgi_params;\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n    }\n    location ~* ^\/phpmyadmin\/(.+\\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {\n        root \/usr\/share\/;\n    }\n}\n}<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&#x26a0;&#xfe0f; Cambia <code>php<strong>8.4<\/strong>-fpm.sock<\/code> si tu versi\u00f3n de PHP es distinta (<code>ls \/run\/php\/<\/code> para comprobar).<\/p>\n<\/blockquote>\n\n\n\n<p>Reinicia Nginx:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl restart nginx<\/code><\/pre>\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 base de datos (opcional) para phpMyAdmin<\/h2>\n\n\n\n<p>Si quieres usar la base tradicional <code>phpmyadmin<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mysql -u root -p<\/code><\/pre>\n\n\n\n<p>Dentro de MariaDB:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE DATABASE phpmyadmin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\nGRANT ALL PRIVILEGES ON phpmyadmin.* TO 'webuser'@'localhost' IDENTIFIED BY 'TU_PASSWORD_SEGURA';\nFLUSH PRIVILEGES;\nEXIT;<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Tambi\u00e9n puedes usar cualquier DB ya existente (<code>apps_db<\/code>) para gesti\u00f3n, no es obligatorio.<\/p>\n<\/blockquote>\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; Acceder y probar<\/h2>\n\n\n\n<p>Abre en tu navegador:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;IP_DE_LA_RASPI\/phpmyadmin<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Usuario: <code>webuser<\/code><\/li>\n\n\n\n<li>Contrase\u00f1a: la que pusiste al crear <code>webuser<\/code><\/li>\n<\/ul>\n\n\n\n<p>Si te has olvidado de la contrase\u00f1a&#8230; o la has guardado mal&#8230; as\u00ed puedes cambiarla:<\/p>\n\n\n\n<p>&#x2714; Si entra \u2192 phpMyAdmin funcionando.<\/p>\n\n\n\n<p>Entras como ROOT:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mysql -u root\n\nALTER USER 'webuser'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('NUEVA_CONTRASE\u00d1A_AQU\u00cd');\nFLUSH PRIVILEGES;\nExit;<\/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; Seguridad m\u00ednima (LAN)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MariaDB escucha solo en <code>127.0.0.1<\/code> \u2192 phpMyAdmin <strong>solo accesible desde LAN<\/strong><\/li>\n\n\n\n<li>Usuario <code>webuser<\/code> <strong>limitado<\/strong> \u2192 no puede borrar root ni otras DBs<\/li>\n\n\n\n<li>Opcional: a\u00f1adir <code>.htpasswd<\/code> para capa extra de login<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>&#x2705; <strong>Estado tras FASE 8<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>phpMyAdmin instalado y funcional<\/li>\n\n\n\n<li>MariaDB segura<\/li>\n\n\n\n<li>Usuario <code>webuser<\/code> configurado<\/li>\n\n\n\n<li>WebApps listas para usar DB y JSON<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">&#x1f539; FASE 9 \u2014 Estructura final de WebApps y permisos<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">1&#xfe0f;&#x20e3; Carpeta principal para todas las apps<\/h2>\n\n\n\n<p>Creamos un directorio central donde se alojar\u00e1n todas las WebApps:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mkdir -p \/var\/www\/apps\nsudo chown -R www-data:www-data \/var\/www\/apps\nsudo chmod -R 750 \/var\/www\/apps<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>www-data<\/code> \u2192 usuario de Nginx\/PHP<\/li>\n\n\n\n<li><code>750<\/code> \u2192 propietario tiene permisos completos, grupo puede leer\/ejecutar, otros nada<\/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; Estructura por aplicaci\u00f3n<\/h2>\n\n\n\n<p>Cada WebApp tendr\u00e1 su propia carpeta:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/var\/www\/apps\/\n \u251c\u2500\u2500 app1\/\n \u2502   \u251c\u2500\u2500 index.php\n \u2502   \u251c\u2500\u2500 config.php       # Opcional: par\u00e1metros de DB o rutas\n \u2502   \u2514\u2500\u2500 data\/\n \u2502       \u251c\u2500\u2500 users.json\n \u2502       \u251c\u2500\u2500 sessions.json\n \u2502       \u2514\u2500\u2500 cache\/\n \u251c\u2500\u2500 app2\/\n \u2502   \u2514\u2500\u2500 ...\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>data\/<\/strong> \u2192 solo archivos JSON<\/li>\n\n\n\n<li><strong>cache\/<\/strong> \u2192 opcional para datos temporales<\/li>\n\n\n\n<li><strong>index.php<\/strong> \u2192 archivo principal de la WebApp<\/li>\n\n\n\n<li><strong>config.php<\/strong> \u2192 configuraci\u00f3n de conexi\u00f3n a DB o rutas locales<\/li>\n<\/ul>\n\n\n\n<p>&#x26a0;&#xfe0f; Recomendaci\u00f3n: <strong>no guardar contrase\u00f1as de root<\/strong> en ning\u00fan archivo PHP. <strong>Solo <code>webuser<\/code><\/strong>.<\/p>\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; Permisos internos por aplicaci\u00f3n<\/h2>\n\n\n\n<p>Para cada app:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mkdir -p \/var\/www\/apps\/app1\/data\nsudo chown -R www-data:www-data \/var\/www\/apps\/app1\nsudo chmod -R 750 \/var\/www\/apps\/app1<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Permite que PHP escriba JSON sin exponer nada a otros usuarios del sistema<\/li>\n\n\n\n<li>Si varias apps necesitan acceso a la misma DB, no hay problema; solo usa <code>webuser<\/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\">4&#xfe0f;&#x20e3; Configuraci\u00f3n de conexi\u00f3n a MariaDB desde PHP<\/h2>\n\n\n\n<p>Ejemplo de <code>config.php<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n$DB_HOST = '127.0.0.1';\n$DB_NAME = 'apps_db';\n$DB_USER = 'webuser';\n$DB_PASS = 'TU_PASSWORD_SEGURA';\n$DB_CHARSET = 'utf8mb4';\n\ntry {\n    $pdo = new PDO(\"mysql:host=$DB_HOST;dbname=$DB_NAME;charset=$DB_CHARSET\", $DB_USER, $DB_PASS);\n    $pdo-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);\n} catch (Exception $e) {\n    die(\"Error conectando a la DB: \" . $e-&gt;getMessage());\n}\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PHP accede solo como <code>webuser<\/code> \u2192 seguridad<\/li>\n\n\n\n<li>Todas las apps pueden usar este patr\u00f3n<\/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\">5&#xfe0f;&#x20e3; Estructura JSON para datos de la WebApp<\/h2>\n\n\n\n<p>Ejemplo de <code>users.json<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;\n    {\n        \"id\": 1,\n        \"nombre\": \"SineEtiqueta\",\n        \"email\": \"SineTiqueta@example.com\",\n        \"rol\": \"admin\"\n    },\n    {\n        \"id\": 2,\n        \"nombre\": \"Usuario1\",\n        \"email\": \"user1@example.com\",\n        \"rol\": \"user\"\n    }\n]<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Guarda cada tipo de dato en un archivo separado para <strong>evitar JSON gigante<\/strong>.<br>Ejemplo: <code>sessions.json<\/code>, <code>cache.json<\/code>, <code>equipos.json<\/code>, etc.<\/p>\n<\/blockquote>\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; Mejoras opcionales de seguridad<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>No exponer <code>\/data<\/code><\/strong> v\u00eda web\n<ul class=\"wp-block-list\">\n<li>Opci\u00f3n 1: <code>.htaccess<\/code> (si usas Apache)<\/li>\n\n\n\n<li>Opci\u00f3n 2 (mejor en Nginx):<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>location ~ \/data\/ {\n    deny all;\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Copia de seguridad autom\u00e1tica<\/strong> de JSON y DB:\n<ul class=\"wp-block-list\">\n<li>Scripts cron cada noche<\/li>\n\n\n\n<li>Guardar en <code>\/home\/pi\/backups\/<\/code><\/li>\n<\/ul>\n<\/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\">7&#xfe0f;&#x20e3; Probando la WebApp<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Copia tu app de AIStudio a <code>\/var\/www\/apps\/app1\/<\/code><\/li>\n\n\n\n<li>Aseg\u00farate que <code>index.php<\/code> funciona y que puede escribir en <code>\/data<\/code><\/li>\n\n\n\n<li>Accede desde navegador:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;IP_DE_LA_RASPI\/apps\/app1\/<\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Verifica:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Escritura\/lectura JSON<\/li>\n\n\n\n<li>Conexi\u00f3n MariaDB<\/li>\n\n\n\n<li>Cache opcional si aplica<\/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\">&#x2705; Estado tras FASE 9<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>WebApps aisladas, seguras y ordenadas<\/li>\n\n\n\n<li>JSON estructurado y accesible solo por PHP<\/li>\n\n\n\n<li>MariaDB para metadatos, con <code>webuser<\/code><\/li>\n\n\n\n<li>Permisos ajustados para proteger datos<\/li>\n\n\n\n<li>LAN lista para pruebas<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>&#x1f4a1; Tip de rendimiento:<br>Si vas a usar <strong>varias apps a la vez<\/strong>, aseg\u00farate de <strong>no sobrepasar 4 procesos PHP simult\u00e1neos<\/strong> (ya lo ajustamos en la fase de PHP-FPM).<\/p>\n\n\n\n<p class=\"has-large-font-size\">FASE INTERMEDIA &#8211; Vamos a crear un mini Cpanel para configurar aspectos de seguridad y gesti\u00f3n de archivos (en local)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este caso quiero montar un Servidor Web Local Lo primero es disponer de una Raspberry PI, para este ejercicio tenemos una del modelo 3B con MicroSD de 32Gb. Se ha descargado la \u00faltima versi\u00f3n de Raspberry OS Lite x64,&#8230; <a href=\"https:\/\/www.sinetiqueta.com\/?p=3313\" class=\"readmore\">Leer m\u00e1s<span class=\"screen-reader-text\">Servidor Web Local con Raspberry PI<\/span><span class=\"fa fa-angle-double-right\" aria-hidden=\"true\"><\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":3321,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[236,498],"tags":[499],"class_list":["post-3313","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-raspberry-pi","category-servidor","tag-webapps","content-layout-excerpt-thumb"],"jetpack_featured_media_url":"https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/Gemini_Generated_Image_mawsoamawsoamaws.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts\/3313","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=3313"}],"version-history":[{"count":14,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts\/3313\/revisions"}],"predecessor-version":[{"id":3352,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts\/3313\/revisions\/3352"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/media\/3321"}],"wp:attachment":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3313"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3313"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3313"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}