<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://wiki.castanedo.es/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Guzman</id>
	<title>Wiki Castanedo.es - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.castanedo.es/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Guzman"/>
	<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/wiki/Especial:Contribuciones/Guzman"/>
	<updated>2026-05-10T14:16:30Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=OS_limpio&amp;diff=219</id>
		<title>OS limpio</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=OS_limpio&amp;diff=219"/>
		<updated>2026-04-19T21:17:17Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Arrancar OS limpio en Docker ==&lt;br /&gt;
Arrancar contenedores con diferentes OS limpios (para debuging o crear otras imágenes).&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
&lt;br /&gt;
== Debian ==&lt;br /&gt;
Debian es imagen muy popular (glibc y coreutils).&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen de debian-slim ===&lt;br /&gt;
Vamos a usar la imagen estable y mínima.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker pull debian:stable-slim&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor de debian-slim ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d -it \&lt;br /&gt;
 --name debian \&lt;br /&gt;
 -v test-vol:/mnt/test-vol \&lt;br /&gt;
 debian:stable-slim&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: ejemplo con volumen asociado.&lt;br /&gt;
&lt;br /&gt;
== Alpine ==&lt;br /&gt;
Alpine es imagen hiper reducida (musl libc y BusyBox).&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen de alpine ===&lt;br /&gt;
Vamos a usar la imagen más reciente.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker pull alpine:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 1: es una imagen de un OS de solo 13 MB (en comparación con 120 MB de debian-slim).&lt;br /&gt;
&lt;br /&gt;
Nota 2: presenta menor superficie de ataque.&lt;br /&gt;
&lt;br /&gt;
Nota 3: puede presentar problemas de falta de herramientas de debug (ni tiene bash).&lt;br /&gt;
&lt;br /&gt;
Nota 4: puede presentar problemas de con software no preparado para musl.&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor de alpine ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d -it \&lt;br /&gt;
 --name alpine \&lt;br /&gt;
 -v test-vol:/mnt/test-vol \&lt;br /&gt;
 alpine:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: ejemplo con volumen asociado.&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/_/debian?xk=ShowRecommendedBadge&amp;amp;xt=Disabled https://hub.docker.com/_/debian?xk=ShowRecommendedBadge&amp;amp;xt=Disabled]&lt;br /&gt;
* [https://oneuptime.com/blog/post/2026-02-08-how-to-choose-between-alpine-and-debian-slim-base-images/view https://oneuptime.com/blog/post/2026-02-08-how-to-choose-between-alpine-and-debian-slim-base-images/view]&lt;br /&gt;
* [https://cr0x.net/es/docker-alpine-vs-debian-slim/ https://cr0x.net/es/docker-alpine-vs-debian-slim/]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=OS_limpio&amp;diff=218</id>
		<title>OS limpio</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=OS_limpio&amp;diff=218"/>
		<updated>2026-04-19T21:12:05Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Arrancar OS limpio en Docker ==&lt;br /&gt;
Arrancar contenedores con diferentes OS limpios (para debuging o crear otras imágenes).&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
&lt;br /&gt;
== Debian ==&lt;br /&gt;
Debian es imagen muy popular (glibc y coreutils).&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen de debian-slim ===&lt;br /&gt;
Vamos a usar la imagen estable y mínima.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker pull debian:stable-slim&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor de debian-slim ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d -it \&lt;br /&gt;
 --name debian \&lt;br /&gt;
 -v test-vol:/mnt/test-vol \&lt;br /&gt;
 debian:stable-slim&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: ejemplo con volumen asociado.&lt;br /&gt;
&lt;br /&gt;
== Alpine ==&lt;br /&gt;
Alpine es imagen hiper reducida (musl libc y BusyBox).&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen de alpine ===&lt;br /&gt;
Vamos a usar la imagen más reciente.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker pull alpine:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 1: es una imagen de un OS de solo 13 MB (en comparación con 120 MB de debian-slim).&lt;br /&gt;
&lt;br /&gt;
Nota 2: presenta menor superficie de ataque.&lt;br /&gt;
&lt;br /&gt;
Nota 3: puede presentar problemas de falta de herramientas de debug.&lt;br /&gt;
&lt;br /&gt;
Nota 4: puede presentar problemas de con software no preparado para musl.&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor de alpine ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d -it \&lt;br /&gt;
 --name alpine \&lt;br /&gt;
 -v test-vol:/mnt/test-vol \&lt;br /&gt;
 alpine:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: ejemplo con volumen asociado.&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/_/debian?xk=ShowRecommendedBadge&amp;amp;xt=Disabled https://hub.docker.com/_/debian?xk=ShowRecommendedBadge&amp;amp;xt=Disabled]&lt;br /&gt;
* [https://oneuptime.com/blog/post/2026-02-08-how-to-choose-between-alpine-and-debian-slim-base-images/view https://oneuptime.com/blog/post/2026-02-08-how-to-choose-between-alpine-and-debian-slim-base-images/view]&lt;br /&gt;
* [https://cr0x.net/es/docker-alpine-vs-debian-slim/ https://cr0x.net/es/docker-alpine-vs-debian-slim/]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=OS_limpio&amp;diff=217</id>
		<title>OS limpio</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=OS_limpio&amp;diff=217"/>
		<updated>2026-04-19T21:10:40Z</updated>

		<summary type="html">&lt;p&gt;Guzman: Página creada con «== Arrancar OS limpio en Docker == Arrancar contenedores con diferentes OS limpios (para debuging o crear otras imágenes).  == Requisitos == Para poder realizar esta configuración se necesita: * Docker Engine (ver Docker Engine) ** Módulo: Docker Compose (para PRO)  == Debian == Debian es imagen muy popular (glibc y coreutils).  === Descargar imagen de debian-slim === Vamos a usar la imagen estable y mínima. &amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt; docker pull debian:sta…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Arrancar OS limpio en Docker ==&lt;br /&gt;
Arrancar contenedores con diferentes OS limpios (para debuging o crear otras imágenes).&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
&lt;br /&gt;
== Debian ==&lt;br /&gt;
Debian es imagen muy popular (glibc y coreutils).&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen de debian-slim ===&lt;br /&gt;
Vamos a usar la imagen estable y mínima.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker pull debian:stable-slim&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor de debian-slim ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d -it \&lt;br /&gt;
 --name debian \&lt;br /&gt;
 -v test-vol:/mnt/test-vol \&lt;br /&gt;
 debian:stable-slim&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: ejemplo con volumen asociado.&lt;br /&gt;
&lt;br /&gt;
== Alpine ==&lt;br /&gt;
Alpine es imagen hiper reducida (musl libc y BusyBox).&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen de debian-slim ===&lt;br /&gt;
Vamos a usar la imagen más reciente.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker pull alpine:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 1: es una imagen de un OS de solo 13 MB (en comparación con 120 MB de debian-slim).&lt;br /&gt;
&lt;br /&gt;
Nota 2: presenta menor superficie de ataque.&lt;br /&gt;
&lt;br /&gt;
Nota 3: puede presentar problemas de falta de herramientas de debug.&lt;br /&gt;
&lt;br /&gt;
Nota 4: puede presentar problemas de con software no preparado para musl.&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor de debian-slim ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d -it \&lt;br /&gt;
 --name alpine \&lt;br /&gt;
 -v nextcloud_aio_backupdir:/mnt/backup \&lt;br /&gt;
 alpine:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: ejemplo con volumen asociado.&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/_/debian?xk=ShowRecommendedBadge&amp;amp;xt=Disabled https://hub.docker.com/_/debian?xk=ShowRecommendedBadge&amp;amp;xt=Disabled]&lt;br /&gt;
* [https://oneuptime.com/blog/post/2026-02-08-how-to-choose-between-alpine-and-debian-slim-base-images/view https://oneuptime.com/blog/post/2026-02-08-how-to-choose-between-alpine-and-debian-slim-base-images/view]&lt;br /&gt;
* [https://cr0x.net/es/docker-alpine-vs-debian-slim/ https://cr0x.net/es/docker-alpine-vs-debian-slim/]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=P%C3%A1gina_principal&amp;diff=216</id>
		<title>Página principal</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=P%C3%A1gina_principal&amp;diff=216"/>
		<updated>2026-04-19T20:45:58Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
== Bienvenidos a Wiki Castanedo.es ==&lt;br /&gt;
&lt;br /&gt;
=== ¿Qué es esto? ===&lt;br /&gt;
&lt;br /&gt;
Mi Wiki personal. No sobre mi persona, sino sobre mis cosas.&lt;br /&gt;
&lt;br /&gt;
Antes tenía diferentes páginas en las que publicaba artículos y notas sobre temas, principalmente relacionados con el mundo [https://es.wikipedia.org/wiki/GNU/Linux GNU/Linux] y la administración de servidores, pero se hallaban dispersos y en diferentes formatos.&lt;br /&gt;
&lt;br /&gt;
Este proyecto busca en primer lugar unificarlo todo en un solo sitio y por otro retomar la publicación de las notas que voy tomando.&lt;br /&gt;
&lt;br /&gt;
=== Contenido ===&lt;br /&gt;
&lt;br /&gt;
Me gusta tomar notas de las cosas que voy haciendo, sobre todo en el mundo de la informática.&lt;br /&gt;
&lt;br /&gt;
Durante mucho tiempo estas notas me las he guardado para mi mismo, pero a partir de ahora las comparto con el que le interesen. Muchas son cosas sencillas y muy conocidas, otras sin embargo contienen información que me han llevado mucha documentación que leer y algunas, incluso, contienen información difícil de encontrar.&lt;br /&gt;
&lt;br /&gt;
Desde aquí se compartirá tres tipos de contenidos diferenciados: notas, código y ayuda.&lt;br /&gt;
&lt;br /&gt;
==== Notas ====&lt;br /&gt;
&lt;br /&gt;
Son las notas que he ido habiendo sobre administración de sistemas:&lt;br /&gt;
* '''Máquinas virtuales:'''&lt;br /&gt;
** [[Securizar Ubuntu Server]]&lt;br /&gt;
** Instalar y configurar un Servidor [[LEMP]] en Ubuntu Server (Linux + Nginx + MySQL + PHP).&lt;br /&gt;
** Instalar y configurar un [[Servidor de Correo]] (Postfix + Dovecot + SSL + SPF + OpenDKIM + OpenDMARC + Amavis + SpamAssassin).&lt;br /&gt;
** [[Administración servidor de correo]].&lt;br /&gt;
** Instalar y configurar [[GOGS]] (Repositorio Git).&lt;br /&gt;
** Instalar y configurar [[TeamSpeak 3]].&lt;br /&gt;
** Instalar y configurar un [[Servidor Minecraft]].&lt;br /&gt;
** Instalar y configurar [[Etherpad]] en Ubuntu Server.&lt;br /&gt;
** Notas sobre [[OpenSSL]].&lt;br /&gt;
** Notas de configuración de [[Drupal 7]] y [[Drupal 8]].&lt;br /&gt;
** Notas de configuración de [[WordPress]].&lt;br /&gt;
** Notas de configuración de [[MediaWiki]].&lt;br /&gt;
* '''Contenedores:'''&lt;br /&gt;
** Instalar y configurar [[Docker Engine]] en Ubuntu Server.&lt;br /&gt;
** Instalar y configurar [[OpenSSH]] en Docker.&lt;br /&gt;
** Instalar y configurar [[OpenLDAP]] en Docker.&lt;br /&gt;
** Instalar y configurar [[MariaDB]] en Docker.&lt;br /&gt;
** Instalar y configurar [[Keycloak]] en Docker.&lt;br /&gt;
** Instalar y configurar [[Nextcloud AIO]] en Docker.&lt;br /&gt;
** Instalar y configurar de servidor de correo [[Docker-Mailserver]].&lt;br /&gt;
** Arrancar [[OS limpio]] en Docker.&lt;br /&gt;
&lt;br /&gt;
Pulse en el siguiente enlace para consultar la '''lista completa: [[:Categoría:Notas]]'''.&lt;br /&gt;
&lt;br /&gt;
==== Código ====&lt;br /&gt;
&lt;br /&gt;
Las notas aquí descritas pueden tener referencias a código fuente escrito por mi.&lt;br /&gt;
&lt;br /&gt;
Está disponible en [https://code.castanedo.es code.castanedo.es].&lt;br /&gt;
&lt;br /&gt;
Todo este software está disponible con licencia [https://www.gnu.org/licenses/gpl.html GPLv3].&lt;br /&gt;
&lt;br /&gt;
==== Ayuda ====&lt;br /&gt;
&lt;br /&gt;
Además es esta Wiki hay una [[:Categoría:Ayuda]] en las que se encuentran pequeñas guías de uso de servicios disponibles en mis servidores.&lt;br /&gt;
&lt;br /&gt;
Su función es que sirvan de ayuda para las personas que están usando estos servicios, aunque, por supuesto, son de libre consulta para cualquiera que los encuentre útiles.&lt;br /&gt;
&lt;br /&gt;
=== Espíritu ===&lt;br /&gt;
&lt;br /&gt;
El espíritu de esta wiki es el carácter libre y abierto.&lt;br /&gt;
&lt;br /&gt;
Todo el material que se aloje aquí será bajo licencia '''Creative Commons Attribution-ShareAlike 4.0''' ([https://creativecommons.org/licenses/by-sa/4.0/ CC BY-SA]) a menos que se exprese lo contrario.&lt;br /&gt;
&lt;br /&gt;
Para más detalles leer [[Wiki_Castanedo.es:Descargo_general]].&lt;br /&gt;
&lt;br /&gt;
=== Gracias ===&lt;br /&gt;
&lt;br /&gt;
'''Muchas gracias''' por visitar este sitio.&lt;br /&gt;
&lt;br /&gt;
Cualquier duda, consulta o corrección contacta en [mailto:guzman@castanedo.es guzman@castanedo.es].&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Nextcloud_AIO&amp;diff=215</id>
		<title>Nextcloud AIO</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Nextcloud_AIO&amp;diff=215"/>
		<updated>2026-04-19T20:05:47Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación Nextcloud AIO en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/r/nextcloud/all-in-one nextcloud/all-in-one] en Docker.&lt;br /&gt;
Vamos a usar la imagen oficial de [https://github.com/nextcloud/all-in-one Nextcloud AIO].&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
** NextCloud AIO sólo soporta Docker (para podman hay que generar ficheros compose manualmente)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
** Usado como proxy inverso.&lt;br /&gt;
&lt;br /&gt;
== ¿Qué contiene Nextcloud AIO? ==&lt;br /&gt;
Nextcloud All In One (AIO) es la forma más sencilla de instalar Nextcloud de forma que ya venga con todo el middleware instalado y configurado.&lt;br /&gt;
Contiene los siguientes componentes:&lt;br /&gt;
* Nextcloud&lt;br /&gt;
* Base ded datos: PostgreSQL&lt;br /&gt;
** Nextcloud soporta otras bases de datos, pero no en AIO.&lt;br /&gt;
* Servidor web: Apache HTTP Server&lt;br /&gt;
** Podría usarse directamente para conectar, pero para poder tener más servicios en el mismo servidor usaremos Nginx como proxy inverso con Virtual Hosts para cada aplicación.&lt;br /&gt;
* Servicios:&lt;br /&gt;
** Nextcloud Files (Client Push)&lt;br /&gt;
** Cachés Redis &amp;amp; APCU&lt;br /&gt;
** Nextcloud Office (opcional)&lt;br /&gt;
** Nextcloud Talk y servidor TURN para Talk (opcional)&lt;br /&gt;
** Nextcloud Talk servidor de grabación (opcional)&lt;br /&gt;
** BorgBackup para backups (opcional)&lt;br /&gt;
** Antivirus ClamAV (opcional)&lt;br /&gt;
** Más&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (20260409_094910). Contiene Nexcloud 33.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker pull ghcr.io/nextcloud-releases/all-in-one:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: vamos a usar latest sin fijar versión exacta para tener actualizaciones automáticas. En caso de no querer esto fijar versión de repositorio [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged estable].&lt;br /&gt;
&lt;br /&gt;
=== Crear volumen para backup ===&lt;br /&gt;
Para guardar los backups de Borg Backup vamos a crear un volumen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker volume create \&lt;br /&gt;
--driver local \&lt;br /&gt;
--name nextcloud_aio_backupdir \&lt;br /&gt;
-o device=&amp;quot;//mnt/host/c/Users/&amp;lt;user&amp;gt;/Documents/Docker/nextcloud-aio/backups&amp;quot; \&lt;br /&gt;
-o type=&amp;quot;none&amp;quot; \&lt;br /&gt;
-o o=&amp;quot;bind&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
--init \&lt;br /&gt;
--sig-proxy=false \&lt;br /&gt;
--name nextcloud-aio-mastercontainer \&lt;br /&gt;
--restart unless-stopped \&lt;br /&gt;
--publish 127.0.0.1:8443:8080 \&lt;br /&gt;
--env APACHE_PORT=8081 \&lt;br /&gt;
--env APACHE_IP_BINDING=0.0.0.0 \&lt;br /&gt;
--env APACHE_ADDITIONAL_NETWORK=&amp;quot;&amp;quot; \&lt;br /&gt;
--env SKIP_DOMAIN_VALIDATION=true \&lt;br /&gt;
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \&lt;br /&gt;
--volume //var/run/docker.sock:/var/run/docker.sock:ro \&lt;br /&gt;
ghcr.io/nextcloud-releases/all-in-one:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 1: no se puede cambiar las siguientes configuraciones&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
--name nextcloud-aio-mastercontainer \&lt;br /&gt;
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 2: para cambiar el puerto de la consola administrativa &amp;quot;--publish 127.0.0.1:8081:8080&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nota 3: para cambiar el puerto de acceso a Nextcloud &amp;quot;--env APACHE_PORT=9081 \&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nota 4: para entornos locales de prueba hay que indicar &amp;quot;--env SKIP_DOMAIN_VALIDATION=true&amp;quot;. En PRO no nos hará falta.&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
* Acceso a la consola administrativa: [https://localhost:8443/ https://localhost:8443/].&lt;br /&gt;
&lt;br /&gt;
* Acceso a la Nextcloud: [http://localhost:8081/ http://localhost:8081/]&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO se va a desplegar transformando la configuración de Docker Desktop en fichero YAML de Docker Composer.&lt;br /&gt;
&lt;br /&gt;
=== Configurar Virtual Host para Keycloak ===&lt;br /&gt;
* Añadir Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/sites-available/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear carpeta para VirtualHost:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /var/www/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Activar Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/nube.culturetas.net /etc/nginx/sites-enabled/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar certificados Let's Encrypt ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;certbot --nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear carpetas para Keycloak ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir -p /opt/nextcloud-aio/data&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (20260409_094910). Contiene Nexcloud 33.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: vamos a usar latest sin fijar versión exacta para tener actualizaciones automáticas. En caso de no querer esto fijar versión de repositorio [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged estable].&lt;br /&gt;
&lt;br /&gt;
=== Generar fichero Compose YAML  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /opt/nextcloud-aio/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod 640 /opt/nextcloud-aio/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose up -d&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose down&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (con SystemD) ===&lt;br /&gt;
* Crear fichero SystemD&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/systemd/system/nextcloud-aio.service&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Nextcloud AIO(Docker Compose)&lt;br /&gt;
After=docker.service network-online.target&lt;br /&gt;
Requires=docker.service&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
WorkingDirectory=/opt/nextcloud-aio&lt;br /&gt;
ExecStart=/usr/bin/docker compose up --detach --remove-orphans --quiet-pull&lt;br /&gt;
ExecStop=/usr/bin/docker compose down --remove-orphans --volumes --timeout 30&lt;br /&gt;
TimeoutStartSec=180&lt;br /&gt;
TimeoutStopSec=120&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=7&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Arrancar y habilitar&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl daemon-reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/r/nextcloud/all-in-one/tags https://hub.docker.com/r/nextcloud/all-in-one/tags]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one https://github.com/nextcloud/all-in-one]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md]&lt;br /&gt;
* [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one#how-to-properly-reset-the-instance https://github.com/nextcloud/all-in-one#how-to-properly-reset-the-instance]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Nextcloud_AIO&amp;diff=214</id>
		<title>Nextcloud AIO</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Nextcloud_AIO&amp;diff=214"/>
		<updated>2026-04-19T19:54:15Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación Nextcloud AIO en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/r/nextcloud/all-in-one nextcloud/all-in-one] en Docker.&lt;br /&gt;
Vamos a usar la imagen oficial de [https://github.com/nextcloud/all-in-one Nextcloud AIO].&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
** NextCloud AIO sólo soporta Docker (para podman hay que generar ficheros compose manualmente)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
** Usado como proxy inverso.&lt;br /&gt;
&lt;br /&gt;
== ¿Qué contiene Nextcloud AIO? ==&lt;br /&gt;
Nextcloud All In One (AIO) es la forma más sencilla de instalar Nextcloud de forma que ya venga con todo el middleware instalado y configurado.&lt;br /&gt;
Contiene los siguientes componentes:&lt;br /&gt;
* Nextcloud&lt;br /&gt;
* Base ded datos: PostgreSQL&lt;br /&gt;
** Nextcloud soporta otras bases de datos, pero no en AIO.&lt;br /&gt;
* Servidor web: Apache HTTP Server&lt;br /&gt;
** Podría usarse directamente para conectar, pero para poder tener más servicios en el mismo servidor usaremos Nginx como proxy inverso con Virtual Hosts para cada aplicación.&lt;br /&gt;
* Servicios:&lt;br /&gt;
** Nextcloud Files (Client Push)&lt;br /&gt;
** Cachés Redis &amp;amp; APCU&lt;br /&gt;
** Nextcloud Office (opcional)&lt;br /&gt;
** Nextcloud Talk y servidor TURN para Talk (opcional)&lt;br /&gt;
** Nextcloud Talk servidor de grabación (opcional)&lt;br /&gt;
** BorgBackup para backups (opcional)&lt;br /&gt;
** Antivirus ClamAV (opcional)&lt;br /&gt;
** Más&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (20260409_094910). Contiene Nexcloud 33.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker pull ghcr.io/nextcloud-releases/all-in-one:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: vamos a usar latest sin fijar versión exacta para tener actualizaciones automáticas. En caso de no querer esto fijar versión de repositorio [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged estable].&lt;br /&gt;
&lt;br /&gt;
=== Crear volumen para backup ===&lt;br /&gt;
Para guardar los backups de Borg Backup vamos a crear un volumen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker volume create \&lt;br /&gt;
--driver local \&lt;br /&gt;
--name nextcloud_aio_backupdir \&lt;br /&gt;
-o device=&amp;quot;//mnt/host/c/Users/&amp;lt;user&amp;gt;/Documents/Docker/nextcloud-aio/backups&amp;quot; \&lt;br /&gt;
-o type=&amp;quot;none&amp;quot; \&lt;br /&gt;
-o o=&amp;quot;bind&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
--init \&lt;br /&gt;
--sig-proxy=false \&lt;br /&gt;
--name nextcloud-aio-mastercontainer \&lt;br /&gt;
--restart unless-stopped \&lt;br /&gt;
--publish 127.0.0.1:8443:8080 \&lt;br /&gt;
--env APACHE_PORT=8081 \&lt;br /&gt;
--env APACHE_IP_BINDING=0.0.0.0 \&lt;br /&gt;
--env APACHE_ADDITIONAL_NETWORK=&amp;quot;&amp;quot; \&lt;br /&gt;
--env SKIP_DOMAIN_VALIDATION=true \&lt;br /&gt;
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \&lt;br /&gt;
--volume //var/run/docker.sock:/var/run/docker.sock:ro \&lt;br /&gt;
ghcr.io/nextcloud-releases/all-in-one:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 1: no se puede cambiar las siguientes configuraciones&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
--name nextcloud-aio-mastercontainer \&lt;br /&gt;
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 2: para cambiar el puerto de la consola administrativa &amp;quot;--publish 127.0.0.1:8081:8080&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nota 3: para cambiar el puerto de acceso a Nextcloud &amp;quot;--env APACHE_PORT=9081 \&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nota 4: para entornos locales de prueba hay que indicar &amp;quot;--env SKIP_DOMAIN_VALIDATION=true&amp;quot;. En PRO no nos hará falta.&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
* Acceso a la consola administrativa: [https://localhost:8443/ https://localhost:8443/].&lt;br /&gt;
&lt;br /&gt;
* Acceso a la Nextcloud: [http://localhost:8081/ http://localhost:8081/]&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO se va a desplegar transformando la configuración de Docker Desktop en fichero YAML de Docker Composer.&lt;br /&gt;
&lt;br /&gt;
=== Configurar Virtual Host para Keycloak ===&lt;br /&gt;
* Añadir Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/sites-available/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear carpeta para VirtualHost:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /var/www/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Activar Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/nube.culturetas.net /etc/nginx/sites-enabled/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar certificados Let's Encrypt ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;certbot --nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear carpetas para Keycloak ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir -p /opt/nextcloud-aio/data&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (20260409_094910). Contiene Nexcloud 33.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: vamos a usar latest sin fijar versión exacta para tener actualizaciones automáticas. En caso de no querer esto fijar versión de repositorio [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged estable].&lt;br /&gt;
&lt;br /&gt;
=== Generar fichero Compose YAML  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /opt/nextcloud-aio/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod 640 /opt/nextcloud-aio/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose up -d&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose down&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (con SystemD) ===&lt;br /&gt;
* Crear fichero SystemD&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/systemd/system/nextcloud-aio.service&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Nextcloud AIO(Docker Compose)&lt;br /&gt;
After=docker.service network-online.target&lt;br /&gt;
Requires=docker.service&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
WorkingDirectory=/opt/nextcloud-aio&lt;br /&gt;
ExecStart=/usr/bin/docker compose up --detach --remove-orphans --quiet-pull&lt;br /&gt;
ExecStop=/usr/bin/docker compose down --remove-orphans --volumes --timeout 30&lt;br /&gt;
TimeoutStartSec=180&lt;br /&gt;
TimeoutStopSec=120&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=7&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Arrancar y habilitar&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl daemon-reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/r/nextcloud/all-in-one/tags https://hub.docker.com/r/nextcloud/all-in-one/tags]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one https://github.com/nextcloud/all-in-one]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md]&lt;br /&gt;
* [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=OpenSSH&amp;diff=213</id>
		<title>OpenSSH</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=OpenSSH&amp;diff=213"/>
		<updated>2026-04-19T18:27:33Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación OpenSSH SFTP en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/r/atmoz/sftp atmoz/sftp] en Docker.&lt;br /&gt;
Esta imagen se usa principalmente para funciones de debug.&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
&lt;br /&gt;
== Descargar imagen ==&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker pull atmoz/sftp:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar SFTP con usuario/contraseña ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
 --name openssh-sftp \&lt;br /&gt;
 -p 2222:22 \&lt;br /&gt;
 -v //mnt/host/c/Users/foo/Desktop/temp://home/foo/upload \&lt;br /&gt;
 atmoz/sftp \&lt;br /&gt;
 foo:1234:::upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: se usa un volumen para guardar los datos persistentemente.&lt;br /&gt;
&lt;br /&gt;
== Ejecutar SFTP con clave RSA ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
 --name openssh-sftp \&lt;br /&gt;
 -p 2222:22 \&lt;br /&gt;
 -v //mnt/host/c/Users/foo/Desktop/temp://home/foo/upload \&lt;br /&gt;
 -v //mnt/host/c/Users/foo/.ssh/foo.key.pub://home/foo/.ssh/keys/foo.key.pub:ro \&lt;br /&gt;
 atmoz/sftp \&lt;br /&gt;
 foo:1234:::upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: se usa un volumen para pasar las claves dentro de el directorio &amp;quot;/home/foo/.ssh/keys&amp;quot; (no se puede pasar directamente el fichero authorized_keys por temas de permisos).&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/r/atmoz/sftp https://hub.docker.com/r/atmoz/sftp]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=OpenSSH&amp;diff=212</id>
		<title>OpenSSH</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=OpenSSH&amp;diff=212"/>
		<updated>2026-04-19T18:19:19Z</updated>

		<summary type="html">&lt;p&gt;Guzman: Página creada con «== Instalación OpenSSH SFTP en Docker == Instalación de [https://hub.docker.com/r/atmoz/sftp atmoz/sftp] en Docker. Esta imagen se usa principalmente para funciones de debug.  == Requisitos == Para poder realizar esta configuración se necesita: * Docker Engine (ver Docker Engine) ** Módulo: Docker Compose (para PRO)  == Descargar imagen == Vamos a usar la imagen que es la latest a día de hoy. &amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt; docker pull atmoz/sftp:latest &amp;lt;/synta…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación OpenSSH SFTP en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/r/atmoz/sftp atmoz/sftp] en Docker.&lt;br /&gt;
Esta imagen se usa principalmente para funciones de debug.&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
&lt;br /&gt;
== Descargar imagen ==&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker pull atmoz/sftp:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar SFTP con usuario/contraseña ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
 --name openssh-sftp \&lt;br /&gt;
 -p 2222:22 \&lt;br /&gt;
 -v //mnt/host/c/Users/foo/Desktop/temp://home/foo/upload \&lt;br /&gt;
 atmoz/sftp \&lt;br /&gt;
 foo:1234:::upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/r/atmoz/sftp https://hub.docker.com/r/atmoz/sftp]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=P%C3%A1gina_principal&amp;diff=211</id>
		<title>Página principal</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=P%C3%A1gina_principal&amp;diff=211"/>
		<updated>2026-04-19T18:14:39Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
== Bienvenidos a Wiki Castanedo.es ==&lt;br /&gt;
&lt;br /&gt;
=== ¿Qué es esto? ===&lt;br /&gt;
&lt;br /&gt;
Mi Wiki personal. No sobre mi persona, sino sobre mis cosas.&lt;br /&gt;
&lt;br /&gt;
Antes tenía diferentes páginas en las que publicaba artículos y notas sobre temas, principalmente relacionados con el mundo [https://es.wikipedia.org/wiki/GNU/Linux GNU/Linux] y la administración de servidores, pero se hallaban dispersos y en diferentes formatos.&lt;br /&gt;
&lt;br /&gt;
Este proyecto busca en primer lugar unificarlo todo en un solo sitio y por otro retomar la publicación de las notas que voy tomando.&lt;br /&gt;
&lt;br /&gt;
=== Contenido ===&lt;br /&gt;
&lt;br /&gt;
Me gusta tomar notas de las cosas que voy haciendo, sobre todo en el mundo de la informática.&lt;br /&gt;
&lt;br /&gt;
Durante mucho tiempo estas notas me las he guardado para mi mismo, pero a partir de ahora las comparto con el que le interesen. Muchas son cosas sencillas y muy conocidas, otras sin embargo contienen información que me han llevado mucha documentación que leer y algunas, incluso, contienen información difícil de encontrar.&lt;br /&gt;
&lt;br /&gt;
Desde aquí se compartirá tres tipos de contenidos diferenciados: notas, código y ayuda.&lt;br /&gt;
&lt;br /&gt;
==== Notas ====&lt;br /&gt;
&lt;br /&gt;
Son las notas que he ido habiendo sobre administración de sistemas:&lt;br /&gt;
* '''Máquinas virtuales:'''&lt;br /&gt;
** [[Securizar Ubuntu Server]]&lt;br /&gt;
** Instalar y configurar un Servidor [[LEMP]] en Ubuntu Server (Linux + Nginx + MySQL + PHP).&lt;br /&gt;
** Instalar y configurar un [[Servidor de Correo]] (Postfix + Dovecot + SSL + SPF + OpenDKIM + OpenDMARC + Amavis + SpamAssassin).&lt;br /&gt;
** [[Administración servidor de correo]].&lt;br /&gt;
** Instalar y configurar [[GOGS]] (Repositorio Git).&lt;br /&gt;
** Instalar y configurar [[TeamSpeak 3]].&lt;br /&gt;
** Instalar y configurar un [[Servidor Minecraft]].&lt;br /&gt;
** Instalar y configurar [[Etherpad]] en Ubuntu Server.&lt;br /&gt;
** Notas sobre [[OpenSSL]].&lt;br /&gt;
** Notas de configuración de [[Drupal 7]] y [[Drupal 8]].&lt;br /&gt;
** Notas de configuración de [[WordPress]].&lt;br /&gt;
** Notas de configuración de [[MediaWiki]].&lt;br /&gt;
* '''Contenedores:'''&lt;br /&gt;
** Instalar y configurar [[Docker Engine]] en Ubuntu Server.&lt;br /&gt;
** Instalar y configurar [[OpenSSH]] en Docker.&lt;br /&gt;
** Instalar y configurar [[OpenLDAP]] en Docker.&lt;br /&gt;
** Instalar y configurar [[MariaDB]] en Docker.&lt;br /&gt;
** Instalar y configurar [[Keycloak]] en Docker.&lt;br /&gt;
** Instalar y configurar [[Nextcloud AIO]] en Docker.&lt;br /&gt;
** Instalar y configurar de servidor de correo [[Docker-Mailserver]].&lt;br /&gt;
&lt;br /&gt;
Pulse en el siguiente enlace para consultar la '''lista completa: [[:Categoría:Notas]]'''.&lt;br /&gt;
&lt;br /&gt;
==== Código ====&lt;br /&gt;
&lt;br /&gt;
Las notas aquí descritas pueden tener referencias a código fuente escrito por mi.&lt;br /&gt;
&lt;br /&gt;
Está disponible en [https://code.castanedo.es code.castanedo.es].&lt;br /&gt;
&lt;br /&gt;
Todo este software está disponible con licencia [https://www.gnu.org/licenses/gpl.html GPLv3].&lt;br /&gt;
&lt;br /&gt;
==== Ayuda ====&lt;br /&gt;
&lt;br /&gt;
Además es esta Wiki hay una [[:Categoría:Ayuda]] en las que se encuentran pequeñas guías de uso de servicios disponibles en mis servidores.&lt;br /&gt;
&lt;br /&gt;
Su función es que sirvan de ayuda para las personas que están usando estos servicios, aunque, por supuesto, son de libre consulta para cualquiera que los encuentre útiles.&lt;br /&gt;
&lt;br /&gt;
=== Espíritu ===&lt;br /&gt;
&lt;br /&gt;
El espíritu de esta wiki es el carácter libre y abierto.&lt;br /&gt;
&lt;br /&gt;
Todo el material que se aloje aquí será bajo licencia '''Creative Commons Attribution-ShareAlike 4.0''' ([https://creativecommons.org/licenses/by-sa/4.0/ CC BY-SA]) a menos que se exprese lo contrario.&lt;br /&gt;
&lt;br /&gt;
Para más detalles leer [[Wiki_Castanedo.es:Descargo_general]].&lt;br /&gt;
&lt;br /&gt;
=== Gracias ===&lt;br /&gt;
&lt;br /&gt;
'''Muchas gracias''' por visitar este sitio.&lt;br /&gt;
&lt;br /&gt;
Cualquier duda, consulta o corrección contacta en [mailto:guzman@castanedo.es guzman@castanedo.es].&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=P%C3%A1gina_principal&amp;diff=210</id>
		<title>Página principal</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=P%C3%A1gina_principal&amp;diff=210"/>
		<updated>2026-04-19T18:14:22Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
== Bienvenidos a Wiki Castanedo.es ==&lt;br /&gt;
&lt;br /&gt;
=== ¿Qué es esto? ===&lt;br /&gt;
&lt;br /&gt;
Mi Wiki personal. No sobre mi persona, sino sobre mis cosas.&lt;br /&gt;
&lt;br /&gt;
Antes tenía diferentes páginas en las que publicaba artículos y notas sobre temas, principalmente relacionados con el mundo [https://es.wikipedia.org/wiki/GNU/Linux GNU/Linux] y la administración de servidores, pero se hallaban dispersos y en diferentes formatos.&lt;br /&gt;
&lt;br /&gt;
Este proyecto busca en primer lugar unificarlo todo en un solo sitio y por otro retomar la publicación de las notas que voy tomando.&lt;br /&gt;
&lt;br /&gt;
=== Contenido ===&lt;br /&gt;
&lt;br /&gt;
Me gusta tomar notas de las cosas que voy haciendo, sobre todo en el mundo de la informática.&lt;br /&gt;
&lt;br /&gt;
Durante mucho tiempo estas notas me las he guardado para mi mismo, pero a partir de ahora las comparto con el que le interesen. Muchas son cosas sencillas y muy conocidas, otras sin embargo contienen información que me han llevado mucha documentación que leer y algunas, incluso, contienen información difícil de encontrar.&lt;br /&gt;
&lt;br /&gt;
Desde aquí se compartirá tres tipos de contenidos diferenciados: notas, código y ayuda.&lt;br /&gt;
&lt;br /&gt;
==== Notas ====&lt;br /&gt;
&lt;br /&gt;
Son las notas que he ido habiendo sobre administración de sistemas:&lt;br /&gt;
* '''Máquinas virtuales:'''&lt;br /&gt;
** [[Securizar Ubuntu Server]]&lt;br /&gt;
** Instalar y configurar un Servidor [[LEMP]] en Ubuntu Server (Linux + Nginx + MySQL + PHP).&lt;br /&gt;
** Instalar y configurar un [[Servidor de Correo]] (Postfix + Dovecot + SSL + SPF + OpenDKIM + OpenDMARC + Amavis + SpamAssassin).&lt;br /&gt;
** [[Administración servidor de correo]].&lt;br /&gt;
** Instalar y configurar [[GOGS]] (Repositorio Git).&lt;br /&gt;
** Instalar y configurar [[TeamSpeak 3]].&lt;br /&gt;
** Instalar y configurar un [[Servidor Minecraft]].&lt;br /&gt;
** Instalar y configurar [[Etherpad]] en Ubuntu Server.&lt;br /&gt;
** Notas sobre [[OpenSSL]].&lt;br /&gt;
** Notas de configuración de [[Drupal 7]] y [[Drupal 8]].&lt;br /&gt;
** Notas de configuración de [[WordPress]].&lt;br /&gt;
** Notas de configuración de [[MediaWiki]].&lt;br /&gt;
* '''Contenedores:'''&lt;br /&gt;
** Instalar y configurar [[Docker Engine]] en Ubuntu Server.&lt;br /&gt;
** Instalar y configurar [[OpenLDAP]] en Docker.&lt;br /&gt;
** Instalar y configurar [[OpenSSH]] en Docker.&lt;br /&gt;
** Instalar y configurar [[MariaDB]] en Docker.&lt;br /&gt;
** Instalar y configurar [[Keycloak]] en Docker.&lt;br /&gt;
** Instalar y configurar [[Nextcloud AIO]] en Docker.&lt;br /&gt;
** Instalar y configurar de servidor de correo [[Docker-Mailserver]].&lt;br /&gt;
&lt;br /&gt;
Pulse en el siguiente enlace para consultar la '''lista completa: [[:Categoría:Notas]]'''.&lt;br /&gt;
&lt;br /&gt;
==== Código ====&lt;br /&gt;
&lt;br /&gt;
Las notas aquí descritas pueden tener referencias a código fuente escrito por mi.&lt;br /&gt;
&lt;br /&gt;
Está disponible en [https://code.castanedo.es code.castanedo.es].&lt;br /&gt;
&lt;br /&gt;
Todo este software está disponible con licencia [https://www.gnu.org/licenses/gpl.html GPLv3].&lt;br /&gt;
&lt;br /&gt;
==== Ayuda ====&lt;br /&gt;
&lt;br /&gt;
Además es esta Wiki hay una [[:Categoría:Ayuda]] en las que se encuentran pequeñas guías de uso de servicios disponibles en mis servidores.&lt;br /&gt;
&lt;br /&gt;
Su función es que sirvan de ayuda para las personas que están usando estos servicios, aunque, por supuesto, son de libre consulta para cualquiera que los encuentre útiles.&lt;br /&gt;
&lt;br /&gt;
=== Espíritu ===&lt;br /&gt;
&lt;br /&gt;
El espíritu de esta wiki es el carácter libre y abierto.&lt;br /&gt;
&lt;br /&gt;
Todo el material que se aloje aquí será bajo licencia '''Creative Commons Attribution-ShareAlike 4.0''' ([https://creativecommons.org/licenses/by-sa/4.0/ CC BY-SA]) a menos que se exprese lo contrario.&lt;br /&gt;
&lt;br /&gt;
Para más detalles leer [[Wiki_Castanedo.es:Descargo_general]].&lt;br /&gt;
&lt;br /&gt;
=== Gracias ===&lt;br /&gt;
&lt;br /&gt;
'''Muchas gracias''' por visitar este sitio.&lt;br /&gt;
&lt;br /&gt;
Cualquier duda, consulta o corrección contacta en [mailto:guzman@castanedo.es guzman@castanedo.es].&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Nextcloud_AIO&amp;diff=209</id>
		<title>Nextcloud AIO</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Nextcloud_AIO&amp;diff=209"/>
		<updated>2026-04-19T17:27:13Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación Nextcloud AIO en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/r/nextcloud/all-in-one nextcloud/all-in-one] en Docker.&lt;br /&gt;
Vamos a usar la imagen oficial de [https://github.com/nextcloud/all-in-one Nextcloud AIO].&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
** NextCloud AIO sólo soporta Docker (para podman hay que generar ficheros compose manualmente)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
** Usado como proxy inverso.&lt;br /&gt;
&lt;br /&gt;
== ¿Qué contiene Nextcloud AIO? ==&lt;br /&gt;
Nextcloud All In One (AIO) es la forma más sencilla de instalar Nextcloud de forma que ya venga con todo el middleware instalado y configurado.&lt;br /&gt;
Contiene los siguientes componentes:&lt;br /&gt;
* Nextcloud&lt;br /&gt;
* Base ded datos: PostgreSQL&lt;br /&gt;
** Nextcloud soporta otras bases de datos, pero no en AIO.&lt;br /&gt;
* Servidor web: Apache HTTP Server&lt;br /&gt;
** Podría usarse directamente para conectar, pero para poder tener más servicios en el mismo servidor usaremos Nginx como proxy inverso con Virtual Hosts para cada aplicación.&lt;br /&gt;
* Servicios:&lt;br /&gt;
** Nextcloud Files (Client Push)&lt;br /&gt;
** Cachés Redis &amp;amp; APCU&lt;br /&gt;
** Nextcloud Office (opcional)&lt;br /&gt;
** Nextcloud Talk y servidor TURN para Talk (opcional)&lt;br /&gt;
** Nextcloud Talk servidor de grabación (opcional)&lt;br /&gt;
** BorgBackup para backups (opcional)&lt;br /&gt;
** Antivirus ClamAV (opcional)&lt;br /&gt;
** Más&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (20260409_094910). Contiene Nexcloud 33.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker pull ghcr.io/nextcloud-releases/all-in-one:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: vamos a usar latest sin fijar versión exacta para tener actualizaciones automáticas. En caso de no querer esto fijar versión de repositorio [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged estable].&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
--init \&lt;br /&gt;
--sig-proxy=false \&lt;br /&gt;
--name nextcloud-aio-mastercontainer \&lt;br /&gt;
--restart unless-stopped \&lt;br /&gt;
--publish 127.0.0.1:8443:8080 \&lt;br /&gt;
--env APACHE_PORT=8081 \&lt;br /&gt;
--env APACHE_IP_BINDING=0.0.0.0 \&lt;br /&gt;
--env APACHE_ADDITIONAL_NETWORK=&amp;quot;&amp;quot; \&lt;br /&gt;
--env SKIP_DOMAIN_VALIDATION=true \&lt;br /&gt;
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \&lt;br /&gt;
--volume //var/run/docker.sock:/var/run/docker.sock:ro \&lt;br /&gt;
ghcr.io/nextcloud-releases/all-in-one:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 1: no se puede cambiar las siguientes configuraciones&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
--name nextcloud-aio-mastercontainer \&lt;br /&gt;
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 2: para cambiar el puerto de la consola administrativa &amp;quot;--publish 127.0.0.1:8081:8080&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nota 3: para cambiar el puerto de acceso a Nextcloud &amp;quot;--env APACHE_PORT=9081 \&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nota 4: para entornos locales de prueba hay que indicar &amp;quot;--env SKIP_DOMAIN_VALIDATION=true&amp;quot;. En PRO no nos hará falta.&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
* Acceso a la consola administrativa: [https://localhost:8443/ https://localhost:8443/].&lt;br /&gt;
&lt;br /&gt;
* Acceso a la Nextcloud: [http://localhost:8081/ http://localhost:8081/]&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO se va a desplegar transformando la configuración de Docker Desktop en fichero YAML de Docker Composer.&lt;br /&gt;
&lt;br /&gt;
=== Configurar Virtual Host para Keycloak ===&lt;br /&gt;
* Añadir Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/sites-available/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear carpeta para VirtualHost:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /var/www/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Activar Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/nube.culturetas.net /etc/nginx/sites-enabled/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar certificados Let's Encrypt ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;certbot --nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear carpetas para Keycloak ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir -p /opt/nextcloud-aio/data&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (20260409_094910). Contiene Nexcloud 33.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: vamos a usar latest sin fijar versión exacta para tener actualizaciones automáticas. En caso de no querer esto fijar versión de repositorio [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged estable].&lt;br /&gt;
&lt;br /&gt;
=== Generar fichero Compose YAML  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /opt/nextcloud-aio/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod 640 /opt/nextcloud-aio/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose up -d&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose down&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (con SystemD) ===&lt;br /&gt;
* Crear fichero SystemD&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/systemd/system/nextcloud-aio.service&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Nextcloud AIO(Docker Compose)&lt;br /&gt;
After=docker.service network-online.target&lt;br /&gt;
Requires=docker.service&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
WorkingDirectory=/opt/nextcloud-aio&lt;br /&gt;
ExecStart=/usr/bin/docker compose up --detach --remove-orphans --quiet-pull&lt;br /&gt;
ExecStop=/usr/bin/docker compose down --remove-orphans --volumes --timeout 30&lt;br /&gt;
TimeoutStartSec=180&lt;br /&gt;
TimeoutStopSec=120&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=7&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Arrancar y habilitar&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl daemon-reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/r/nextcloud/all-in-one/tags https://hub.docker.com/r/nextcloud/all-in-one/tags]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one https://github.com/nextcloud/all-in-one]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md]&lt;br /&gt;
* [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Nextcloud_AIO&amp;diff=208</id>
		<title>Nextcloud AIO</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Nextcloud_AIO&amp;diff=208"/>
		<updated>2026-04-19T16:54:18Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación Nextcloud AIO en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/r/nextcloud/all-in-one nextcloud/all-in-one] en Docker.&lt;br /&gt;
Vamos a usar la imagen oficial de [https://github.com/nextcloud/all-in-one Nextcloud AIO].&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
** NextCloud AIO sólo soporta Docker (para podman hay que generar ficheros compose manualmente)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
** Usado como proxy inverso.&lt;br /&gt;
&lt;br /&gt;
== ¿Qué contiene Nextcloud AIO? ==&lt;br /&gt;
Nextcloud All In One (AIO) es la forma más sencilla de instalar Nextcloud de forma que ya venga con todo el middleware instalado y configurado.&lt;br /&gt;
Contiene los siguientes componentes:&lt;br /&gt;
* Nextcloud&lt;br /&gt;
* Base ded datos: PostgreSQL&lt;br /&gt;
** Nextcloud soporta otras bases de datos, pero no en AIO.&lt;br /&gt;
* Servidor web: Apache HTTP Server&lt;br /&gt;
** Podría usarse directamente para conectar, pero para poder tener más servicios en el mismo servidor usaremos Nginx como proxy inverso con Virtual Hosts para cada aplicación.&lt;br /&gt;
* Servicios:&lt;br /&gt;
** Nextcloud Files (Client Push)&lt;br /&gt;
** Cachés Redis &amp;amp; APCU&lt;br /&gt;
** Nextcloud Office (opcional)&lt;br /&gt;
** Nextcloud Talk y servidor TURN para Talk (opcional)&lt;br /&gt;
** Nextcloud Talk servidor de grabación (opcional)&lt;br /&gt;
** BorgBackup para backups (opcional)&lt;br /&gt;
** Antivirus ClamAV (opcional)&lt;br /&gt;
** Más&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (20260409_094910). Contiene Nexcloud 33.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker pull ghcr.io/nextcloud-releases/all-in-one:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: vamos a usar latest sin fijar versión exacta para tener actualizaciones automáticas. En caso de no querer esto fijar versión de repositorio [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged estable].&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
--init \&lt;br /&gt;
--sig-proxy=false \&lt;br /&gt;
--name nextcloud-aio-mastercontainer \&lt;br /&gt;
--restart unless-stopped \&lt;br /&gt;
--publish 127.0.0.1:8443:8080 \&lt;br /&gt;
--env APACHE_PORT=8081 \&lt;br /&gt;
--env APACHE_IP_BINDING=0.0.0.0 \&lt;br /&gt;
--env APACHE_ADDITIONAL_NETWORK=&amp;quot;&amp;quot; \&lt;br /&gt;
--env SKIP_DOMAIN_VALIDATION=true \&lt;br /&gt;
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \&lt;br /&gt;
--volume //var/run/docker.sock:/var/run/docker.sock:ro \&lt;br /&gt;
ghcr.io/nextcloud-releases/all-in-one:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 1: no se puede cambiar las siguientes configuraciones&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
--name nextcloud-aio-mastercontainer \&lt;br /&gt;
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 2: para cambiar el puerto de la consola administrativa &amp;quot;--publish 127.0.0.1:8081:8080&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nota 3: para cambiar el puerto de acceso a Nextcloud &amp;quot;--env APACHE_PORT=9081 \&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note 4: para entornos locales de prueba hay que indicar &amp;quot;--env SKIP_DOMAIN_VALIDATION=true&amp;quot;. En PRO no nos hará falta.&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
* Acceso a la consola administrativa: [https://localhost:8443/ https://localhost:8443/].&lt;br /&gt;
&lt;br /&gt;
* Acceso a la Nextcloud: [http://localhost:8081/ http://localhost:8081/]&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO se va a desplegar transformando la configuración de Docker Desktop en fichero YAML de Docker Composer.&lt;br /&gt;
&lt;br /&gt;
=== Configurar Virtual Host para Keycloak ===&lt;br /&gt;
* Añadir Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/sites-available/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear carpeta para VirtualHost:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /var/www/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Activar Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/nube.culturetas.net /etc/nginx/sites-enabled/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar certificados Let's Encrypt ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;certbot --nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear carpetas para Keycloak ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir -p /opt/nextcloud-aio/data&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (20260409_094910). Contiene Nexcloud 33.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: vamos a usar latest sin fijar versión exacta para tener actualizaciones automáticas. En caso de no querer esto fijar versión de repositorio [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged estable].&lt;br /&gt;
&lt;br /&gt;
=== Generar fichero Compose YAML  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /opt/nextcloud-aio/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod 640 /opt/nextcloud-aio/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose up -d&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose down&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (con SystemD) ===&lt;br /&gt;
* Crear fichero SystemD&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/systemd/system/nextcloud-aio.service&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Nextcloud AIO(Docker Compose)&lt;br /&gt;
After=docker.service network-online.target&lt;br /&gt;
Requires=docker.service&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
WorkingDirectory=/opt/nextcloud-aio&lt;br /&gt;
ExecStart=/usr/bin/docker compose up --detach --remove-orphans --quiet-pull&lt;br /&gt;
ExecStop=/usr/bin/docker compose down --remove-orphans --volumes --timeout 30&lt;br /&gt;
TimeoutStartSec=180&lt;br /&gt;
TimeoutStopSec=120&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=7&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Arrancar y habilitar&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl daemon-reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/r/nextcloud/all-in-one/tags https://hub.docker.com/r/nextcloud/all-in-one/tags]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one https://github.com/nextcloud/all-in-one]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md]&lt;br /&gt;
* [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Nextcloud_AIO&amp;diff=207</id>
		<title>Nextcloud AIO</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Nextcloud_AIO&amp;diff=207"/>
		<updated>2026-04-19T16:36:53Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación Nextcloud AIO en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/r/nextcloud/all-in-one nextcloud/all-in-one] en Docker.&lt;br /&gt;
Vamos a usar la imagen oficial de [https://github.com/nextcloud/all-in-one Nextcloud AIO].&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
** NextCloud AIO sólo soporta Docker (para podman hay que generar ficheros compose manualmente)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
** Usado como proxy inverso.&lt;br /&gt;
&lt;br /&gt;
== ¿Qué contiene Nextcloud AIO? ==&lt;br /&gt;
Nextcloud All In One (AIO) es la forma más sencilla de instalar Nextcloud de forma que ya venga con todo el middleware instalado y configurado.&lt;br /&gt;
Contiene los siguientes componentes:&lt;br /&gt;
* Nextcloud&lt;br /&gt;
* Base ded datos: PostgreSQL&lt;br /&gt;
** Nextcloud soporta otras bases de datos, pero no en AIO.&lt;br /&gt;
* Servidor web: Apache HTTP Server&lt;br /&gt;
** Podría usarse directamente para conectar, pero para poder tener más servicios en el mismo servidor usaremos Nginx como proxy inverso con Virtual Hosts para cada aplicación.&lt;br /&gt;
* Servicios:&lt;br /&gt;
** Nextcloud Files (Client Push)&lt;br /&gt;
** Cachés Redis &amp;amp; APCU&lt;br /&gt;
** Nextcloud Office (opcional)&lt;br /&gt;
** Nextcloud Talk y servidor TURN para Talk (opcional)&lt;br /&gt;
** Nextcloud Talk servidor de grabación (opcional)&lt;br /&gt;
** BorgBackup para backups (opcional)&lt;br /&gt;
** Antivirus ClamAV (opcional)&lt;br /&gt;
** Más&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (20260409_094910). Contiene Nexcloud 33.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker pull ghcr.io/nextcloud-releases/all-in-one:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: vamos a usar latest sin fijar versión exacta para tener actualizaciones automáticas. En caso de no querer esto fijar versión de repositorio [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged estable].&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
--init \&lt;br /&gt;
--sig-proxy=false \&lt;br /&gt;
--name nextcloud-aio-mastercontainer \&lt;br /&gt;
--restart unless-stopped \&lt;br /&gt;
--publish 127.0.0.1:8443:8080 \&lt;br /&gt;
--env APACHE_PORT=8081 \&lt;br /&gt;
--env APACHE_IP_BINDING=0.0.0.0 \&lt;br /&gt;
--env APACHE_ADDITIONAL_NETWORK=&amp;quot;&amp;quot; \&lt;br /&gt;
--env SKIP_DOMAIN_VALIDATION=false \&lt;br /&gt;
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \&lt;br /&gt;
--volume //var/run/docker.sock:/var/run/docker.sock:ro \&lt;br /&gt;
ghcr.io/nextcloud-releases/all-in-one:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 1: no se puede cambiar las siguientes configuraciones&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
--name nextcloud-aio-mastercontainer \&lt;br /&gt;
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 2: para cambiar el puerto de la consola administrativa &amp;quot;--publish 127.0.0.1:8081:8080&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nota 3: para cambiar el puerto de acceso a Nextcloud &amp;quot;--env APACHE_PORT=9081 \&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
* Acceso a la consola administrativa: [https://localhost:8443/ https://localhost:8443/].&lt;br /&gt;
&lt;br /&gt;
* Acceso a la Nextcloud: [http://localhost:8081/ http://localhost:8081/]&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO se va a desplegar transformando la configuración de Docker Desktop en fichero YAML de Docker Composer.&lt;br /&gt;
&lt;br /&gt;
=== Configurar Virtual Host para Keycloak ===&lt;br /&gt;
* Añadir Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/sites-available/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear carpeta para VirtualHost:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /var/www/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Activar Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/nube.culturetas.net /etc/nginx/sites-enabled/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar certificados Let's Encrypt ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;certbot --nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear carpetas para Keycloak ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir -p /opt/nextcloud-aio/data&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (20260409_094910). Contiene Nexcloud 33.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: vamos a usar latest sin fijar versión exacta para tener actualizaciones automáticas. En caso de no querer esto fijar versión de repositorio [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged estable].&lt;br /&gt;
&lt;br /&gt;
=== Generar fichero Compose YAML  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /opt/nextcloud-aio/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod 640 /opt/nextcloud-aio/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose up -d&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose down&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (con SystemD) ===&lt;br /&gt;
* Crear fichero SystemD&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/systemd/system/nextcloud-aio.service&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Nextcloud AIO(Docker Compose)&lt;br /&gt;
After=docker.service network-online.target&lt;br /&gt;
Requires=docker.service&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
WorkingDirectory=/opt/nextcloud-aio&lt;br /&gt;
ExecStart=/usr/bin/docker compose up --detach --remove-orphans --quiet-pull&lt;br /&gt;
ExecStop=/usr/bin/docker compose down --remove-orphans --volumes --timeout 30&lt;br /&gt;
TimeoutStartSec=180&lt;br /&gt;
TimeoutStopSec=120&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=7&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Arrancar y habilitar&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl daemon-reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/r/nextcloud/all-in-one/tags https://hub.docker.com/r/nextcloud/all-in-one/tags]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one https://github.com/nextcloud/all-in-one]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md]&lt;br /&gt;
* [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Nextcloud_AIO&amp;diff=206</id>
		<title>Nextcloud AIO</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Nextcloud_AIO&amp;diff=206"/>
		<updated>2026-04-19T16:27:25Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación Nextcloud AIO en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/r/nextcloud/all-in-one nextcloud/all-in-one] en Docker.&lt;br /&gt;
Vamos a usar la imagen oficial de [https://github.com/nextcloud/all-in-one Nextcloud AIO].&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
** NextCloud AIO sólo soporta Docker (para podman hay que generar ficheros compose manualmente)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
** Usado como proxy inverso.&lt;br /&gt;
&lt;br /&gt;
== ¿Qué contiene Nextcloud AIO? ==&lt;br /&gt;
Nextcloud All In One (AIO) es la forma más sencilla de instalar Nextcloud de forma que ya venga con todo el middleware instalado y configurado.&lt;br /&gt;
Contiene los siguientes componentes:&lt;br /&gt;
* Nextcloud&lt;br /&gt;
* Base ded datos: PostgreSQL&lt;br /&gt;
** Nextcloud soporta otras bases de datos, pero no en AIO.&lt;br /&gt;
* Servidor web: Apache HTTP Server&lt;br /&gt;
** Podría usarse directamente para conectar, pero para poder tener más servicios en el mismo servidor usaremos Nginx como proxy inverso con Virtual Hosts para cada aplicación.&lt;br /&gt;
* Servicios:&lt;br /&gt;
** Nextcloud Files (Client Push)&lt;br /&gt;
** Cachés Redis &amp;amp; APCU&lt;br /&gt;
** Nextcloud Office (opcional)&lt;br /&gt;
** Nextcloud Talk y servidor TURN para Talk (opcional)&lt;br /&gt;
** Nextcloud Talk servidor de grabación (opcional)&lt;br /&gt;
** BorgBackup para backups (opcional)&lt;br /&gt;
** Antivirus ClamAV (opcional)&lt;br /&gt;
** Más&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (20260409_094910). Contiene Nexcloud 33.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker pull ghcr.io/nextcloud-releases/all-in-one:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: vamos a usar latest sin fijar versión exacta para tener actualizaciones automáticas. En caso de no querer esto fijar versión de repositorio [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged estable].&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
--init \&lt;br /&gt;
--sig-proxy=false \&lt;br /&gt;
--name nextcloud-aio-mastercontainer \&lt;br /&gt;
--restart unless-stopped \&lt;br /&gt;
--publish 127.0.0.1:8080:8080 \&lt;br /&gt;
--env APACHE_PORT=8081 \&lt;br /&gt;
--env APACHE_IP_BINDING=0.0.0.0 \&lt;br /&gt;
--env APACHE_ADDITIONAL_NETWORK=&amp;quot;&amp;quot; \&lt;br /&gt;
--env SKIP_DOMAIN_VALIDATION=false \&lt;br /&gt;
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \&lt;br /&gt;
--volume //var/run/docker.sock:/var/run/docker.sock:ro \&lt;br /&gt;
ghcr.io/nextcloud-releases/all-in-one:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 1: no se puede cambiar las siguientes configuraciones&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
--name nextcloud-aio-mastercontainer \&lt;br /&gt;
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 2: para cambiar el puerto de la consola administrativa &amp;quot;--publish 127.0.0.1:9080:8080&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nota 3: para cambiar el puerto de acceso a Nextcloud &amp;quot;--env APACHE_PORT=9081 \&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
Accedemos con un navegador web [https://localhost:9443/ https://localhost:9443/].&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO se va a desplegar transformando la configuración de Docker Desktop en fichero YAML de Docker Composer.&lt;br /&gt;
&lt;br /&gt;
=== Configurar Virtual Host para Keycloak ===&lt;br /&gt;
* Añadir Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/sites-available/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear carpeta para VirtualHost:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /var/www/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Activar Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/nube.culturetas.net /etc/nginx/sites-enabled/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar certificados Let's Encrypt ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;certbot --nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear carpetas para Keycloak ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir -p /opt/nextcloud-aio/data&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (20260409_094910). Contiene Nexcloud 33.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: vamos a usar latest sin fijar versión exacta para tener actualizaciones automáticas. En caso de no querer esto fijar versión de repositorio [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged estable].&lt;br /&gt;
&lt;br /&gt;
=== Generar fichero Compose YAML  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /opt/nextcloud-aio/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod 640 /opt/nextcloud-aio/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose up -d&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose down&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (con SystemD) ===&lt;br /&gt;
* Crear fichero SystemD&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/systemd/system/nextcloud-aio.service&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Nextcloud AIO(Docker Compose)&lt;br /&gt;
After=docker.service network-online.target&lt;br /&gt;
Requires=docker.service&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
WorkingDirectory=/opt/nextcloud-aio&lt;br /&gt;
ExecStart=/usr/bin/docker compose up --detach --remove-orphans --quiet-pull&lt;br /&gt;
ExecStop=/usr/bin/docker compose down --remove-orphans --volumes --timeout 30&lt;br /&gt;
TimeoutStartSec=180&lt;br /&gt;
TimeoutStopSec=120&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=7&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Arrancar y habilitar&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl daemon-reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/r/nextcloud/all-in-one/tags https://hub.docker.com/r/nextcloud/all-in-one/tags]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one https://github.com/nextcloud/all-in-one]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md]&lt;br /&gt;
* [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Nextcloud_AIO&amp;diff=205</id>
		<title>Nextcloud AIO</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Nextcloud_AIO&amp;diff=205"/>
		<updated>2026-04-19T16:12:15Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación Nextcloud AIO en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/r/nextcloud/all-in-one nextcloud/all-in-one] en Docker.&lt;br /&gt;
Vamos a usar la imagen oficial de [https://github.com/nextcloud/all-in-one Nextcloud AIO].&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
** NextCloud AIO sólo soporta Docker (para podman hay que generar ficheros compose manualmente)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
** Usado como proxy inverso.&lt;br /&gt;
&lt;br /&gt;
== ¿Qué contiene Nextcloud AIO? ==&lt;br /&gt;
Nextcloud All In One (AIO) es la forma más sencilla de instalar Nextcloud de forma que ya venga con todo el middleware instalado y configurado.&lt;br /&gt;
Contiene los siguientes componentes:&lt;br /&gt;
* Nextcloud&lt;br /&gt;
* Base ded datos: PostgreSQL&lt;br /&gt;
** Nextcloud soporta otras bases de datos, pero no en AIO.&lt;br /&gt;
* Servidor web: Apache HTTP Server&lt;br /&gt;
** Podría usarse directamente para conectar, pero para poder tener más servicios en el mismo servidor usaremos Nginx como proxy inverso con Virtual Hosts para cada aplicación.&lt;br /&gt;
* Servicios:&lt;br /&gt;
** Nextcloud Files (Client Push)&lt;br /&gt;
** Cachés Redis &amp;amp; APCU&lt;br /&gt;
** Nextcloud Office (opcional)&lt;br /&gt;
** Nextcloud Talk y servidor TURN para Talk (opcional)&lt;br /&gt;
** Nextcloud Talk servidor de grabación (opcional)&lt;br /&gt;
** BorgBackup para backups (opcional)&lt;br /&gt;
** Antivirus ClamAV (opcional)&lt;br /&gt;
** Más&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (20260409_094910). Contiene Nexcloud 33.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker pull ghcr.io/nextcloud-releases/all-in-one:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: vamos a usar latest sin fijar versión exacta para tener actualizaciones automáticas. En caso de no querer esto fijar versión de repositorio [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged estable].&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
Accedemos con un navegador web [https://localhost:9443/ https://localhost:9443/].&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO se va a desplegar transformando la configuración de Docker Desktop en fichero YAML de Docker Composer.&lt;br /&gt;
&lt;br /&gt;
=== Configurar Virtual Host para Keycloak ===&lt;br /&gt;
* Añadir Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/sites-available/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear carpeta para VirtualHost:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /var/www/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Activar Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/nube.culturetas.net /etc/nginx/sites-enabled/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar certificados Let's Encrypt ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;certbot --nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear carpetas para Keycloak ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir -p /opt/nextcloud-aio/data&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (20260409_094910). Contiene Nexcloud 33.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: vamos a usar latest sin fijar versión exacta para tener actualizaciones automáticas. En caso de no querer esto fijar versión de repositorio [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged estable].&lt;br /&gt;
&lt;br /&gt;
=== Generar fichero Compose YAML  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /opt/nextcloud-aio/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod 640 /opt/nextcloud-aio/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose up -d&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose down&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (con SystemD) ===&lt;br /&gt;
* Crear fichero SystemD&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/systemd/system/nextcloud-aio.service&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Nextcloud AIO(Docker Compose)&lt;br /&gt;
After=docker.service network-online.target&lt;br /&gt;
Requires=docker.service&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
WorkingDirectory=/opt/nextcloud-aio&lt;br /&gt;
ExecStart=/usr/bin/docker compose up --detach --remove-orphans --quiet-pull&lt;br /&gt;
ExecStop=/usr/bin/docker compose down --remove-orphans --volumes --timeout 30&lt;br /&gt;
TimeoutStartSec=180&lt;br /&gt;
TimeoutStopSec=120&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=7&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Arrancar y habilitar&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl daemon-reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/r/nextcloud/all-in-one/tags https://hub.docker.com/r/nextcloud/all-in-one/tags]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one https://github.com/nextcloud/all-in-one]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md]&lt;br /&gt;
* [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Nextcloud_AIO&amp;diff=204</id>
		<title>Nextcloud AIO</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Nextcloud_AIO&amp;diff=204"/>
		<updated>2026-04-19T16:06:37Z</updated>

		<summary type="html">&lt;p&gt;Guzman: Página creada con «== Instalación Nextcloud AIO en Docker == Instalación de [https://hub.docker.com/r/nextcloud/all-in-one nextcloud/all-in-one] en Docker. Vamos a usar la imagen oficial de [https://github.com/nextcloud/all-in-one Nextcloud AIO].  == Requisitos == Para poder realizar esta configuración se necesita: * Servidor GNU Linux (ver Securizar Ubuntu Server) ** Cortafuegos FirewallD (UFW tiene problemas con Docker) * Docker Engine (ver Docker Engine) ** Módulo: Docker…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación Nextcloud AIO en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/r/nextcloud/all-in-one nextcloud/all-in-one] en Docker.&lt;br /&gt;
Vamos a usar la imagen oficial de [https://github.com/nextcloud/all-in-one Nextcloud AIO].&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
** NextCloud AIO sólo soporta Docker (para podman hay que generar ficheros compose manualmente)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
** Usado como proxy inverso.&lt;br /&gt;
&lt;br /&gt;
== ¿Qué contiene Nextcloud AIO? ==&lt;br /&gt;
Nextcloud All In One (AIO) es la forma más sencilla de instalar Nextcloud de forma que ya venga con todo el middleware instalado y configurado.&lt;br /&gt;
Contiene los siguientes componentes:&lt;br /&gt;
* Nextcloud&lt;br /&gt;
* Base ded datos: PostgreSQL&lt;br /&gt;
** Nextcloud soporta otras bases de datos, pero no en AIO.&lt;br /&gt;
* Servidor web: Apache HTTP Server&lt;br /&gt;
** Podría usarse directamente para conectar, pero para poder tener más servicios en el mismo servidor usaremos Nginx como proxy inverso con Virtual Hosts para cada aplicación.&lt;br /&gt;
* Servicios:&lt;br /&gt;
** Nextcloud Files (Client Push)&lt;br /&gt;
** Cachés Redis &amp;amp; APCU&lt;br /&gt;
** Nextcloud Office (opcional)&lt;br /&gt;
** Nextcloud Talk y servidor TURN para Talk (opcional)&lt;br /&gt;
** Nextcloud Talk servidor de grabación (opcional)&lt;br /&gt;
** BorgBackup para backups (opcional)&lt;br /&gt;
** Antivirus ClamAV (opcional)&lt;br /&gt;
** Más&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (20260409_094910). Contiene Nexcloud 33.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: vamos a usar latest sin fijar versión exacta para tener actualizaciones automáticas. En caso de no querer esto fijar versión de repositorio [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged estable].&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
Accedemos con un navegador web [https://localhost:9443/ https://localhost:9443/].&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO se va a desplegar transformando la configuración de Docker Desktop en fichero YAML de Docker Composer.&lt;br /&gt;
&lt;br /&gt;
=== Configurar Virtual Host para Keycloak ===&lt;br /&gt;
* Añadir Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/sites-available/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear carpeta para VirtualHost:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /var/www/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Activar Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/nube.culturetas.net /etc/nginx/sites-enabled/nube.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar certificados Let's Encrypt ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;certbot --nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear carpetas para Keycloak ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir -p /opt/nextcloud-aio/data&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (20260409_094910). Contiene Nexcloud 33.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: vamos a usar latest sin fijar versión exacta para tener actualizaciones automáticas. En caso de no querer esto fijar versión de repositorio [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged estable].&lt;br /&gt;
&lt;br /&gt;
=== Generar fichero Compose YAML  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /opt/nextcloud-aio/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod 640 /opt/nextcloud-aio/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose up -d&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose down&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (con SystemD) ===&lt;br /&gt;
* Crear fichero SystemD&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/systemd/system/nextcloud-aio.service&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Nextcloud AIO(Docker Compose)&lt;br /&gt;
After=docker.service network-online.target&lt;br /&gt;
Requires=docker.service&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
WorkingDirectory=/opt/nextcloud-aio&lt;br /&gt;
ExecStart=/usr/bin/docker compose up --detach --remove-orphans --quiet-pull&lt;br /&gt;
ExecStop=/usr/bin/docker compose down --remove-orphans --volumes --timeout 30&lt;br /&gt;
TimeoutStartSec=180&lt;br /&gt;
TimeoutStopSec=120&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=7&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Arrancar y habilitar&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl daemon-reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable nextcloud-aio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/r/nextcloud/all-in-one/tags https://hub.docker.com/r/nextcloud/all-in-one/tags]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one https://github.com/nextcloud/all-in-one]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md]&lt;br /&gt;
* [https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged https://github.com/nextcloud-releases/all-in-one/pkgs/container/all-in-one/versions?filters%5Bversion_type%5D=tagged]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Keycloak&amp;diff=203</id>
		<title>Keycloak</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Keycloak&amp;diff=203"/>
		<updated>2026-04-18T22:46:26Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación Keycloak en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/hardened-images/catalog/dhi/keycloak dhi.io/keycloak] en Docker.&lt;br /&gt;
Vamos a usar una imagen &amp;quot;Docker Hardened Image&amp;quot; (imágenes seguras, mínimas y listas para producción).&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
* MariaDB (ver [[MariaDB]])&lt;br /&gt;
** Usaremos MariaDB para almacenar los datos. [https://www.keycloak.org/server/db Más información].&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
* Cuenta en Docker Hub&lt;br /&gt;
** Necesario para acceder a Docker Hardened Image.&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Login en catálogo DHI ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker login dhi.io&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (26.5.6). &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker pull dhi.io/keycloak:26.5&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Certificados SSL ===&lt;br /&gt;
Para poder arrancar la Keycloak hace falta tener certificados SSL/TLS.&lt;br /&gt;
Nombres:&lt;br /&gt;
* tls.crt: Certificado Fullchain (X.509 PEM)&lt;br /&gt;
* tls.key: Clave RSA (PKCS#8)&lt;br /&gt;
'''Nota''': en DEV usaremos auto-firmados y en PRO de Let's Encrypt.&lt;br /&gt;
&lt;br /&gt;
=== Crear volumen para certificados SSL ===&lt;br /&gt;
* Crear volumen &amp;quot;keycloak-certs&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker volume create keycloak-certs&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Copiar certificados en el &amp;quot;keycloak-cert&amp;quot;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /c/Users/guzman/Desktop/temp&lt;br /&gt;
docker create --name temp-copia -v keycloak-certs:/data alpine&lt;br /&gt;
docker cp entrardev.culturetas.net-fullchain.crt temp-copia:/data/tls.crt&lt;br /&gt;
docker cp entrardev.culturetas.net.key temp-copia:/data/tls.key&lt;br /&gt;
docker cp culturetas-root-ca.crt temp-copia:/data/ca.crt&lt;br /&gt;
docker rm temp-copia&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear base de datos para MariaDB ===&lt;br /&gt;
Ver [[MariaDB]] para montar la BD necesaria.&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d --name keycloak \&lt;br /&gt;
 --hostname entrardev.culturetas.net \&lt;br /&gt;
 --env KC_BOOTSTRAP_ADMIN_USERNAME=admin \&lt;br /&gt;
 --env KC_BOOTSTRAP_ADMIN_PASSWORD=admin \&lt;br /&gt;
 --env KC_HTTP_PORT=9080 \&lt;br /&gt;
 --env KC_HTTPS_PORT=9443 \&lt;br /&gt;
 --env KC_HTTPS_CERTIFICATE_FILE=//etc/x509/https/tls.crt \&lt;br /&gt;
 --env KC_HTTPS_CERTIFICATE_KEY_FILE=//etc/x509/https/tls.key \&lt;br /&gt;
 --env KC_HOSTNAME=https://localhost:9443/ \&lt;br /&gt;
 --env KC_DB=mariadb \&lt;br /&gt;
 --env KC_DB_URL=jdbc:mariadb://172.17.0.2:3306/keycloakdb \&lt;br /&gt;
 --env KC_DB_USERNAME=keycloak \&lt;br /&gt;
 --env KC_DB_PASSWORD=keycloak \&lt;br /&gt;
 -p 127.0.0.1:9443:9443 \&lt;br /&gt;
 -v keycloak-certs:/etc/x509/https:ro \&lt;br /&gt;
 dhi.io/keycloak:26.5 start&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: si se desea usar una DB H2 hay que crear un volumen para guardar persistentemente dicha DB. NO RECOMENDADO PARA PRO.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
 -v keycloak-data:/opt/keycloak/data/ \&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
Accedemos con un navegador web [https://localhost:9443/ https://localhost:9443/].&lt;br /&gt;
[[Archivo:Keycloak-DEV-Accesos.png|border|900px|none]]&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO se va a desplegar transformando la configuración de Docker Desktop en fichero YAML de Docker Composer.&lt;br /&gt;
&lt;br /&gt;
=== Configurar Virtual Host para Keycloak ===&lt;br /&gt;
* Añadir Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/sites-available/entrar.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
###########################&lt;br /&gt;
# KEYCLOAK REVERSER PROXY #&lt;br /&gt;
###########################&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	listen [::]:80;&lt;br /&gt;
	server_name entrar.culturetas.net;&lt;br /&gt;
	# Redirect HTTP to HTTPS&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	# SSL configuration&lt;br /&gt;
	#&lt;br /&gt;
	listen 443 ssl http2;&lt;br /&gt;
	listen [::]:443 ssl http2;&lt;br /&gt;
	ssl_certificate /etc/ssl/certs/selfsigned.crt;&lt;br /&gt;
	ssl_certificate_key /etc/ssl/private/selfsigned.key;&lt;br /&gt;
	&lt;br /&gt;
	# Root directory&lt;br /&gt;
	root /var/www/entrar.culturetas.net;&lt;br /&gt;
&lt;br /&gt;
	# Add index.php to the list if you are using PHP&lt;br /&gt;
	index index.php index.html index.htm;&lt;br /&gt;
&lt;br /&gt;
	server_name entrar.culturetas.net;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/entrar.culturetas.net-access.log;&lt;br /&gt;
	error_log /var/log/nginx/entrar.culturetas.net-error.log;&lt;br /&gt;
&lt;br /&gt;
	# Activate HSTS (HTTP Strict Transport Security)&lt;br /&gt;
	# Note: reinclude if in a location a header is set&lt;br /&gt;
	include snippets/hsts.conf;&lt;br /&gt;
&lt;br /&gt;
	# Allow favicon.ico, robots.txt, .well-known/&lt;br /&gt;
	# Deny *.txt, *.log, .*/*.php, .*, *.json, .lock, *.ht&lt;br /&gt;
	#include snippets/allowed.conf;&lt;br /&gt;
	#include snippets/denied.conf;&lt;br /&gt;
&lt;br /&gt;
	location / {&lt;br /&gt;
		# First attempt to serve request as file, then&lt;br /&gt;
		# as directory, then fall back to displaying a 404.&lt;br /&gt;
		#try_files $uri $uri/ =404;&lt;br /&gt;
		proxy_pass https://127.0.0.1:9443;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location = /robots.txt {&lt;br /&gt;
		allow all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* ^/.well-known/ {&lt;br /&gt;
		allow all;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear carpeta para VirtualHost:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /var/www/entrar.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Activar Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/entrar.culturetas.net /etc/nginx/sites-enabled/entrar.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar certificados Let's Encrypt ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;certbot --nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
&lt;br /&gt;
Which names would you like to activate HTTPS for?&lt;br /&gt;
We recommend selecting either all domains, or all domains in a VirtualHost/server block.&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
1: entrar.culturetas.net&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Select the appropriate numbers separated by commas and/or spaces, or leave input&lt;br /&gt;
blank to select all options shown (Enter 'c' to cancel): 1&lt;br /&gt;
Requesting a certificate for entrar.culturetas.net&lt;br /&gt;
&lt;br /&gt;
Successfully received certificate.&lt;br /&gt;
Certificate is saved at: /etc/letsencrypt/live/entrar.culturetas.net/fullchain.pem&lt;br /&gt;
Key is saved at:         /etc/letsencrypt/live/entrar.culturetas.net/privkey.pem&lt;br /&gt;
This certificate expires on 2026-07-17.&lt;br /&gt;
These files will be updated when the certificate renews.&lt;br /&gt;
Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
&lt;br /&gt;
Deploying certificate&lt;br /&gt;
Successfully deployed certificate for entrar.culturetas.net to /etc/nginx/sites-enabled/entrar.culturetas.net&lt;br /&gt;
Congratulations! You have successfully enabled HTTPS on https://entrar.culturetas.net&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
If you like Certbot, please consider supporting our work by:&lt;br /&gt;
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate&lt;br /&gt;
 * Donating to EFF:                    https://eff.org/donate-le&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear BD para keycloak (MariaDB) ===&lt;br /&gt;
&lt;br /&gt;
==== Conectar a la base de datos ====&lt;br /&gt;
Conectamos como root:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
mariadb&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Crear base de datos ====&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
CREATE DATABASE keycloakdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Crear usuario ====&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER keycloak IDENTIFIED BY 'keycloak';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Dar permisos a usuario en BD ====&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL PRIVILEGES ON keycloakdb.* TO 'keycloak';&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Comprobar permisos ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
SHOW GRANTS FOR 'keycloak';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
| Grants for keycloak@%                                                                                   |&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
| GRANT USAGE ON *.* TO `keycloak`@`%` IDENTIFIED BY PASSWORD '*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' |&lt;br /&gt;
| GRANT ALL PRIVILEGES ON `keycloakdb`.* TO `keycloak`@`%`                                                |&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Habilitar conexiones remotas ====&lt;br /&gt;
El necesario que la BD tenga configurada conexiones remotas (no sólo desde localhost).&lt;br /&gt;
Ver documento [[LEMP|Configuración MariaDB]].&lt;br /&gt;
&lt;br /&gt;
Nota: se recomienda NO exponer la base de datos a Internet. Es decir, sí habilitar las conexiones remotas, pero no abrir el puerto en los firewalls.&lt;br /&gt;
&lt;br /&gt;
=== Crear carpetas para Keycloak ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir -p /opt/keycloak/data&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Certificados SSL para el contenedor (auto-firmados) ===&lt;br /&gt;
Vamos a usar los unos certificados SSL auto-firmados para usar dentro del contenedor.&lt;br /&gt;
Aunque estos sean auto-firmados los finales son los que muestra Nginx (Let's Encrypt).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p /opt/keycloak/data/ssl&lt;br /&gt;
mv /tmp/entrar.culturetas.net* /opt/keycloak/data/ssl/&lt;br /&gt;
chown root:root /opt/keycloak/data/ssl/entrar.culturetas.net*&lt;br /&gt;
chmod 644 /opt/keycloak/data/ssl/entrar.culturetas.net*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: aunque la key no se recomienda 644 (sino 600). Keycloak no es capaz de leerlo con otros permisos.&lt;br /&gt;
&lt;br /&gt;
=== Login en catálogo DHI ===&lt;br /&gt;
* Acceso a Docker Hub: https://app.docker.com/accounts/&amp;lt;user&amp;gt;/settings/personal-access-tokens&lt;br /&gt;
&lt;br /&gt;
* Generar nuevo token&lt;br /&gt;
[[Archivo:Culturetas-access-token.png|border|900px|none]]&lt;br /&gt;
&lt;br /&gt;
* Guardar token en lugar seguro&lt;br /&gt;
&lt;br /&gt;
* Acceder a Docker&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker login -u &amp;lt;user&amp;gt; dhi.io&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nota: las imágenes Hardened son libres pero bajo registro.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (26.5.6). &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker pull dhi.io/keycloak:26.5&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar fichero Compose YAML  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /opt/keycloak/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
name: keycloak&lt;br /&gt;
services:&lt;br /&gt;
    keycloak:&lt;br /&gt;
        container_name: keycloak&lt;br /&gt;
        hostname: entrar.culturetas.net&lt;br /&gt;
        restart: unless-stopped&lt;br /&gt;
        environment:&lt;br /&gt;
            - KC_BOOTSTRAP_ADMIN_USERNAME=admin&lt;br /&gt;
            - KC_BOOTSTRAP_ADMIN_PASSWORD=admin&lt;br /&gt;
            - KC_HTTP_PORT=9080&lt;br /&gt;
            - KC_HTTPS_PORT=9443&lt;br /&gt;
            - KC_HTTPS_CERTIFICATE_FILE=/etc/x509/https/tls.crt&lt;br /&gt;
            - KC_HTTPS_CERTIFICATE_KEY_FILE=/etc/x509/https/tls.key&lt;br /&gt;
            - KC_HOSTNAME=https://entrar.culturetas.net/&lt;br /&gt;
            - KC_DB=mariadb&lt;br /&gt;
            - KC_DB_URL=jdbc:mariadb://135.125.179.32:3306/keycloakdb&lt;br /&gt;
            - KC_DB_USERNAME=keycloak&lt;br /&gt;
            - KC_DB_PASSWORD=keycloak&lt;br /&gt;
        ports:&lt;br /&gt;
            - 127.0.0.1:9443:9443&lt;br /&gt;
        volumes:&lt;br /&gt;
            - /opt/keycloak/data/ssl/entrar.culturetas.net-fullchain.crt:/etc/x509/https/tls.crt:ro&lt;br /&gt;
            - /opt/keycloak/data/ssl/entrar.culturetas.net.key:/etc/x509/https/tls.key:ro&lt;br /&gt;
        image: dhi.io/keycloak:26.5&lt;br /&gt;
        command: start&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod 640 /opt/keycloak/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/keycloak&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose up -d&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/keycloak&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose down&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (con SystemD) ===&lt;br /&gt;
* Crear fichero SystemD&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/systemd/system/keycloak.service&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=KeyCloak (Docker Compose)&lt;br /&gt;
After=docker.service mariadb.service network-online.target&lt;br /&gt;
Requires=docker.service mariadb.service&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
WorkingDirectory=/opt/keycloak&lt;br /&gt;
ExecStart=/usr/bin/docker compose up --detach --remove-orphans --quiet-pull&lt;br /&gt;
ExecStop=/usr/bin/docker compose down --remove-orphans --volumes --timeout 30&lt;br /&gt;
TimeoutStartSec=180&lt;br /&gt;
TimeoutStopSec=120&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=7&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Arrancar y habilitar&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl daemon-reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start keycloak&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable keycloak&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración KeyCloak ==&lt;br /&gt;
=== Editar Realm (master) ===&lt;br /&gt;
* Acceder a KeyCloak con usuario admin.&lt;br /&gt;
* Pulsar en &amp;quot;Realm settings&amp;quot;.&lt;br /&gt;
* Pulsar en &amp;quot;General&amp;quot;.&lt;br /&gt;
** Display name: culturetas.net&lt;br /&gt;
* Pulsar en &amp;quot;Email&amp;quot;.&lt;br /&gt;
** From: hola@culturetas.net&lt;br /&gt;
** From display name: Hola Cultureta&lt;br /&gt;
** Host: smtp.culturetas.net&lt;br /&gt;
** Port: 587&lt;br /&gt;
** Enable StartTLS: Sí&lt;br /&gt;
** Authentication: Sí&lt;br /&gt;
** Username: hola@culturetas.net&lt;br /&gt;
** Password&lt;br /&gt;
&lt;br /&gt;
=== Crear usuario ===&lt;br /&gt;
* Comprobar que estás en el realm &amp;quot;master&amp;quot;.&lt;br /&gt;
* Pulsar en &amp;quot;Users&amp;quot; -&amp;gt; &amp;quot;Create new user&amp;quot;.&lt;br /&gt;
** Username&lt;br /&gt;
** Email&lt;br /&gt;
** First name&lt;br /&gt;
** Last name&lt;br /&gt;
* Pulser en &amp;quot;Credentials&amp;quot; -&amp;gt; &amp;quot;Set password&amp;quot;.&lt;br /&gt;
** Password&lt;br /&gt;
** Password confirmation&lt;br /&gt;
** Temporary: Off&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/hardened-images/catalog/dhi/keycloak https://hub.docker.com/hardened-images/catalog/dhi/keycloak]&lt;br /&gt;
* [https://www.keycloak.org/guides https://www.keycloak.org/guides]&lt;br /&gt;
* [https://www.keycloak.org/getting-started/getting-started-docker https://www.keycloak.org/getting-started/getting-started-docker]&lt;br /&gt;
* [https://www.keycloak.org/server/db https://www.keycloak.org/server/db]&lt;br /&gt;
* [https://www.keycloak.org/server/configuration-production https://www.keycloak.org/server/configuration-production]&lt;br /&gt;
* [https://www.keycloak.org/server/hostname https://www.keycloak.org/server/hostname]&lt;br /&gt;
* [https://www.keycloak.org/server/reverseproxy https://www.keycloak.org/server/reverseproxy]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=OpenLDAP&amp;diff=201</id>
		<title>OpenLDAP</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=OpenLDAP&amp;diff=201"/>
		<updated>2026-04-18T21:40:09Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación OpenLDAP en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/r/vegardit/openldap vegardit/openldap] en Docker.&lt;br /&gt;
Se va a usar los siguientes protocolos:&lt;br /&gt;
* LDAP (puerto 389/tcp): sólo en localhost&lt;br /&gt;
* LDAPS (puerto 636/tcp): publicado con Nginx como reserve proxy (en PRO)&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
** Módulo: Nginx Stream (incluido en Ubuntu)&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar la imagen que es la latest a día de hoy (2.6.10).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker pull vegardit/openldap:2.6.10&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
Vamos a usar la imagen sólo con LDAP (389/tcp) solo para localhost.&lt;br /&gt;
IMPORTANTE: para añadir SSL/TLS usaremos Nginx.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d --name openldap \&lt;br /&gt;
 --hostname ldapdev.culturetas.net \&lt;br /&gt;
 --env LDAP_INIT_ORG_DN=&amp;quot;dc=culturetas,dc=net&amp;quot; \&lt;br /&gt;
 --env LDAP_INIT_ORG_NAME=&amp;quot;Culturetas SPQR&amp;quot; \&lt;br /&gt;
 --env LDAP_INIT_ROOT_USER_DN='uid=admin,dc=culturetas,dc=net' \&lt;br /&gt;
 --env LDAP_INIT_ROOT_USER_PW=&amp;quot;CONTRASEÑA&amp;quot; \&lt;br /&gt;
 --env LDAP_INIT_PPOLICY_PW_MIN_LENGTH='12' \&lt;br /&gt;
 --env LDAP_INIT_ADMIN_GROUP_DN='cn=ldap-admins,ou=Groups,dc=culturetas,dc=net' \&lt;br /&gt;
 --env LDAP_INIT_PASSWORD_RESET_GROUP_DN='cn=ldap-password-reset,ou=Groups,dc=culturetas,dc=net' \&lt;br /&gt;
 --env LDAP_INIT_RFC2307BIS_SCHEMA=0 \&lt;br /&gt;
 --env LDAP_INIT_ALLOW_CONFIG_ACCESS='true' \&lt;br /&gt;
 --env LDAP_TLS_ENABLED=false \&lt;br /&gt;
 --env LDAP_LDAPS_ENABLED=false \&lt;br /&gt;
 -p 127.0.0.1:389:389 \&lt;br /&gt;
 -v ldap-data:/var/lib/ldap -v ldap-config:/etc/ldap/slapd.d \&lt;br /&gt;
 vegardit/openldap:2.6.10&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
'''Nota''': OpenSSL soporta SSL/TLS, pero con vegardit/openldap no funciona correctamente y tras un handshake correcot, no completa siempre la autenticación (usaremos un reverse proxy como alternativa y es más seguro).&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
Vamos a probar a conectar usando [https://directory.apache.org/studio/downloads.html Apache Directory Studio].&lt;br /&gt;
* Hostname: 127.0.0.1&lt;br /&gt;
* Port: 389&lt;br /&gt;
* Encryption: LDAP&lt;br /&gt;
* Bind DN: uid=admin,dc=culturetas,dc=net&lt;br /&gt;
* Bind password: CONTRASEÑA&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO se va a desplegar transformando la configuración de Docker Desktop en fichero YAML de Docker Composer.&lt;br /&gt;
&lt;br /&gt;
=== Instalar módulo Stream de Nginx ===&lt;br /&gt;
Nginx con módulo Stream permite balancear a puertos TCP o UDP (que no sean HTTP).&lt;br /&gt;
No viene con el paquete estándar de Nginx, se instala aparte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install libnginx-mod-stream&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuración módulo Stream ===&lt;br /&gt;
* Backup nginx.conf&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cp -a /etc/nginx/nginx.conf /etc/nginx/nginx.conf.20260322&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear carpeta para Stream&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /etc/nginx/stream-available&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /etc/nginx/stream-enabled&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Añadir configuración para Stream&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/nginx.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
stream {&lt;br /&gt;
	# Log format&lt;br /&gt;
	log_format stream_format '$remote_addr [$time_local] '&lt;br /&gt;
							 '$protocol $status $bytes_sent $bytes_received '&lt;br /&gt;
							 '$session_time &amp;quot;$upstream_addr&amp;quot;';&lt;br /&gt;
	include /etc/nginx/stream-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurar Virtual Host para LDAP (para HTTP) ===&lt;br /&gt;
* Añadir Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/sites-available/ldap.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
##&lt;br /&gt;
# You should look at the following URL's in order to grasp a solid understanding&lt;br /&gt;
# of Nginx configuration files in order to fully unleash the power of Nginx.&lt;br /&gt;
# http://wiki.nginx.org/Pitfalls&lt;br /&gt;
# http://wiki.nginx.org/QuickStart&lt;br /&gt;
# http://wiki.nginx.org/Configuration&lt;br /&gt;
#&lt;br /&gt;
# Generally, you will want to move this file somewhere, and start with a clean&lt;br /&gt;
# file but keep this around for reference. Or just disable in sites-enabled.&lt;br /&gt;
#&lt;br /&gt;
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
# Default server configuration&lt;br /&gt;
#&lt;br /&gt;
server {&lt;br /&gt;
        # Redirect HTTP to HTTPS&lt;br /&gt;
        listen 80;&lt;br /&gt;
        listen [::]:80;&lt;br /&gt;
        server_name ldap.culturetas.net;&lt;br /&gt;
        # Redirect HTTP to HTTPS&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
        # SSL configuration&lt;br /&gt;
        #&lt;br /&gt;
        listen 443 ssl http2;&lt;br /&gt;
        listen [::]:443 ssl http2;&lt;br /&gt;
        ssl_certificate /etc/letsencrypt/live/culturetas.net/fullchain.pem;&lt;br /&gt;
        ssl_certificate_key /etc/letsencrypt/live/culturetas.net/privkey.pem;&lt;br /&gt;
        #&lt;br /&gt;
        # Note: You should disable gzip for SSL traffic.&lt;br /&gt;
        # See: https://bugs.debian.org/773332&lt;br /&gt;
        #&lt;br /&gt;
        # Read up on ssl_ciphers to ensure a secure configuration.&lt;br /&gt;
        # See: https://bugs.debian.org/765782&lt;br /&gt;
        #&lt;br /&gt;
        # Self signed certs generated by the ssl-cert package&lt;br /&gt;
        # Don't use them in a production server!&lt;br /&gt;
        #&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&lt;br /&gt;
        root /var/www/ldap.culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        # Add index.php to the list if you are using PHP&lt;br /&gt;
        index index.php index.html index.htm;&lt;br /&gt;
&lt;br /&gt;
        server_name ldap.culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        access_log /var/log/nginx/ldap.culturetas.net-access.log;&lt;br /&gt;
        error_log /var/log/nginx/ldap.culturetas.net-error.log;&lt;br /&gt;
&lt;br /&gt;
#       # Auth Basic (for developing)&lt;br /&gt;
#       auth_basic &amp;quot;Pagina Restringida&amp;quot;;&lt;br /&gt;
#       auth_basic_user_file /etc/nginx/passwd/passwd-culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        # Activate HSTS (HTTP Strict Transport Security)&lt;br /&gt;
        # Note: reinclude if in a location a header is set&lt;br /&gt;
        include snippets/hsts.conf;&lt;br /&gt;
&lt;br /&gt;
        # Allow favicon.ico, robots.txt, .well-known/&lt;br /&gt;
        # Deny *.txt, *.log, .*/*.php, .*, *.json, .lock, *.ht&lt;br /&gt;
        include snippets/allowed.conf;&lt;br /&gt;
        include snippets/denied.conf;&lt;br /&gt;
&lt;br /&gt;
        # Redirect all to Keycloak&lt;br /&gt;
        return 301 https://entrar.culturetas.net;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear carpeta para VirtualHost:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /var/www/ldap.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Activar Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/ldap.culturetas.net /etc/nginx/sites-enabled/ldap.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar certificados Let's Encrypt ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;certbot --nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
&lt;br /&gt;
Which names would you like to activate HTTPS for?&lt;br /&gt;
We recommend selecting either all domains, or all domains in a VirtualHost/server block.&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
1: ldap.culturetas.net&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Select the appropriate numbers separated by commas and/or spaces, or leave input&lt;br /&gt;
blank to select all options shown (Enter 'c' to cancel): 1&lt;br /&gt;
Requesting a certificate for ldap.culturetas.net&lt;br /&gt;
&lt;br /&gt;
Successfully received certificate.&lt;br /&gt;
Certificate is saved at: /etc/letsencrypt/live/ldap.culturetas.net/fullchain.pem&lt;br /&gt;
Key is saved at:         /etc/letsencrypt/live/ldap.culturetas.net/privkey.pem&lt;br /&gt;
This certificate expires on 2026-06-19.&lt;br /&gt;
These files will be updated when the certificate renews.&lt;br /&gt;
Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
&lt;br /&gt;
Deploying certificate&lt;br /&gt;
Successfully deployed certificate for ldap.culturetas.net to /etc/nginx/sites-enabled/ldap.culturetas.net&lt;br /&gt;
Congratulations! You have successfully enabled HTTPS on https://ldap.culturetas.net&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
If you like Certbot, please consider supporting our work by:&lt;br /&gt;
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate&lt;br /&gt;
 * Donating to EFF:                    https://eff.org/donate-le&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurar Virtual Host para LDAP (para Stream) ===&lt;br /&gt;
* Añadir Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/stream-available/ldap.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
########################&lt;br /&gt;
# STREAM REVERSE PROXY #&lt;br /&gt;
########################&lt;br /&gt;
&lt;br /&gt;
# Nginx Stream allow load balancer to TCP or UDP ports (no HTTP).&lt;br /&gt;
upstream ldap_backend {&lt;br /&gt;
	server 127.0.0.1:389 max_fails=3 fail_timeout=30s;&lt;br /&gt;
	# Opcional: High Availability&lt;br /&gt;
	# server 192.168.10.45:389 backup;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	# LDAPS port (636/tcp)&lt;br /&gt;
	listen 636 ssl;&lt;br /&gt;
&lt;br /&gt;
	# SSL/TLS Certificates&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/ldap.culturetas.net/fullchain.pem;&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/ldap.culturetas.net/privkey.pem;&lt;br /&gt;
&lt;br /&gt;
	# TLS Settings&lt;br /&gt;
	ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
	ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;&lt;br /&gt;
	ssl_prefer_server_ciphers on;&lt;br /&gt;
	ssl_session_cache shared:SSL:10m;&lt;br /&gt;
	ssl_session_timeout 10m;&lt;br /&gt;
	ssl_session_tickets off;&lt;br /&gt;
	&lt;br /&gt;
	# Forwarding to plain LDAP (LDAPS -&amp;gt; LDAP)&lt;br /&gt;
	proxy_pass ldap_backend;&lt;br /&gt;
&lt;br /&gt;
	# LDAP timeouts&lt;br /&gt;
	proxy_connect_timeout 5s;&lt;br /&gt;
	proxy_timeout 3m;&lt;br /&gt;
&lt;br /&gt;
	# Logging (stream format)&lt;br /&gt;
	access_log /var/log/nginx/ldaps.culturetas.net-access.log stream_format;&lt;br /&gt;
	error_log /var/log/nginx/ldaps.culturetas.net-error.log warn;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Activar Virtual Host:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/stream-available/ldap.culturetas.net /etc/nginx/stream-enabled/ldap.culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Habilitar LDAPS en FirewallD ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --permanent --zone=public --add-port=636/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear carpetas para OpenLDAP ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir -p /opt/openldap/data&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar fichero Compose YAML  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /opt/openldap/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
name: openldap&lt;br /&gt;
services:&lt;br /&gt;
    openldap:&lt;br /&gt;
        container_name: openldap&lt;br /&gt;
        hostname: ldap.culturetas.net&lt;br /&gt;
        restart: unless-stopped&lt;br /&gt;
        environment:&lt;br /&gt;
            - LDAP_INIT_ORG_DN=dc=culturetas,dc=net&lt;br /&gt;
            - LDAP_INIT_ORG_NAME=Culturetas SPQR&lt;br /&gt;
            - LDAP_INIT_ROOT_USER_DN=uid=admin,dc=culturetas,dc=net&lt;br /&gt;
            - LDAP_INIT_ROOT_USER_PW=CONTRASEÑA&lt;br /&gt;
            - LDAP_INIT_PPOLICY_PW_MIN_LENGTH=12&lt;br /&gt;
            - LDAP_INIT_ADMIN_GROUP_DN=cn=ldap-admins,ou=Groups,dc=culturetas,dc=net&lt;br /&gt;
            - LDAP_INIT_PASSWORD_RESET_GROUP_DN=cn=ldap-password-reset,ou=Groups,dc=culturetas,dc=net&lt;br /&gt;
            - LDAP_INIT_RFC2307BIS_SCHEMA=0&lt;br /&gt;
            - LDAP_INIT_ALLOW_CONFIG_ACCESS=true&lt;br /&gt;
            - LDAP_TLS_ENABLED=false&lt;br /&gt;
            - LDAP_LDAPS_ENABLED=false&lt;br /&gt;
        ports:&lt;br /&gt;
            - 127.0.0.1:389:389&lt;br /&gt;
        volumes:&lt;br /&gt;
            - /opt/openldap/data/var:/var/lib/ldap&lt;br /&gt;
            - /opt/openldap/data/etc:/etc/ldap/slapd.d&lt;br /&gt;
        image: vegardit/openldap:2.6.10&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod 640 /opt/openldap/compose.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/openldap&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose up -d&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parar OpenLDAP (manual)  ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /opt/openldap&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker compose down&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrancar OpenLDAP (con SystemD) ===&lt;br /&gt;
* Crear fichero SystemD&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/systemd/system/openldap.service&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=OpenLDAP (Docker Compose)&lt;br /&gt;
After=docker.service network-online.target&lt;br /&gt;
Requires=docker.service&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
WorkingDirectory=/opt/openldap&lt;br /&gt;
ExecStart=/usr/bin/docker compose up --detach --remove-orphans --quiet-pull&lt;br /&gt;
ExecStop=/usr/bin/docker compose down --remove-orphans --volumes --timeout 30&lt;br /&gt;
TimeoutStartSec=180&lt;br /&gt;
TimeoutStopSec=120&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=7&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Arrancar y habilitar&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl daemon-reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start openldap&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enabled openldap&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/r/vegardit/openldap https://hub.docker.com/r/vegardit/openldap]&lt;br /&gt;
* [https://github.com/vegardit/docker-openldap https://github.com/vegardit/docker-openldap]&lt;br /&gt;
* [https://directory.apache.org/studio/downloads.html https://directory.apache.org/studio/downloads.html]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=LEMP&amp;diff=192</id>
		<title>LEMP</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=LEMP&amp;diff=192"/>
		<updated>2026-04-18T20:13:46Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación servidor LEMP ==&lt;br /&gt;
Instalaremos:&lt;br /&gt;
* GNU Linux (Ubuntu Server 24.04)&lt;br /&gt;
* eNginx 1.24.0 (APT Ubuntu)&lt;br /&gt;
* MariaDB 10.8 (Repo oficiales de MariaDB)&lt;br /&gt;
* PHP 8.5 (PPA ondrej/php)&lt;br /&gt;
&lt;br /&gt;
== Permisos de root ==&lt;br /&gt;
Todos los comandos en esta guía se realizarán como root.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación Nginx (Stable) ==&lt;br /&gt;
* Actualizar repositorio&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar Nginx&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalación Apache Utils&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install apache2-utils&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación MariaDB ==&lt;br /&gt;
* Instalar requisitos&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install apt-transport-https curl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Añadir repositorios MariaDB (oficiales)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir -p /etc/apt/keyrings&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/apt/sources.list.d/mariadb.sources&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# MariaDB 11.8 repository list - created 2026-02-23 08:31 UTC&lt;br /&gt;
# https://mariadb.org/download/&lt;br /&gt;
X-Repolib-Name: MariaDB&lt;br /&gt;
Types: deb&lt;br /&gt;
# deb.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.&lt;br /&gt;
# URIs: https://deb.mariadb.org/11.8/ubuntu&lt;br /&gt;
URIs: https://mirror.raiolanetworks.com/mariadb/repo/11.8/ubuntu&lt;br /&gt;
Suites: noble&lt;br /&gt;
Components: main main/debug&lt;br /&gt;
Signed-By: /etc/apt/keyrings/mariadb-keyring.pgp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Actualizar repositorio&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalación de servidor y cliente&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install mariadb-client mariadb-server mariadb-plugin-provider-bzip2 mariadb-plugin-provider-lz4 mariadb-plugin-provider-lzma mariadb-plugin-provider-lzo mariadb-plugin-provider-snappy&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Inicializar base de datos&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mysql_secure_installation&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB&lt;br /&gt;
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!&lt;br /&gt;
&lt;br /&gt;
In order to log into MariaDB to secure it, we'll need the current&lt;br /&gt;
password for the root user. If you've just installed MariaDB, and&lt;br /&gt;
haven't set the root password yet, you should just press enter here.&lt;br /&gt;
&lt;br /&gt;
Enter current password for root (enter for none):&lt;br /&gt;
OK, successfully used password, moving on...&lt;br /&gt;
&lt;br /&gt;
Setting the root password or using the unix_socket ensures that nobody&lt;br /&gt;
can log into the MariaDB root user without the proper authorisation.&lt;br /&gt;
&lt;br /&gt;
You already have your root account protected, so you can safely answer 'n'.&lt;br /&gt;
&lt;br /&gt;
Switch to unix_socket authentication [Y/n] n&lt;br /&gt;
 ... skipping.&lt;br /&gt;
&lt;br /&gt;
You already have your root account protected, so you can safely answer 'n'.&lt;br /&gt;
&lt;br /&gt;
Change the root password? [Y/n] y&lt;br /&gt;
New password:&lt;br /&gt;
Re-enter new password:&lt;br /&gt;
Password updated successfully!&lt;br /&gt;
Reloading privilege tables..&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By default, a MariaDB installation has an anonymous user, allowing anyone&lt;br /&gt;
to log into MariaDB without having to have a user account created for&lt;br /&gt;
them.  This is intended only for testing, and to make the installation&lt;br /&gt;
go a bit smoother.  You should remove them before moving into a&lt;br /&gt;
production environment.&lt;br /&gt;
&lt;br /&gt;
Remove anonymous users? [Y/n] y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Normally, root should only be allowed to connect from 'localhost'.  This&lt;br /&gt;
ensures that someone cannot guess at the root password from the network.&lt;br /&gt;
&lt;br /&gt;
Disallow root login remotely? [Y/n] Y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
By default, MariaDB comes with a database named 'test' that anyone can&lt;br /&gt;
access.  This is also intended only for testing, and should be removed&lt;br /&gt;
before moving into a production environment.&lt;br /&gt;
&lt;br /&gt;
Remove test database and access to it? [Y/n] Y&lt;br /&gt;
 - Dropping test database...&lt;br /&gt;
 ... Success!&lt;br /&gt;
 - Removing privileges on test database...&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Reloading the privilege tables will ensure that all changes made so far&lt;br /&gt;
will take effect immediately.&lt;br /&gt;
&lt;br /&gt;
Reload privilege tables now? [Y/n] Y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Cleaning up...&lt;br /&gt;
&lt;br /&gt;
All done!  If you've completed all of the above steps, your MariaDB&lt;br /&gt;
installation should now be secure.&lt;br /&gt;
&lt;br /&gt;
Thanks for using MariaDB!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación PHP ==&lt;br /&gt;
Vamos a usar los repositorios PPA de ondrej/php&lt;br /&gt;
&lt;br /&gt;
* Instalar repositorio PPA&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;add-apt-repository ppa:ondrej/php&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Actualizar repositorios&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar PHP 8.5&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install php8.5 php8.5-apcu php8.5-common php8.5-fpm php8.5-curl php8.5-gd php8.5-mysql php8.5-xml php8.5-xmlrpc php8.5-bz2 php8.5-imap php8.5-intl php8.5-mbstring php8.5-soap php8.5-gnupg php8.5-imagick php8.5-mcrypt php8.5-zip&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación Let's Encrypt ==&lt;br /&gt;
Vamos a usar Let's Encrypt para generar las claves y certificados usadas para comunicaciones HTTPS.&lt;br /&gt;
&lt;br /&gt;
* Instalar Snap Core&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap install core&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Refrescar Snap Core&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap refresh core&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar Certbot&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap install --classic certbot&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear enlace simbólico&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /snap/bin/certbot /usr/local/bin/certbot&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Comprobar que está activada el timer de renovación&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl list-timers | grep certbot&lt;br /&gt;
Mon 2026-02-23 11:47:00 UTC      12h -                                      - snap.certbot.renew.timer       snap.certbot.renew.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración PHP ==&lt;br /&gt;
* Configuración php-fpm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/php/8.5/fpm/php.ini&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum amount of memory a script may consume&lt;br /&gt;
; https://php.net/memory-limit&lt;br /&gt;
memory_limit = 128M&lt;br /&gt;
max_memory_limit = -1&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum size of POST data that PHP will accept.&lt;br /&gt;
; Its value may be 0 to disable the limit. It is ignored if POST data reading&lt;br /&gt;
; is disabled through enable_post_data_reading.&lt;br /&gt;
; https://php.net/post-max-size&lt;br /&gt;
post_max_size = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's&lt;br /&gt;
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok&lt;br /&gt;
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting&lt;br /&gt;
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting&lt;br /&gt;
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts&lt;br /&gt;
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.&lt;br /&gt;
; https://php.net/cgi.fix-pathinfo&lt;br /&gt;
cgi.fix_pathinfo=0&lt;br /&gt;
[...]&lt;br /&gt;
; Whether to allow HTTP file uploads.&lt;br /&gt;
; https://php.net/file-uploads&lt;br /&gt;
file_uploads = On&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum allowed size for uploaded files.&lt;br /&gt;
; https://php.net/upload-max-filesize&lt;br /&gt;
upload_max_filesize = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum number of files that can be uploaded via a single request&lt;br /&gt;
max_file_uploads = 20&lt;br /&gt;
[...]&lt;br /&gt;
[Session]&lt;br /&gt;
; Handler used to store/retrieve data.&lt;br /&gt;
; https://php.net/session.save-handler&lt;br /&gt;
session.save_handler = files&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configuración php-cli:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/php/8.5/cli/php.ini&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum amount of memory a script may consume&lt;br /&gt;
; https://php.net/memory-limit&lt;br /&gt;
memory_limit = -1&lt;br /&gt;
max_memory_limit = -1&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum size of POST data that PHP will accept.&lt;br /&gt;
; Its value may be 0 to disable the limit. It is ignored if POST data reading&lt;br /&gt;
; is disabled through enable_post_data_reading.&lt;br /&gt;
; https://php.net/post-max-size&lt;br /&gt;
post_max_size = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's&lt;br /&gt;
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok&lt;br /&gt;
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting&lt;br /&gt;
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting&lt;br /&gt;
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts&lt;br /&gt;
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.&lt;br /&gt;
; https://php.net/cgi.fix-pathinfo&lt;br /&gt;
cgi.fix_pathinfo=0&lt;br /&gt;
[...]&lt;br /&gt;
; Whether to allow HTTP file uploads.&lt;br /&gt;
; https://php.net/file-uploads&lt;br /&gt;
file_uploads = On&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum allowed size for uploaded files.&lt;br /&gt;
; https://php.net/upload-max-filesize&lt;br /&gt;
upload_max_filesize = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum number of files that can be uploaded via a single request&lt;br /&gt;
max_file_uploads = 20&lt;br /&gt;
[...]&lt;br /&gt;
[Session]&lt;br /&gt;
; Handler used to store/retrieve data.&lt;br /&gt;
; https://php.net/session.save-handler&lt;br /&gt;
session.save_handler = files&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar php-fpm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart php8.5-fpm.service&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración Nginx ==&lt;br /&gt;
* Backup nginx.conf&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cp -a /etc/nginx/nginx.conf /etc/nginx/nginx.conf.$(date +%Y%m%d)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Editar nginx.conf&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/nginx.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
http {&lt;br /&gt;
        ##&lt;br /&gt;
        # Basic Settings&lt;br /&gt;
        ##&lt;br /&gt;
        sendfile on;&lt;br /&gt;
        tcp_nopush on;&lt;br /&gt;
        types_hash_max_size 2048;&lt;br /&gt;
        client_max_body_size 100M;&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
[...]&lt;br /&gt;
        ##&lt;br /&gt;
        # SSL Settings&lt;br /&gt;
        ##&lt;br /&gt;
        #ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE&lt;br /&gt;
        ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
        ssl_prefer_server_ciphers on;&lt;br /&gt;
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;&lt;br /&gt;
[...]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Generar PHParam:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /etc/nginx/ssl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar contraseñas:&lt;br /&gt;
Si se quiere configurar contraseñas Auth Basic se almacenan en /etc/nginx/passwd.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /etc/nginx/passwd&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;htpasswd -c -B /etc/nginx/passwd/test.pw guzman&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar snippets:&lt;br /&gt;
Estos &amp;quot;fragmentos&amp;quot; se pueden usar para permitir que sistemas funcionen si se tiene Auth Basic activo (como robots.txt o validación de Let's Encrypt).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/allowed.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Allow favicon.ico, robots.txt, .well-known/&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
        access_log off;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Allow robots.txt&lt;br /&gt;
location = /robots.txt {&lt;br /&gt;
        allow all;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
        access_log off;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Allow &amp;quot;Well-Known URIs&amp;quot; as pwe RFC 5785 (e.g. Let's Encrypt)&lt;br /&gt;
location ~* ^/.well-known/ {&lt;br /&gt;
        auth_basic off;&lt;br /&gt;
        allow all;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/denied.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Deny *.txt, *.log, .*/*.php, .*, *.json, .lock, *.ht&lt;br /&gt;
&lt;br /&gt;
# Not allow txt or logs to be downloaded&lt;br /&gt;
location ~* \.(txt|log)$ {&lt;br /&gt;
        deny all;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow execute php in hidden folders&lt;br /&gt;
location ~ \..*/.\.php$ {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow &amp;quot;hidden files&amp;quot;&lt;br /&gt;
location ~ (^|/)\. {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow *.json or *.lock&lt;br /&gt;
location ~* \.(json|lock)$ {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Deny *.ht&lt;br /&gt;
location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/hsts.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Activate HSTS (HTTP Strict Transport Security)&lt;br /&gt;
# Note: if we set another header in a location we've to&lt;br /&gt;
#       rewrite it&lt;br /&gt;
add_header Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot; always;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar sites-available:&lt;br /&gt;
En al carpeta /etc/nginx/sites-available/ se almacenan todos los Virtual Hosts disponibles.&lt;br /&gt;
En Nginx hay que personalizar cada uno por cada tipo de aplicación.&lt;br /&gt;
Hay que tener en cuenta las diferentes URL's.&lt;br /&gt;
&lt;br /&gt;
* Configurar sites-enabled:&lt;br /&gt;
Se suelen configurar enlaces simbólicos con la carpeta sites-available para activarlos.&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar Nginx:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración MariaDB ==&lt;br /&gt;
* Conectar a MariaDB&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mariadb&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Opción 1: Permitir conexiones por TCP (sólo desde localhost)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Sql&amp;quot;&amp;gt;&lt;br /&gt;
grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Opción 2: Permitir conexiones por Sockets UNIX (sólo desde localhost)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Sql&amp;quot;&amp;gt;&lt;br /&gt;
grant all privileges on *.* to 'root'@'localhost' identified via unix_socket with grant option;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nota: esta opción es la que suelo usar yo (no se pueden usar los dos a la vez).&lt;br /&gt;
&lt;br /&gt;
* Habilitar conexiones remotas&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
vi /etc/mysql/mariadb.conf.d/50-server.cnf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
# Instead of skip-networking the default is now to listen only on&lt;br /&gt;
# localhost which is more compatible and is not less secure.&lt;br /&gt;
#bind-address            = 127.0.0.1&lt;br /&gt;
bind-address            = 0.0.0.0&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl restart mariadb.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 1: vamos a necesitar deshabilitar el Bind Address para los contenedores de [[Docker Engine]].&lt;br /&gt;
&lt;br /&gt;
Nota 2: el puerto 3306/tcp de MariaDB no se va a ver expuesto a Internet, porque no se va a habilitar en el firewall.&lt;br /&gt;
&lt;br /&gt;
== Habilitar puertos en cortafuegos ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw allow 80/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw allow 443/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Virtual Host de ejemplo ==&lt;br /&gt;
=== Generar certificados autofirmados (temporales) ===&lt;br /&gt;
Estos certificados los vamos a generar sólo para levantar el Virtual Host y los sustituiremos por unos de Let's Encrypt.&lt;br /&gt;
* Generamos clave privada:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /etc/ssl/private&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl genrsa -out selfsigned.key&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Generamos petición de firma (CSR):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
openssl req -key selfsigned.key -new -out selfsigned.csr&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter '.', the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:ES&lt;br /&gt;
State or Province Name (full name) [Some-State]:Madrid&lt;br /&gt;
Locality Name (eg, city) []:Madrid&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:GCV&lt;br /&gt;
Organizational Unit Name (eg, section) []:GCV&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:www.culturetas.net&lt;br /&gt;
Email Address []:&lt;br /&gt;
&lt;br /&gt;
Please enter the following 'extra' attributes&lt;br /&gt;
to be sent with your certificate request&lt;br /&gt;
A challenge password []:&lt;br /&gt;
An optional company name []:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Auto-firmamos con la misma firma:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl x509 -signkey selfsigned.key -in selfsigned.csr -req -days 365 -out selfsigned.crt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Movemos certificados a las carpetas correctas:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv selfsigned.key /etc/ssl/private/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv selfsigned.crt /etc/ssl/certs/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;rm selfsigned.csr&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Referencia: [https://www.baeldung.com/openssl-self-signed-cert https://www.baeldung.com/openssl-self-signed-cert]&lt;br /&gt;
&lt;br /&gt;
=== Dar de alta Virtual Host en Nginx ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/sites-available/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
##&lt;br /&gt;
# You should look at the following URL's in order to grasp a solid understanding&lt;br /&gt;
# of Nginx configuration files in order to fully unleash the power of Nginx.&lt;br /&gt;
# http://wiki.nginx.org/Pitfalls&lt;br /&gt;
# http://wiki.nginx.org/QuickStart&lt;br /&gt;
# http://wiki.nginx.org/Configuration&lt;br /&gt;
#&lt;br /&gt;
# Generally, you will want to move this file somewhere, and start with a clean&lt;br /&gt;
# file but keep this around for reference. Or just disable in sites-enabled.&lt;br /&gt;
#&lt;br /&gt;
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
# Default server configuration&lt;br /&gt;
#&lt;br /&gt;
server {&lt;br /&gt;
        # Redirect HTTP to HTTPS&lt;br /&gt;
        listen 80 default_server;&lt;br /&gt;
        listen [::]:80 default_server;&lt;br /&gt;
        server_name www.culturetas.net culturetas.net;&lt;br /&gt;
        # Redirect HTTP to HTTPS&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
        # SSL configuration&lt;br /&gt;
        #&lt;br /&gt;
        listen 443 ssl http2 default_server;&lt;br /&gt;
        listen [::]:443 ssl http2 default_server;&lt;br /&gt;
        ssl_certificate /etc/ssl/certs/selfsigned.crt;&lt;br /&gt;
        ssl_certificate_key /etc/ssl/private/selfsigned.key;&lt;br /&gt;
        #&lt;br /&gt;
        # Note: You should disable gzip for SSL traffic.&lt;br /&gt;
        # See: https://bugs.debian.org/773332&lt;br /&gt;
        #&lt;br /&gt;
        # Read up on ssl_ciphers to ensure a secure configuration.&lt;br /&gt;
        # See: https://bugs.debian.org/765782&lt;br /&gt;
        #&lt;br /&gt;
        # Self signed certs generated by the ssl-cert package&lt;br /&gt;
        # Don't use them in a production server!&lt;br /&gt;
        #&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&lt;br /&gt;
        root /var/www/culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        # Add index.php to the list if you are using PHP&lt;br /&gt;
        index index.php index.html index.htm;&lt;br /&gt;
&lt;br /&gt;
        server_name www.culturetas.net culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        access_log /var/log/nginx/culturetas.net-access.log;&lt;br /&gt;
        error_log /var/log/nginx/culturetas.net-error.log;&lt;br /&gt;
&lt;br /&gt;
#       # Auth Basic (for developing)&lt;br /&gt;
#       auth_basic &amp;quot;Pagina Restringida&amp;quot;;&lt;br /&gt;
#       auth_basic_user_file /etc/nginx/passwd/passwd-culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        # Activate HSTS (HTTP Strict Transport Security)&lt;br /&gt;
        # Note: reinclude if in a location a header is set&lt;br /&gt;
        include snippets/hsts.conf;&lt;br /&gt;
&lt;br /&gt;
        # Allow favicon.ico, robots.txt, .well-known/&lt;br /&gt;
        # Deny *.txt, *.log, .*/*.php, .*, *.json, .lock, *.ht&lt;br /&gt;
        include snippets/allowed.conf;&lt;br /&gt;
        include snippets/denied.conf;&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                # First attempt to serve request as file, then&lt;br /&gt;
                # as directory, then fall back to displaying a 404.&lt;br /&gt;
                #try_files $uri $uri/ =404;&lt;br /&gt;
                try_files $uri $uri/ /index.php?$args;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # pass the PHP scripts to FastCGI server&lt;br /&gt;
        #&lt;br /&gt;
        location ~ \.php$ {&lt;br /&gt;
                include snippets/fastcgi-php.conf;&lt;br /&gt;
&lt;br /&gt;
        #       # With php8.5-cgi alone (TCP Ports):&lt;br /&gt;
        #       fastcgi_pass 127.0.0.1:9000;&lt;br /&gt;
                # With php8.5-fpm (UNIX Socket):&lt;br /&gt;
                fastcgi_pass unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # Disable hidden files&lt;br /&gt;
        location ~ /\. {&lt;br /&gt;
                deny all;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desactivar Virtual Host por defecto ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;rm /etc/nginx/sites-enabled/default&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Activar Virtual Host nuevo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/culturetas.net /etc/nginx/sites-enabled/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar nuevas claves con Let's Encrypt ===&lt;br /&gt;
El certbot de Let's Encrypt ya contiene un plugin que gestiona Nginx.&lt;br /&gt;
Usándolo no sólo nos generará automáticamente las claves y certificados, si no que lo aplicará en el servidor por nosotros.&lt;br /&gt;
Además, también se encargará de la renovación, por lo que desatiende toda esa parte de gestión de certificados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
certbot --nginx&lt;br /&gt;
Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
Enter email address or hit Enter to skip.&lt;br /&gt;
 (Enter 'c' to cancel): admin@ejemplo.com&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Please read the Terms of Service at:&lt;br /&gt;
https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf&lt;br /&gt;
You must agree in order to register with the ACME server. Do you agree?&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
(Y)es/(N)o: Y&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Would you be willing, once your first certificate is successfully issued, to&lt;br /&gt;
share your email address with the Electronic Frontier Foundation, a founding&lt;br /&gt;
partner of the Let's Encrypt project and the non-profit organization that&lt;br /&gt;
develops Certbot? We'd like to send you email about our work encrypting the web,&lt;br /&gt;
EFF news, campaigns, and ways to support digital freedom.&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
(Y)es/(N)o: N&lt;br /&gt;
Account registered.&lt;br /&gt;
&lt;br /&gt;
Which names would you like to activate HTTPS for?&lt;br /&gt;
We recommend selecting either all domains, or all domains in a VirtualHost/server block.&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
1: culturetas.net&lt;br /&gt;
2: www.culturetas.net&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Select the appropriate numbers separated by commas and/or spaces, or leave input&lt;br /&gt;
blank to select all options shown (Enter 'c' to cancel): 1,2&lt;br /&gt;
Requesting a certificate for culturetas.net and www.culturetas.net&lt;br /&gt;
&lt;br /&gt;
Successfully received certificate.&lt;br /&gt;
Certificate is saved at: /etc/letsencrypt/live/culturetas.net/fullchain.pem&lt;br /&gt;
Key is saved at:         /etc/letsencrypt/live/culturetas.net/privkey.pem&lt;br /&gt;
This certificate expires on 2026-05-25.&lt;br /&gt;
These files will be updated when the certificate renews.&lt;br /&gt;
Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
&lt;br /&gt;
Deploying certificate&lt;br /&gt;
Successfully deployed certificate for culturetas.net to /etc/nginx/sites-enabled/culturetas.net&lt;br /&gt;
Successfully deployed certificate for www.culturetas.net to /etc/nginx/sites-enabled/culturetas.net&lt;br /&gt;
Congratulations! You have successfully enabled HTTPS on https://culturetas.net and https://www.culturetas.net&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
If you like Certbot, please consider supporting our work by:&lt;br /&gt;
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate&lt;br /&gt;
 * Donating to EFF:                    https://eff.org/donate-le&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desplegar página de ejemplo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /var/www/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /var/www/culturetas.net/index.html&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;es&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Culturetas.net - En construcción&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;style&amp;gt;&lt;br /&gt;
    body {&lt;br /&gt;
      margin: 0;&lt;br /&gt;
      padding: 0;&lt;br /&gt;
      height: 100vh;&lt;br /&gt;
      font-family: system-ui, -apple-system, sans-serif;&lt;br /&gt;
      background: linear-gradient(135deg, #1e3a8a 0%, #3b82f6 100%);&lt;br /&gt;
      color: white;&lt;br /&gt;
      display: flex;&lt;br /&gt;
      flex-direction: column;&lt;br /&gt;
      align-items: center;&lt;br /&gt;
      justify-content: center;&lt;br /&gt;
      text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .container {&lt;br /&gt;
      max-width: 700px;&lt;br /&gt;
      padding: 20px;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    h1 {&lt;br /&gt;
      font-size: 4.5rem;&lt;br /&gt;
      margin: 0.2em 0;&lt;br /&gt;
      font-weight: 800;&lt;br /&gt;
      letter-spacing: -1px;&lt;br /&gt;
      text-shadow: 0 4px 12px rgba(0,0,0,0.3);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .subtitle {&lt;br /&gt;
      font-size: 1.6rem;&lt;br /&gt;
      margin: 0.8em 0 1.5em;&lt;br /&gt;
      opacity: 0.95;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .construction {&lt;br /&gt;
      font-size: 8rem;&lt;br /&gt;
      margin: 0.3em 0;&lt;br /&gt;
      animation: bounce 3s infinite;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    p {&lt;br /&gt;
      font-size: 1.3rem;&lt;br /&gt;
      line-height: 1.6;&lt;br /&gt;
      max-width: 600px;&lt;br /&gt;
      margin: 1.5em auto;&lt;br /&gt;
      opacity: 0.9;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .soon {&lt;br /&gt;
      font-size: 2rem;&lt;br /&gt;
      font-weight: bold;&lt;br /&gt;
      margin-top: 2rem;&lt;br /&gt;
      color: #fef08a;&lt;br /&gt;
      text-shadow: 0 2px 10px rgba(0,0,0,0.4);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @keyframes bounce {&lt;br /&gt;
      0%, 20%, 50%, 80%, 100% { transform: translateY(0); }&lt;br /&gt;
      40% { transform: translateY(-25px); }&lt;br /&gt;
      60% { transform: translateY(-12px); }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @media (max-width: 600px) {&lt;br /&gt;
      h1 { font-size: 3.2rem; }&lt;br /&gt;
      .construction { font-size: 6rem; }&lt;br /&gt;
      .subtitle { font-size: 1.3rem; }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;construction&amp;quot;&amp;gt;🚧&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Culturetas.net&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;subtitle&amp;quot;&amp;gt;Está en construcción&amp;lt;/div&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Estamos trabajando para traerte un espacio mucho más bonito, rápido y con mucho más contenido cultural interesante.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;¡Vuelve en unos días y te sorprenderás!&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;div class=&amp;quot;soon&amp;quot;&amp;gt;Próximamente... ✨&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=LEMP&amp;diff=191</id>
		<title>LEMP</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=LEMP&amp;diff=191"/>
		<updated>2026-04-18T20:00:55Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación servidor LEMP ==&lt;br /&gt;
Instalaremos:&lt;br /&gt;
* GNU Linux (Ubuntu Server 24.04)&lt;br /&gt;
* eNginx 1.24.0 (APT Ubuntu)&lt;br /&gt;
* MariaDB 10.8 (Repo oficiales de MariaDB)&lt;br /&gt;
* PHP 8.5 (PPA ondrej/php)&lt;br /&gt;
&lt;br /&gt;
== Permisos de root ==&lt;br /&gt;
Todos los comandos en esta guía se realizarán como root.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación Nginx (Stable) ==&lt;br /&gt;
* Actualizar repositorio&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar Nginx&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalación Apache Utils&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install apache2-utils&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación MariaDB ==&lt;br /&gt;
* Instalar requisitos&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install apt-transport-https curl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Añadir repositorios MariaDB (oficiales)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir -p /etc/apt/keyrings&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/apt/sources.list.d/mariadb.sources&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# MariaDB 11.8 repository list - created 2026-02-23 08:31 UTC&lt;br /&gt;
# https://mariadb.org/download/&lt;br /&gt;
X-Repolib-Name: MariaDB&lt;br /&gt;
Types: deb&lt;br /&gt;
# deb.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.&lt;br /&gt;
# URIs: https://deb.mariadb.org/11.8/ubuntu&lt;br /&gt;
URIs: https://mirror.raiolanetworks.com/mariadb/repo/11.8/ubuntu&lt;br /&gt;
Suites: noble&lt;br /&gt;
Components: main main/debug&lt;br /&gt;
Signed-By: /etc/apt/keyrings/mariadb-keyring.pgp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Actualizar repositorio&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalación de servidor y cliente&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install mariadb-client mariadb-server mariadb-plugin-provider-bzip2 mariadb-plugin-provider-lz4 mariadb-plugin-provider-lzma mariadb-plugin-provider-lzo mariadb-plugin-provider-snappy&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Inicializar base de datos&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mysql_secure_installation&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB&lt;br /&gt;
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!&lt;br /&gt;
&lt;br /&gt;
In order to log into MariaDB to secure it, we'll need the current&lt;br /&gt;
password for the root user. If you've just installed MariaDB, and&lt;br /&gt;
haven't set the root password yet, you should just press enter here.&lt;br /&gt;
&lt;br /&gt;
Enter current password for root (enter for none):&lt;br /&gt;
OK, successfully used password, moving on...&lt;br /&gt;
&lt;br /&gt;
Setting the root password or using the unix_socket ensures that nobody&lt;br /&gt;
can log into the MariaDB root user without the proper authorisation.&lt;br /&gt;
&lt;br /&gt;
You already have your root account protected, so you can safely answer 'n'.&lt;br /&gt;
&lt;br /&gt;
Switch to unix_socket authentication [Y/n] n&lt;br /&gt;
 ... skipping.&lt;br /&gt;
&lt;br /&gt;
You already have your root account protected, so you can safely answer 'n'.&lt;br /&gt;
&lt;br /&gt;
Change the root password? [Y/n] y&lt;br /&gt;
New password:&lt;br /&gt;
Re-enter new password:&lt;br /&gt;
Password updated successfully!&lt;br /&gt;
Reloading privilege tables..&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By default, a MariaDB installation has an anonymous user, allowing anyone&lt;br /&gt;
to log into MariaDB without having to have a user account created for&lt;br /&gt;
them.  This is intended only for testing, and to make the installation&lt;br /&gt;
go a bit smoother.  You should remove them before moving into a&lt;br /&gt;
production environment.&lt;br /&gt;
&lt;br /&gt;
Remove anonymous users? [Y/n] y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Normally, root should only be allowed to connect from 'localhost'.  This&lt;br /&gt;
ensures that someone cannot guess at the root password from the network.&lt;br /&gt;
&lt;br /&gt;
Disallow root login remotely? [Y/n] Y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
By default, MariaDB comes with a database named 'test' that anyone can&lt;br /&gt;
access.  This is also intended only for testing, and should be removed&lt;br /&gt;
before moving into a production environment.&lt;br /&gt;
&lt;br /&gt;
Remove test database and access to it? [Y/n] Y&lt;br /&gt;
 - Dropping test database...&lt;br /&gt;
 ... Success!&lt;br /&gt;
 - Removing privileges on test database...&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Reloading the privilege tables will ensure that all changes made so far&lt;br /&gt;
will take effect immediately.&lt;br /&gt;
&lt;br /&gt;
Reload privilege tables now? [Y/n] Y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Cleaning up...&lt;br /&gt;
&lt;br /&gt;
All done!  If you've completed all of the above steps, your MariaDB&lt;br /&gt;
installation should now be secure.&lt;br /&gt;
&lt;br /&gt;
Thanks for using MariaDB!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación PHP ==&lt;br /&gt;
Vamos a usar los repositorios PPA de ondrej/php&lt;br /&gt;
&lt;br /&gt;
* Instalar repositorio PPA&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;add-apt-repository ppa:ondrej/php&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Actualizar repositorios&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar PHP 8.5&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install php8.5 php8.5-apcu php8.5-common php8.5-fpm php8.5-curl php8.5-gd php8.5-mysql php8.5-xml php8.5-xmlrpc php8.5-bz2 php8.5-imap php8.5-intl php8.5-mbstring php8.5-soap php8.5-gnupg php8.5-imagick php8.5-mcrypt php8.5-zip&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación Let's Encrypt ==&lt;br /&gt;
Vamos a usar Let's Encrypt para generar las claves y certificados usadas para comunicaciones HTTPS.&lt;br /&gt;
&lt;br /&gt;
* Instalar Snap Core&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap install core&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Refrescar Snap Core&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap refresh core&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar Certbot&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap install --classic certbot&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear enlace simbólico&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /snap/bin/certbot /usr/local/bin/certbot&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Comprobar que está activada el timer de renovación&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl list-timers | grep certbot&lt;br /&gt;
Mon 2026-02-23 11:47:00 UTC      12h -                                      - snap.certbot.renew.timer       snap.certbot.renew.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración PHP ==&lt;br /&gt;
* Configuración php-fpm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/php/8.5/fpm/php.ini&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum amount of memory a script may consume&lt;br /&gt;
; https://php.net/memory-limit&lt;br /&gt;
memory_limit = 128M&lt;br /&gt;
max_memory_limit = -1&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum size of POST data that PHP will accept.&lt;br /&gt;
; Its value may be 0 to disable the limit. It is ignored if POST data reading&lt;br /&gt;
; is disabled through enable_post_data_reading.&lt;br /&gt;
; https://php.net/post-max-size&lt;br /&gt;
post_max_size = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's&lt;br /&gt;
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok&lt;br /&gt;
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting&lt;br /&gt;
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting&lt;br /&gt;
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts&lt;br /&gt;
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.&lt;br /&gt;
; https://php.net/cgi.fix-pathinfo&lt;br /&gt;
cgi.fix_pathinfo=0&lt;br /&gt;
[...]&lt;br /&gt;
; Whether to allow HTTP file uploads.&lt;br /&gt;
; https://php.net/file-uploads&lt;br /&gt;
file_uploads = On&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum allowed size for uploaded files.&lt;br /&gt;
; https://php.net/upload-max-filesize&lt;br /&gt;
upload_max_filesize = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum number of files that can be uploaded via a single request&lt;br /&gt;
max_file_uploads = 20&lt;br /&gt;
[...]&lt;br /&gt;
[Session]&lt;br /&gt;
; Handler used to store/retrieve data.&lt;br /&gt;
; https://php.net/session.save-handler&lt;br /&gt;
session.save_handler = files&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configuración php-cli:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/php/8.5/cli/php.ini&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum amount of memory a script may consume&lt;br /&gt;
; https://php.net/memory-limit&lt;br /&gt;
memory_limit = -1&lt;br /&gt;
max_memory_limit = -1&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum size of POST data that PHP will accept.&lt;br /&gt;
; Its value may be 0 to disable the limit. It is ignored if POST data reading&lt;br /&gt;
; is disabled through enable_post_data_reading.&lt;br /&gt;
; https://php.net/post-max-size&lt;br /&gt;
post_max_size = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's&lt;br /&gt;
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok&lt;br /&gt;
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting&lt;br /&gt;
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting&lt;br /&gt;
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts&lt;br /&gt;
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.&lt;br /&gt;
; https://php.net/cgi.fix-pathinfo&lt;br /&gt;
cgi.fix_pathinfo=0&lt;br /&gt;
[...]&lt;br /&gt;
; Whether to allow HTTP file uploads.&lt;br /&gt;
; https://php.net/file-uploads&lt;br /&gt;
file_uploads = On&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum allowed size for uploaded files.&lt;br /&gt;
; https://php.net/upload-max-filesize&lt;br /&gt;
upload_max_filesize = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum number of files that can be uploaded via a single request&lt;br /&gt;
max_file_uploads = 20&lt;br /&gt;
[...]&lt;br /&gt;
[Session]&lt;br /&gt;
; Handler used to store/retrieve data.&lt;br /&gt;
; https://php.net/session.save-handler&lt;br /&gt;
session.save_handler = files&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar php-fpm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart php8.5-fpm.service&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración Nginx ==&lt;br /&gt;
* Backup nginx.conf&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cp -a /etc/nginx/nginx.conf /etc/nginx/nginx.conf.$(date +%Y%m%d)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Editar nginx.conf&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/nginx.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
http {&lt;br /&gt;
        ##&lt;br /&gt;
        # Basic Settings&lt;br /&gt;
        ##&lt;br /&gt;
        sendfile on;&lt;br /&gt;
        tcp_nopush on;&lt;br /&gt;
        types_hash_max_size 2048;&lt;br /&gt;
        client_max_body_size 100M;&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
[...]&lt;br /&gt;
        ##&lt;br /&gt;
        # SSL Settings&lt;br /&gt;
        ##&lt;br /&gt;
        #ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE&lt;br /&gt;
        ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
        ssl_prefer_server_ciphers on;&lt;br /&gt;
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;&lt;br /&gt;
[...]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Generar PHParam:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /etc/nginx/ssl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar contraseñas:&lt;br /&gt;
Si se quiere configurar contraseñas Auth Basic se almacenan en /etc/nginx/passwd.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /etc/nginx/passwd&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;htpasswd -c -B /etc/nginx/passwd/test.pw guzman&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar snippets:&lt;br /&gt;
Estos &amp;quot;fragmentos&amp;quot; se pueden usar para permitir que sistemas funcionen si se tiene Auth Basic activo (como robots.txt o validación de Let's Encrypt).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/allowed.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Allow favicon.ico, robots.txt, .well-known/&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
        access_log off;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Allow robots.txt&lt;br /&gt;
location = /robots.txt {&lt;br /&gt;
        allow all;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
        access_log off;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Allow &amp;quot;Well-Known URIs&amp;quot; as pwe RFC 5785 (e.g. Let's Encrypt)&lt;br /&gt;
location ~* ^/.well-known/ {&lt;br /&gt;
        auth_basic off;&lt;br /&gt;
        allow all;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/denied.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Deny *.txt, *.log, .*/*.php, .*, *.json, .lock, *.ht&lt;br /&gt;
&lt;br /&gt;
# Not allow txt or logs to be downloaded&lt;br /&gt;
location ~* \.(txt|log)$ {&lt;br /&gt;
        deny all;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow execute php in hidden folders&lt;br /&gt;
location ~ \..*/.\.php$ {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow &amp;quot;hidden files&amp;quot;&lt;br /&gt;
location ~ (^|/)\. {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow *.json or *.lock&lt;br /&gt;
location ~* \.(json|lock)$ {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Deny *.ht&lt;br /&gt;
location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/hsts.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Activate HSTS (HTTP Strict Transport Security)&lt;br /&gt;
# Note: if we set another header in a location we've to&lt;br /&gt;
#       rewrite it&lt;br /&gt;
add_header Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot; always;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar sites-available:&lt;br /&gt;
En al carpeta /etc/nginx/sites-available/ se almacenan todos los Virtual Hosts disponibles.&lt;br /&gt;
En Nginx hay que personalizar cada uno por cada tipo de aplicación.&lt;br /&gt;
Hay que tener en cuenta las diferentes URL's.&lt;br /&gt;
&lt;br /&gt;
* Configurar sites-enabled:&lt;br /&gt;
Se suelen configurar enlaces simbólicos con la carpeta sites-available para activarlos.&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar Nginx:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración MariaDB ==&lt;br /&gt;
* Conectar a MariaDB&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mariadb&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Opción 1: Permitir conexiones por TCP (sólo desde localhost)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Sql&amp;quot;&amp;gt;&lt;br /&gt;
grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Opción 2: Permitir conexiones por Sockets UNIX (sólo desde localhost)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Sql&amp;quot;&amp;gt;&lt;br /&gt;
grant all privileges on *.* to 'root'@'localhost' identified via unix_socket with grant option;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nota: esta opción es la que suelo usar yo (no se pueden usar los dos a la vez).&lt;br /&gt;
&lt;br /&gt;
* Habilitar conexiones remotas&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
vi /etc/mysql/mariadb.conf.d/50-server.cnf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
# Instead of skip-networking the default is now to listen only on&lt;br /&gt;
# localhost which is more compatible and is not less secure.&lt;br /&gt;
#bind-address            = 127.0.0.1&lt;br /&gt;
bind-address            = 0.0.0.0&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl restart mariadb.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 1: vamos a necesitar deshabilitar el Bind Address para los contenedores de [[Docker Engine]].&lt;br /&gt;
&lt;br /&gt;
Nota 2: el puerto 3306/tcp de MariaDB no se va a ver expuesto a Internet, porque no se va a habilitar en el firewall.&lt;br /&gt;
&lt;br /&gt;
== Habilitar puertos en cortafuegos ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw allow 80/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw allow 443/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Virtual Host de ejemplo ==&lt;br /&gt;
=== Generar certificados autofirmados (temporales) ===&lt;br /&gt;
Estos certificados los vamos a generar sólo para levantar el Virtual Host y los sustituiremos por unos de Let's Encrypt.&lt;br /&gt;
* Generamos clave privada:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /etc/ssl/private&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl genrsa -out selfsigned.key&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Generamos petición de firma (CSR):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
openssl req -key selfsigned.key -new -out selfsigned.csr&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter '.', the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:ES&lt;br /&gt;
State or Province Name (full name) [Some-State]:Madrid&lt;br /&gt;
Locality Name (eg, city) []:Madrid&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:GCV&lt;br /&gt;
Organizational Unit Name (eg, section) []:GCV&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:www.culturetas.net&lt;br /&gt;
Email Address []:&lt;br /&gt;
&lt;br /&gt;
Please enter the following 'extra' attributes&lt;br /&gt;
to be sent with your certificate request&lt;br /&gt;
A challenge password []:&lt;br /&gt;
An optional company name []:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Auto-firmamos con la misma firma:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl x509 -signkey selfsigned.key -in selfsigned.csr -req -days 365 -out selfsigned.crt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Movemos certificados a las carpetas correctas:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv selfsigned.key /etc/ssl/private/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv selfsigned.crt /etc/ssl/certs/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;rm selfsigned.csr&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Damos permisos a los certificados:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod 644 /etc/ssl/private/selfsigned.key&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod 644 /etc/ssl/certs/selfsigned.crt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Referencia: [https://www.baeldung.com/openssl-self-signed-cert https://www.baeldung.com/openssl-self-signed-cert]&lt;br /&gt;
&lt;br /&gt;
=== Dar de alta Virtual Host en Nginx ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/sites-available/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
##&lt;br /&gt;
# You should look at the following URL's in order to grasp a solid understanding&lt;br /&gt;
# of Nginx configuration files in order to fully unleash the power of Nginx.&lt;br /&gt;
# http://wiki.nginx.org/Pitfalls&lt;br /&gt;
# http://wiki.nginx.org/QuickStart&lt;br /&gt;
# http://wiki.nginx.org/Configuration&lt;br /&gt;
#&lt;br /&gt;
# Generally, you will want to move this file somewhere, and start with a clean&lt;br /&gt;
# file but keep this around for reference. Or just disable in sites-enabled.&lt;br /&gt;
#&lt;br /&gt;
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
# Default server configuration&lt;br /&gt;
#&lt;br /&gt;
server {&lt;br /&gt;
        # Redirect HTTP to HTTPS&lt;br /&gt;
        listen 80 default_server;&lt;br /&gt;
        listen [::]:80 default_server;&lt;br /&gt;
        server_name www.culturetas.net culturetas.net;&lt;br /&gt;
        # Redirect HTTP to HTTPS&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
        # SSL configuration&lt;br /&gt;
        #&lt;br /&gt;
        listen 443 ssl http2 default_server;&lt;br /&gt;
        listen [::]:443 ssl http2 default_server;&lt;br /&gt;
        ssl_certificate /etc/ssl/certs/selfsigned.crt;&lt;br /&gt;
        ssl_certificate_key /etc/ssl/private/selfsigned.key;&lt;br /&gt;
        #&lt;br /&gt;
        # Note: You should disable gzip for SSL traffic.&lt;br /&gt;
        # See: https://bugs.debian.org/773332&lt;br /&gt;
        #&lt;br /&gt;
        # Read up on ssl_ciphers to ensure a secure configuration.&lt;br /&gt;
        # See: https://bugs.debian.org/765782&lt;br /&gt;
        #&lt;br /&gt;
        # Self signed certs generated by the ssl-cert package&lt;br /&gt;
        # Don't use them in a production server!&lt;br /&gt;
        #&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&lt;br /&gt;
        root /var/www/culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        # Add index.php to the list if you are using PHP&lt;br /&gt;
        index index.php index.html index.htm;&lt;br /&gt;
&lt;br /&gt;
        server_name www.culturetas.net culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        access_log /var/log/nginx/culturetas.net-access.log;&lt;br /&gt;
        error_log /var/log/nginx/culturetas.net-error.log;&lt;br /&gt;
&lt;br /&gt;
#       # Auth Basic (for developing)&lt;br /&gt;
#       auth_basic &amp;quot;Pagina Restringida&amp;quot;;&lt;br /&gt;
#       auth_basic_user_file /etc/nginx/passwd/passwd-culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        # Activate HSTS (HTTP Strict Transport Security)&lt;br /&gt;
        # Note: reinclude if in a location a header is set&lt;br /&gt;
        include snippets/hsts.conf;&lt;br /&gt;
&lt;br /&gt;
        # Allow favicon.ico, robots.txt, .well-known/&lt;br /&gt;
        # Deny *.txt, *.log, .*/*.php, .*, *.json, .lock, *.ht&lt;br /&gt;
        include snippets/allowed.conf;&lt;br /&gt;
        include snippets/denied.conf;&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                # First attempt to serve request as file, then&lt;br /&gt;
                # as directory, then fall back to displaying a 404.&lt;br /&gt;
                #try_files $uri $uri/ =404;&lt;br /&gt;
                try_files $uri $uri/ /index.php?$args;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # pass the PHP scripts to FastCGI server&lt;br /&gt;
        #&lt;br /&gt;
        location ~ \.php$ {&lt;br /&gt;
                include snippets/fastcgi-php.conf;&lt;br /&gt;
&lt;br /&gt;
        #       # With php8.5-cgi alone (TCP Ports):&lt;br /&gt;
        #       fastcgi_pass 127.0.0.1:9000;&lt;br /&gt;
                # With php8.5-fpm (UNIX Socket):&lt;br /&gt;
                fastcgi_pass unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # Disable hidden files&lt;br /&gt;
        location ~ /\. {&lt;br /&gt;
                deny all;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desactivar Virtual Host por defecto ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;rm /etc/nginx/sites-enabled/default&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Activar Virtual Host nuevo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/culturetas.net /etc/nginx/sites-enabled/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar nuevas claves con Let's Encrypt ===&lt;br /&gt;
El certbot de Let's Encrypt ya contiene un plugin que gestiona Nginx.&lt;br /&gt;
Usándolo no sólo nos generará automáticamente las claves y certificados, si no que lo aplicará en el servidor por nosotros.&lt;br /&gt;
Además, también se encargará de la renovación, por lo que desatiende toda esa parte de gestión de certificados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
certbot --nginx&lt;br /&gt;
Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
Enter email address or hit Enter to skip.&lt;br /&gt;
 (Enter 'c' to cancel): admin@ejemplo.com&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Please read the Terms of Service at:&lt;br /&gt;
https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf&lt;br /&gt;
You must agree in order to register with the ACME server. Do you agree?&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
(Y)es/(N)o: Y&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Would you be willing, once your first certificate is successfully issued, to&lt;br /&gt;
share your email address with the Electronic Frontier Foundation, a founding&lt;br /&gt;
partner of the Let's Encrypt project and the non-profit organization that&lt;br /&gt;
develops Certbot? We'd like to send you email about our work encrypting the web,&lt;br /&gt;
EFF news, campaigns, and ways to support digital freedom.&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
(Y)es/(N)o: N&lt;br /&gt;
Account registered.&lt;br /&gt;
&lt;br /&gt;
Which names would you like to activate HTTPS for?&lt;br /&gt;
We recommend selecting either all domains, or all domains in a VirtualHost/server block.&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
1: culturetas.net&lt;br /&gt;
2: www.culturetas.net&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Select the appropriate numbers separated by commas and/or spaces, or leave input&lt;br /&gt;
blank to select all options shown (Enter 'c' to cancel): 1,2&lt;br /&gt;
Requesting a certificate for culturetas.net and www.culturetas.net&lt;br /&gt;
&lt;br /&gt;
Successfully received certificate.&lt;br /&gt;
Certificate is saved at: /etc/letsencrypt/live/culturetas.net/fullchain.pem&lt;br /&gt;
Key is saved at:         /etc/letsencrypt/live/culturetas.net/privkey.pem&lt;br /&gt;
This certificate expires on 2026-05-25.&lt;br /&gt;
These files will be updated when the certificate renews.&lt;br /&gt;
Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
&lt;br /&gt;
Deploying certificate&lt;br /&gt;
Successfully deployed certificate for culturetas.net to /etc/nginx/sites-enabled/culturetas.net&lt;br /&gt;
Successfully deployed certificate for www.culturetas.net to /etc/nginx/sites-enabled/culturetas.net&lt;br /&gt;
Congratulations! You have successfully enabled HTTPS on https://culturetas.net and https://www.culturetas.net&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
If you like Certbot, please consider supporting our work by:&lt;br /&gt;
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate&lt;br /&gt;
 * Donating to EFF:                    https://eff.org/donate-le&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desplegar página de ejemplo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /var/www/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /var/www/culturetas.net/index.html&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;es&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Culturetas.net - En construcción&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;style&amp;gt;&lt;br /&gt;
    body {&lt;br /&gt;
      margin: 0;&lt;br /&gt;
      padding: 0;&lt;br /&gt;
      height: 100vh;&lt;br /&gt;
      font-family: system-ui, -apple-system, sans-serif;&lt;br /&gt;
      background: linear-gradient(135deg, #1e3a8a 0%, #3b82f6 100%);&lt;br /&gt;
      color: white;&lt;br /&gt;
      display: flex;&lt;br /&gt;
      flex-direction: column;&lt;br /&gt;
      align-items: center;&lt;br /&gt;
      justify-content: center;&lt;br /&gt;
      text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .container {&lt;br /&gt;
      max-width: 700px;&lt;br /&gt;
      padding: 20px;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    h1 {&lt;br /&gt;
      font-size: 4.5rem;&lt;br /&gt;
      margin: 0.2em 0;&lt;br /&gt;
      font-weight: 800;&lt;br /&gt;
      letter-spacing: -1px;&lt;br /&gt;
      text-shadow: 0 4px 12px rgba(0,0,0,0.3);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .subtitle {&lt;br /&gt;
      font-size: 1.6rem;&lt;br /&gt;
      margin: 0.8em 0 1.5em;&lt;br /&gt;
      opacity: 0.95;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .construction {&lt;br /&gt;
      font-size: 8rem;&lt;br /&gt;
      margin: 0.3em 0;&lt;br /&gt;
      animation: bounce 3s infinite;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    p {&lt;br /&gt;
      font-size: 1.3rem;&lt;br /&gt;
      line-height: 1.6;&lt;br /&gt;
      max-width: 600px;&lt;br /&gt;
      margin: 1.5em auto;&lt;br /&gt;
      opacity: 0.9;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .soon {&lt;br /&gt;
      font-size: 2rem;&lt;br /&gt;
      font-weight: bold;&lt;br /&gt;
      margin-top: 2rem;&lt;br /&gt;
      color: #fef08a;&lt;br /&gt;
      text-shadow: 0 2px 10px rgba(0,0,0,0.4);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @keyframes bounce {&lt;br /&gt;
      0%, 20%, 50%, 80%, 100% { transform: translateY(0); }&lt;br /&gt;
      40% { transform: translateY(-25px); }&lt;br /&gt;
      60% { transform: translateY(-12px); }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @media (max-width: 600px) {&lt;br /&gt;
      h1 { font-size: 3.2rem; }&lt;br /&gt;
      .construction { font-size: 6rem; }&lt;br /&gt;
      .subtitle { font-size: 1.3rem; }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;construction&amp;quot;&amp;gt;🚧&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Culturetas.net&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;subtitle&amp;quot;&amp;gt;Está en construcción&amp;lt;/div&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Estamos trabajando para traerte un espacio mucho más bonito, rápido y con mucho más contenido cultural interesante.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;¡Vuelve en unos días y te sorprenderás!&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;div class=&amp;quot;soon&amp;quot;&amp;gt;Próximamente... ✨&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=LEMP&amp;diff=189</id>
		<title>LEMP</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=LEMP&amp;diff=189"/>
		<updated>2026-04-18T18:57:10Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación servidor LEMP ==&lt;br /&gt;
Instalaremos:&lt;br /&gt;
* GNU Linux (Ubuntu Server 24.04)&lt;br /&gt;
* eNginx 1.24.0 (APT Ubuntu)&lt;br /&gt;
* MariaDB 10.8 (Repo oficiales de MariaDB)&lt;br /&gt;
* PHP 8.5 (PPA ondrej/php)&lt;br /&gt;
&lt;br /&gt;
== Permisos de root ==&lt;br /&gt;
Todos los comandos en esta guía se realizarán como root.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación Nginx (Stable) ==&lt;br /&gt;
* Actualizar repositorio&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar Nginx&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalación Apache Utils&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install apache2-utils&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación MariaDB ==&lt;br /&gt;
* Instalar requisitos&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install apt-transport-https curl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Añadir repositorios MariaDB (oficiales)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir -p /etc/apt/keyrings&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/apt/sources.list.d/mariadb.sources&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# MariaDB 11.8 repository list - created 2026-02-23 08:31 UTC&lt;br /&gt;
# https://mariadb.org/download/&lt;br /&gt;
X-Repolib-Name: MariaDB&lt;br /&gt;
Types: deb&lt;br /&gt;
# deb.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.&lt;br /&gt;
# URIs: https://deb.mariadb.org/11.8/ubuntu&lt;br /&gt;
URIs: https://mirror.raiolanetworks.com/mariadb/repo/11.8/ubuntu&lt;br /&gt;
Suites: noble&lt;br /&gt;
Components: main main/debug&lt;br /&gt;
Signed-By: /etc/apt/keyrings/mariadb-keyring.pgp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Actualizar repositorio&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalación de servidor y cliente&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install mariadb-client mariadb-server mariadb-plugin-provider-bzip2 mariadb-plugin-provider-lz4 mariadb-plugin-provider-lzma mariadb-plugin-provider-lzo mariadb-plugin-provider-snappy&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Inicializar base de datos&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mysql_secure_installation&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB&lt;br /&gt;
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!&lt;br /&gt;
&lt;br /&gt;
In order to log into MariaDB to secure it, we'll need the current&lt;br /&gt;
password for the root user. If you've just installed MariaDB, and&lt;br /&gt;
haven't set the root password yet, you should just press enter here.&lt;br /&gt;
&lt;br /&gt;
Enter current password for root (enter for none):&lt;br /&gt;
OK, successfully used password, moving on...&lt;br /&gt;
&lt;br /&gt;
Setting the root password or using the unix_socket ensures that nobody&lt;br /&gt;
can log into the MariaDB root user without the proper authorisation.&lt;br /&gt;
&lt;br /&gt;
You already have your root account protected, so you can safely answer 'n'.&lt;br /&gt;
&lt;br /&gt;
Switch to unix_socket authentication [Y/n] n&lt;br /&gt;
 ... skipping.&lt;br /&gt;
&lt;br /&gt;
You already have your root account protected, so you can safely answer 'n'.&lt;br /&gt;
&lt;br /&gt;
Change the root password? [Y/n] y&lt;br /&gt;
New password:&lt;br /&gt;
Re-enter new password:&lt;br /&gt;
Password updated successfully!&lt;br /&gt;
Reloading privilege tables..&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By default, a MariaDB installation has an anonymous user, allowing anyone&lt;br /&gt;
to log into MariaDB without having to have a user account created for&lt;br /&gt;
them.  This is intended only for testing, and to make the installation&lt;br /&gt;
go a bit smoother.  You should remove them before moving into a&lt;br /&gt;
production environment.&lt;br /&gt;
&lt;br /&gt;
Remove anonymous users? [Y/n] y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Normally, root should only be allowed to connect from 'localhost'.  This&lt;br /&gt;
ensures that someone cannot guess at the root password from the network.&lt;br /&gt;
&lt;br /&gt;
Disallow root login remotely? [Y/n] Y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
By default, MariaDB comes with a database named 'test' that anyone can&lt;br /&gt;
access.  This is also intended only for testing, and should be removed&lt;br /&gt;
before moving into a production environment.&lt;br /&gt;
&lt;br /&gt;
Remove test database and access to it? [Y/n] Y&lt;br /&gt;
 - Dropping test database...&lt;br /&gt;
 ... Success!&lt;br /&gt;
 - Removing privileges on test database...&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Reloading the privilege tables will ensure that all changes made so far&lt;br /&gt;
will take effect immediately.&lt;br /&gt;
&lt;br /&gt;
Reload privilege tables now? [Y/n] Y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Cleaning up...&lt;br /&gt;
&lt;br /&gt;
All done!  If you've completed all of the above steps, your MariaDB&lt;br /&gt;
installation should now be secure.&lt;br /&gt;
&lt;br /&gt;
Thanks for using MariaDB!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación PHP ==&lt;br /&gt;
Vamos a usar los repositorios PPA de ondrej/php&lt;br /&gt;
&lt;br /&gt;
* Instalar repositorio PPA&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;add-apt-repository ppa:ondrej/php&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Actualizar repositorios&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar PHP 8.5&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install php8.5 php8.5-apcu php8.5-common php8.5-fpm php8.5-curl php8.5-gd php8.5-mysql php8.5-xml php8.5-xmlrpc php8.5-bz2 php8.5-imap php8.5-intl php8.5-mbstring php8.5-soap php8.5-gnupg php8.5-imagick php8.5-mcrypt php8.5-zip&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación Let's Encrypt ==&lt;br /&gt;
Vamos a usar Let's Encrypt para generar las claves y certificados usadas para comunicaciones HTTPS.&lt;br /&gt;
&lt;br /&gt;
* Instalar Snap Core&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap install core&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Refrescar Snap Core&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap refresh core&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar Certbot&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap install --classic certbot&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear enlace simbólico&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /snap/bin/certbot /usr/local/bin/certbot&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Comprobar que está activada el timer de renovación&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl list-timers | grep certbot&lt;br /&gt;
Mon 2026-02-23 11:47:00 UTC      12h -                                      - snap.certbot.renew.timer       snap.certbot.renew.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración PHP ==&lt;br /&gt;
* Configuración php-fpm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/php/8.5/fpm/php.ini&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum amount of memory a script may consume&lt;br /&gt;
; https://php.net/memory-limit&lt;br /&gt;
memory_limit = 128M&lt;br /&gt;
max_memory_limit = -1&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum size of POST data that PHP will accept.&lt;br /&gt;
; Its value may be 0 to disable the limit. It is ignored if POST data reading&lt;br /&gt;
; is disabled through enable_post_data_reading.&lt;br /&gt;
; https://php.net/post-max-size&lt;br /&gt;
post_max_size = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's&lt;br /&gt;
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok&lt;br /&gt;
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting&lt;br /&gt;
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting&lt;br /&gt;
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts&lt;br /&gt;
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.&lt;br /&gt;
; https://php.net/cgi.fix-pathinfo&lt;br /&gt;
cgi.fix_pathinfo=0&lt;br /&gt;
[...]&lt;br /&gt;
; Whether to allow HTTP file uploads.&lt;br /&gt;
; https://php.net/file-uploads&lt;br /&gt;
file_uploads = On&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum allowed size for uploaded files.&lt;br /&gt;
; https://php.net/upload-max-filesize&lt;br /&gt;
upload_max_filesize = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum number of files that can be uploaded via a single request&lt;br /&gt;
max_file_uploads = 20&lt;br /&gt;
[...]&lt;br /&gt;
[Session]&lt;br /&gt;
; Handler used to store/retrieve data.&lt;br /&gt;
; https://php.net/session.save-handler&lt;br /&gt;
session.save_handler = files&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configuración php-cli:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/php/8.5/cli/php.ini&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum amount of memory a script may consume&lt;br /&gt;
; https://php.net/memory-limit&lt;br /&gt;
memory_limit = -1&lt;br /&gt;
max_memory_limit = -1&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum size of POST data that PHP will accept.&lt;br /&gt;
; Its value may be 0 to disable the limit. It is ignored if POST data reading&lt;br /&gt;
; is disabled through enable_post_data_reading.&lt;br /&gt;
; https://php.net/post-max-size&lt;br /&gt;
post_max_size = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's&lt;br /&gt;
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok&lt;br /&gt;
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting&lt;br /&gt;
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting&lt;br /&gt;
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts&lt;br /&gt;
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.&lt;br /&gt;
; https://php.net/cgi.fix-pathinfo&lt;br /&gt;
cgi.fix_pathinfo=0&lt;br /&gt;
[...]&lt;br /&gt;
; Whether to allow HTTP file uploads.&lt;br /&gt;
; https://php.net/file-uploads&lt;br /&gt;
file_uploads = On&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum allowed size for uploaded files.&lt;br /&gt;
; https://php.net/upload-max-filesize&lt;br /&gt;
upload_max_filesize = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum number of files that can be uploaded via a single request&lt;br /&gt;
max_file_uploads = 20&lt;br /&gt;
[...]&lt;br /&gt;
[Session]&lt;br /&gt;
; Handler used to store/retrieve data.&lt;br /&gt;
; https://php.net/session.save-handler&lt;br /&gt;
session.save_handler = files&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar php-fpm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart php8.5-fpm.service&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración Nginx ==&lt;br /&gt;
* Backup nginx.conf&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cp -a /etc/nginx/nginx.conf /etc/nginx/nginx.conf.$(date +%Y%m%d)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Editar nginx.conf&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/nginx.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
http {&lt;br /&gt;
        ##&lt;br /&gt;
        # Basic Settings&lt;br /&gt;
        ##&lt;br /&gt;
        sendfile on;&lt;br /&gt;
        tcp_nopush on;&lt;br /&gt;
        types_hash_max_size 2048;&lt;br /&gt;
        client_max_body_size 100M;&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
[...]&lt;br /&gt;
        ##&lt;br /&gt;
        # SSL Settings&lt;br /&gt;
        ##&lt;br /&gt;
        #ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE&lt;br /&gt;
        ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
        ssl_prefer_server_ciphers on;&lt;br /&gt;
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;&lt;br /&gt;
[...]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Generar PHParam:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /etc/nginx/ssl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar contraseñas:&lt;br /&gt;
Si se quiere configurar contraseñas Auth Basic se almacenan en /etc/nginx/passwd.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /etc/nginx/passwd&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;htpasswd -c -B /etc/nginx/passwd/test.pw guzman&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar snippets:&lt;br /&gt;
Estos &amp;quot;fragmentos&amp;quot; se pueden usar para permitir que sistemas funcionen si se tiene Auth Basic activo (como robots.txt o validación de Let's Encrypt).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/allowed.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Allow favicon.ico, robots.txt, .well-known/&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
        access_log off;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Allow robots.txt&lt;br /&gt;
location = /robots.txt {&lt;br /&gt;
        allow all;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
        access_log off;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Allow &amp;quot;Well-Known URIs&amp;quot; as pwe RFC 5785 (e.g. Let's Encrypt)&lt;br /&gt;
location ~* ^/.well-known/ {&lt;br /&gt;
        auth_basic off;&lt;br /&gt;
        allow all;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/denied.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Deny *.txt, *.log, .*/*.php, .*, *.json, .lock, *.ht&lt;br /&gt;
&lt;br /&gt;
# Not allow txt or logs to be downloaded&lt;br /&gt;
location ~* \.(txt|log)$ {&lt;br /&gt;
        deny all;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow execute php in hidden folders&lt;br /&gt;
location ~ \..*/.\.php$ {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow &amp;quot;hidden files&amp;quot;&lt;br /&gt;
location ~ (^|/)\. {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow *.json or *.lock&lt;br /&gt;
location ~* \.(json|lock)$ {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Deny *.ht&lt;br /&gt;
location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/hsts.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Activate HSTS (HTTP Strict Transport Security)&lt;br /&gt;
# Note: if we set another header in a location we've to&lt;br /&gt;
#       rewrite it&lt;br /&gt;
add_header Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot; always;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar sites-available:&lt;br /&gt;
En al carpeta /etc/nginx/sites-available/ se almacenan todos los Virtual Hosts disponibles.&lt;br /&gt;
En Nginx hay que personalizar cada uno por cada tipo de aplicación.&lt;br /&gt;
Hay que tener en cuenta las diferentes URL's.&lt;br /&gt;
&lt;br /&gt;
* Configurar sites-enabled:&lt;br /&gt;
Se suelen configurar enlaces simbólicos con la carpeta sites-available para activarlos.&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar Nginx:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración MariaDB ==&lt;br /&gt;
* Conectar a MariaDB&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mariadb&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Opción 1: Permitir conexiones por TCP (sólo desde localhost)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Sql&amp;quot;&amp;gt;&lt;br /&gt;
grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Opción 2: Permitir conexiones por Sockets UNIX (sólo desde localhost)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Sql&amp;quot;&amp;gt;&lt;br /&gt;
grant all privileges on *.* to 'root'@'localhost' identified via unix_socket with grant option;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nota: esta opción es la que suelo usar yo (no se pueden usar los dos a la vez).&lt;br /&gt;
&lt;br /&gt;
* Habilitar conexiones remotas&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
vi /etc/mysql/mariadb.conf.d/50-server.cnf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
# Instead of skip-networking the default is now to listen only on&lt;br /&gt;
# localhost which is more compatible and is not less secure.&lt;br /&gt;
#bind-address            = 127.0.0.1&lt;br /&gt;
bind-address            = 0.0.0.0&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl restart mariadb.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 1: vamos a necesitar deshabilitar el Bind Address para los contenedores de [[Docker Engine]].&lt;br /&gt;
&lt;br /&gt;
Nota 2: el puerto 3306/tcp de MariaDB no se va a ver expuesto a Internet, porque no se va a habilitar en el firewall.&lt;br /&gt;
&lt;br /&gt;
== Habilitar puertos en cortafuegos ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw allow 80/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw allow 443/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Virtual Host de ejemplo ==&lt;br /&gt;
=== Generar certificados autofirmados (temporales) ===&lt;br /&gt;
Estos certificados los vamos a generar sólo para levantar el Virtual Host y los sustituiremos por unos de Let's Encrypt.&lt;br /&gt;
* Generamos clave privada:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /etc/ssl/private&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl genrsa -out selfsigned.key&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Generamos petición de firma (CSR):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
openssl req -key selfsigned.key -new -out selfsigned.csr&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter '.', the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:ES&lt;br /&gt;
State or Province Name (full name) [Some-State]:Madrid&lt;br /&gt;
Locality Name (eg, city) []:Madrid&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:GCV&lt;br /&gt;
Organizational Unit Name (eg, section) []:GCV&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:www.culturetas.net&lt;br /&gt;
Email Address []:&lt;br /&gt;
&lt;br /&gt;
Please enter the following 'extra' attributes&lt;br /&gt;
to be sent with your certificate request&lt;br /&gt;
A challenge password []:&lt;br /&gt;
An optional company name []:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Auto-firmamos con la misma firma:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl x509 -signkey selfsigned.key -in selfsigned.csr -req -days 365 -out selfsigned.crt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Movemos certificados a las carpetas correctas:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv selfsigned.key /etc/ssl/private/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv selfsigned.crt /etc/ssl/certs/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;rm selfsigned.csr&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Referencia: [https://www.baeldung.com/openssl-self-signed-cert https://www.baeldung.com/openssl-self-signed-cert]&lt;br /&gt;
&lt;br /&gt;
=== Dar de alta Virtual Host en Nginx ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/sites-available/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
##&lt;br /&gt;
# You should look at the following URL's in order to grasp a solid understanding&lt;br /&gt;
# of Nginx configuration files in order to fully unleash the power of Nginx.&lt;br /&gt;
# http://wiki.nginx.org/Pitfalls&lt;br /&gt;
# http://wiki.nginx.org/QuickStart&lt;br /&gt;
# http://wiki.nginx.org/Configuration&lt;br /&gt;
#&lt;br /&gt;
# Generally, you will want to move this file somewhere, and start with a clean&lt;br /&gt;
# file but keep this around for reference. Or just disable in sites-enabled.&lt;br /&gt;
#&lt;br /&gt;
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
# Default server configuration&lt;br /&gt;
#&lt;br /&gt;
server {&lt;br /&gt;
        # Redirect HTTP to HTTPS&lt;br /&gt;
        listen 80 default_server;&lt;br /&gt;
        listen [::]:80 default_server;&lt;br /&gt;
        server_name www.culturetas.net culturetas.net;&lt;br /&gt;
        # Redirect HTTP to HTTPS&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
        # SSL configuration&lt;br /&gt;
        #&lt;br /&gt;
        listen 443 ssl http2 default_server;&lt;br /&gt;
        listen [::]:443 ssl http2 default_server;&lt;br /&gt;
        ssl_certificate /etc/ssl/certs/selfsigned.crt;&lt;br /&gt;
        ssl_certificate_key /etc/ssl/private/selfsigned.key;&lt;br /&gt;
        #&lt;br /&gt;
        # Note: You should disable gzip for SSL traffic.&lt;br /&gt;
        # See: https://bugs.debian.org/773332&lt;br /&gt;
        #&lt;br /&gt;
        # Read up on ssl_ciphers to ensure a secure configuration.&lt;br /&gt;
        # See: https://bugs.debian.org/765782&lt;br /&gt;
        #&lt;br /&gt;
        # Self signed certs generated by the ssl-cert package&lt;br /&gt;
        # Don't use them in a production server!&lt;br /&gt;
        #&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&lt;br /&gt;
        root /var/www/culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        # Add index.php to the list if you are using PHP&lt;br /&gt;
        index index.php index.html index.htm;&lt;br /&gt;
&lt;br /&gt;
        server_name www.culturetas.net culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        access_log /var/log/nginx/culturetas.net-access.log;&lt;br /&gt;
        error_log /var/log/nginx/culturetas.net-error.log;&lt;br /&gt;
&lt;br /&gt;
#       # Auth Basic (for developing)&lt;br /&gt;
#       auth_basic &amp;quot;Pagina Restringida&amp;quot;;&lt;br /&gt;
#       auth_basic_user_file /etc/nginx/passwd/passwd-culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        # Activate HSTS (HTTP Strict Transport Security)&lt;br /&gt;
        # Note: reinclude if in a location a header is set&lt;br /&gt;
        include snippets/hsts.conf;&lt;br /&gt;
&lt;br /&gt;
        # Allow favicon.ico, robots.txt, .well-known/&lt;br /&gt;
        # Deny *.txt, *.log, .*/*.php, .*, *.json, .lock, *.ht&lt;br /&gt;
        include snippets/allowed.conf;&lt;br /&gt;
        include snippets/denied.conf;&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                # First attempt to serve request as file, then&lt;br /&gt;
                # as directory, then fall back to displaying a 404.&lt;br /&gt;
                #try_files $uri $uri/ =404;&lt;br /&gt;
                try_files $uri $uri/ /index.php?$args;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # pass the PHP scripts to FastCGI server&lt;br /&gt;
        #&lt;br /&gt;
        location ~ \.php$ {&lt;br /&gt;
                include snippets/fastcgi-php.conf;&lt;br /&gt;
&lt;br /&gt;
        #       # With php8.5-cgi alone (TCP Ports):&lt;br /&gt;
        #       fastcgi_pass 127.0.0.1:9000;&lt;br /&gt;
                # With php8.5-fpm (UNIX Socket):&lt;br /&gt;
                fastcgi_pass unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # Disable hidden files&lt;br /&gt;
        location ~ /\. {&lt;br /&gt;
                deny all;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desactivar Virtual Host por defecto ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;rm /etc/nginx/sites-enabled/default&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Activar Virtual Host nuevo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/culturetas.net /etc/nginx/sites-enabled/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar nuevas claves con Let's Encrypt ===&lt;br /&gt;
El certbot de Let's Encrypt ya contiene un plugin que gestiona Nginx.&lt;br /&gt;
Usándolo no sólo nos generará automáticamente las claves y certificados, si no que lo aplicará en el servidor por nosotros.&lt;br /&gt;
Además, también se encargará de la renovación, por lo que desatiende toda esa parte de gestión de certificados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
certbot --nginx&lt;br /&gt;
Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
Enter email address or hit Enter to skip.&lt;br /&gt;
 (Enter 'c' to cancel): admin@ejemplo.com&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Please read the Terms of Service at:&lt;br /&gt;
https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf&lt;br /&gt;
You must agree in order to register with the ACME server. Do you agree?&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
(Y)es/(N)o: Y&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Would you be willing, once your first certificate is successfully issued, to&lt;br /&gt;
share your email address with the Electronic Frontier Foundation, a founding&lt;br /&gt;
partner of the Let's Encrypt project and the non-profit organization that&lt;br /&gt;
develops Certbot? We'd like to send you email about our work encrypting the web,&lt;br /&gt;
EFF news, campaigns, and ways to support digital freedom.&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
(Y)es/(N)o: N&lt;br /&gt;
Account registered.&lt;br /&gt;
&lt;br /&gt;
Which names would you like to activate HTTPS for?&lt;br /&gt;
We recommend selecting either all domains, or all domains in a VirtualHost/server block.&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
1: culturetas.net&lt;br /&gt;
2: www.culturetas.net&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Select the appropriate numbers separated by commas and/or spaces, or leave input&lt;br /&gt;
blank to select all options shown (Enter 'c' to cancel): 1,2&lt;br /&gt;
Requesting a certificate for culturetas.net and www.culturetas.net&lt;br /&gt;
&lt;br /&gt;
Successfully received certificate.&lt;br /&gt;
Certificate is saved at: /etc/letsencrypt/live/culturetas.net/fullchain.pem&lt;br /&gt;
Key is saved at:         /etc/letsencrypt/live/culturetas.net/privkey.pem&lt;br /&gt;
This certificate expires on 2026-05-25.&lt;br /&gt;
These files will be updated when the certificate renews.&lt;br /&gt;
Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
&lt;br /&gt;
Deploying certificate&lt;br /&gt;
Successfully deployed certificate for culturetas.net to /etc/nginx/sites-enabled/culturetas.net&lt;br /&gt;
Successfully deployed certificate for www.culturetas.net to /etc/nginx/sites-enabled/culturetas.net&lt;br /&gt;
Congratulations! You have successfully enabled HTTPS on https://culturetas.net and https://www.culturetas.net&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
If you like Certbot, please consider supporting our work by:&lt;br /&gt;
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate&lt;br /&gt;
 * Donating to EFF:                    https://eff.org/donate-le&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desplegar página de ejemplo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /var/www/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /var/www/culturetas.net/index.html&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;es&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Culturetas.net - En construcción&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;style&amp;gt;&lt;br /&gt;
    body {&lt;br /&gt;
      margin: 0;&lt;br /&gt;
      padding: 0;&lt;br /&gt;
      height: 100vh;&lt;br /&gt;
      font-family: system-ui, -apple-system, sans-serif;&lt;br /&gt;
      background: linear-gradient(135deg, #1e3a8a 0%, #3b82f6 100%);&lt;br /&gt;
      color: white;&lt;br /&gt;
      display: flex;&lt;br /&gt;
      flex-direction: column;&lt;br /&gt;
      align-items: center;&lt;br /&gt;
      justify-content: center;&lt;br /&gt;
      text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .container {&lt;br /&gt;
      max-width: 700px;&lt;br /&gt;
      padding: 20px;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    h1 {&lt;br /&gt;
      font-size: 4.5rem;&lt;br /&gt;
      margin: 0.2em 0;&lt;br /&gt;
      font-weight: 800;&lt;br /&gt;
      letter-spacing: -1px;&lt;br /&gt;
      text-shadow: 0 4px 12px rgba(0,0,0,0.3);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .subtitle {&lt;br /&gt;
      font-size: 1.6rem;&lt;br /&gt;
      margin: 0.8em 0 1.5em;&lt;br /&gt;
      opacity: 0.95;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .construction {&lt;br /&gt;
      font-size: 8rem;&lt;br /&gt;
      margin: 0.3em 0;&lt;br /&gt;
      animation: bounce 3s infinite;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    p {&lt;br /&gt;
      font-size: 1.3rem;&lt;br /&gt;
      line-height: 1.6;&lt;br /&gt;
      max-width: 600px;&lt;br /&gt;
      margin: 1.5em auto;&lt;br /&gt;
      opacity: 0.9;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .soon {&lt;br /&gt;
      font-size: 2rem;&lt;br /&gt;
      font-weight: bold;&lt;br /&gt;
      margin-top: 2rem;&lt;br /&gt;
      color: #fef08a;&lt;br /&gt;
      text-shadow: 0 2px 10px rgba(0,0,0,0.4);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @keyframes bounce {&lt;br /&gt;
      0%, 20%, 50%, 80%, 100% { transform: translateY(0); }&lt;br /&gt;
      40% { transform: translateY(-25px); }&lt;br /&gt;
      60% { transform: translateY(-12px); }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @media (max-width: 600px) {&lt;br /&gt;
      h1 { font-size: 3.2rem; }&lt;br /&gt;
      .construction { font-size: 6rem; }&lt;br /&gt;
      .subtitle { font-size: 1.3rem; }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;construction&amp;quot;&amp;gt;🚧&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Culturetas.net&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;subtitle&amp;quot;&amp;gt;Está en construcción&amp;lt;/div&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Estamos trabajando para traerte un espacio mucho más bonito, rápido y con mucho más contenido cultural interesante.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;¡Vuelve en unos días y te sorprenderás!&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;div class=&amp;quot;soon&amp;quot;&amp;gt;Próximamente... ✨&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=LEMP&amp;diff=188</id>
		<title>LEMP</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=LEMP&amp;diff=188"/>
		<updated>2026-04-18T18:55:38Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación servidor LEMP ==&lt;br /&gt;
Instalaremos:&lt;br /&gt;
* GNU Linux (Ubuntu Server 24.04)&lt;br /&gt;
* eNginx 1.24.0 (APT Ubuntu)&lt;br /&gt;
* MariaDB 10.8 (Repo oficiales de MariaDB)&lt;br /&gt;
* PHP 8.5 (PPA ondrej/php)&lt;br /&gt;
&lt;br /&gt;
== Permisos de root ==&lt;br /&gt;
Todos los comandos en esta guía se realizarán como root.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación Nginx (Stable) ==&lt;br /&gt;
* Actualizar repositorio&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar Nginx&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalación Apache Utils&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install apache2-utils&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación MariaDB ==&lt;br /&gt;
* Instalar requisitos&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install apt-transport-https curl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Añadir repositorios MariaDB (oficiales)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir -p /etc/apt/keyrings&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/apt/sources.list.d/mariadb.sources&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# MariaDB 11.8 repository list - created 2026-02-23 08:31 UTC&lt;br /&gt;
# https://mariadb.org/download/&lt;br /&gt;
X-Repolib-Name: MariaDB&lt;br /&gt;
Types: deb&lt;br /&gt;
# deb.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.&lt;br /&gt;
# URIs: https://deb.mariadb.org/11.8/ubuntu&lt;br /&gt;
URIs: https://mirror.raiolanetworks.com/mariadb/repo/11.8/ubuntu&lt;br /&gt;
Suites: noble&lt;br /&gt;
Components: main main/debug&lt;br /&gt;
Signed-By: /etc/apt/keyrings/mariadb-keyring.pgp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Actualizar repositorio&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalación de servidor y cliente&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install mariadb-client mariadb-server mariadb-plugin-provider-bzip2 mariadb-plugin-provider-lz4 mariadb-plugin-provider-lzma mariadb-plugin-provider-lzo mariadb-plugin-provider-snappy&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Inicializar base de datos&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mysql_secure_installation&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB&lt;br /&gt;
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!&lt;br /&gt;
&lt;br /&gt;
In order to log into MariaDB to secure it, we'll need the current&lt;br /&gt;
password for the root user. If you've just installed MariaDB, and&lt;br /&gt;
haven't set the root password yet, you should just press enter here.&lt;br /&gt;
&lt;br /&gt;
Enter current password for root (enter for none):&lt;br /&gt;
OK, successfully used password, moving on...&lt;br /&gt;
&lt;br /&gt;
Setting the root password or using the unix_socket ensures that nobody&lt;br /&gt;
can log into the MariaDB root user without the proper authorisation.&lt;br /&gt;
&lt;br /&gt;
You already have your root account protected, so you can safely answer 'n'.&lt;br /&gt;
&lt;br /&gt;
Switch to unix_socket authentication [Y/n] n&lt;br /&gt;
 ... skipping.&lt;br /&gt;
&lt;br /&gt;
You already have your root account protected, so you can safely answer 'n'.&lt;br /&gt;
&lt;br /&gt;
Change the root password? [Y/n] y&lt;br /&gt;
New password:&lt;br /&gt;
Re-enter new password:&lt;br /&gt;
Password updated successfully!&lt;br /&gt;
Reloading privilege tables..&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By default, a MariaDB installation has an anonymous user, allowing anyone&lt;br /&gt;
to log into MariaDB without having to have a user account created for&lt;br /&gt;
them.  This is intended only for testing, and to make the installation&lt;br /&gt;
go a bit smoother.  You should remove them before moving into a&lt;br /&gt;
production environment.&lt;br /&gt;
&lt;br /&gt;
Remove anonymous users? [Y/n] y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Normally, root should only be allowed to connect from 'localhost'.  This&lt;br /&gt;
ensures that someone cannot guess at the root password from the network.&lt;br /&gt;
&lt;br /&gt;
Disallow root login remotely? [Y/n] Y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
By default, MariaDB comes with a database named 'test' that anyone can&lt;br /&gt;
access.  This is also intended only for testing, and should be removed&lt;br /&gt;
before moving into a production environment.&lt;br /&gt;
&lt;br /&gt;
Remove test database and access to it? [Y/n] Y&lt;br /&gt;
 - Dropping test database...&lt;br /&gt;
 ... Success!&lt;br /&gt;
 - Removing privileges on test database...&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Reloading the privilege tables will ensure that all changes made so far&lt;br /&gt;
will take effect immediately.&lt;br /&gt;
&lt;br /&gt;
Reload privilege tables now? [Y/n] Y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Cleaning up...&lt;br /&gt;
&lt;br /&gt;
All done!  If you've completed all of the above steps, your MariaDB&lt;br /&gt;
installation should now be secure.&lt;br /&gt;
&lt;br /&gt;
Thanks for using MariaDB!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación PHP ==&lt;br /&gt;
Vamos a usar los repositorios PPA de ondrej/php&lt;br /&gt;
&lt;br /&gt;
* Instalar repositorio PPA&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;add-apt-repository ppa:ondrej/php&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Actualizar repositorios&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar PHP 8.5&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install php8.5 php8.5-apcu php8.5-common php8.5-fpm php8.5-curl php8.5-gd php8.5-mysql php8.5-xml php8.5-xmlrpc php8.5-bz2 php8.5-imap php8.5-intl php8.5-mbstring php8.5-soap php8.5-gnupg php8.5-imagick php8.5-mcrypt php8.5-zip&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación Let's Encrypt ==&lt;br /&gt;
Vamos a usar Let's Encrypt para generar las claves y certificados usadas para comunicaciones HTTPS.&lt;br /&gt;
&lt;br /&gt;
* Instalar Snap Core&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap install core&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Refrescar Snap Core&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap refresh core&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar Certbot&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap install --classic certbot&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear enlace simbólico&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /snap/bin/certbot /usr/local/bin/certbot&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Comprobar que está activada el timer de renovación&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl list-timers | grep certbot&lt;br /&gt;
Mon 2026-02-23 11:47:00 UTC      12h -                                      - snap.certbot.renew.timer       snap.certbot.renew.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración PHP ==&lt;br /&gt;
* Configuración php-fpm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/php/8.5/fpm/php.ini&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum amount of memory a script may consume&lt;br /&gt;
; https://php.net/memory-limit&lt;br /&gt;
memory_limit = 128M&lt;br /&gt;
max_memory_limit = -1&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum size of POST data that PHP will accept.&lt;br /&gt;
; Its value may be 0 to disable the limit. It is ignored if POST data reading&lt;br /&gt;
; is disabled through enable_post_data_reading.&lt;br /&gt;
; https://php.net/post-max-size&lt;br /&gt;
post_max_size = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's&lt;br /&gt;
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok&lt;br /&gt;
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting&lt;br /&gt;
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting&lt;br /&gt;
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts&lt;br /&gt;
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.&lt;br /&gt;
; https://php.net/cgi.fix-pathinfo&lt;br /&gt;
cgi.fix_pathinfo=0&lt;br /&gt;
[...]&lt;br /&gt;
; Whether to allow HTTP file uploads.&lt;br /&gt;
; https://php.net/file-uploads&lt;br /&gt;
file_uploads = On&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum allowed size for uploaded files.&lt;br /&gt;
; https://php.net/upload-max-filesize&lt;br /&gt;
upload_max_filesize = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum number of files that can be uploaded via a single request&lt;br /&gt;
max_file_uploads = 20&lt;br /&gt;
[...]&lt;br /&gt;
[Session]&lt;br /&gt;
; Handler used to store/retrieve data.&lt;br /&gt;
; https://php.net/session.save-handler&lt;br /&gt;
session.save_handler = files&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configuración php-cli:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/php/8.5/cli/php.ini&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum amount of memory a script may consume&lt;br /&gt;
; https://php.net/memory-limit&lt;br /&gt;
memory_limit = -1&lt;br /&gt;
max_memory_limit = -1&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum size of POST data that PHP will accept.&lt;br /&gt;
; Its value may be 0 to disable the limit. It is ignored if POST data reading&lt;br /&gt;
; is disabled through enable_post_data_reading.&lt;br /&gt;
; https://php.net/post-max-size&lt;br /&gt;
post_max_size = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's&lt;br /&gt;
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok&lt;br /&gt;
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting&lt;br /&gt;
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting&lt;br /&gt;
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts&lt;br /&gt;
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.&lt;br /&gt;
; https://php.net/cgi.fix-pathinfo&lt;br /&gt;
cgi.fix_pathinfo=0&lt;br /&gt;
[...]&lt;br /&gt;
; Whether to allow HTTP file uploads.&lt;br /&gt;
; https://php.net/file-uploads&lt;br /&gt;
file_uploads = On&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum allowed size for uploaded files.&lt;br /&gt;
; https://php.net/upload-max-filesize&lt;br /&gt;
upload_max_filesize = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum number of files that can be uploaded via a single request&lt;br /&gt;
max_file_uploads = 20&lt;br /&gt;
[...]&lt;br /&gt;
[Session]&lt;br /&gt;
; Handler used to store/retrieve data.&lt;br /&gt;
; https://php.net/session.save-handler&lt;br /&gt;
session.save_handler = files&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar php-fpm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart php8.5-fpm.service&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración Nginx ==&lt;br /&gt;
* Backup nginx.conf&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cp -a /etc/nginx/nginx.conf /etc/nginx/nginx.conf.$(date +%Y%m%d)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Editar nginx.conf&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/nginx.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
http {&lt;br /&gt;
        ##&lt;br /&gt;
        # Basic Settings&lt;br /&gt;
        ##&lt;br /&gt;
        sendfile on;&lt;br /&gt;
        tcp_nopush on;&lt;br /&gt;
        types_hash_max_size 2048;&lt;br /&gt;
        client_max_body_size 100M;&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
[...]&lt;br /&gt;
        ##&lt;br /&gt;
        # SSL Settings&lt;br /&gt;
        ##&lt;br /&gt;
        #ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE&lt;br /&gt;
        ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
        ssl_prefer_server_ciphers on;&lt;br /&gt;
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;&lt;br /&gt;
[...]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Generar PHParam:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /etc/nginx/ssl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar contraseñas:&lt;br /&gt;
Si se quiere configurar contraseñas Auth Basic se almacenan en /etc/nginx/passwd.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /etc/nginx/passwd&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;htpasswd -c -B /etc/nginx/passwd/test.pw guzman&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar snippets:&lt;br /&gt;
Estos &amp;quot;fragmentos&amp;quot; se pueden usar para permitir que sistemas funcionen si se tiene Auth Basic activo (como robots.txt o validación de Let's Encrypt).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/allowed.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Allow favicon.ico, robots.txt, .well-known/&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
        access_log off;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Allow robots.txt&lt;br /&gt;
location = /robots.txt {&lt;br /&gt;
        allow all;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
        access_log off;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Allow &amp;quot;Well-Known URIs&amp;quot; as pwe RFC 5785 (e.g. Let's Encrypt)&lt;br /&gt;
location ~* ^/.well-known/ {&lt;br /&gt;
        auth_basic off;&lt;br /&gt;
        allow all;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/denied.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Deny *.txt, *.log, .*/*.php, .*, *.json, .lock, *.ht&lt;br /&gt;
&lt;br /&gt;
# Not allow txt or logs to be downloaded&lt;br /&gt;
location ~* \.(txt|log)$ {&lt;br /&gt;
        deny all;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow execute php in hidden folders&lt;br /&gt;
location ~ \..*/.\.php$ {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow &amp;quot;hidden files&amp;quot;&lt;br /&gt;
location ~ (^|/)\. {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow *.json or *.lock&lt;br /&gt;
location ~* \.(json|lock)$ {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Deny *.ht&lt;br /&gt;
location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/hsts.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Activate HSTS (HTTP Strict Transport Security)&lt;br /&gt;
# Note: if we set another header in a location we've to&lt;br /&gt;
#       rewrite it&lt;br /&gt;
add_header Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot; always;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar sites-available:&lt;br /&gt;
En al carpeta /etc/nginx/sites-available/ se almacenan todos los Virtual Hosts disponibles.&lt;br /&gt;
En Nginx hay que personalizar cada uno por cada tipo de aplicación.&lt;br /&gt;
Hay que tener en cuenta las diferentes URL's.&lt;br /&gt;
&lt;br /&gt;
* Configurar sites-enabled:&lt;br /&gt;
Se suelen configurar enlaces simbólicos con la carpeta sites-available para activarlos.&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar Nginx:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración MariaDB ==&lt;br /&gt;
* Conectar a MariaDB&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mariadb&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Opción 1: Permitir conexiones por TCP (sólo desde localhost)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Sql&amp;quot;&amp;gt;&lt;br /&gt;
grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Opción 2: Permitir conexiones por Sockets UNIX (sólo desde localhost)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Sql&amp;quot;&amp;gt;&lt;br /&gt;
grant all privileges on *.* to 'root'@'localhost' identified via unix_socket with grant option;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nota: esta opción es la que suelo usar yo (no se pueden usar los dos a la vez).&lt;br /&gt;
&lt;br /&gt;
* Habilitar conexiones remotas&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
vi /etc/mysql/mariadb.conf.d/50-server.cnf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
# Instead of skip-networking the default is now to listen only on&lt;br /&gt;
# localhost which is more compatible and is not less secure.&lt;br /&gt;
#bind-address            = 127.0.0.1&lt;br /&gt;
bind-address            = 0.0.0.0&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota 1: vamos a necesitar deshabilitar el Bind Address para los contenedores de [[Docker Engine]].&lt;br /&gt;
&lt;br /&gt;
Nota 2: el puerto 3306/tcp de MariaDB no se va a ver expuesto a Internet, porque no se va a habilitar en el firewall.&lt;br /&gt;
&lt;br /&gt;
== Habilitar puertos en cortafuegos ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw allow 80/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw allow 443/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Virtual Host de ejemplo ==&lt;br /&gt;
=== Generar certificados autofirmados (temporales) ===&lt;br /&gt;
Estos certificados los vamos a generar sólo para levantar el Virtual Host y los sustituiremos por unos de Let's Encrypt.&lt;br /&gt;
* Generamos clave privada:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /etc/ssl/private&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl genrsa -out selfsigned.key&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Generamos petición de firma (CSR):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
openssl req -key selfsigned.key -new -out selfsigned.csr&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter '.', the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:ES&lt;br /&gt;
State or Province Name (full name) [Some-State]:Madrid&lt;br /&gt;
Locality Name (eg, city) []:Madrid&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:GCV&lt;br /&gt;
Organizational Unit Name (eg, section) []:GCV&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:www.culturetas.net&lt;br /&gt;
Email Address []:&lt;br /&gt;
&lt;br /&gt;
Please enter the following 'extra' attributes&lt;br /&gt;
to be sent with your certificate request&lt;br /&gt;
A challenge password []:&lt;br /&gt;
An optional company name []:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Auto-firmamos con la misma firma:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl x509 -signkey selfsigned.key -in selfsigned.csr -req -days 365 -out selfsigned.crt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Movemos certificados a las carpetas correctas:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv selfsigned.key /etc/ssl/private/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv selfsigned.crt /etc/ssl/certs/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;rm selfsigned.csr&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Referencia: [https://www.baeldung.com/openssl-self-signed-cert https://www.baeldung.com/openssl-self-signed-cert]&lt;br /&gt;
&lt;br /&gt;
=== Dar de alta Virtual Host en Nginx ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/sites-available/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
##&lt;br /&gt;
# You should look at the following URL's in order to grasp a solid understanding&lt;br /&gt;
# of Nginx configuration files in order to fully unleash the power of Nginx.&lt;br /&gt;
# http://wiki.nginx.org/Pitfalls&lt;br /&gt;
# http://wiki.nginx.org/QuickStart&lt;br /&gt;
# http://wiki.nginx.org/Configuration&lt;br /&gt;
#&lt;br /&gt;
# Generally, you will want to move this file somewhere, and start with a clean&lt;br /&gt;
# file but keep this around for reference. Or just disable in sites-enabled.&lt;br /&gt;
#&lt;br /&gt;
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
# Default server configuration&lt;br /&gt;
#&lt;br /&gt;
server {&lt;br /&gt;
        # Redirect HTTP to HTTPS&lt;br /&gt;
        listen 80 default_server;&lt;br /&gt;
        listen [::]:80 default_server;&lt;br /&gt;
        server_name www.culturetas.net culturetas.net;&lt;br /&gt;
        # Redirect HTTP to HTTPS&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
        # SSL configuration&lt;br /&gt;
        #&lt;br /&gt;
        listen 443 ssl http2 default_server;&lt;br /&gt;
        listen [::]:443 ssl http2 default_server;&lt;br /&gt;
        ssl_certificate /etc/ssl/certs/selfsigned.crt;&lt;br /&gt;
        ssl_certificate_key /etc/ssl/private/selfsigned.key;&lt;br /&gt;
        #&lt;br /&gt;
        # Note: You should disable gzip for SSL traffic.&lt;br /&gt;
        # See: https://bugs.debian.org/773332&lt;br /&gt;
        #&lt;br /&gt;
        # Read up on ssl_ciphers to ensure a secure configuration.&lt;br /&gt;
        # See: https://bugs.debian.org/765782&lt;br /&gt;
        #&lt;br /&gt;
        # Self signed certs generated by the ssl-cert package&lt;br /&gt;
        # Don't use them in a production server!&lt;br /&gt;
        #&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&lt;br /&gt;
        root /var/www/culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        # Add index.php to the list if you are using PHP&lt;br /&gt;
        index index.php index.html index.htm;&lt;br /&gt;
&lt;br /&gt;
        server_name www.culturetas.net culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        access_log /var/log/nginx/culturetas.net-access.log;&lt;br /&gt;
        error_log /var/log/nginx/culturetas.net-error.log;&lt;br /&gt;
&lt;br /&gt;
#       # Auth Basic (for developing)&lt;br /&gt;
#       auth_basic &amp;quot;Pagina Restringida&amp;quot;;&lt;br /&gt;
#       auth_basic_user_file /etc/nginx/passwd/passwd-culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        # Activate HSTS (HTTP Strict Transport Security)&lt;br /&gt;
        # Note: reinclude if in a location a header is set&lt;br /&gt;
        include snippets/hsts.conf;&lt;br /&gt;
&lt;br /&gt;
        # Allow favicon.ico, robots.txt, .well-known/&lt;br /&gt;
        # Deny *.txt, *.log, .*/*.php, .*, *.json, .lock, *.ht&lt;br /&gt;
        include snippets/allowed.conf;&lt;br /&gt;
        include snippets/denied.conf;&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                # First attempt to serve request as file, then&lt;br /&gt;
                # as directory, then fall back to displaying a 404.&lt;br /&gt;
                #try_files $uri $uri/ =404;&lt;br /&gt;
                try_files $uri $uri/ /index.php?$args;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # pass the PHP scripts to FastCGI server&lt;br /&gt;
        #&lt;br /&gt;
        location ~ \.php$ {&lt;br /&gt;
                include snippets/fastcgi-php.conf;&lt;br /&gt;
&lt;br /&gt;
        #       # With php8.5-cgi alone (TCP Ports):&lt;br /&gt;
        #       fastcgi_pass 127.0.0.1:9000;&lt;br /&gt;
                # With php8.5-fpm (UNIX Socket):&lt;br /&gt;
                fastcgi_pass unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # Disable hidden files&lt;br /&gt;
        location ~ /\. {&lt;br /&gt;
                deny all;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desactivar Virtual Host por defecto ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;rm /etc/nginx/sites-enabled/default&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Activar Virtual Host nuevo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/culturetas.net /etc/nginx/sites-enabled/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar nuevas claves con Let's Encrypt ===&lt;br /&gt;
El certbot de Let's Encrypt ya contiene un plugin que gestiona Nginx.&lt;br /&gt;
Usándolo no sólo nos generará automáticamente las claves y certificados, si no que lo aplicará en el servidor por nosotros.&lt;br /&gt;
Además, también se encargará de la renovación, por lo que desatiende toda esa parte de gestión de certificados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
certbot --nginx&lt;br /&gt;
Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
Enter email address or hit Enter to skip.&lt;br /&gt;
 (Enter 'c' to cancel): admin@ejemplo.com&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Please read the Terms of Service at:&lt;br /&gt;
https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf&lt;br /&gt;
You must agree in order to register with the ACME server. Do you agree?&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
(Y)es/(N)o: Y&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Would you be willing, once your first certificate is successfully issued, to&lt;br /&gt;
share your email address with the Electronic Frontier Foundation, a founding&lt;br /&gt;
partner of the Let's Encrypt project and the non-profit organization that&lt;br /&gt;
develops Certbot? We'd like to send you email about our work encrypting the web,&lt;br /&gt;
EFF news, campaigns, and ways to support digital freedom.&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
(Y)es/(N)o: N&lt;br /&gt;
Account registered.&lt;br /&gt;
&lt;br /&gt;
Which names would you like to activate HTTPS for?&lt;br /&gt;
We recommend selecting either all domains, or all domains in a VirtualHost/server block.&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
1: culturetas.net&lt;br /&gt;
2: www.culturetas.net&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Select the appropriate numbers separated by commas and/or spaces, or leave input&lt;br /&gt;
blank to select all options shown (Enter 'c' to cancel): 1,2&lt;br /&gt;
Requesting a certificate for culturetas.net and www.culturetas.net&lt;br /&gt;
&lt;br /&gt;
Successfully received certificate.&lt;br /&gt;
Certificate is saved at: /etc/letsencrypt/live/culturetas.net/fullchain.pem&lt;br /&gt;
Key is saved at:         /etc/letsencrypt/live/culturetas.net/privkey.pem&lt;br /&gt;
This certificate expires on 2026-05-25.&lt;br /&gt;
These files will be updated when the certificate renews.&lt;br /&gt;
Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
&lt;br /&gt;
Deploying certificate&lt;br /&gt;
Successfully deployed certificate for culturetas.net to /etc/nginx/sites-enabled/culturetas.net&lt;br /&gt;
Successfully deployed certificate for www.culturetas.net to /etc/nginx/sites-enabled/culturetas.net&lt;br /&gt;
Congratulations! You have successfully enabled HTTPS on https://culturetas.net and https://www.culturetas.net&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
If you like Certbot, please consider supporting our work by:&lt;br /&gt;
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate&lt;br /&gt;
 * Donating to EFF:                    https://eff.org/donate-le&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desplegar página de ejemplo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /var/www/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /var/www/culturetas.net/index.html&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;es&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Culturetas.net - En construcción&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;style&amp;gt;&lt;br /&gt;
    body {&lt;br /&gt;
      margin: 0;&lt;br /&gt;
      padding: 0;&lt;br /&gt;
      height: 100vh;&lt;br /&gt;
      font-family: system-ui, -apple-system, sans-serif;&lt;br /&gt;
      background: linear-gradient(135deg, #1e3a8a 0%, #3b82f6 100%);&lt;br /&gt;
      color: white;&lt;br /&gt;
      display: flex;&lt;br /&gt;
      flex-direction: column;&lt;br /&gt;
      align-items: center;&lt;br /&gt;
      justify-content: center;&lt;br /&gt;
      text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .container {&lt;br /&gt;
      max-width: 700px;&lt;br /&gt;
      padding: 20px;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    h1 {&lt;br /&gt;
      font-size: 4.5rem;&lt;br /&gt;
      margin: 0.2em 0;&lt;br /&gt;
      font-weight: 800;&lt;br /&gt;
      letter-spacing: -1px;&lt;br /&gt;
      text-shadow: 0 4px 12px rgba(0,0,0,0.3);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .subtitle {&lt;br /&gt;
      font-size: 1.6rem;&lt;br /&gt;
      margin: 0.8em 0 1.5em;&lt;br /&gt;
      opacity: 0.95;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .construction {&lt;br /&gt;
      font-size: 8rem;&lt;br /&gt;
      margin: 0.3em 0;&lt;br /&gt;
      animation: bounce 3s infinite;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    p {&lt;br /&gt;
      font-size: 1.3rem;&lt;br /&gt;
      line-height: 1.6;&lt;br /&gt;
      max-width: 600px;&lt;br /&gt;
      margin: 1.5em auto;&lt;br /&gt;
      opacity: 0.9;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .soon {&lt;br /&gt;
      font-size: 2rem;&lt;br /&gt;
      font-weight: bold;&lt;br /&gt;
      margin-top: 2rem;&lt;br /&gt;
      color: #fef08a;&lt;br /&gt;
      text-shadow: 0 2px 10px rgba(0,0,0,0.4);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @keyframes bounce {&lt;br /&gt;
      0%, 20%, 50%, 80%, 100% { transform: translateY(0); }&lt;br /&gt;
      40% { transform: translateY(-25px); }&lt;br /&gt;
      60% { transform: translateY(-12px); }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @media (max-width: 600px) {&lt;br /&gt;
      h1 { font-size: 3.2rem; }&lt;br /&gt;
      .construction { font-size: 6rem; }&lt;br /&gt;
      .subtitle { font-size: 1.3rem; }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;construction&amp;quot;&amp;gt;🚧&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Culturetas.net&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;subtitle&amp;quot;&amp;gt;Está en construcción&amp;lt;/div&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Estamos trabajando para traerte un espacio mucho más bonito, rápido y con mucho más contenido cultural interesante.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;¡Vuelve en unos días y te sorprenderás!&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;div class=&amp;quot;soon&amp;quot;&amp;gt;Próximamente... ✨&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Archivo:Culturetas-access-token.png&amp;diff=185</id>
		<title>Archivo:Culturetas-access-token.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Archivo:Culturetas-access-token.png&amp;diff=185"/>
		<updated>2026-04-18T18:19:51Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=MariaDB&amp;diff=176</id>
		<title>MariaDB</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=MariaDB&amp;diff=176"/>
		<updated>2026-04-18T11:48:50Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación MariaDB en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/_/mariadb mariadb] en Docker.&lt;br /&gt;
Vamos a usar una imagen oficial de Docker.&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar MariaDB 11.8 que es la versión LTS a día de hoy. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker pull mariadb:11.8-noble&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run --detach --name mariadb-11.8 \&lt;br /&gt;
 --env MARIADB_ROOT_PASSWORD=root \&lt;br /&gt;
 -p 127.0.0.1:3306:3306 \&lt;br /&gt;
 -v mariadb-data:/var/lib/mysql:Z \&lt;br /&gt;
 -v mariadb-backup:/var/backups/mariadb \&lt;br /&gt;
 mariadb:11.8-noble&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conectar a la base de datos ===&lt;br /&gt;
Conectamos como root:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it mariadb-11.8 mariadb --host localhost --user root --password&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear base de datos ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
CREATE DATABASE keycloakdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear usuario ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER keycloak IDENTIFIED BY 'keycloak';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dar permisos a usuario en BD ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL PRIVILEGES ON keycloakdb.* TO 'keycloak';&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comprobar permisos ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
SHOW GRANTS FOR 'keycloak';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
| Grants for keycloak@%                                                                                   |&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
| GRANT USAGE ON *.* TO `keycloak`@`%` IDENTIFIED BY PASSWORD '*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' |&lt;br /&gt;
| GRANT ALL PRIVILEGES ON `keycloakdb`.* TO `keycloak`@`%`                                                |&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
Probaremos a conectar a la BBDD mediante el cliente [http://www.squirrelsql.org/ SquirrelSQL].&lt;br /&gt;
&lt;br /&gt;
== Realizar un Backup ==&lt;br /&gt;
=== Crear script de backup ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker debug mariadb-11.8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nota: el contenedor no tiene herramientas de edición como vi.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
nano /var/backups/mariadb/make-mariadb-backup.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
export DATE=$(date +%Y%m%d-%H%M%S)&lt;br /&gt;
mkdir /var/backups/mariadb/${DATE}&lt;br /&gt;
mariadb-backup --backup --target-dir=/var/backups/mariadb/${DATE} --user=root --password=root&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
chmod 755 /var/backups/mariadb/make-mariadb-backup.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar backup ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it mariadb-11.8 /var/backups/mariadb/make-mariadb-backup.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO MariaDB no la vamos a ejecutar en contenedores.&lt;br /&gt;
Usaremos un servidor [[LEMP]] dedicado que usará MariaDB como base de datos.&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/_/mariadb https://hub.docker.com/_/mariadb]&lt;br /&gt;
* [http://www.squirrelsql.org/ http://www.squirrelsql.org/]&lt;br /&gt;
* [https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector]&lt;br /&gt;
* [https://phoenixnap.com/kb/how-to-create-mariadb-user-grant-privileges https://phoenixnap.com/kb/how-to-create-mariadb-user-grant-privileges]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=MariaDB&amp;diff=175</id>
		<title>MariaDB</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=MariaDB&amp;diff=175"/>
		<updated>2026-04-18T11:47:16Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación MariaDB en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/_/mariadb mariadb] en Docker.&lt;br /&gt;
Vamos a usar una imagen oficial de Docker.&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar MariaDB 11.8 que es la versión LTS a día de hoy. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker pull mariadb:11.8-noble&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run --detach --name mariadb-11.8 \&lt;br /&gt;
 --env MARIADB_ROOT_PASSWORD=root \&lt;br /&gt;
 -p 127.0.0.1:3306:3306 \&lt;br /&gt;
 -v mariadb-data:/var/lib/mysql:Z \&lt;br /&gt;
 -v mariadb-backup:/var/backups/mariadb \&lt;br /&gt;
 mariadb:11.8-noble&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conectar a la base de datos ===&lt;br /&gt;
Conectamos como root:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it mariadb-11.8 mariadb --host localhost --user root --password&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear base de datos ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
CREATE DATABASE keycloakdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear usuario ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER keycloak IDENTIFIED BY 'keycloak';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dar permisos a usuario en BD ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL PRIVILEGES ON keycloakdb.* TO 'keycloak';&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comprobar permisos ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
SHOW GRANTS FOR 'keycloak';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
| Grants for keycloak@%                                                                                   |&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
| GRANT USAGE ON *.* TO `keycloak`@`%` IDENTIFIED BY PASSWORD '*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' |&lt;br /&gt;
| GRANT ALL PRIVILEGES ON `keycloakdb`.* TO `keycloak`@`%`                                                |&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
Probaremos a conectar a la BBDD mediante el cliente [http://www.squirrelsql.org/ SquirrelSQL].&lt;br /&gt;
&lt;br /&gt;
== Realizar un Backup ==&lt;br /&gt;
=== Crear script de backup ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker debug mariadb-11.8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nota: el contenedor no tiene herramientas de edición como vi.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
nano /var/backups/mariadb/make-mariadb-backup.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
DATE=$(date +%Y%m%d-%H%M%S)&lt;br /&gt;
mkdir /var/backups/mariadb/${DATE}&lt;br /&gt;
mariadb-backup --backup --target-dir=/var/backups/mariadb/${DATE} --user=root --password=root&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
chmod 755 /var/backups/mariadb/make-mariadb-backup.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar backup ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it mariadb-11.8 /var/backups/mariadb/make-mariadb-backup.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO MariaDB no la vamos a ejecutar en contenedores.&lt;br /&gt;
Usaremos un servidor [[LEMP]] dedicado que usará MariaDB como base de datos.&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/_/mariadb https://hub.docker.com/_/mariadb]&lt;br /&gt;
* [http://www.squirrelsql.org/ http://www.squirrelsql.org/]&lt;br /&gt;
* [https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector]&lt;br /&gt;
* [https://phoenixnap.com/kb/how-to-create-mariadb-user-grant-privileges https://phoenixnap.com/kb/how-to-create-mariadb-user-grant-privileges]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=MariaDB&amp;diff=174</id>
		<title>MariaDB</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=MariaDB&amp;diff=174"/>
		<updated>2026-04-18T10:57:47Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación MariaDB en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/_/mariadb mariadb] en Docker.&lt;br /&gt;
Vamos a usar una imagen oficial de Docker.&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar MariaDB 11.8 que es la versión LTS a día de hoy. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker pull mariadb:11.8-noble&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run --detach --name mariadb-11.8 \&lt;br /&gt;
 --env MARIADB_ROOT_PASSWORD=root \&lt;br /&gt;
 -p 127.0.0.1:3306:3306 \&lt;br /&gt;
 -v mariadb-data:/var/lib/mysql:Z \&lt;br /&gt;
 -v mariadb-backup:/var/backups/mariadb \&lt;br /&gt;
 mariadb:11.8-noble&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conectar a la base de datos ===&lt;br /&gt;
Conectamos como root:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it mariadb-11.8 mariadb --host localhost --user root --password&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear base de datos ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
CREATE DATABASE keycloakdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear usuario ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER keycloak IDENTIFIED BY 'keycloak';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dar permisos a usuario en BD ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL PRIVILEGES ON keycloakdb.* TO 'keycloak';&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comprobar permisos ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
SHOW GRANTS FOR 'keycloak';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
| Grants for keycloak@%                                                                                   |&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
| GRANT USAGE ON *.* TO `keycloak`@`%` IDENTIFIED BY PASSWORD '*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' |&lt;br /&gt;
| GRANT ALL PRIVILEGES ON `keycloakdb`.* TO `keycloak`@`%`                                                |&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
Probaremos a conectar a la BBDD mediante el cliente [http://www.squirrelsql.org/ SquirrelSQL].&lt;br /&gt;
&lt;br /&gt;
== Realizar un Backup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO MariaDB no la vamos a ejecutar en contenedores.&lt;br /&gt;
Usaremos un servidor [[LEMP]] dedicado que usará MariaDB como base de datos.&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/_/mariadb https://hub.docker.com/_/mariadb]&lt;br /&gt;
* [http://www.squirrelsql.org/ http://www.squirrelsql.org/]&lt;br /&gt;
* [https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector]&lt;br /&gt;
* [https://phoenixnap.com/kb/how-to-create-mariadb-user-grant-privileges https://phoenixnap.com/kb/how-to-create-mariadb-user-grant-privileges]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=MariaDB&amp;diff=173</id>
		<title>MariaDB</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=MariaDB&amp;diff=173"/>
		<updated>2026-04-18T10:53:14Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación MariaDB en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/_/mariadb mariadb] en Docker.&lt;br /&gt;
Vamos a usar una imagen oficial de Docker.&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar MariaDB 11.8 que es la versión LTS a día de hoy. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker pull mariadb:11.8-noble&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run --detach --name mariadb-11.8 \&lt;br /&gt;
 --env MARIADB_ROOT_PASSWORD=root \&lt;br /&gt;
 -p 127.0.0.1:3306:3306 \&lt;br /&gt;
 -v mariadb-data:/var/lib/mysql:Z \&lt;br /&gt;
 mariadb:11.8-noble&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conectar a la base de datos ===&lt;br /&gt;
Conectamos como root:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it mariadb-11.8 mariadb --host localhost --user root --password&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear base de datos ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
CREATE DATABASE keycloakdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear usuario ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER keycloak IDENTIFIED BY 'keycloak';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dar permisos a usuario en BD ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL PRIVILEGES ON keycloakdb.* TO 'keycloak';&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comprobar permisos ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
SHOW GRANTS FOR 'keycloak';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
| Grants for keycloak@%                                                                                   |&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
| GRANT USAGE ON *.* TO `keycloak`@`%` IDENTIFIED BY PASSWORD '*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' |&lt;br /&gt;
| GRANT ALL PRIVILEGES ON `keycloakdb`.* TO `keycloak`@`%`                                                |&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
Probaremos a conectar a la BBDD mediante el cliente [http://www.squirrelsql.org/ SquirrelSQL].&lt;br /&gt;
&lt;br /&gt;
== Realizar un Backup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO MariaDB no la vamos a ejecutar en contenedores.&lt;br /&gt;
Usaremos un servidor [[LEMP]] dedicado que usará MariaDB como base de datos.&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/_/mariadb https://hub.docker.com/_/mariadb]&lt;br /&gt;
* [http://www.squirrelsql.org/ http://www.squirrelsql.org/]&lt;br /&gt;
* [https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector]&lt;br /&gt;
* [https://phoenixnap.com/kb/how-to-create-mariadb-user-grant-privileges https://phoenixnap.com/kb/how-to-create-mariadb-user-grant-privileges]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=MariaDB&amp;diff=172</id>
		<title>MariaDB</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=MariaDB&amp;diff=172"/>
		<updated>2026-04-18T10:49:34Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación MariaDB en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/_/mariadb mariadb] en Docker.&lt;br /&gt;
Vamos a usar una imagen oficial de Docker.&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar MariaDB 11.8 que es la versión LTS a día de hoy. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker pull mariadb:11.8-noble&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run --detach --name mariadb-11.8 \&lt;br /&gt;
 --env MARIADB_ROOT_PASSWORD=root \&lt;br /&gt;
 -p 127.0.0.1:3306:3306 \&lt;br /&gt;
 -v mariadb-data:/var/lib/mysql:Z \&lt;br /&gt;
 -v mariadb-backup:/var/backups/mariadb \&lt;br /&gt;
 mariadb:11.8-noble&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conectar a la base de datos ===&lt;br /&gt;
Conectamos como root:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it mariadb-11.8 mariadb --host localhost --user root --password&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear base de datos ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
CREATE DATABASE keycloakdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear usuario ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER keycloak IDENTIFIED BY 'keycloak';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dar permisos a usuario en BD ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL PRIVILEGES ON keycloakdb.* TO 'keycloak';&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comprobar permisos ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
SHOW GRANTS FOR 'keycloak';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
| Grants for keycloak@%                                                                                   |&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
| GRANT USAGE ON *.* TO `keycloak`@`%` IDENTIFIED BY PASSWORD '*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' |&lt;br /&gt;
| GRANT ALL PRIVILEGES ON `keycloakdb`.* TO `keycloak`@`%`                                                |&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
Probaremos a conectar a la BBDD mediante el cliente [http://www.squirrelsql.org/ SquirrelSQL].&lt;br /&gt;
&lt;br /&gt;
== Realizar un Backup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO MariaDB no la vamos a ejecutar en contenedores.&lt;br /&gt;
Usaremos un servidor [[LEMP]] dedicado que usará MariaDB como base de datos.&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/_/mariadb https://hub.docker.com/_/mariadb]&lt;br /&gt;
* [http://www.squirrelsql.org/ http://www.squirrelsql.org/]&lt;br /&gt;
* [https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector]&lt;br /&gt;
* [https://phoenixnap.com/kb/how-to-create-mariadb-user-grant-privileges https://phoenixnap.com/kb/how-to-create-mariadb-user-grant-privileges]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=MariaDB&amp;diff=170</id>
		<title>MariaDB</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=MariaDB&amp;diff=170"/>
		<updated>2026-04-18T10:33:33Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación MariaDB en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/_/mariadb mariadb] en Docker.&lt;br /&gt;
Vamos a usar una imagen oficial de Docker.&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar MariaDB 11.8 que es la versión LTS a día de hoy. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker pull mariadb:11.8-noble&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run --detach --name mariadb-11.8 \&lt;br /&gt;
 --env MARIADB_ROOT_PASSWORD=root \&lt;br /&gt;
 -p 127.0.0.1:3306:3306 \&lt;br /&gt;
 -v mariadb-data:/var/lib/mysql:Z \&lt;br /&gt;
 mariadb:11.8-noble&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conectar a la base de datos ===&lt;br /&gt;
Conectamos como root:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it mariadb-11.8 mariadb --host localhost --user root --password&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear base de datos ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
CREATE DATABASE keycloakdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crear usuario ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER keycloak IDENTIFIED BY 'keycloak';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dar permisos a usuario en BD ===&lt;br /&gt;
En este ejemplo creamos una BD para keycloak:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL PRIVILEGES ON keycloakdb.* TO 'keycloak';&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comprobar permisos ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
SHOW GRANTS FOR 'keycloak';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
| Grants for keycloak@%                                                                                   |&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
| GRANT USAGE ON *.* TO `keycloak`@`%` IDENTIFIED BY PASSWORD '*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' |&lt;br /&gt;
| GRANT ALL PRIVILEGES ON `keycloakdb`.* TO `keycloak`@`%`                                                |&lt;br /&gt;
+---------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
Probaremos a conectar a la BBDD mediante el cliente [http://www.squirrelsql.org/ SquirrelSQL].&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO MariaDB no la vamos a ejecutar en contenedores.&lt;br /&gt;
Usaremos un servidor [[LEMP]] dedicado que usará MariaDB como base de datos.&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/_/mariadb https://hub.docker.com/_/mariadb]&lt;br /&gt;
* [http://www.squirrelsql.org/ http://www.squirrelsql.org/]&lt;br /&gt;
* [https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector]&lt;br /&gt;
* [https://phoenixnap.com/kb/how-to-create-mariadb-user-grant-privileges https://phoenixnap.com/kb/how-to-create-mariadb-user-grant-privileges]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=MariaDB&amp;diff=169</id>
		<title>MariaDB</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=MariaDB&amp;diff=169"/>
		<updated>2026-04-18T10:18:28Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación MariaDB en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/_/mariadb mariadb] en Docker.&lt;br /&gt;
Vamos a usar una imagen oficial de Docker.&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar MariaDB 11.8 que es la versión LTS a día de hoy. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker pull mariadb:11.8-noble&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run --detach --name mariadb-11.8 \&lt;br /&gt;
 --env MARIADB_ROOT_PASSWORD=root \&lt;br /&gt;
 -p 127.0.0.1:3306:3306 \&lt;br /&gt;
 -v mariadb-data:/var/lib/mysql:Z \&lt;br /&gt;
 mariadb:11.8-noble&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
Probaremos a conectar a la BBDD mediante el cliente [http://www.squirrelsql.org/ SquirrelSQL].&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO MariaDB no la vamos a ejecutar en contenedores.&lt;br /&gt;
Usaremos un servidor [[LEMP]] dedicado que usará MariaDB como base de datos.&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/_/mariadb https://hub.docker.com/_/mariadb]&lt;br /&gt;
* [http://www.squirrelsql.org/ http://www.squirrelsql.org/]&lt;br /&gt;
* [https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=MariaDB&amp;diff=168</id>
		<title>MariaDB</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=MariaDB&amp;diff=168"/>
		<updated>2026-04-18T09:45:37Z</updated>

		<summary type="html">&lt;p&gt;Guzman: Página creada con «== Instalación MariaDB en Docker == Instalación de [https://hub.docker.com/_/mariadb mariadb] en Docker. Vamos a usar una imagen oficial de Docker.  == Requisitos == Para poder realizar esta configuración se necesita: * Servidor GNU Linux (ver Securizar Ubuntu Server) ** Cortafuegos FirewallD (UFW tiene problemas con Docker) * Docker Engine (ver Docker Engine) ** Módulo: Docker Compose (para PRO) * Nginx (ver LEMP)  == Entorno de DEV == Como entorno de…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación MariaDB en Docker ==&lt;br /&gt;
Instalación de [https://hub.docker.com/_/mariadb mariadb] en Docker.&lt;br /&gt;
Vamos a usar una imagen oficial de Docker.&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Para poder realizar esta configuración se necesita:&lt;br /&gt;
* Servidor GNU Linux (ver [[Securizar Ubuntu Server]])&lt;br /&gt;
** Cortafuegos FirewallD (UFW tiene problemas con Docker)&lt;br /&gt;
* Docker Engine (ver [[Docker Engine]])&lt;br /&gt;
** Módulo: Docker Compose (para PRO)&lt;br /&gt;
* Nginx (ver [[LEMP]])&lt;br /&gt;
&lt;br /&gt;
== Entorno de DEV ==&lt;br /&gt;
Como entorno de DEV se va a usar Docker Desktop.&lt;br /&gt;
&lt;br /&gt;
=== Descargar imagen ===&lt;br /&gt;
Vamos a usar MariaDB 11.8 que es la versión LTS a día de hoy. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker pull mariadb:11.8-noble&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecutar contenedor en Docker Desktop (DEV) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run --detach --name mariadb-11.8 \&lt;br /&gt;
 --env MARIADB_ROOT_PASSWORD=root \&lt;br /&gt;
 -p 127.0.0.1:3306:3306 \&lt;br /&gt;
 mariadb:11.8-noble&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pruebas ===&lt;br /&gt;
Probaremos a conectar a la BBDD mediante el cliente [http://www.squirrelsql.org/ SquirrelSQL].&lt;br /&gt;
&lt;br /&gt;
== Entorno de PRO ==&lt;br /&gt;
En el entorno de PRO MariaDB no la vamos a ejecutar en contenedores.&lt;br /&gt;
Usaremos un servidor [[LEMP]] dedicado que usará MariaDB como base de datos.&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://hub.docker.com/_/mariadb https://hub.docker.com/_/mariadb]&lt;br /&gt;
* [http://www.squirrelsql.org/ http://www.squirrelsql.org/]&lt;br /&gt;
* [https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=P%C3%A1gina_principal&amp;diff=167</id>
		<title>Página principal</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=P%C3%A1gina_principal&amp;diff=167"/>
		<updated>2026-04-18T09:37:15Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
== Bienvenidos a Wiki Castanedo.es ==&lt;br /&gt;
&lt;br /&gt;
=== ¿Qué es esto? ===&lt;br /&gt;
&lt;br /&gt;
Mi Wiki personal. No sobre mi persona, sino sobre mis cosas.&lt;br /&gt;
&lt;br /&gt;
Antes tenía diferentes páginas en las que publicaba artículos y notas sobre temas, principalmente relacionados con el mundo [https://es.wikipedia.org/wiki/GNU/Linux GNU/Linux] y la administración de servidores, pero se hallaban dispersos y en diferentes formatos.&lt;br /&gt;
&lt;br /&gt;
Este proyecto busca en primer lugar unificarlo todo en un solo sitio y por otro retomar la publicación de las notas que voy tomando.&lt;br /&gt;
&lt;br /&gt;
=== Contenido ===&lt;br /&gt;
&lt;br /&gt;
Me gusta tomar notas de las cosas que voy haciendo, sobre todo en el mundo de la informática.&lt;br /&gt;
&lt;br /&gt;
Durante mucho tiempo estas notas me las he guardado para mi mismo, pero a partir de ahora las comparto con el que le interesen. Muchas son cosas sencillas y muy conocidas, otras sin embargo contienen información que me han llevado mucha documentación que leer y algunas, incluso, contienen información difícil de encontrar.&lt;br /&gt;
&lt;br /&gt;
Desde aquí se compartirá tres tipos de contenidos diferenciados: notas, código y ayuda.&lt;br /&gt;
&lt;br /&gt;
==== Notas ====&lt;br /&gt;
&lt;br /&gt;
Son las notas que he ido habiendo sobre administración de sistemas:&lt;br /&gt;
* '''Máquinas virtuales:'''&lt;br /&gt;
** [[Securizar Ubuntu Server]]&lt;br /&gt;
** Instalar y configurar un Servidor [[LEMP]] en Ubuntu Server (Linux + Nginx + MySQL + PHP).&lt;br /&gt;
** Instalar y configurar un [[Servidor de Correo]] (Postfix + Dovecot + SSL + SPF + OpenDKIM + OpenDMARC + Amavis + SpamAssassin).&lt;br /&gt;
** [[Administración servidor de correo]].&lt;br /&gt;
** Instalar y configurar [[GOGS]] (Repositorio Git).&lt;br /&gt;
** Instalar y configurar [[TeamSpeak 3]].&lt;br /&gt;
** Instalar y configurar un [[Servidor Minecraft]].&lt;br /&gt;
** Instalar y configurar [[Etherpad]] en Ubuntu Server.&lt;br /&gt;
** Notas sobre [[OpenSSL]].&lt;br /&gt;
** Notas de configuración de [[Drupal 7]] y [[Drupal 8]].&lt;br /&gt;
** Notas de configuración de [[WordPress]].&lt;br /&gt;
** Notas de configuración de [[MediaWiki]].&lt;br /&gt;
* '''Contenedores:'''&lt;br /&gt;
** Instalar y configurar [[Docker Engine]] en Ubuntu Server.&lt;br /&gt;
** Instalar y configurar [[OpenLDAP]] en Docker.&lt;br /&gt;
** Instalar y configurar [[MariaDB]] en Docker.&lt;br /&gt;
** Instalar y configurar [[Keycloak]] en Docker.&lt;br /&gt;
** Instalar y configurar [[Nextcloud AIO]] en Docker.&lt;br /&gt;
** Instalar y configurar de servidor de correo [[Docker-Mailserver]].&lt;br /&gt;
&lt;br /&gt;
Pulse en el siguiente enlace para consultar la '''lista completa: [[:Categoría:Notas]]'''.&lt;br /&gt;
&lt;br /&gt;
==== Código ====&lt;br /&gt;
&lt;br /&gt;
Las notas aquí descritas pueden tener referencias a código fuente escrito por mi.&lt;br /&gt;
&lt;br /&gt;
Está disponible en [https://code.castanedo.es code.castanedo.es].&lt;br /&gt;
&lt;br /&gt;
Todo este software está disponible con licencia [https://www.gnu.org/licenses/gpl.html GPLv3].&lt;br /&gt;
&lt;br /&gt;
==== Ayuda ====&lt;br /&gt;
&lt;br /&gt;
Además es esta Wiki hay una [[:Categoría:Ayuda]] en las que se encuentran pequeñas guías de uso de servicios disponibles en mis servidores.&lt;br /&gt;
&lt;br /&gt;
Su función es que sirvan de ayuda para las personas que están usando estos servicios, aunque, por supuesto, son de libre consulta para cualquiera que los encuentre útiles.&lt;br /&gt;
&lt;br /&gt;
=== Espíritu ===&lt;br /&gt;
&lt;br /&gt;
El espíritu de esta wiki es el carácter libre y abierto.&lt;br /&gt;
&lt;br /&gt;
Todo el material que se aloje aquí será bajo licencia '''Creative Commons Attribution-ShareAlike 4.0''' ([https://creativecommons.org/licenses/by-sa/4.0/ CC BY-SA]) a menos que se exprese lo contrario.&lt;br /&gt;
&lt;br /&gt;
Para más detalles leer [[Wiki_Castanedo.es:Descargo_general]].&lt;br /&gt;
&lt;br /&gt;
=== Gracias ===&lt;br /&gt;
&lt;br /&gt;
'''Muchas gracias''' por visitar este sitio.&lt;br /&gt;
&lt;br /&gt;
Cualquier duda, consulta o corrección contacta en [mailto:guzman@castanedo.es guzman@castanedo.es].&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Archivo:Keycloak-DEV-Accesos.png&amp;diff=160</id>
		<title>Archivo:Keycloak-DEV-Accesos.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Archivo:Keycloak-DEV-Accesos.png&amp;diff=160"/>
		<updated>2026-03-22T21:21:16Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Keycloak-DEV-Accesos&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=P%C3%A1gina_principal&amp;diff=154</id>
		<title>Página principal</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=P%C3%A1gina_principal&amp;diff=154"/>
		<updated>2026-03-22T19:26:29Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
== Bienvenidos a Wiki Castanedo.es ==&lt;br /&gt;
&lt;br /&gt;
=== ¿Qué es esto? ===&lt;br /&gt;
&lt;br /&gt;
Mi Wiki personal. No sobre mi persona, sino sobre mis cosas.&lt;br /&gt;
&lt;br /&gt;
Antes tenía diferentes páginas en las que publicaba artículos y notas sobre temas, principalmente relacionados con el mundo [https://es.wikipedia.org/wiki/GNU/Linux GNU/Linux] y la administración de servidores, pero se hallaban dispersos y en diferentes formatos.&lt;br /&gt;
&lt;br /&gt;
Este proyecto busca en primer lugar unificarlo todo en un solo sitio y por otro retomar la publicación de las notas que voy tomando.&lt;br /&gt;
&lt;br /&gt;
=== Contenido ===&lt;br /&gt;
&lt;br /&gt;
Me gusta tomar notas de las cosas que voy haciendo, sobre todo en el mundo de la informática.&lt;br /&gt;
&lt;br /&gt;
Durante mucho tiempo estas notas me las he guardado para mi mismo, pero a partir de ahora las comparto con el que le interesen. Muchas son cosas sencillas y muy conocidas, otras sin embargo contienen información que me han llevado mucha documentación que leer y algunas, incluso, contienen información difícil de encontrar.&lt;br /&gt;
&lt;br /&gt;
Desde aquí se compartirá tres tipos de contenidos diferenciados: notas, código y ayuda.&lt;br /&gt;
&lt;br /&gt;
==== Notas ====&lt;br /&gt;
&lt;br /&gt;
Son las notas que he ido habiendo sobre administración de sistemas:&lt;br /&gt;
* '''Máquinas virtuales:'''&lt;br /&gt;
** [[Securizar Ubuntu Server]]&lt;br /&gt;
** Instalar y configurar un Servidor [[LEMP]] en Ubuntu Server (Linux + Nginx + MySQL + PHP).&lt;br /&gt;
** Instalar y configurar un [[Servidor de Correo]] (Postfix + Dovecot + SSL + SPF + OpenDKIM + OpenDMARC + Amavis + SpamAssassin).&lt;br /&gt;
** [[Administración servidor de correo]].&lt;br /&gt;
** Instalar y configurar [[GOGS]] (Repositorio Git).&lt;br /&gt;
** Instalar y configurar [[TeamSpeak 3]].&lt;br /&gt;
** Instalar y configurar un [[Servidor Minecraft]].&lt;br /&gt;
** Instalar y configurar [[Etherpad]] en Ubuntu Server.&lt;br /&gt;
** Notas sobre [[OpenSSL]].&lt;br /&gt;
** Notas de configuración de [[Drupal 7]] y [[Drupal 8]].&lt;br /&gt;
** Notas de configuración de [[WordPress]].&lt;br /&gt;
** Notas de configuración de [[MediaWiki]].&lt;br /&gt;
* '''Contenedores:'''&lt;br /&gt;
** Instalar y configurar [[Docker Engine]] en Ubuntu Server.&lt;br /&gt;
** Instalar y configurar [[OpenLDAP]] en Docker.&lt;br /&gt;
** Instalar y configurar [[Keycloak]] en Docker.&lt;br /&gt;
** Instalar y configurar [[Nextcloud AIO]] en Docker.&lt;br /&gt;
** Instalar y configurar de servidor de correo [[Docker-Mailserver]].&lt;br /&gt;
&lt;br /&gt;
Pulse en el siguiente enlace para consultar la '''lista completa: [[:Categoría:Notas]]'''.&lt;br /&gt;
&lt;br /&gt;
==== Código ====&lt;br /&gt;
&lt;br /&gt;
Las notas aquí descritas pueden tener referencias a código fuente escrito por mi.&lt;br /&gt;
&lt;br /&gt;
Está disponible en [https://code.castanedo.es code.castanedo.es].&lt;br /&gt;
&lt;br /&gt;
Todo este software está disponible con licencia [https://www.gnu.org/licenses/gpl.html GPLv3].&lt;br /&gt;
&lt;br /&gt;
==== Ayuda ====&lt;br /&gt;
&lt;br /&gt;
Además es esta Wiki hay una [[:Categoría:Ayuda]] en las que se encuentran pequeñas guías de uso de servicios disponibles en mis servidores.&lt;br /&gt;
&lt;br /&gt;
Su función es que sirvan de ayuda para las personas que están usando estos servicios, aunque, por supuesto, son de libre consulta para cualquiera que los encuentre útiles.&lt;br /&gt;
&lt;br /&gt;
=== Espíritu ===&lt;br /&gt;
&lt;br /&gt;
El espíritu de esta wiki es el carácter libre y abierto.&lt;br /&gt;
&lt;br /&gt;
Todo el material que se aloje aquí será bajo licencia '''Creative Commons Attribution-ShareAlike 4.0''' ([https://creativecommons.org/licenses/by-sa/4.0/ CC BY-SA]) a menos que se exprese lo contrario.&lt;br /&gt;
&lt;br /&gt;
Para más detalles leer [[Wiki_Castanedo.es:Descargo_general]].&lt;br /&gt;
&lt;br /&gt;
=== Gracias ===&lt;br /&gt;
&lt;br /&gt;
'''Muchas gracias''' por visitar este sitio.&lt;br /&gt;
&lt;br /&gt;
Cualquier duda, consulta o corrección contacta en [mailto:guzman@castanedo.es guzman@castanedo.es].&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=LEMP&amp;diff=142</id>
		<title>LEMP</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=LEMP&amp;diff=142"/>
		<updated>2026-03-22T15:04:43Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación servidor LEMP ==&lt;br /&gt;
Instalaremos:&lt;br /&gt;
* GNU Linux (Ubuntu Server 24.04)&lt;br /&gt;
* eNginx 1.24.0 (APT Ubuntu)&lt;br /&gt;
* MariaDB 10.8 (Repo oficiales de MariaDB)&lt;br /&gt;
* PHP 8.5 (PPA ondrej/php)&lt;br /&gt;
&lt;br /&gt;
== Permisos de root ==&lt;br /&gt;
Todos los comandos en esta guía se realizarán como root.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación Nginx (Stable) ==&lt;br /&gt;
* Actualizar repositorio&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar Nginx&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalación Apache Utils&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install apache2-utils&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación MariaDB ==&lt;br /&gt;
* Instalar requisitos&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install apt-transport-https curl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Añadir repositorios MariaDB (oficiales)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir -p /etc/apt/keyrings&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/apt/sources.list.d/mariadb.sources&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# MariaDB 11.8 repository list - created 2026-02-23 08:31 UTC&lt;br /&gt;
# https://mariadb.org/download/&lt;br /&gt;
X-Repolib-Name: MariaDB&lt;br /&gt;
Types: deb&lt;br /&gt;
# deb.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.&lt;br /&gt;
# URIs: https://deb.mariadb.org/11.8/ubuntu&lt;br /&gt;
URIs: https://mirror.raiolanetworks.com/mariadb/repo/11.8/ubuntu&lt;br /&gt;
Suites: noble&lt;br /&gt;
Components: main main/debug&lt;br /&gt;
Signed-By: /etc/apt/keyrings/mariadb-keyring.pgp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Actualizar repositorio&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalación de servidor y cliente&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install mariadb-client mariadb-server mariadb-plugin-provider-bzip2 mariadb-plugin-provider-lz4 mariadb-plugin-provider-lzma mariadb-plugin-provider-lzo mariadb-plugin-provider-snappy&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Inicializar base de datos&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mysql_secure_installation&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB&lt;br /&gt;
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!&lt;br /&gt;
&lt;br /&gt;
In order to log into MariaDB to secure it, we'll need the current&lt;br /&gt;
password for the root user. If you've just installed MariaDB, and&lt;br /&gt;
haven't set the root password yet, you should just press enter here.&lt;br /&gt;
&lt;br /&gt;
Enter current password for root (enter for none):&lt;br /&gt;
OK, successfully used password, moving on...&lt;br /&gt;
&lt;br /&gt;
Setting the root password or using the unix_socket ensures that nobody&lt;br /&gt;
can log into the MariaDB root user without the proper authorisation.&lt;br /&gt;
&lt;br /&gt;
You already have your root account protected, so you can safely answer 'n'.&lt;br /&gt;
&lt;br /&gt;
Switch to unix_socket authentication [Y/n] n&lt;br /&gt;
 ... skipping.&lt;br /&gt;
&lt;br /&gt;
You already have your root account protected, so you can safely answer 'n'.&lt;br /&gt;
&lt;br /&gt;
Change the root password? [Y/n] y&lt;br /&gt;
New password:&lt;br /&gt;
Re-enter new password:&lt;br /&gt;
Password updated successfully!&lt;br /&gt;
Reloading privilege tables..&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By default, a MariaDB installation has an anonymous user, allowing anyone&lt;br /&gt;
to log into MariaDB without having to have a user account created for&lt;br /&gt;
them.  This is intended only for testing, and to make the installation&lt;br /&gt;
go a bit smoother.  You should remove them before moving into a&lt;br /&gt;
production environment.&lt;br /&gt;
&lt;br /&gt;
Remove anonymous users? [Y/n] y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Normally, root should only be allowed to connect from 'localhost'.  This&lt;br /&gt;
ensures that someone cannot guess at the root password from the network.&lt;br /&gt;
&lt;br /&gt;
Disallow root login remotely? [Y/n] Y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
By default, MariaDB comes with a database named 'test' that anyone can&lt;br /&gt;
access.  This is also intended only for testing, and should be removed&lt;br /&gt;
before moving into a production environment.&lt;br /&gt;
&lt;br /&gt;
Remove test database and access to it? [Y/n] Y&lt;br /&gt;
 - Dropping test database...&lt;br /&gt;
 ... Success!&lt;br /&gt;
 - Removing privileges on test database...&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Reloading the privilege tables will ensure that all changes made so far&lt;br /&gt;
will take effect immediately.&lt;br /&gt;
&lt;br /&gt;
Reload privilege tables now? [Y/n] Y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Cleaning up...&lt;br /&gt;
&lt;br /&gt;
All done!  If you've completed all of the above steps, your MariaDB&lt;br /&gt;
installation should now be secure.&lt;br /&gt;
&lt;br /&gt;
Thanks for using MariaDB!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación PHP ==&lt;br /&gt;
Vamos a usar los repositorios PPA de ondrej/php&lt;br /&gt;
&lt;br /&gt;
* Instalar repositorio PPA&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;add-apt-repository ppa:ondrej/php&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Actualizar repositorios&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar PHP 8.5&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install php8.5 php8.5-apcu php8.5-common php8.5-fpm php8.5-curl php8.5-gd php8.5-mysql php8.5-xml php8.5-xmlrpc php8.5-bz2 php8.5-imap php8.5-intl php8.5-mbstring php8.5-soap php8.5-gnupg php8.5-imagick php8.5-mcrypt php8.5-zip&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación Let's Encrypt ==&lt;br /&gt;
Vamos a usar Let's Encrypt para generar las claves y certificados usadas para comunicaciones HTTPS.&lt;br /&gt;
&lt;br /&gt;
* Instalar Snap Core&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap install core&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Refrescar Snap Core&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap refresh core&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar Certbot&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap install --classic certbot&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear enlace simbólico&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /snap/bin/certbot /usr/local/bin/certbot&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Comprobar que está activada el timer de renovación&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl list-timers | grep certbot&lt;br /&gt;
Mon 2026-02-23 11:47:00 UTC      12h -                                      - snap.certbot.renew.timer       snap.certbot.renew.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración PHP ==&lt;br /&gt;
* Configuración php-fpm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/php/8.5/fpm/php.ini&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum amount of memory a script may consume&lt;br /&gt;
; https://php.net/memory-limit&lt;br /&gt;
memory_limit = 128M&lt;br /&gt;
max_memory_limit = -1&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum size of POST data that PHP will accept.&lt;br /&gt;
; Its value may be 0 to disable the limit. It is ignored if POST data reading&lt;br /&gt;
; is disabled through enable_post_data_reading.&lt;br /&gt;
; https://php.net/post-max-size&lt;br /&gt;
post_max_size = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's&lt;br /&gt;
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok&lt;br /&gt;
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting&lt;br /&gt;
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting&lt;br /&gt;
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts&lt;br /&gt;
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.&lt;br /&gt;
; https://php.net/cgi.fix-pathinfo&lt;br /&gt;
cgi.fix_pathinfo=0&lt;br /&gt;
[...]&lt;br /&gt;
; Whether to allow HTTP file uploads.&lt;br /&gt;
; https://php.net/file-uploads&lt;br /&gt;
file_uploads = On&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum allowed size for uploaded files.&lt;br /&gt;
; https://php.net/upload-max-filesize&lt;br /&gt;
upload_max_filesize = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum number of files that can be uploaded via a single request&lt;br /&gt;
max_file_uploads = 20&lt;br /&gt;
[...]&lt;br /&gt;
[Session]&lt;br /&gt;
; Handler used to store/retrieve data.&lt;br /&gt;
; https://php.net/session.save-handler&lt;br /&gt;
session.save_handler = files&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configuración php-cli:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/php/8.5/cli/php.ini&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum amount of memory a script may consume&lt;br /&gt;
; https://php.net/memory-limit&lt;br /&gt;
memory_limit = -1&lt;br /&gt;
max_memory_limit = -1&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum size of POST data that PHP will accept.&lt;br /&gt;
; Its value may be 0 to disable the limit. It is ignored if POST data reading&lt;br /&gt;
; is disabled through enable_post_data_reading.&lt;br /&gt;
; https://php.net/post-max-size&lt;br /&gt;
post_max_size = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's&lt;br /&gt;
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok&lt;br /&gt;
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting&lt;br /&gt;
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting&lt;br /&gt;
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts&lt;br /&gt;
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.&lt;br /&gt;
; https://php.net/cgi.fix-pathinfo&lt;br /&gt;
cgi.fix_pathinfo=0&lt;br /&gt;
[...]&lt;br /&gt;
; Whether to allow HTTP file uploads.&lt;br /&gt;
; https://php.net/file-uploads&lt;br /&gt;
file_uploads = On&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum allowed size for uploaded files.&lt;br /&gt;
; https://php.net/upload-max-filesize&lt;br /&gt;
upload_max_filesize = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum number of files that can be uploaded via a single request&lt;br /&gt;
max_file_uploads = 20&lt;br /&gt;
[...]&lt;br /&gt;
[Session]&lt;br /&gt;
; Handler used to store/retrieve data.&lt;br /&gt;
; https://php.net/session.save-handler&lt;br /&gt;
session.save_handler = files&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar php-fpm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart php8.5-fpm.service&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración Nginx ==&lt;br /&gt;
* Backup nginx.conf&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cp -a /etc/nginx/nginx.conf /etc/nginx/nginx.conf.$(date +%Y%m%d)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Editar nginx.conf&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/nginx.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
http {&lt;br /&gt;
        ##&lt;br /&gt;
        # Basic Settings&lt;br /&gt;
        ##&lt;br /&gt;
        sendfile on;&lt;br /&gt;
        tcp_nopush on;&lt;br /&gt;
        types_hash_max_size 2048;&lt;br /&gt;
        client_max_body_size 100M;&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
[...]&lt;br /&gt;
        ##&lt;br /&gt;
        # SSL Settings&lt;br /&gt;
        ##&lt;br /&gt;
        #ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE&lt;br /&gt;
        ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
        ssl_prefer_server_ciphers on;&lt;br /&gt;
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;&lt;br /&gt;
[...]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Generar PHParam:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /etc/nginx/ssl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar contraseñas:&lt;br /&gt;
Si se quiere configurar contraseñas Auth Basic se almacenan en /etc/nginx/passwd.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /etc/nginx/passwd&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;htpasswd -c -B /etc/nginx/passwd/test.pw guzman&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar snippets:&lt;br /&gt;
Estos &amp;quot;fragmentos&amp;quot; se pueden usar para permitir que sistemas funcionen si se tiene Auth Basic activo (como robots.txt o validación de Let's Encrypt).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/allowed.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Allow favicon.ico, robots.txt, .well-known/&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
        access_log off;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Allow robots.txt&lt;br /&gt;
location = /robots.txt {&lt;br /&gt;
        allow all;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
        access_log off;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Allow &amp;quot;Well-Known URIs&amp;quot; as pwe RFC 5785 (e.g. Let's Encrypt)&lt;br /&gt;
location ~* ^/.well-known/ {&lt;br /&gt;
        auth_basic off;&lt;br /&gt;
        allow all;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/denied.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Deny *.txt, *.log, .*/*.php, .*, *.json, .lock, *.ht&lt;br /&gt;
&lt;br /&gt;
# Not allow txt or logs to be downloaded&lt;br /&gt;
location ~* \.(txt|log)$ {&lt;br /&gt;
        deny all;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow execute php in hidden folders&lt;br /&gt;
location ~ \..*/.\.php$ {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow &amp;quot;hidden files&amp;quot;&lt;br /&gt;
location ~ (^|/)\. {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow *.json or *.lock&lt;br /&gt;
location ~* \.(json|lock)$ {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Deny *.ht&lt;br /&gt;
location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/hsts.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Activate HSTS (HTTP Strict Transport Security)&lt;br /&gt;
# Note: if we set another header in a location we've to&lt;br /&gt;
#       rewrite it&lt;br /&gt;
add_header Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot; always;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar sites-available:&lt;br /&gt;
En al carpeta /etc/nginx/sites-available/ se almacenan todos los Virtual Hosts disponibles.&lt;br /&gt;
En Nginx hay que personalizar cada uno por cada tipo de aplicación.&lt;br /&gt;
Hay que tener en cuenta las diferentes URL's.&lt;br /&gt;
&lt;br /&gt;
* Configurar sites-enabled:&lt;br /&gt;
Se suelen configurar enlaces simbólicos con la carpeta sites-available para activarlos.&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar Nginx:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración MariaDB ==&lt;br /&gt;
* Conectar a MariaDB&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mariadb&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Opción 1: Permitir conexiones por TCP (sólo desde localhost)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Sql&amp;quot;&amp;gt;&lt;br /&gt;
grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Opción 2: Permitir conexiones por Sockets UNIX (sólo desde localhost)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Sql&amp;quot;&amp;gt;&lt;br /&gt;
grant all privileges on *.* to 'root'@'localhost' identified via unix_socket with grant option;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nota: esta opción es la que suelo usar yo (no se pueden usar los dos a la vez).&lt;br /&gt;
&lt;br /&gt;
== Habilitar puertos en cortafuegos ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw allow 80/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw allow 443/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Virtual Host de ejemplo ==&lt;br /&gt;
=== Generar certificados autofirmados (temporales) ===&lt;br /&gt;
Estos certificados los vamos a generar sólo para levantar el Virtual Host y los sustituiremos por unos de Let's Encrypt.&lt;br /&gt;
* Generamos clave privada:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /etc/ssl/private&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl genrsa -out selfsigned.key&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Generamos petición de firma (CSR):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
openssl req -key selfsigned.key -new -out selfsigned.csr&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter '.', the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:ES&lt;br /&gt;
State or Province Name (full name) [Some-State]:Madrid&lt;br /&gt;
Locality Name (eg, city) []:Madrid&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:GCV&lt;br /&gt;
Organizational Unit Name (eg, section) []:GCV&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:www.culturetas.net&lt;br /&gt;
Email Address []:&lt;br /&gt;
&lt;br /&gt;
Please enter the following 'extra' attributes&lt;br /&gt;
to be sent with your certificate request&lt;br /&gt;
A challenge password []:&lt;br /&gt;
An optional company name []:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Auto-firmamos con la misma firma:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl x509 -signkey selfsigned.key -in selfsigned.csr -req -days 365 -out selfsigned.crt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Movemos certificados a las carpetas correctas:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv selfsigned.key /etc/ssl/private/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv selfsigned.crt /etc/ssl/certs/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;rm selfsigned.csr&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Referencia: [https://www.baeldung.com/openssl-self-signed-cert https://www.baeldung.com/openssl-self-signed-cert]&lt;br /&gt;
&lt;br /&gt;
=== Dar de alta Virtual Host en Nginx ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/sites-available/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
##&lt;br /&gt;
# You should look at the following URL's in order to grasp a solid understanding&lt;br /&gt;
# of Nginx configuration files in order to fully unleash the power of Nginx.&lt;br /&gt;
# http://wiki.nginx.org/Pitfalls&lt;br /&gt;
# http://wiki.nginx.org/QuickStart&lt;br /&gt;
# http://wiki.nginx.org/Configuration&lt;br /&gt;
#&lt;br /&gt;
# Generally, you will want to move this file somewhere, and start with a clean&lt;br /&gt;
# file but keep this around for reference. Or just disable in sites-enabled.&lt;br /&gt;
#&lt;br /&gt;
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
# Default server configuration&lt;br /&gt;
#&lt;br /&gt;
server {&lt;br /&gt;
        # Redirect HTTP to HTTPS&lt;br /&gt;
        listen 80 default_server;&lt;br /&gt;
        listen [::]:80 default_server;&lt;br /&gt;
        server_name www.culturetas.net culturetas.net;&lt;br /&gt;
        # Redirect HTTP to HTTPS&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
        # SSL configuration&lt;br /&gt;
        #&lt;br /&gt;
        listen 443 ssl http2 default_server;&lt;br /&gt;
        listen [::]:443 ssl http2 default_server;&lt;br /&gt;
        ssl_certificate /etc/ssl/certs/selfsigned.crt;&lt;br /&gt;
        ssl_certificate_key /etc/ssl/private/selfsigned.key;&lt;br /&gt;
        #&lt;br /&gt;
        # Note: You should disable gzip for SSL traffic.&lt;br /&gt;
        # See: https://bugs.debian.org/773332&lt;br /&gt;
        #&lt;br /&gt;
        # Read up on ssl_ciphers to ensure a secure configuration.&lt;br /&gt;
        # See: https://bugs.debian.org/765782&lt;br /&gt;
        #&lt;br /&gt;
        # Self signed certs generated by the ssl-cert package&lt;br /&gt;
        # Don't use them in a production server!&lt;br /&gt;
        #&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&lt;br /&gt;
        root /var/www/culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        # Add index.php to the list if you are using PHP&lt;br /&gt;
        index index.php index.html index.htm;&lt;br /&gt;
&lt;br /&gt;
        server_name www.culturetas.net culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        access_log /var/log/nginx/culturetas.net-access.log;&lt;br /&gt;
        error_log /var/log/nginx/culturetas.net-error.log;&lt;br /&gt;
&lt;br /&gt;
#       # Auth Basic (for developing)&lt;br /&gt;
#       auth_basic &amp;quot;Pagina Restringida&amp;quot;;&lt;br /&gt;
#       auth_basic_user_file /etc/nginx/passwd/passwd-culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        # Activate HSTS (HTTP Strict Transport Security)&lt;br /&gt;
        # Note: reinclude if in a location a header is set&lt;br /&gt;
        include snippets/hsts.conf;&lt;br /&gt;
&lt;br /&gt;
        # Allow favicon.ico, robots.txt, .well-known/&lt;br /&gt;
        # Deny *.txt, *.log, .*/*.php, .*, *.json, .lock, *.ht&lt;br /&gt;
        include snippets/allowed.conf;&lt;br /&gt;
        include snippets/denied.conf;&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                # First attempt to serve request as file, then&lt;br /&gt;
                # as directory, then fall back to displaying a 404.&lt;br /&gt;
                #try_files $uri $uri/ =404;&lt;br /&gt;
                try_files $uri $uri/ /index.php?$args;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # pass the PHP scripts to FastCGI server&lt;br /&gt;
        #&lt;br /&gt;
        location ~ \.php$ {&lt;br /&gt;
                include snippets/fastcgi-php.conf;&lt;br /&gt;
&lt;br /&gt;
        #       # With php8.5-cgi alone (TCP Ports):&lt;br /&gt;
        #       fastcgi_pass 127.0.0.1:9000;&lt;br /&gt;
                # With php8.5-fpm (UNIX Socket):&lt;br /&gt;
                fastcgi_pass unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # Disable hidden files&lt;br /&gt;
        location ~ /\. {&lt;br /&gt;
                deny all;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desactivar Virtual Host por defecto ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;rm /etc/nginx/sites-enabled/default&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Activar Virtual Host nuevo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/culturetas.net /etc/nginx/sites-enabled/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar nuevas claves con Let's Encrypt ===&lt;br /&gt;
El certbot de Let's Encrypt ya contiene un plugin que gestiona Nginx.&lt;br /&gt;
Usándolo no sólo nos generará automáticamente las claves y certificados, si no que lo aplicará en el servidor por nosotros.&lt;br /&gt;
Además, también se encargará de la renovación, por lo que desatiende toda esa parte de gestión de certificados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
certbot --nginx&lt;br /&gt;
Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
Enter email address or hit Enter to skip.&lt;br /&gt;
 (Enter 'c' to cancel): admin@ejemplo.com&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Please read the Terms of Service at:&lt;br /&gt;
https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf&lt;br /&gt;
You must agree in order to register with the ACME server. Do you agree?&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
(Y)es/(N)o: Y&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Would you be willing, once your first certificate is successfully issued, to&lt;br /&gt;
share your email address with the Electronic Frontier Foundation, a founding&lt;br /&gt;
partner of the Let's Encrypt project and the non-profit organization that&lt;br /&gt;
develops Certbot? We'd like to send you email about our work encrypting the web,&lt;br /&gt;
EFF news, campaigns, and ways to support digital freedom.&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
(Y)es/(N)o: N&lt;br /&gt;
Account registered.&lt;br /&gt;
&lt;br /&gt;
Which names would you like to activate HTTPS for?&lt;br /&gt;
We recommend selecting either all domains, or all domains in a VirtualHost/server block.&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
1: culturetas.net&lt;br /&gt;
2: www.culturetas.net&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Select the appropriate numbers separated by commas and/or spaces, or leave input&lt;br /&gt;
blank to select all options shown (Enter 'c' to cancel): 1,2&lt;br /&gt;
Requesting a certificate for culturetas.net and www.culturetas.net&lt;br /&gt;
&lt;br /&gt;
Successfully received certificate.&lt;br /&gt;
Certificate is saved at: /etc/letsencrypt/live/culturetas.net/fullchain.pem&lt;br /&gt;
Key is saved at:         /etc/letsencrypt/live/culturetas.net/privkey.pem&lt;br /&gt;
This certificate expires on 2026-05-25.&lt;br /&gt;
These files will be updated when the certificate renews.&lt;br /&gt;
Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
&lt;br /&gt;
Deploying certificate&lt;br /&gt;
Successfully deployed certificate for culturetas.net to /etc/nginx/sites-enabled/culturetas.net&lt;br /&gt;
Successfully deployed certificate for www.culturetas.net to /etc/nginx/sites-enabled/culturetas.net&lt;br /&gt;
Congratulations! You have successfully enabled HTTPS on https://culturetas.net and https://www.culturetas.net&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
If you like Certbot, please consider supporting our work by:&lt;br /&gt;
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate&lt;br /&gt;
 * Donating to EFF:                    https://eff.org/donate-le&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desplegar página de ejemplo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /var/www/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /var/www/culturetas.net/index.html&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;es&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Culturetas.net - En construcción&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;style&amp;gt;&lt;br /&gt;
    body {&lt;br /&gt;
      margin: 0;&lt;br /&gt;
      padding: 0;&lt;br /&gt;
      height: 100vh;&lt;br /&gt;
      font-family: system-ui, -apple-system, sans-serif;&lt;br /&gt;
      background: linear-gradient(135deg, #1e3a8a 0%, #3b82f6 100%);&lt;br /&gt;
      color: white;&lt;br /&gt;
      display: flex;&lt;br /&gt;
      flex-direction: column;&lt;br /&gt;
      align-items: center;&lt;br /&gt;
      justify-content: center;&lt;br /&gt;
      text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .container {&lt;br /&gt;
      max-width: 700px;&lt;br /&gt;
      padding: 20px;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    h1 {&lt;br /&gt;
      font-size: 4.5rem;&lt;br /&gt;
      margin: 0.2em 0;&lt;br /&gt;
      font-weight: 800;&lt;br /&gt;
      letter-spacing: -1px;&lt;br /&gt;
      text-shadow: 0 4px 12px rgba(0,0,0,0.3);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .subtitle {&lt;br /&gt;
      font-size: 1.6rem;&lt;br /&gt;
      margin: 0.8em 0 1.5em;&lt;br /&gt;
      opacity: 0.95;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .construction {&lt;br /&gt;
      font-size: 8rem;&lt;br /&gt;
      margin: 0.3em 0;&lt;br /&gt;
      animation: bounce 3s infinite;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    p {&lt;br /&gt;
      font-size: 1.3rem;&lt;br /&gt;
      line-height: 1.6;&lt;br /&gt;
      max-width: 600px;&lt;br /&gt;
      margin: 1.5em auto;&lt;br /&gt;
      opacity: 0.9;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .soon {&lt;br /&gt;
      font-size: 2rem;&lt;br /&gt;
      font-weight: bold;&lt;br /&gt;
      margin-top: 2rem;&lt;br /&gt;
      color: #fef08a;&lt;br /&gt;
      text-shadow: 0 2px 10px rgba(0,0,0,0.4);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @keyframes bounce {&lt;br /&gt;
      0%, 20%, 50%, 80%, 100% { transform: translateY(0); }&lt;br /&gt;
      40% { transform: translateY(-25px); }&lt;br /&gt;
      60% { transform: translateY(-12px); }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @media (max-width: 600px) {&lt;br /&gt;
      h1 { font-size: 3.2rem; }&lt;br /&gt;
      .construction { font-size: 6rem; }&lt;br /&gt;
      .subtitle { font-size: 1.3rem; }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;construction&amp;quot;&amp;gt;🚧&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Culturetas.net&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;subtitle&amp;quot;&amp;gt;Está en construcción&amp;lt;/div&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Estamos trabajando para traerte un espacio mucho más bonito, rápido y con mucho más contenido cultural interesante.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;¡Vuelve en unos días y te sorprenderás!&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;div class=&amp;quot;soon&amp;quot;&amp;gt;Próximamente... ✨&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=LEMP&amp;diff=141</id>
		<title>LEMP</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=LEMP&amp;diff=141"/>
		<updated>2026-03-22T14:59:00Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación servidor LEMP ==&lt;br /&gt;
Instalaremos:&lt;br /&gt;
* GNU Linux (Ubuntu Server 24.04)&lt;br /&gt;
* eNginx 1.24.0 (APT Ubuntu)&lt;br /&gt;
* MariaDB 10.8 (Repo oficiales de MariaDB)&lt;br /&gt;
* PHP 8.5 (PPA ondrej/php)&lt;br /&gt;
&lt;br /&gt;
== Permisos de root ==&lt;br /&gt;
Todos los comandos en esta guía se realizarán como root.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación Nginx (Stable) ==&lt;br /&gt;
* Actualizar repositorio&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar Nginx&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalación Apache Utils&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install apache2-utils&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalación módulo Nginx Stream (para balancear a puertos TCP o UDP no HTTP)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install libnginx-mod-stream&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación MariaDB ==&lt;br /&gt;
* Instalar requisitos&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install apt-transport-https curl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Añadir repositorios MariaDB (oficiales)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir -p /etc/apt/keyrings&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/apt/sources.list.d/mariadb.sources&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# MariaDB 11.8 repository list - created 2026-02-23 08:31 UTC&lt;br /&gt;
# https://mariadb.org/download/&lt;br /&gt;
X-Repolib-Name: MariaDB&lt;br /&gt;
Types: deb&lt;br /&gt;
# deb.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.&lt;br /&gt;
# URIs: https://deb.mariadb.org/11.8/ubuntu&lt;br /&gt;
URIs: https://mirror.raiolanetworks.com/mariadb/repo/11.8/ubuntu&lt;br /&gt;
Suites: noble&lt;br /&gt;
Components: main main/debug&lt;br /&gt;
Signed-By: /etc/apt/keyrings/mariadb-keyring.pgp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Actualizar repositorio&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalación de servidor y cliente&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install mariadb-client mariadb-server mariadb-plugin-provider-bzip2 mariadb-plugin-provider-lz4 mariadb-plugin-provider-lzma mariadb-plugin-provider-lzo mariadb-plugin-provider-snappy&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Inicializar base de datos&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mysql_secure_installation&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB&lt;br /&gt;
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!&lt;br /&gt;
&lt;br /&gt;
In order to log into MariaDB to secure it, we'll need the current&lt;br /&gt;
password for the root user. If you've just installed MariaDB, and&lt;br /&gt;
haven't set the root password yet, you should just press enter here.&lt;br /&gt;
&lt;br /&gt;
Enter current password for root (enter for none):&lt;br /&gt;
OK, successfully used password, moving on...&lt;br /&gt;
&lt;br /&gt;
Setting the root password or using the unix_socket ensures that nobody&lt;br /&gt;
can log into the MariaDB root user without the proper authorisation.&lt;br /&gt;
&lt;br /&gt;
You already have your root account protected, so you can safely answer 'n'.&lt;br /&gt;
&lt;br /&gt;
Switch to unix_socket authentication [Y/n] n&lt;br /&gt;
 ... skipping.&lt;br /&gt;
&lt;br /&gt;
You already have your root account protected, so you can safely answer 'n'.&lt;br /&gt;
&lt;br /&gt;
Change the root password? [Y/n] y&lt;br /&gt;
New password:&lt;br /&gt;
Re-enter new password:&lt;br /&gt;
Password updated successfully!&lt;br /&gt;
Reloading privilege tables..&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By default, a MariaDB installation has an anonymous user, allowing anyone&lt;br /&gt;
to log into MariaDB without having to have a user account created for&lt;br /&gt;
them.  This is intended only for testing, and to make the installation&lt;br /&gt;
go a bit smoother.  You should remove them before moving into a&lt;br /&gt;
production environment.&lt;br /&gt;
&lt;br /&gt;
Remove anonymous users? [Y/n] y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Normally, root should only be allowed to connect from 'localhost'.  This&lt;br /&gt;
ensures that someone cannot guess at the root password from the network.&lt;br /&gt;
&lt;br /&gt;
Disallow root login remotely? [Y/n] Y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
By default, MariaDB comes with a database named 'test' that anyone can&lt;br /&gt;
access.  This is also intended only for testing, and should be removed&lt;br /&gt;
before moving into a production environment.&lt;br /&gt;
&lt;br /&gt;
Remove test database and access to it? [Y/n] Y&lt;br /&gt;
 - Dropping test database...&lt;br /&gt;
 ... Success!&lt;br /&gt;
 - Removing privileges on test database...&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Reloading the privilege tables will ensure that all changes made so far&lt;br /&gt;
will take effect immediately.&lt;br /&gt;
&lt;br /&gt;
Reload privilege tables now? [Y/n] Y&lt;br /&gt;
 ... Success!&lt;br /&gt;
&lt;br /&gt;
Cleaning up...&lt;br /&gt;
&lt;br /&gt;
All done!  If you've completed all of the above steps, your MariaDB&lt;br /&gt;
installation should now be secure.&lt;br /&gt;
&lt;br /&gt;
Thanks for using MariaDB!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación PHP ==&lt;br /&gt;
Vamos a usar los repositorios PPA de ondrej/php&lt;br /&gt;
&lt;br /&gt;
* Instalar repositorio PPA&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;add-apt-repository ppa:ondrej/php&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Actualizar repositorios&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar PHP 8.5&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install php8.5 php8.5-apcu php8.5-common php8.5-fpm php8.5-curl php8.5-gd php8.5-mysql php8.5-xml php8.5-xmlrpc php8.5-bz2 php8.5-imap php8.5-intl php8.5-mbstring php8.5-soap php8.5-gnupg php8.5-imagick php8.5-mcrypt php8.5-zip&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalación Let's Encrypt ==&lt;br /&gt;
Vamos a usar Let's Encrypt para generar las claves y certificados usadas para comunicaciones HTTPS.&lt;br /&gt;
&lt;br /&gt;
* Instalar Snap Core&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap install core&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Refrescar Snap Core&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap refresh core&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Instalar Certbot&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;snap install --classic certbot&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear enlace simbólico&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /snap/bin/certbot /usr/local/bin/certbot&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Comprobar que está activada el timer de renovación&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl list-timers | grep certbot&lt;br /&gt;
Mon 2026-02-23 11:47:00 UTC      12h -                                      - snap.certbot.renew.timer       snap.certbot.renew.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración PHP ==&lt;br /&gt;
* Configuración php-fpm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/php/8.5/fpm/php.ini&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum amount of memory a script may consume&lt;br /&gt;
; https://php.net/memory-limit&lt;br /&gt;
memory_limit = 128M&lt;br /&gt;
max_memory_limit = -1&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum size of POST data that PHP will accept.&lt;br /&gt;
; Its value may be 0 to disable the limit. It is ignored if POST data reading&lt;br /&gt;
; is disabled through enable_post_data_reading.&lt;br /&gt;
; https://php.net/post-max-size&lt;br /&gt;
post_max_size = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's&lt;br /&gt;
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok&lt;br /&gt;
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting&lt;br /&gt;
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting&lt;br /&gt;
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts&lt;br /&gt;
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.&lt;br /&gt;
; https://php.net/cgi.fix-pathinfo&lt;br /&gt;
cgi.fix_pathinfo=0&lt;br /&gt;
[...]&lt;br /&gt;
; Whether to allow HTTP file uploads.&lt;br /&gt;
; https://php.net/file-uploads&lt;br /&gt;
file_uploads = On&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum allowed size for uploaded files.&lt;br /&gt;
; https://php.net/upload-max-filesize&lt;br /&gt;
upload_max_filesize = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum number of files that can be uploaded via a single request&lt;br /&gt;
max_file_uploads = 20&lt;br /&gt;
[...]&lt;br /&gt;
[Session]&lt;br /&gt;
; Handler used to store/retrieve data.&lt;br /&gt;
; https://php.net/session.save-handler&lt;br /&gt;
session.save_handler = files&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configuración php-cli:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/php/8.5/cli/php.ini&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum amount of memory a script may consume&lt;br /&gt;
; https://php.net/memory-limit&lt;br /&gt;
memory_limit = -1&lt;br /&gt;
max_memory_limit = -1&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum size of POST data that PHP will accept.&lt;br /&gt;
; Its value may be 0 to disable the limit. It is ignored if POST data reading&lt;br /&gt;
; is disabled through enable_post_data_reading.&lt;br /&gt;
; https://php.net/post-max-size&lt;br /&gt;
post_max_size = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's&lt;br /&gt;
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok&lt;br /&gt;
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting&lt;br /&gt;
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting&lt;br /&gt;
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts&lt;br /&gt;
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.&lt;br /&gt;
; https://php.net/cgi.fix-pathinfo&lt;br /&gt;
cgi.fix_pathinfo=0&lt;br /&gt;
[...]&lt;br /&gt;
; Whether to allow HTTP file uploads.&lt;br /&gt;
; https://php.net/file-uploads&lt;br /&gt;
file_uploads = On&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum allowed size for uploaded files.&lt;br /&gt;
; https://php.net/upload-max-filesize&lt;br /&gt;
upload_max_filesize = 100M&lt;br /&gt;
[...]&lt;br /&gt;
; Maximum number of files that can be uploaded via a single request&lt;br /&gt;
max_file_uploads = 20&lt;br /&gt;
[...]&lt;br /&gt;
[Session]&lt;br /&gt;
; Handler used to store/retrieve data.&lt;br /&gt;
; https://php.net/session.save-handler&lt;br /&gt;
session.save_handler = files&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar php-fpm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart php8.5-fpm.service&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración Nginx ==&lt;br /&gt;
* Backup nginx.conf&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cp -a /etc/nginx/nginx.conf /etc/nginx/nginx.conf.$(date +%Y%m%d)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Editar nginx.conf&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/nginx.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
http {&lt;br /&gt;
        ##&lt;br /&gt;
        # Basic Settings&lt;br /&gt;
        ##&lt;br /&gt;
        sendfile on;&lt;br /&gt;
        tcp_nopush on;&lt;br /&gt;
        types_hash_max_size 2048;&lt;br /&gt;
        client_max_body_size 100M;&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
[...]&lt;br /&gt;
        ##&lt;br /&gt;
        # SSL Settings&lt;br /&gt;
        ##&lt;br /&gt;
        #ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE&lt;br /&gt;
        ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
        ssl_prefer_server_ciphers on;&lt;br /&gt;
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;&lt;br /&gt;
[...]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Generar PHParam:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /etc/nginx/ssl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar contraseñas:&lt;br /&gt;
Si se quiere configurar contraseñas Auth Basic se almacenan en /etc/nginx/passwd.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /etc/nginx/passwd&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;htpasswd -c -B /etc/nginx/passwd/test.pw guzman&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar snippets:&lt;br /&gt;
Estos &amp;quot;fragmentos&amp;quot; se pueden usar para permitir que sistemas funcionen si se tiene Auth Basic activo (como robots.txt o validación de Let's Encrypt).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/allowed.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Allow favicon.ico, robots.txt, .well-known/&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
        access_log off;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Allow robots.txt&lt;br /&gt;
location = /robots.txt {&lt;br /&gt;
        allow all;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
        access_log off;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Allow &amp;quot;Well-Known URIs&amp;quot; as pwe RFC 5785 (e.g. Let's Encrypt)&lt;br /&gt;
location ~* ^/.well-known/ {&lt;br /&gt;
        auth_basic off;&lt;br /&gt;
        allow all;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/denied.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Deny *.txt, *.log, .*/*.php, .*, *.json, .lock, *.ht&lt;br /&gt;
&lt;br /&gt;
# Not allow txt or logs to be downloaded&lt;br /&gt;
location ~* \.(txt|log)$ {&lt;br /&gt;
        deny all;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow execute php in hidden folders&lt;br /&gt;
location ~ \..*/.\.php$ {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow &amp;quot;hidden files&amp;quot;&lt;br /&gt;
location ~ (^|/)\. {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Not allow *.json or *.lock&lt;br /&gt;
location ~* \.(json|lock)$ {&lt;br /&gt;
        return 403;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Deny *.ht&lt;br /&gt;
location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/snippets/hsts.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Activate HSTS (HTTP Strict Transport Security)&lt;br /&gt;
# Note: if we set another header in a location we've to&lt;br /&gt;
#       rewrite it&lt;br /&gt;
add_header Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot; always;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configurar sites-available:&lt;br /&gt;
En al carpeta /etc/nginx/sites-available/ se almacenan todos los Virtual Hosts disponibles.&lt;br /&gt;
En Nginx hay que personalizar cada uno por cada tipo de aplicación.&lt;br /&gt;
Hay que tener en cuenta las diferentes URL's.&lt;br /&gt;
&lt;br /&gt;
* Configurar sites-enabled:&lt;br /&gt;
Se suelen configurar enlaces simbólicos con la carpeta sites-available para activarlos.&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar Nginx:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración MariaDB ==&lt;br /&gt;
* Conectar a MariaDB&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mariadb&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Opción 1: Permitir conexiones por TCP (sólo desde localhost)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Sql&amp;quot;&amp;gt;&lt;br /&gt;
grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Opción 2: Permitir conexiones por Sockets UNIX (sólo desde localhost)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Sql&amp;quot;&amp;gt;&lt;br /&gt;
grant all privileges on *.* to 'root'@'localhost' identified via unix_socket with grant option;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nota: esta opción es la que suelo usar yo (no se pueden usar los dos a la vez).&lt;br /&gt;
&lt;br /&gt;
== Habilitar puertos en cortafuegos ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw allow 80/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw allow 443/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Virtual Host de ejemplo ==&lt;br /&gt;
=== Generar certificados autofirmados (temporales) ===&lt;br /&gt;
Estos certificados los vamos a generar sólo para levantar el Virtual Host y los sustituiremos por unos de Let's Encrypt.&lt;br /&gt;
* Generamos clave privada:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /etc/ssl/private&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl genrsa -out selfsigned.key&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Generamos petición de firma (CSR):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
openssl req -key selfsigned.key -new -out selfsigned.csr&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter '.', the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:ES&lt;br /&gt;
State or Province Name (full name) [Some-State]:Madrid&lt;br /&gt;
Locality Name (eg, city) []:Madrid&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:GCV&lt;br /&gt;
Organizational Unit Name (eg, section) []:GCV&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:www.culturetas.net&lt;br /&gt;
Email Address []:&lt;br /&gt;
&lt;br /&gt;
Please enter the following 'extra' attributes&lt;br /&gt;
to be sent with your certificate request&lt;br /&gt;
A challenge password []:&lt;br /&gt;
An optional company name []:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Auto-firmamos con la misma firma:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;openssl x509 -signkey selfsigned.key -in selfsigned.csr -req -days 365 -out selfsigned.crt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Movemos certificados a las carpetas correctas:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv selfsigned.key /etc/ssl/private/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv selfsigned.crt /etc/ssl/certs/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;rm selfsigned.csr&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Referencia: [https://www.baeldung.com/openssl-self-signed-cert https://www.baeldung.com/openssl-self-signed-cert]&lt;br /&gt;
&lt;br /&gt;
=== Dar de alta Virtual Host en Nginx ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/nginx/sites-available/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
##&lt;br /&gt;
# You should look at the following URL's in order to grasp a solid understanding&lt;br /&gt;
# of Nginx configuration files in order to fully unleash the power of Nginx.&lt;br /&gt;
# http://wiki.nginx.org/Pitfalls&lt;br /&gt;
# http://wiki.nginx.org/QuickStart&lt;br /&gt;
# http://wiki.nginx.org/Configuration&lt;br /&gt;
#&lt;br /&gt;
# Generally, you will want to move this file somewhere, and start with a clean&lt;br /&gt;
# file but keep this around for reference. Or just disable in sites-enabled.&lt;br /&gt;
#&lt;br /&gt;
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
# Default server configuration&lt;br /&gt;
#&lt;br /&gt;
server {&lt;br /&gt;
        # Redirect HTTP to HTTPS&lt;br /&gt;
        listen 80 default_server;&lt;br /&gt;
        listen [::]:80 default_server;&lt;br /&gt;
        server_name www.culturetas.net culturetas.net;&lt;br /&gt;
        # Redirect HTTP to HTTPS&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
        # SSL configuration&lt;br /&gt;
        #&lt;br /&gt;
        listen 443 ssl http2 default_server;&lt;br /&gt;
        listen [::]:443 ssl http2 default_server;&lt;br /&gt;
        ssl_certificate /etc/ssl/certs/selfsigned.crt;&lt;br /&gt;
        ssl_certificate_key /etc/ssl/private/selfsigned.key;&lt;br /&gt;
        #&lt;br /&gt;
        # Note: You should disable gzip for SSL traffic.&lt;br /&gt;
        # See: https://bugs.debian.org/773332&lt;br /&gt;
        #&lt;br /&gt;
        # Read up on ssl_ciphers to ensure a secure configuration.&lt;br /&gt;
        # See: https://bugs.debian.org/765782&lt;br /&gt;
        #&lt;br /&gt;
        # Self signed certs generated by the ssl-cert package&lt;br /&gt;
        # Don't use them in a production server!&lt;br /&gt;
        #&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&lt;br /&gt;
        root /var/www/culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        # Add index.php to the list if you are using PHP&lt;br /&gt;
        index index.php index.html index.htm;&lt;br /&gt;
&lt;br /&gt;
        server_name www.culturetas.net culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        access_log /var/log/nginx/culturetas.net-access.log;&lt;br /&gt;
        error_log /var/log/nginx/culturetas.net-error.log;&lt;br /&gt;
&lt;br /&gt;
#       # Auth Basic (for developing)&lt;br /&gt;
#       auth_basic &amp;quot;Pagina Restringida&amp;quot;;&lt;br /&gt;
#       auth_basic_user_file /etc/nginx/passwd/passwd-culturetas.net;&lt;br /&gt;
&lt;br /&gt;
        # Activate HSTS (HTTP Strict Transport Security)&lt;br /&gt;
        # Note: reinclude if in a location a header is set&lt;br /&gt;
        include snippets/hsts.conf;&lt;br /&gt;
&lt;br /&gt;
        # Allow favicon.ico, robots.txt, .well-known/&lt;br /&gt;
        # Deny *.txt, *.log, .*/*.php, .*, *.json, .lock, *.ht&lt;br /&gt;
        include snippets/allowed.conf;&lt;br /&gt;
        include snippets/denied.conf;&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                # First attempt to serve request as file, then&lt;br /&gt;
                # as directory, then fall back to displaying a 404.&lt;br /&gt;
                #try_files $uri $uri/ =404;&lt;br /&gt;
                try_files $uri $uri/ /index.php?$args;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # pass the PHP scripts to FastCGI server&lt;br /&gt;
        #&lt;br /&gt;
        location ~ \.php$ {&lt;br /&gt;
                include snippets/fastcgi-php.conf;&lt;br /&gt;
&lt;br /&gt;
        #       # With php8.5-cgi alone (TCP Ports):&lt;br /&gt;
        #       fastcgi_pass 127.0.0.1:9000;&lt;br /&gt;
                # With php8.5-fpm (UNIX Socket):&lt;br /&gt;
                fastcgi_pass unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # Disable hidden files&lt;br /&gt;
        location ~ /\. {&lt;br /&gt;
                deny all;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desactivar Virtual Host por defecto ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;rm /etc/nginx/sites-enabled/default&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Activar Virtual Host nuevo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ln -s /etc/nginx/sites-available/culturetas.net /etc/nginx/sites-enabled/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl reload nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generar nuevas claves con Let's Encrypt ===&lt;br /&gt;
El certbot de Let's Encrypt ya contiene un plugin que gestiona Nginx.&lt;br /&gt;
Usándolo no sólo nos generará automáticamente las claves y certificados, si no que lo aplicará en el servidor por nosotros.&lt;br /&gt;
Además, también se encargará de la renovación, por lo que desatiende toda esa parte de gestión de certificados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
certbot --nginx&lt;br /&gt;
Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
Enter email address or hit Enter to skip.&lt;br /&gt;
 (Enter 'c' to cancel): admin@ejemplo.com&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Please read the Terms of Service at:&lt;br /&gt;
https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf&lt;br /&gt;
You must agree in order to register with the ACME server. Do you agree?&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
(Y)es/(N)o: Y&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Would you be willing, once your first certificate is successfully issued, to&lt;br /&gt;
share your email address with the Electronic Frontier Foundation, a founding&lt;br /&gt;
partner of the Let's Encrypt project and the non-profit organization that&lt;br /&gt;
develops Certbot? We'd like to send you email about our work encrypting the web,&lt;br /&gt;
EFF news, campaigns, and ways to support digital freedom.&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
(Y)es/(N)o: N&lt;br /&gt;
Account registered.&lt;br /&gt;
&lt;br /&gt;
Which names would you like to activate HTTPS for?&lt;br /&gt;
We recommend selecting either all domains, or all domains in a VirtualHost/server block.&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
1: culturetas.net&lt;br /&gt;
2: www.culturetas.net&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Select the appropriate numbers separated by commas and/or spaces, or leave input&lt;br /&gt;
blank to select all options shown (Enter 'c' to cancel): 1,2&lt;br /&gt;
Requesting a certificate for culturetas.net and www.culturetas.net&lt;br /&gt;
&lt;br /&gt;
Successfully received certificate.&lt;br /&gt;
Certificate is saved at: /etc/letsencrypt/live/culturetas.net/fullchain.pem&lt;br /&gt;
Key is saved at:         /etc/letsencrypt/live/culturetas.net/privkey.pem&lt;br /&gt;
This certificate expires on 2026-05-25.&lt;br /&gt;
These files will be updated when the certificate renews.&lt;br /&gt;
Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
&lt;br /&gt;
Deploying certificate&lt;br /&gt;
Successfully deployed certificate for culturetas.net to /etc/nginx/sites-enabled/culturetas.net&lt;br /&gt;
Successfully deployed certificate for www.culturetas.net to /etc/nginx/sites-enabled/culturetas.net&lt;br /&gt;
Congratulations! You have successfully enabled HTTPS on https://culturetas.net and https://www.culturetas.net&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
If you like Certbot, please consider supporting our work by:&lt;br /&gt;
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate&lt;br /&gt;
 * Donating to EFF:                    https://eff.org/donate-le&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desplegar página de ejemplo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mkdir /var/www/culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /var/www/culturetas.net/index.html&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;es&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Culturetas.net - En construcción&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;style&amp;gt;&lt;br /&gt;
    body {&lt;br /&gt;
      margin: 0;&lt;br /&gt;
      padding: 0;&lt;br /&gt;
      height: 100vh;&lt;br /&gt;
      font-family: system-ui, -apple-system, sans-serif;&lt;br /&gt;
      background: linear-gradient(135deg, #1e3a8a 0%, #3b82f6 100%);&lt;br /&gt;
      color: white;&lt;br /&gt;
      display: flex;&lt;br /&gt;
      flex-direction: column;&lt;br /&gt;
      align-items: center;&lt;br /&gt;
      justify-content: center;&lt;br /&gt;
      text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .container {&lt;br /&gt;
      max-width: 700px;&lt;br /&gt;
      padding: 20px;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    h1 {&lt;br /&gt;
      font-size: 4.5rem;&lt;br /&gt;
      margin: 0.2em 0;&lt;br /&gt;
      font-weight: 800;&lt;br /&gt;
      letter-spacing: -1px;&lt;br /&gt;
      text-shadow: 0 4px 12px rgba(0,0,0,0.3);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .subtitle {&lt;br /&gt;
      font-size: 1.6rem;&lt;br /&gt;
      margin: 0.8em 0 1.5em;&lt;br /&gt;
      opacity: 0.95;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .construction {&lt;br /&gt;
      font-size: 8rem;&lt;br /&gt;
      margin: 0.3em 0;&lt;br /&gt;
      animation: bounce 3s infinite;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    p {&lt;br /&gt;
      font-size: 1.3rem;&lt;br /&gt;
      line-height: 1.6;&lt;br /&gt;
      max-width: 600px;&lt;br /&gt;
      margin: 1.5em auto;&lt;br /&gt;
      opacity: 0.9;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .soon {&lt;br /&gt;
      font-size: 2rem;&lt;br /&gt;
      font-weight: bold;&lt;br /&gt;
      margin-top: 2rem;&lt;br /&gt;
      color: #fef08a;&lt;br /&gt;
      text-shadow: 0 2px 10px rgba(0,0,0,0.4);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @keyframes bounce {&lt;br /&gt;
      0%, 20%, 50%, 80%, 100% { transform: translateY(0); }&lt;br /&gt;
      40% { transform: translateY(-25px); }&lt;br /&gt;
      60% { transform: translateY(-12px); }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @media (max-width: 600px) {&lt;br /&gt;
      h1 { font-size: 3.2rem; }&lt;br /&gt;
      .construction { font-size: 6rem; }&lt;br /&gt;
      .subtitle { font-size: 1.3rem; }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;construction&amp;quot;&amp;gt;🚧&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Culturetas.net&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;subtitle&amp;quot;&amp;gt;Está en construcción&amp;lt;/div&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Estamos trabajando para traerte un espacio mucho más bonito, rápido y con mucho más contenido cultural interesante.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;¡Vuelve en unos días y te sorprenderás!&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;div class=&amp;quot;soon&amp;quot;&amp;gt;Próximamente... ✨&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Docker_Engine&amp;diff=132</id>
		<title>Docker Engine</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Docker_Engine&amp;diff=132"/>
		<updated>2026-03-21T23:06:41Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación de Docker Engine en Ubuntu Server ==&lt;br /&gt;
El objetivo de este documento es instalar Docker Engine en Ubuntu Server 24.04.&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Antes de instalar Docker hay que tener en cuenta una serie de consideraciones.&lt;br /&gt;
&lt;br /&gt;
=== Usuario root ===&lt;br /&gt;
Todos los comandos que aquí se ponen, han de ejecutarse como root.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desinstalar UFW ===&lt;br /&gt;
El firewall que viene por defecto en entornos tipo Debian (como Ubuntu) tiene problemas de compatibilidad con Docker Engine.&lt;br /&gt;
Debido a que Docker crea reglas directamente con IPTables, se ocasiona que Docker cree reglas que se salten las reglas existentes.&lt;br /&gt;
Para evitar que esto pase vamos a sustituir UFW por FirewallD (en modo IPTables), que evita este tipo de problemas.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw disable&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl disable ufw&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl stop ufw&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt remove --purge ufw&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Instalar FirewallD ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Habilitar modo IPTables a FirewallD (opcional) ===&lt;br /&gt;
Hay problemas reportados de conexión entre contenedores de Docker cuando FirewallD está en modo nftables, se resuelven cambiando a modo IPTables.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/firewalld/firewalld.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
# FirewallBackend&lt;br /&gt;
# Selects the firewall backend implementation.&lt;br /&gt;
# Choices are:&lt;br /&gt;
#       - nftables (default)&lt;br /&gt;
#       - iptables (iptables, ip6tables, ebtables and ipset)&lt;br /&gt;
# Note: The iptables backend is deprecated. It will be removed in a future&lt;br /&gt;
# release.&lt;br /&gt;
#FirewallBackend=nftables&lt;br /&gt;
FirewallBackend=iptables&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Habilitar reglas anteriores ===&lt;br /&gt;
En mi paso prefiero habilitar puertos TCP en vez de servicios (aunque también es posible).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --permanent --zone=public --add-port=80/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --permanent --zone=public --add-port=443/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Habilitar salida a Internet de contenedores ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --permanent --zone=public --add-masquerade&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comprobar estado de FirewallD ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
firewall-cmd --list-all&lt;br /&gt;
public (default, active)&lt;br /&gt;
  target: default&lt;br /&gt;
  ingress-priority: 0&lt;br /&gt;
  egress-priority: 0&lt;br /&gt;
  icmp-block-inversion: no&lt;br /&gt;
  interfaces:&lt;br /&gt;
  sources:&lt;br /&gt;
  services: dhcpv6-client ssh&lt;br /&gt;
  ports: 80/tcp 443/tcp&lt;br /&gt;
  protocols:&lt;br /&gt;
  forward: yes&lt;br /&gt;
  masquerade: yes&lt;br /&gt;
  forward-ports:&lt;br /&gt;
  source-ports:&lt;br /&gt;
  icmp-blocks:&lt;br /&gt;
  rich rules:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Consideraciones importantes ===&lt;br /&gt;
* Toda esta configuración estamos asumiendo que estamos usando la zona public.&lt;br /&gt;
* Cuando se creen contenedores en Docker hay que evitar usar la opción -p (--port), ya que creará reglas en el firewall (iptables) que habilitarán acceso directo desde Internet a los contenedores.&lt;br /&gt;
* Mi recomendación es no hacerlo así y exponer los servicios a través de un proxy inverso (ver artículo sobre servidor [[LEMP]]).&lt;br /&gt;
&lt;br /&gt;
== Desinstalar versiones anteriores de Docker Engine ==&lt;br /&gt;
Comprobar que no existe una versión de Docker Engine instalada.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Añadir repositorios APT oficiales de Docker ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install ca-certificates curl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;install -m 0755 -d /etc/apt/keyrings&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod a+r /etc/apt/keyrings/docker.asc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tee /etc/apt/sources.list.d/docker.sources &amp;lt;&amp;lt;EOF&lt;br /&gt;
Types: deb&lt;br /&gt;
URIs: https://download.docker.com/linux/ubuntu&lt;br /&gt;
Suites: $(. /etc/os-release &amp;amp;&amp;amp; echo &amp;quot;${UBUNTU_CODENAME:-$VERSION_CODENAME}&amp;quot;)&lt;br /&gt;
Components: stable&lt;br /&gt;
Signed-By: /etc/apt/keyrings/docker.asc&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalar Docker Engine ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comprobar Docker Engine ==&lt;br /&gt;
=== Comprobar servicio ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl status docker&lt;br /&gt;
● docker.service - Docker Application Container Engine&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Thu 2026-02-26 22:52:45 UTC; 2min 39s ago&lt;br /&gt;
TriggeredBy: ● docker.socket&lt;br /&gt;
       Docs: https://docs.docker.com&lt;br /&gt;
   Main PID: 23159 (dockerd)&lt;br /&gt;
      Tasks: 11&lt;br /&gt;
     Memory: 26.5M (peak: 29.2M)&lt;br /&gt;
        CPU: 284ms&lt;br /&gt;
     CGroup: /system.slice/docker.service&lt;br /&gt;
             └─23159 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock&lt;br /&gt;
&lt;br /&gt;
Feb 26 22:52:44 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:44.065056936Z&amp;quot; level=info msg=&amp;quot;Deleting nftables IPv4 rules&amp;quot; error=&amp;quot;exit s&amp;gt;&lt;br /&gt;
Feb 26 22:52:44 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:44.088078290Z&amp;quot; level=info msg=&amp;quot;Deleting nftables IPv6 rules&amp;quot; error=&amp;quot;exit s&amp;gt;&lt;br /&gt;
Feb 26 22:52:44 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:44.118636746Z&amp;quot; level=info msg=&amp;quot;Firewalld: created docker-forwarding policy&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.117792420Z&amp;quot; level=info msg=&amp;quot;Loading containers: done.&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.131108392Z&amp;quot; level=info msg=&amp;quot;Docker daemon&amp;quot; commit=6bc6209 containerd-sn&amp;gt;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.131332307Z&amp;quot; level=info msg=&amp;quot;Initializing buildkit&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.149255659Z&amp;quot; level=info msg=&amp;quot;Completed buildkit initialization&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.158529795Z&amp;quot; level=info msg=&amp;quot;Daemon has completed initialization&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.158627568Z&amp;quot; level=info msg=&amp;quot;API listen on /run/docker.sock&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net systemd[1]: Started docker.service - Docker Application Container Engine.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si el servicio está apagado hay que arrancarlo y habilitarlo en el arranque:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start docker&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable docker&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desplegar contenedor de prueba (hello-world) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker run hello-world&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker ps --all&lt;br /&gt;
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES&lt;br /&gt;
3995e4839733   hello-world   &amp;quot;/hello&amp;quot;   2 minutes ago   Exited (0) 2 minutes ago             elated_matsumoto&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker stop elated_matsumoto&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker rm elated_matsumoto&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker image list&lt;br /&gt;
                                                                                                                             i Info →   U  In Use&lt;br /&gt;
IMAGE                ID             DISK USAGE   CONTENT SIZE   EXTRA&lt;br /&gt;
hello-world:latest   ef54e839ef54       25.9kB         9.52kB&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker image rm hello-world:latest&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Desarrollo con Docker Compose ==&lt;br /&gt;
Para entornos productivos está recomendado usar Docker Compose para declarar todos los contenedores que se van a usar (mediante fichero YAML).&lt;br /&gt;
Para su eso utilizo las siguientes herramientas:&lt;br /&gt;
&lt;br /&gt;
=== Visual Studio Codium ===&lt;br /&gt;
Visual Studio Codium o [https://vscodium.com/ VS Codium] es la versión libre de Visual Studio Code.&lt;br /&gt;
&lt;br /&gt;
Se compilan del mismo repositio, pero no se incluyen las herramientas de telemetría que introduce Microsoft.&lt;br /&gt;
&lt;br /&gt;
Esta es una buena herramienta para desarrollar los ficheros YAML.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, es necesario añadir extensiones.&lt;br /&gt;
&lt;br /&gt;
=== Docker (extensión) ===&lt;br /&gt;
Extensión de VS Codium para gestionar contenedores.&lt;br /&gt;
&lt;br /&gt;
URL: [https://open-vsx.org/extension/ms-azuretools/vscode-docker https://open-vsx.org/extension/ms-azuretools/vscode-docker]&lt;br /&gt;
&lt;br /&gt;
Instalará automática otra extensión: [https://open-vsx.org/extension/ms-azuretools/vscode-containers Container Tools].&lt;br /&gt;
&lt;br /&gt;
=== YAML (extensión) ===&lt;br /&gt;
Extensión de VS Codium para soporte al formato YAML.&lt;br /&gt;
&lt;br /&gt;
URL: [https://open-vsx.org/extension/redhat/vscode-yaml https://open-vsx.org/extension/redhat/vscode-yaml]&lt;br /&gt;
&lt;br /&gt;
=== Open Remote - SSH (extensión) ===&lt;br /&gt;
Para poder conectar a servidores SSH en el propio VS Codium.&lt;br /&gt;
&lt;br /&gt;
URL: [https://open-vsx.org/extension/jeanp413/open-remote-ssh https://open-vsx.org/extension/jeanp413/open-remote-ssh]&lt;br /&gt;
&lt;br /&gt;
=== Spanish Language Pack (extensión) ===&lt;br /&gt;
Para traducir VS Codium al español.&lt;br /&gt;
&lt;br /&gt;
URL: [https://open-vsx.org/extension/MS-CEINTL/vscode-language-pack-es https://open-vsx.org/extension/MS-CEINTL/vscode-language-pack-es]&lt;br /&gt;
&lt;br /&gt;
== Herramientas útiles ==&lt;br /&gt;
=== Skopeo ===&lt;br /&gt;
Permite analizar los repositorios de imágenes.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install skopeo&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uso:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;skopeo list-tags docker://cleanstart/openldap&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Composerize ===&lt;br /&gt;
Permite transformar un comando &amp;quot;docker run...&amp;quot; en fichero YAML para Docker Compose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install npm&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;npm install composerize -g&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uso:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;composerize docker run -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro --restart always --log-opt max-size=1g nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://docs.docker.com/engine/install/ubuntu/ https://docs.docker.com/engine/install/ubuntu/]&lt;br /&gt;
* [https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one?tab=readme-ov-file#how-to-resolve-firewall-problems-with-fedora-linux-rhel-os-centos-suse-linux-and-others https://github.com/nextcloud/all-in-one?tab=readme-ov-file#how-to-resolve-firewall-problems-with-fedora-linux-rhel-os-centos-suse-linux-and-others]&lt;br /&gt;
* [https://github.com/composerize/composerize https://github.com/composerize/composerize]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Docker_Engine&amp;diff=131</id>
		<title>Docker Engine</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Docker_Engine&amp;diff=131"/>
		<updated>2026-03-21T23:05:00Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación de Docker Engine en Ubuntu Server ==&lt;br /&gt;
El objetivo de este documento es instalar Docker Engine en Ubuntu Server 24.04.&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Antes de instalar Docker hay que tener en cuenta una serie de consideraciones.&lt;br /&gt;
&lt;br /&gt;
=== Usuario root ===&lt;br /&gt;
Todos los comandos que aquí se ponen, han de ejecutarse como root.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desinstalar UFW ===&lt;br /&gt;
El firewall que viene por defecto en entornos tipo Debian (como Ubuntu) tiene problemas de compatibilidad con Docker Engine.&lt;br /&gt;
Debido a que Docker crea reglas directamente con IPTables, se ocasiona que Docker cree reglas que se salten las reglas existentes.&lt;br /&gt;
Para evitar que esto pase vamos a sustituir UFW por FirewallD (en modo IPTables), que evita este tipo de problemas.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw disable&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl disable ufw&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl stop ufw&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt remove --purge ufw&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Instalar FirewallD ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Habilitar modo IPTables a FirewallD (opcional) ===&lt;br /&gt;
Hay problemas reportados de conexión entre contenedores de Docker cuando FirewallD está en modo nftables, se resuelven cambiando a modo IPTables.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/firewalld/firewalld.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
# FirewallBackend&lt;br /&gt;
# Selects the firewall backend implementation.&lt;br /&gt;
# Choices are:&lt;br /&gt;
#       - nftables (default)&lt;br /&gt;
#       - iptables (iptables, ip6tables, ebtables and ipset)&lt;br /&gt;
# Note: The iptables backend is deprecated. It will be removed in a future&lt;br /&gt;
# release.&lt;br /&gt;
#FirewallBackend=nftables&lt;br /&gt;
FirewallBackend=iptables&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Habilitar reglas anteriores ===&lt;br /&gt;
En mi paso prefiero habilitar puertos TCP en vez de servicios (aunque también es posible).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --permanent --zone=public --add-port=80/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --permanent --zone=public --add-port=443/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Habilitar salida a Internet de contenedores ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --permanent --zone=public --add-masquerade&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comprobar estado de FirewallD ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
firewall-cmd --list-all&lt;br /&gt;
public (default, active)&lt;br /&gt;
  target: default&lt;br /&gt;
  ingress-priority: 0&lt;br /&gt;
  egress-priority: 0&lt;br /&gt;
  icmp-block-inversion: no&lt;br /&gt;
  interfaces:&lt;br /&gt;
  sources:&lt;br /&gt;
  services: dhcpv6-client ssh&lt;br /&gt;
  ports: 80/tcp 443/tcp&lt;br /&gt;
  protocols:&lt;br /&gt;
  forward: yes&lt;br /&gt;
  masquerade: yes&lt;br /&gt;
  forward-ports:&lt;br /&gt;
  source-ports:&lt;br /&gt;
  icmp-blocks:&lt;br /&gt;
  rich rules:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Consideraciones importantes ===&lt;br /&gt;
* Toda esta configuración estamos asumiendo que estamos usando la zona public.&lt;br /&gt;
* Cuando se creen contenedores en Docker hay que evitar usar la opción -p (--port), ya que creará reglas en el firewall (iptables) que habilitarán acceso directo desde Internet a los contenedores.&lt;br /&gt;
* Mi recomendación es no hacerlo así y exponer los servicios a través de un proxy inverso (ver artículo sobre servidor [[LEMP]]).&lt;br /&gt;
&lt;br /&gt;
== Desinstalar versiones anteriores de Docker Engine ==&lt;br /&gt;
Comprobar que no existe una versión de Docker Engine instalada.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Añadir repositorios APT oficiales de Docker ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install ca-certificates curl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;install -m 0755 -d /etc/apt/keyrings&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod a+r /etc/apt/keyrings/docker.asc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tee /etc/apt/sources.list.d/docker.sources &amp;lt;&amp;lt;EOF&lt;br /&gt;
Types: deb&lt;br /&gt;
URIs: https://download.docker.com/linux/ubuntu&lt;br /&gt;
Suites: $(. /etc/os-release &amp;amp;&amp;amp; echo &amp;quot;${UBUNTU_CODENAME:-$VERSION_CODENAME}&amp;quot;)&lt;br /&gt;
Components: stable&lt;br /&gt;
Signed-By: /etc/apt/keyrings/docker.asc&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalar Docker Engine ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comprobar Docker Engine ==&lt;br /&gt;
=== Comprobar servicio ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl status docker&lt;br /&gt;
● docker.service - Docker Application Container Engine&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Thu 2026-02-26 22:52:45 UTC; 2min 39s ago&lt;br /&gt;
TriggeredBy: ● docker.socket&lt;br /&gt;
       Docs: https://docs.docker.com&lt;br /&gt;
   Main PID: 23159 (dockerd)&lt;br /&gt;
      Tasks: 11&lt;br /&gt;
     Memory: 26.5M (peak: 29.2M)&lt;br /&gt;
        CPU: 284ms&lt;br /&gt;
     CGroup: /system.slice/docker.service&lt;br /&gt;
             └─23159 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock&lt;br /&gt;
&lt;br /&gt;
Feb 26 22:52:44 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:44.065056936Z&amp;quot; level=info msg=&amp;quot;Deleting nftables IPv4 rules&amp;quot; error=&amp;quot;exit s&amp;gt;&lt;br /&gt;
Feb 26 22:52:44 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:44.088078290Z&amp;quot; level=info msg=&amp;quot;Deleting nftables IPv6 rules&amp;quot; error=&amp;quot;exit s&amp;gt;&lt;br /&gt;
Feb 26 22:52:44 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:44.118636746Z&amp;quot; level=info msg=&amp;quot;Firewalld: created docker-forwarding policy&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.117792420Z&amp;quot; level=info msg=&amp;quot;Loading containers: done.&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.131108392Z&amp;quot; level=info msg=&amp;quot;Docker daemon&amp;quot; commit=6bc6209 containerd-sn&amp;gt;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.131332307Z&amp;quot; level=info msg=&amp;quot;Initializing buildkit&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.149255659Z&amp;quot; level=info msg=&amp;quot;Completed buildkit initialization&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.158529795Z&amp;quot; level=info msg=&amp;quot;Daemon has completed initialization&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.158627568Z&amp;quot; level=info msg=&amp;quot;API listen on /run/docker.sock&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net systemd[1]: Started docker.service - Docker Application Container Engine.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si el servicio está apagado hay que arrancarlo y habilitarlo en el arranque:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start docker&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable docker&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desplegar contenedor de prueba (hello-world) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker run hello-world&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker ps --all&lt;br /&gt;
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES&lt;br /&gt;
3995e4839733   hello-world   &amp;quot;/hello&amp;quot;   2 minutes ago   Exited (0) 2 minutes ago             elated_matsumoto&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker stop elated_matsumoto&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker rm elated_matsumoto&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker image list&lt;br /&gt;
                                                                                                                             i Info →   U  In Use&lt;br /&gt;
IMAGE                ID             DISK USAGE   CONTENT SIZE   EXTRA&lt;br /&gt;
hello-world:latest   ef54e839ef54       25.9kB         9.52kB&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker image rm hello-world:latest&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Desarrollo con Docker Compose ==&lt;br /&gt;
Para entornos productivos está recomendado usar Docker Compose para declarar todos los contenedores que se van a usar (mediante fichero YAML).&lt;br /&gt;
Para su eso utilizo las siguientes herramientas:&lt;br /&gt;
&lt;br /&gt;
=== Visual Studio Codium ===&lt;br /&gt;
Visual Studio Codium o [https://vscodium.com/ VS Codium] es la versión libre de Visual Studio Code.&lt;br /&gt;
&lt;br /&gt;
Se compilan del mismo repositio, pero no se incluyen las herramientas de telemetría que introduce Microsoft.&lt;br /&gt;
&lt;br /&gt;
Esta es una buena herramienta para desarrollar los ficheros YAML.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, es necesario añadir extensiones.&lt;br /&gt;
&lt;br /&gt;
=== Docker (extensión) ===&lt;br /&gt;
Extensión de VS Codium para gestionar contenedores.&lt;br /&gt;
&lt;br /&gt;
URL: [https://open-vsx.org/extension/ms-azuretools/vscode-docker https://open-vsx.org/extension/ms-azuretools/vscode-docker]&lt;br /&gt;
&lt;br /&gt;
Instalará automática otra extensión: [https://open-vsx.org/extension/ms-azuretools/vscode-containers Container Tools].&lt;br /&gt;
&lt;br /&gt;
=== YAML (extensión) ===&lt;br /&gt;
Extensión de VS Codium para soporte al formato YAML.&lt;br /&gt;
&lt;br /&gt;
URL: [https://open-vsx.org/extension/redhat/vscode-yaml https://open-vsx.org/extension/redhat/vscode-yaml]&lt;br /&gt;
&lt;br /&gt;
=== Open Remote - SSH (extensión) ===&lt;br /&gt;
Para poder conectar a servidores SSH en el propio VS Codium.&lt;br /&gt;
&lt;br /&gt;
URL: [https://open-vsx.org/extension/jeanp413/open-remote-ssh https://open-vsx.org/extension/jeanp413/open-remote-ssh]&lt;br /&gt;
&lt;br /&gt;
=== Spanish Language Pack (extensión) ===&lt;br /&gt;
Para traducir VS Codium al español.&lt;br /&gt;
&lt;br /&gt;
URL: [https://open-vsx.org/extension/MS-CEINTL/vscode-language-pack-es https://open-vsx.org/extension/MS-CEINTL/vscode-language-pack-es]&lt;br /&gt;
&lt;br /&gt;
== Herramientas útiles ==&lt;br /&gt;
=== Skopeo ===&lt;br /&gt;
Permite analizar los repositorios de imágenes.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install skopeo&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uso:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;skopeo list-tags docker://cleanstart/openldap&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Composerize ===&lt;br /&gt;
Permite transformar un comando &amp;quot;docker run...&amp;quot; en fichero YAML para Docker Compose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install npm&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;npm install composerize -g&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uso:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;composerize docker run -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro --restart always --log-opt max-size=1g nginx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://docs.docker.com/engine/install/ubuntu/ https://docs.docker.com/engine/install/ubuntu/]&lt;br /&gt;
* [https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one?tab=readme-ov-file#how-to-resolve-firewall-problems-with-fedora-linux-rhel-os-centos-suse-linux-and-others https://github.com/nextcloud/all-in-one?tab=readme-ov-file#how-to-resolve-firewall-problems-with-fedora-linux-rhel-os-centos-suse-linux-and-others]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Docker_Engine&amp;diff=120</id>
		<title>Docker Engine</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Docker_Engine&amp;diff=120"/>
		<updated>2026-03-21T11:30:17Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación de Docker Engine en Ubuntu Server ==&lt;br /&gt;
El objetivo de este documento es instalar Docker Engine en Ubuntu Server 24.04.&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Antes de instalar Docker hay que tener en cuenta una serie de consideraciones.&lt;br /&gt;
&lt;br /&gt;
=== Usuario root ===&lt;br /&gt;
Todos los comandos que aquí se ponen, han de ejecutarse como root.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desinstalar UFW ===&lt;br /&gt;
El firewall que viene por defecto en entornos tipo Debian (como Ubuntu) tiene problemas de compatibilidad con Docker Engine.&lt;br /&gt;
Debido a que Docker crea reglas directamente con IPTables, se ocasiona que Docker cree reglas que se salten las reglas existentes.&lt;br /&gt;
Para evitar que esto pase vamos a sustituir UFW por FirewallD (en modo IPTables), que evita este tipo de problemas.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw disable&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl disable ufw&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl stop ufw&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt remove --purge ufw&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Instalar FirewallD ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Habilitar modo IPTables a FirewallD (opcional) ===&lt;br /&gt;
Hay problemas reportados de conexión entre contenedores de Docker cuando FirewallD está en modo nftables, se resuelven cambiando a modo IPTables.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/firewalld/firewalld.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
# FirewallBackend&lt;br /&gt;
# Selects the firewall backend implementation.&lt;br /&gt;
# Choices are:&lt;br /&gt;
#       - nftables (default)&lt;br /&gt;
#       - iptables (iptables, ip6tables, ebtables and ipset)&lt;br /&gt;
# Note: The iptables backend is deprecated. It will be removed in a future&lt;br /&gt;
# release.&lt;br /&gt;
#FirewallBackend=nftables&lt;br /&gt;
FirewallBackend=iptables&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Habilitar reglas anteriores ===&lt;br /&gt;
En mi paso prefiero habilitar puertos TCP en vez de servicios (aunque también es posible).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --permanent --zone=public --add-port=80/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --permanent --zone=public --add-port=443/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Habilitar salida a Internet de contenedores ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --permanent --zone=public --add-masquerade&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comprobar estado de FirewallD ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
firewall-cmd --list-all&lt;br /&gt;
public (default, active)&lt;br /&gt;
  target: default&lt;br /&gt;
  ingress-priority: 0&lt;br /&gt;
  egress-priority: 0&lt;br /&gt;
  icmp-block-inversion: no&lt;br /&gt;
  interfaces:&lt;br /&gt;
  sources:&lt;br /&gt;
  services: dhcpv6-client ssh&lt;br /&gt;
  ports: 80/tcp 443/tcp&lt;br /&gt;
  protocols:&lt;br /&gt;
  forward: yes&lt;br /&gt;
  masquerade: yes&lt;br /&gt;
  forward-ports:&lt;br /&gt;
  source-ports:&lt;br /&gt;
  icmp-blocks:&lt;br /&gt;
  rich rules:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Consideraciones importantes ===&lt;br /&gt;
* Toda esta configuración estamos asumiendo que estamos usando la zona public.&lt;br /&gt;
* Cuando se creen contenedores en Docker hay que evitar usar la opción -p (--port), ya que creará reglas en el firewall (iptables) que habilitarán acceso directo desde Internet a los contenedores.&lt;br /&gt;
* Mi recomendación es no hacerlo así y exponer los servicios a través de un proxy inverso (ver artículo sobre servidor [[LEMP]]).&lt;br /&gt;
&lt;br /&gt;
== Desinstalar versiones anteriores de Docker Engine ==&lt;br /&gt;
Comprobar que no existe una versión de Docker Engine instalada.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Añadir repositorios APT oficiales de Docker ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install ca-certificates curl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;install -m 0755 -d /etc/apt/keyrings&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod a+r /etc/apt/keyrings/docker.asc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tee /etc/apt/sources.list.d/docker.sources &amp;lt;&amp;lt;EOF&lt;br /&gt;
Types: deb&lt;br /&gt;
URIs: https://download.docker.com/linux/ubuntu&lt;br /&gt;
Suites: $(. /etc/os-release &amp;amp;&amp;amp; echo &amp;quot;${UBUNTU_CODENAME:-$VERSION_CODENAME}&amp;quot;)&lt;br /&gt;
Components: stable&lt;br /&gt;
Signed-By: /etc/apt/keyrings/docker.asc&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalar Docker Engine ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comprobar Docker Engine ==&lt;br /&gt;
=== Comprobar servicio ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl status docker&lt;br /&gt;
● docker.service - Docker Application Container Engine&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Thu 2026-02-26 22:52:45 UTC; 2min 39s ago&lt;br /&gt;
TriggeredBy: ● docker.socket&lt;br /&gt;
       Docs: https://docs.docker.com&lt;br /&gt;
   Main PID: 23159 (dockerd)&lt;br /&gt;
      Tasks: 11&lt;br /&gt;
     Memory: 26.5M (peak: 29.2M)&lt;br /&gt;
        CPU: 284ms&lt;br /&gt;
     CGroup: /system.slice/docker.service&lt;br /&gt;
             └─23159 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock&lt;br /&gt;
&lt;br /&gt;
Feb 26 22:52:44 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:44.065056936Z&amp;quot; level=info msg=&amp;quot;Deleting nftables IPv4 rules&amp;quot; error=&amp;quot;exit s&amp;gt;&lt;br /&gt;
Feb 26 22:52:44 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:44.088078290Z&amp;quot; level=info msg=&amp;quot;Deleting nftables IPv6 rules&amp;quot; error=&amp;quot;exit s&amp;gt;&lt;br /&gt;
Feb 26 22:52:44 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:44.118636746Z&amp;quot; level=info msg=&amp;quot;Firewalld: created docker-forwarding policy&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.117792420Z&amp;quot; level=info msg=&amp;quot;Loading containers: done.&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.131108392Z&amp;quot; level=info msg=&amp;quot;Docker daemon&amp;quot; commit=6bc6209 containerd-sn&amp;gt;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.131332307Z&amp;quot; level=info msg=&amp;quot;Initializing buildkit&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.149255659Z&amp;quot; level=info msg=&amp;quot;Completed buildkit initialization&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.158529795Z&amp;quot; level=info msg=&amp;quot;Daemon has completed initialization&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.158627568Z&amp;quot; level=info msg=&amp;quot;API listen on /run/docker.sock&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net systemd[1]: Started docker.service - Docker Application Container Engine.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si el servicio está apagado hay que arrancarlo y habilitarlo en el arranque:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start docker&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable docker&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desplegar contenedor de prueba (hello-world) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker run hello-world&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker ps --all&lt;br /&gt;
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES&lt;br /&gt;
3995e4839733   hello-world   &amp;quot;/hello&amp;quot;   2 minutes ago   Exited (0) 2 minutes ago             elated_matsumoto&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker stop elated_matsumoto&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker rm elated_matsumoto&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker image list&lt;br /&gt;
                                                                                                                             i Info →   U  In Use&lt;br /&gt;
IMAGE                ID             DISK USAGE   CONTENT SIZE   EXTRA&lt;br /&gt;
hello-world:latest   ef54e839ef54       25.9kB         9.52kB&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker image rm hello-world:latest&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Desarrollo con Docker Compose ==&lt;br /&gt;
Para entornos productivos está recomendado usar Docker Compose para declarar todos los contenedores que se van a usar (mediante fichero YAML).&lt;br /&gt;
Para su eso utilizo las siguientes herramientas:&lt;br /&gt;
&lt;br /&gt;
=== Visual Studio Codium ===&lt;br /&gt;
Visual Studio Codium o [https://vscodium.com/ VS Codium] es la versión libre de Visual Studio Code.&lt;br /&gt;
&lt;br /&gt;
Se compilan del mismo repositio, pero no se incluyen las herramientas de telemetría que introduce Microsoft.&lt;br /&gt;
&lt;br /&gt;
Esta es una buena herramienta para desarrollar los ficheros YAML.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, es necesario añadir extensiones.&lt;br /&gt;
&lt;br /&gt;
=== Docker (extensión) ===&lt;br /&gt;
Extensión de VS Codium para gestionar contenedores.&lt;br /&gt;
&lt;br /&gt;
URL: [https://open-vsx.org/extension/ms-azuretools/vscode-docker https://open-vsx.org/extension/ms-azuretools/vscode-docker]&lt;br /&gt;
&lt;br /&gt;
Instalará automática otra extensión: [https://open-vsx.org/extension/ms-azuretools/vscode-containers Container Tools].&lt;br /&gt;
&lt;br /&gt;
=== YAML (extensión) ===&lt;br /&gt;
Extensión de VS Codium para soporte al formato YAML.&lt;br /&gt;
&lt;br /&gt;
URL: [https://open-vsx.org/extension/redhat/vscode-yaml https://open-vsx.org/extension/redhat/vscode-yaml]&lt;br /&gt;
&lt;br /&gt;
=== Open Remote - SSH (extensión) ===&lt;br /&gt;
Para poder conectar a servidores SSH en el propio VS Codium.&lt;br /&gt;
&lt;br /&gt;
URL: [https://open-vsx.org/extension/jeanp413/open-remote-ssh https://open-vsx.org/extension/jeanp413/open-remote-ssh]&lt;br /&gt;
&lt;br /&gt;
=== Spanish Language Pack (extensión) ===&lt;br /&gt;
Para traducir VS Codium al español.&lt;br /&gt;
&lt;br /&gt;
URL: [https://open-vsx.org/extension/MS-CEINTL/vscode-language-pack-es https://open-vsx.org/extension/MS-CEINTL/vscode-language-pack-es]&lt;br /&gt;
&lt;br /&gt;
== Herramientas útiles ==&lt;br /&gt;
=== Skopeo ===&lt;br /&gt;
Permite analizar los repositorios de imágenes.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install skopeo&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uso:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;skopeo list-tags docker://cleanstart/openldap&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://docs.docker.com/engine/install/ubuntu/ https://docs.docker.com/engine/install/ubuntu/]&lt;br /&gt;
* [https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one?tab=readme-ov-file#how-to-resolve-firewall-problems-with-fedora-linux-rhel-os-centos-suse-linux-and-others https://github.com/nextcloud/all-in-one?tab=readme-ov-file#how-to-resolve-firewall-problems-with-fedora-linux-rhel-os-centos-suse-linux-and-others]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=P%C3%A1gina_principal&amp;diff=118</id>
		<title>Página principal</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=P%C3%A1gina_principal&amp;diff=118"/>
		<updated>2026-03-21T10:54:21Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
== Bienvenidos a Wiki Castanedo.es ==&lt;br /&gt;
&lt;br /&gt;
=== ¿Qué es esto? ===&lt;br /&gt;
&lt;br /&gt;
Mi Wiki personal. No sobre mi persona, sino sobre mis cosas.&lt;br /&gt;
&lt;br /&gt;
Antes tenía diferentes páginas en las que publicaba artículos y notas sobre temas, principalmente relacionados con el mundo [https://es.wikipedia.org/wiki/GNU/Linux GNU/Linux] y la administración de servidores, pero se hallaban dispersos y en diferentes formatos.&lt;br /&gt;
&lt;br /&gt;
Este proyecto busca en primer lugar unificarlo todo en un solo sitio y por otro retomar la publicación de las notas que voy tomando.&lt;br /&gt;
&lt;br /&gt;
=== Contenido ===&lt;br /&gt;
&lt;br /&gt;
Me gusta tomar notas de las cosas que voy haciendo, sobre todo en el mundo de la informática.&lt;br /&gt;
&lt;br /&gt;
Durante mucho tiempo estas notas me las he guardado para mi mismo, pero a partir de ahora las comparto con el que le interesen. Muchas son cosas sencillas y muy conocidas, otras sin embargo contienen información que me han llevado mucha documentación que leer y algunas, incluso, contienen información difícil de encontrar.&lt;br /&gt;
&lt;br /&gt;
Desde aquí se compartirá tres tipos de contenidos diferenciados: notas, código y ayuda.&lt;br /&gt;
&lt;br /&gt;
==== Notas ====&lt;br /&gt;
&lt;br /&gt;
Son las notas que he ido habiendo sobre administración de sistemas:&lt;br /&gt;
* '''Máquinas virtuales:'''&lt;br /&gt;
** [[Securizar Ubuntu Server]]&lt;br /&gt;
** Instalar y configurar un Servidor [[LEMP]] en Ubuntu Server (Linux + Nginx + MySQL + PHP).&lt;br /&gt;
** Instalar y configurar un [[Servidor de Correo]] (Postfix + Dovecot + SSL + SPF + OpenDKIM + OpenDMARC + Amavis + SpamAssassin).&lt;br /&gt;
** [[Administración servidor de correo]].&lt;br /&gt;
** Instalar y configurar [[GOGS]] (Repositorio Git).&lt;br /&gt;
** Instalar y configurar [[TeamSpeak 3]].&lt;br /&gt;
** Instalar y configurar un [[Servidor Minecraft]].&lt;br /&gt;
** Instalar y configurar [[Etherpad]] en Ubuntu Server.&lt;br /&gt;
** Notas sobre [[OpenSSL]].&lt;br /&gt;
** Notas de configuración de [[Drupal 7]] y [[Drupal 8]].&lt;br /&gt;
** Notas de configuración de [[WordPress]].&lt;br /&gt;
** Notas de configuración de [[MediaWiki]].&lt;br /&gt;
* '''Contenedores:'''&lt;br /&gt;
** Instalar y configurar [[Docker Engine]] en Ubuntu Server.&lt;br /&gt;
** Instalar y configurar [[OpenLDAP]] en Docker.&lt;br /&gt;
** Instalar y configurar [[Nextcloud AIO]] en Docker.&lt;br /&gt;
** Instalar y configurar de servidor de correo [[Docker-Mailserver]].&lt;br /&gt;
&lt;br /&gt;
Pulse en el siguiente enlace para consultar la '''lista completa: [[:Categoría:Notas]]'''.&lt;br /&gt;
&lt;br /&gt;
==== Código ====&lt;br /&gt;
&lt;br /&gt;
Las notas aquí descritas pueden tener referencias a código fuente escrito por mi.&lt;br /&gt;
&lt;br /&gt;
Está disponible en [https://code.castanedo.es code.castanedo.es].&lt;br /&gt;
&lt;br /&gt;
Todo este software está disponible con licencia [https://www.gnu.org/licenses/gpl.html GPLv3].&lt;br /&gt;
&lt;br /&gt;
==== Ayuda ====&lt;br /&gt;
&lt;br /&gt;
Además es esta Wiki hay una [[:Categoría:Ayuda]] en las que se encuentran pequeñas guías de uso de servicios disponibles en mis servidores.&lt;br /&gt;
&lt;br /&gt;
Su función es que sirvan de ayuda para las personas que están usando estos servicios, aunque, por supuesto, son de libre consulta para cualquiera que los encuentre útiles.&lt;br /&gt;
&lt;br /&gt;
=== Espíritu ===&lt;br /&gt;
&lt;br /&gt;
El espíritu de esta wiki es el carácter libre y abierto.&lt;br /&gt;
&lt;br /&gt;
Todo el material que se aloje aquí será bajo licencia '''Creative Commons Attribution-ShareAlike 4.0''' ([https://creativecommons.org/licenses/by-sa/4.0/ CC BY-SA]) a menos que se exprese lo contrario.&lt;br /&gt;
&lt;br /&gt;
Para más detalles leer [[Wiki_Castanedo.es:Descargo_general]].&lt;br /&gt;
&lt;br /&gt;
=== Gracias ===&lt;br /&gt;
&lt;br /&gt;
'''Muchas gracias''' por visitar este sitio.&lt;br /&gt;
&lt;br /&gt;
Cualquier duda, consulta o corrección contacta en [mailto:guzman@castanedo.es guzman@castanedo.es].&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=P%C3%A1gina_principal&amp;diff=117</id>
		<title>Página principal</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=P%C3%A1gina_principal&amp;diff=117"/>
		<updated>2026-03-09T10:26:32Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
== Bienvenidos a Wiki Castanedo.es ==&lt;br /&gt;
&lt;br /&gt;
=== ¿Qué es esto? ===&lt;br /&gt;
&lt;br /&gt;
Mi Wiki personal. No sobre mi persona, sino sobre mis cosas.&lt;br /&gt;
&lt;br /&gt;
Antes tenía diferentes páginas en las que publicaba artículos y notas sobre temas, principalmente relacionados con el mundo [https://es.wikipedia.org/wiki/GNU/Linux GNU/Linux] y la administración de servidores, pero se hallaban dispersos y en diferentes formatos.&lt;br /&gt;
&lt;br /&gt;
Este proyecto busca en primer lugar unificarlo todo en un solo sitio y por otro retomar la publicación de las notas que voy tomando.&lt;br /&gt;
&lt;br /&gt;
=== Contenido ===&lt;br /&gt;
&lt;br /&gt;
Me gusta tomar notas de las cosas que voy haciendo, sobre todo en el mundo de la informática.&lt;br /&gt;
&lt;br /&gt;
Durante mucho tiempo estas notas me las he guardado para mi mismo, pero a partir de ahora las comparto con el que le interesen. Muchas son cosas sencillas y muy conocidas, otras sin embargo contienen información que me han llevado mucha documentación que leer y algunas, incluso, contienen información difícil de encontrar.&lt;br /&gt;
&lt;br /&gt;
Desde aquí se compartirá tres tipos de contenidos diferenciados: notas, código y ayuda.&lt;br /&gt;
&lt;br /&gt;
==== Notas ====&lt;br /&gt;
&lt;br /&gt;
Son las notas que he ido habiendo sobre administración de sistemas:&lt;br /&gt;
* '''Máquinas virtuales:'''&lt;br /&gt;
** [[Securizar Ubuntu Server]]&lt;br /&gt;
** Instalar y configurar un Servidor [[LEMP]] en Ubuntu Server (Linux + Nginx + MySQL + PHP).&lt;br /&gt;
** Instalar y configurar un [[Servidor de Correo]] (Postfix + Dovecot + SSL + SPF + OpenDKIM + OpenDMARC + Amavis + SpamAssassin).&lt;br /&gt;
** [[Administración servidor de correo]].&lt;br /&gt;
** Instalar y configurar [[GOGS]] (Repositorio Git).&lt;br /&gt;
** Instalar y configurar [[TeamSpeak 3]].&lt;br /&gt;
** Instalar y configurar un [[Servidor Minecraft]].&lt;br /&gt;
** Instalar y configurar [[Etherpad]] en Ubuntu Server.&lt;br /&gt;
** Notas sobre [[OpenSSL]].&lt;br /&gt;
** Notas de configuración de [[Drupal 7]] y [[Drupal 8]].&lt;br /&gt;
** Notas de configuración de [[WordPress]].&lt;br /&gt;
** Notas de configuración de [[MediaWiki]].&lt;br /&gt;
* '''Contenedores:'''&lt;br /&gt;
** Instalar y configurar [[Docker Engine]] en Ubuntu Server.&lt;br /&gt;
** Instalar y configurar [[Nextcloud AIO]] en Docker.&lt;br /&gt;
** Instalar y configurar de servidor de correo [[Docker-Mailserver]].&lt;br /&gt;
&lt;br /&gt;
Pulse en el siguiente enlace para consultar la '''lista completa: [[:Categoría:Notas]]'''.&lt;br /&gt;
&lt;br /&gt;
==== Código ====&lt;br /&gt;
&lt;br /&gt;
Las notas aquí descritas pueden tener referencias a código fuente escrito por mi.&lt;br /&gt;
&lt;br /&gt;
Está disponible en [https://code.castanedo.es code.castanedo.es].&lt;br /&gt;
&lt;br /&gt;
Todo este software está disponible con licencia [https://www.gnu.org/licenses/gpl.html GPLv3].&lt;br /&gt;
&lt;br /&gt;
==== Ayuda ====&lt;br /&gt;
&lt;br /&gt;
Además es esta Wiki hay una [[:Categoría:Ayuda]] en las que se encuentran pequeñas guías de uso de servicios disponibles en mis servidores.&lt;br /&gt;
&lt;br /&gt;
Su función es que sirvan de ayuda para las personas que están usando estos servicios, aunque, por supuesto, son de libre consulta para cualquiera que los encuentre útiles.&lt;br /&gt;
&lt;br /&gt;
=== Espíritu ===&lt;br /&gt;
&lt;br /&gt;
El espíritu de esta wiki es el carácter libre y abierto.&lt;br /&gt;
&lt;br /&gt;
Todo el material que se aloje aquí será bajo licencia '''Creative Commons Attribution-ShareAlike 4.0''' ([https://creativecommons.org/licenses/by-sa/4.0/ CC BY-SA]) a menos que se exprese lo contrario.&lt;br /&gt;
&lt;br /&gt;
Para más detalles leer [[Wiki_Castanedo.es:Descargo_general]].&lt;br /&gt;
&lt;br /&gt;
=== Gracias ===&lt;br /&gt;
&lt;br /&gt;
'''Muchas gracias''' por visitar este sitio.&lt;br /&gt;
&lt;br /&gt;
Cualquier duda, consulta o corrección contacta en [mailto:guzman@castanedo.es guzman@castanedo.es].&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Docker_Engine&amp;diff=116</id>
		<title>Docker Engine</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Docker_Engine&amp;diff=116"/>
		<updated>2026-03-08T22:15:06Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación de Docker Engine en Ubuntu Server ==&lt;br /&gt;
El objetivo de este documento es instalar Docker Engine en Ubuntu Server 24.04.&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Antes de instalar Docker hay que tener en cuenta una serie de consideraciones.&lt;br /&gt;
&lt;br /&gt;
=== Usuario root ===&lt;br /&gt;
Todos los comandos que aquí se ponen, han de ejecutarse como root.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desinstalar UFW ===&lt;br /&gt;
El firewall que viene por defecto en entornos tipo Debian (como Ubuntu) tiene problemas de compatibilidad con Docker Engine.&lt;br /&gt;
Debido a que Docker crea reglas directamente con IPTables, se ocasiona que Docker cree reglas que se salten las reglas existentes.&lt;br /&gt;
Para evitar que esto pase vamos a sustituir UFW por FirewallD (en modo IPTables), que evita este tipo de problemas.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw disable&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl disable ufw&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl stop ufw&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt remove --purge ufw&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Instalar FirewallD ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Habilitar modo IPTables a FirewallD (opcional) ===&lt;br /&gt;
Hay problemas reportados de conexión entre contenedores de Docker cuando FirewallD está en modo nftables, se resuelven cambiando a modo IPTables.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/firewalld/firewalld.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
# FirewallBackend&lt;br /&gt;
# Selects the firewall backend implementation.&lt;br /&gt;
# Choices are:&lt;br /&gt;
#       - nftables (default)&lt;br /&gt;
#       - iptables (iptables, ip6tables, ebtables and ipset)&lt;br /&gt;
# Note: The iptables backend is deprecated. It will be removed in a future&lt;br /&gt;
# release.&lt;br /&gt;
#FirewallBackend=nftables&lt;br /&gt;
FirewallBackend=iptables&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Habilitar reglas anteriores ===&lt;br /&gt;
En mi paso prefiero habilitar puertos TCP en vez de servicios (aunque también es posible).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --permanent --zone=public --add-port=80/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --permanent --zone=public --add-port=443/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Habilitar salida a Internet de contenedores ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --permanent --zone=public --add-masquerade&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comprobar estado de FirewallD ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
firewall-cmd --list-all&lt;br /&gt;
public (default, active)&lt;br /&gt;
  target: default&lt;br /&gt;
  ingress-priority: 0&lt;br /&gt;
  egress-priority: 0&lt;br /&gt;
  icmp-block-inversion: no&lt;br /&gt;
  interfaces:&lt;br /&gt;
  sources:&lt;br /&gt;
  services: dhcpv6-client ssh&lt;br /&gt;
  ports: 80/tcp 443/tcp&lt;br /&gt;
  protocols:&lt;br /&gt;
  forward: yes&lt;br /&gt;
  masquerade: yes&lt;br /&gt;
  forward-ports:&lt;br /&gt;
  source-ports:&lt;br /&gt;
  icmp-blocks:&lt;br /&gt;
  rich rules:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Consideraciones importantes ===&lt;br /&gt;
* Toda esta configuración estamos asumiendo que estamos usando la zona public.&lt;br /&gt;
* Cuando se creen contenedores en Docker hay que evitar usar la opción -p (--port), ya que creará reglas en el firewall (iptables) que habilitarán acceso directo desde Internet a los contenedores.&lt;br /&gt;
* Mi recomendación es no hacerlo así y exponer los servicios a través de un proxy inverso (ver artículo sobre servidor [[LEMP]]).&lt;br /&gt;
&lt;br /&gt;
== Desinstalar versiones anteriores de Docker Engine ==&lt;br /&gt;
Comprobar que no existe una versión de Docker Engine instalada.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Añadir repositorios APT oficiales de Docker ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install ca-certificates curl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;install -m 0755 -d /etc/apt/keyrings&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod a+r /etc/apt/keyrings/docker.asc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tee /etc/apt/sources.list.d/docker.sources &amp;lt;&amp;lt;EOF&lt;br /&gt;
Types: deb&lt;br /&gt;
URIs: https://download.docker.com/linux/ubuntu&lt;br /&gt;
Suites: $(. /etc/os-release &amp;amp;&amp;amp; echo &amp;quot;${UBUNTU_CODENAME:-$VERSION_CODENAME}&amp;quot;)&lt;br /&gt;
Components: stable&lt;br /&gt;
Signed-By: /etc/apt/keyrings/docker.asc&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalar Docker Engine ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comprobar Docker Engine ==&lt;br /&gt;
=== Comprobar servicio ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl status docker&lt;br /&gt;
● docker.service - Docker Application Container Engine&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Thu 2026-02-26 22:52:45 UTC; 2min 39s ago&lt;br /&gt;
TriggeredBy: ● docker.socket&lt;br /&gt;
       Docs: https://docs.docker.com&lt;br /&gt;
   Main PID: 23159 (dockerd)&lt;br /&gt;
      Tasks: 11&lt;br /&gt;
     Memory: 26.5M (peak: 29.2M)&lt;br /&gt;
        CPU: 284ms&lt;br /&gt;
     CGroup: /system.slice/docker.service&lt;br /&gt;
             └─23159 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock&lt;br /&gt;
&lt;br /&gt;
Feb 26 22:52:44 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:44.065056936Z&amp;quot; level=info msg=&amp;quot;Deleting nftables IPv4 rules&amp;quot; error=&amp;quot;exit s&amp;gt;&lt;br /&gt;
Feb 26 22:52:44 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:44.088078290Z&amp;quot; level=info msg=&amp;quot;Deleting nftables IPv6 rules&amp;quot; error=&amp;quot;exit s&amp;gt;&lt;br /&gt;
Feb 26 22:52:44 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:44.118636746Z&amp;quot; level=info msg=&amp;quot;Firewalld: created docker-forwarding policy&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.117792420Z&amp;quot; level=info msg=&amp;quot;Loading containers: done.&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.131108392Z&amp;quot; level=info msg=&amp;quot;Docker daemon&amp;quot; commit=6bc6209 containerd-sn&amp;gt;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.131332307Z&amp;quot; level=info msg=&amp;quot;Initializing buildkit&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.149255659Z&amp;quot; level=info msg=&amp;quot;Completed buildkit initialization&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.158529795Z&amp;quot; level=info msg=&amp;quot;Daemon has completed initialization&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.158627568Z&amp;quot; level=info msg=&amp;quot;API listen on /run/docker.sock&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net systemd[1]: Started docker.service - Docker Application Container Engine.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si el servicio está apagado hay que arrancarlo y habilitarlo en el arranque:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start docker&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable docker&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desplegar contenedor de prueba (hello-world) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker run hello-world&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker ps --all&lt;br /&gt;
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES&lt;br /&gt;
3995e4839733   hello-world   &amp;quot;/hello&amp;quot;   2 minutes ago   Exited (0) 2 minutes ago             elated_matsumoto&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker stop elated_matsumoto&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker rm elated_matsumoto&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker image list&lt;br /&gt;
                                                                                                                             i Info →   U  In Use&lt;br /&gt;
IMAGE                ID             DISK USAGE   CONTENT SIZE   EXTRA&lt;br /&gt;
hello-world:latest   ef54e839ef54       25.9kB         9.52kB&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker image rm hello-world:latest&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Desarrollo con Docker Compose ==&lt;br /&gt;
Para entornos productivos está recomendado usar Docker Compose para declarar todos los contenedores que se van a usar (mediante fichero YAML).&lt;br /&gt;
Para su eso utilizo las siguientes herramientas:&lt;br /&gt;
&lt;br /&gt;
=== Visual Studio Codium ===&lt;br /&gt;
Visual Studio Codium o [https://vscodium.com/ VS Codium] es la versión libre de Visual Studio Code.&lt;br /&gt;
&lt;br /&gt;
Se compilan del mismo repositio, pero no se incluyen las herramientas de telemetría que introduce Microsoft.&lt;br /&gt;
&lt;br /&gt;
Esta es una buena herramienta para desarrollar los ficheros YAML.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, es necesario añadir extensiones.&lt;br /&gt;
&lt;br /&gt;
=== Docker (extensión) ===&lt;br /&gt;
Extensión de VS Codium para gestionar contenedores.&lt;br /&gt;
&lt;br /&gt;
URL: [https://open-vsx.org/extension/ms-azuretools/vscode-docker https://open-vsx.org/extension/ms-azuretools/vscode-docker]&lt;br /&gt;
&lt;br /&gt;
Instalará automática otra extensión: [https://open-vsx.org/extension/ms-azuretools/vscode-containers Container Tools].&lt;br /&gt;
&lt;br /&gt;
=== YAML (extensión) ===&lt;br /&gt;
Extensión de VS Codium para soporte al formato YAML.&lt;br /&gt;
&lt;br /&gt;
URL: [https://open-vsx.org/extension/redhat/vscode-yaml https://open-vsx.org/extension/redhat/vscode-yaml]&lt;br /&gt;
&lt;br /&gt;
=== Open Remote - SSH (extensión) ===&lt;br /&gt;
Para poder conectar a servidores SSH en el propio VS Codium.&lt;br /&gt;
&lt;br /&gt;
URL: [https://open-vsx.org/extension/jeanp413/open-remote-ssh https://open-vsx.org/extension/jeanp413/open-remote-ssh]&lt;br /&gt;
&lt;br /&gt;
=== Spanish Language Pack (extensión) ===&lt;br /&gt;
Para traducir VS Codium al español.&lt;br /&gt;
&lt;br /&gt;
URL: [https://open-vsx.org/extension/MS-CEINTL/vscode-language-pack-es https://open-vsx.org/extension/MS-CEINTL/vscode-language-pack-es]&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://docs.docker.com/engine/install/ubuntu/ https://docs.docker.com/engine/install/ubuntu/]&lt;br /&gt;
* [https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one?tab=readme-ov-file#how-to-resolve-firewall-problems-with-fedora-linux-rhel-os-centos-suse-linux-and-others https://github.com/nextcloud/all-in-one?tab=readme-ov-file#how-to-resolve-firewall-problems-with-fedora-linux-rhel-os-centos-suse-linux-and-others]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Docker_Engine&amp;diff=115</id>
		<title>Docker Engine</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Docker_Engine&amp;diff=115"/>
		<updated>2026-03-08T22:12:45Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalación de Docker Engine en Ubuntu Server ==&lt;br /&gt;
El objetivo de este documento es instalar Docker Engine en Ubuntu Server 24.04.&lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
Antes de instalar Docker hay que tener en cuenta una serie de consideraciones.&lt;br /&gt;
&lt;br /&gt;
=== Usuario root ===&lt;br /&gt;
Todos los comandos que aquí se ponen, han de ejecutarse como root.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;sudo -i&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desinstalar UFW ===&lt;br /&gt;
El firewall que viene por defecto en entornos tipo Debian (como Ubuntu) tiene problemas de compatibilidad con Docker Engine.&lt;br /&gt;
Debido a que Docker crea reglas directamente con IPTables, se ocasiona que Docker cree reglas que se salten las reglas existentes.&lt;br /&gt;
Para evitar que esto pase vamos a sustituir UFW por FirewallD (en modo IPTables), que evita este tipo de problemas.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;ufw disable&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl disable ufw&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl stop ufw&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt remove --purge ufw&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Instalar FirewallD ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Habilitar modo IPTables a FirewallD (opcional) ===&lt;br /&gt;
Hay problemas reportados de conexión entre contenedores de Docker cuando FirewallD está en modo nftables, se resuelven cambiando a modo IPTables.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/firewalld/firewalld.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
# FirewallBackend&lt;br /&gt;
# Selects the firewall backend implementation.&lt;br /&gt;
# Choices are:&lt;br /&gt;
#       - nftables (default)&lt;br /&gt;
#       - iptables (iptables, ip6tables, ebtables and ipset)&lt;br /&gt;
# Note: The iptables backend is deprecated. It will be removed in a future&lt;br /&gt;
# release.&lt;br /&gt;
#FirewallBackend=nftables&lt;br /&gt;
FirewallBackend=iptables&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart firewalld&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Habilitar reglas anteriores ===&lt;br /&gt;
En mi paso prefiero habilitar puertos TCP en vez de servicios (aunque también es posible).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --permanent --zone=public --add-port=80/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --permanent --zone=public --add-port=443/tcp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Habilitar salida a Internet de contenedores ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --permanent --zone=public --add-masquerade&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;firewall-cmd --reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comprobar estado de FirewallD ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
firewall-cmd --list-all&lt;br /&gt;
public (default, active)&lt;br /&gt;
  target: default&lt;br /&gt;
  ingress-priority: 0&lt;br /&gt;
  egress-priority: 0&lt;br /&gt;
  icmp-block-inversion: no&lt;br /&gt;
  interfaces:&lt;br /&gt;
  sources:&lt;br /&gt;
  services: dhcpv6-client ssh&lt;br /&gt;
  ports: 80/tcp 443/tcp&lt;br /&gt;
  protocols:&lt;br /&gt;
  forward: yes&lt;br /&gt;
  masquerade: yes&lt;br /&gt;
  forward-ports:&lt;br /&gt;
  source-ports:&lt;br /&gt;
  icmp-blocks:&lt;br /&gt;
  rich rules:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Consideraciones importantes ===&lt;br /&gt;
* Toda esta configuración estamos asumiendo que estamos usando la zona public.&lt;br /&gt;
* Cuando se creen contenedores en Docker hay que evitar usar la opción -p (--port), ya que creará reglas en el firewall (iptables) que habilitarán acceso directo desde Internet a los contenedores.&lt;br /&gt;
* Mi recomendación es no hacerlo así y exponer los servicios a través de un proxy inverso (ver artículo sobre servidor [[LEMP]]).&lt;br /&gt;
&lt;br /&gt;
== Desinstalar versiones anteriores de Docker Engine ==&lt;br /&gt;
Comprobar que no existe una versión de Docker Engine instalada.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Añadir repositorios APT oficiales de Docker ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install ca-certificates curl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;install -m 0755 -d /etc/apt/keyrings&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chmod a+r /etc/apt/keyrings/docker.asc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tee /etc/apt/sources.list.d/docker.sources &amp;lt;&amp;lt;EOF&lt;br /&gt;
Types: deb&lt;br /&gt;
URIs: https://download.docker.com/linux/ubuntu&lt;br /&gt;
Suites: $(. /etc/os-release &amp;amp;&amp;amp; echo &amp;quot;${UBUNTU_CODENAME:-$VERSION_CODENAME}&amp;quot;)&lt;br /&gt;
Components: stable&lt;br /&gt;
Signed-By: /etc/apt/keyrings/docker.asc&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalar Docker Engine ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt update&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comprobar Docker Engine ==&lt;br /&gt;
=== Comprobar servicio ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl status docker&lt;br /&gt;
● docker.service - Docker Application Container Engine&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Thu 2026-02-26 22:52:45 UTC; 2min 39s ago&lt;br /&gt;
TriggeredBy: ● docker.socket&lt;br /&gt;
       Docs: https://docs.docker.com&lt;br /&gt;
   Main PID: 23159 (dockerd)&lt;br /&gt;
      Tasks: 11&lt;br /&gt;
     Memory: 26.5M (peak: 29.2M)&lt;br /&gt;
        CPU: 284ms&lt;br /&gt;
     CGroup: /system.slice/docker.service&lt;br /&gt;
             └─23159 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock&lt;br /&gt;
&lt;br /&gt;
Feb 26 22:52:44 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:44.065056936Z&amp;quot; level=info msg=&amp;quot;Deleting nftables IPv4 rules&amp;quot; error=&amp;quot;exit s&amp;gt;&lt;br /&gt;
Feb 26 22:52:44 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:44.088078290Z&amp;quot; level=info msg=&amp;quot;Deleting nftables IPv6 rules&amp;quot; error=&amp;quot;exit s&amp;gt;&lt;br /&gt;
Feb 26 22:52:44 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:44.118636746Z&amp;quot; level=info msg=&amp;quot;Firewalld: created docker-forwarding policy&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.117792420Z&amp;quot; level=info msg=&amp;quot;Loading containers: done.&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.131108392Z&amp;quot; level=info msg=&amp;quot;Docker daemon&amp;quot; commit=6bc6209 containerd-sn&amp;gt;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.131332307Z&amp;quot; level=info msg=&amp;quot;Initializing buildkit&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.149255659Z&amp;quot; level=info msg=&amp;quot;Completed buildkit initialization&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.158529795Z&amp;quot; level=info msg=&amp;quot;Daemon has completed initialization&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net dockerd[23159]: time=&amp;quot;2026-02-26T22:52:45.158627568Z&amp;quot; level=info msg=&amp;quot;API listen on /run/docker.sock&amp;quot;&lt;br /&gt;
Feb 26 22:52:45 culturetas.net systemd[1]: Started docker.service - Docker Application Container Engine.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si el servicio está apagado hay que arrancarlo y habilitarlo en el arranque:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl start docker&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl enable docker&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Desplegar contenedor de prueba (hello-world) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker run hello-world&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker ps --all&lt;br /&gt;
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES&lt;br /&gt;
3995e4839733   hello-world   &amp;quot;/hello&amp;quot;   2 minutes ago   Exited (0) 2 minutes ago             elated_matsumoto&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker stop elated_matsumoto&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker rm elated_matsumoto&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
docker image list&lt;br /&gt;
                                                                                                                             i Info →   U  In Use&lt;br /&gt;
IMAGE                ID             DISK USAGE   CONTENT SIZE   EXTRA&lt;br /&gt;
hello-world:latest   ef54e839ef54       25.9kB         9.52kB&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;docker image rm hello-world:latest&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Desarrollo con Docker Compose ==&lt;br /&gt;
Para entornos productivos está recomendado usar Docker Compose para declarar todos los contenedores que se van a usar (mediante fichero YAML).&lt;br /&gt;
Para su eso utilizo las siguientes herramientas:&lt;br /&gt;
&lt;br /&gt;
=== Visual Studio Codium ===&lt;br /&gt;
Visual Studio Codium o [https://vscodium.com/ VS Codium] es la versión libre de Visual Studio Code.&lt;br /&gt;
Se compilan del mismo repositio, pero no se incluyen las herramientas de telemetría que introduce Microsoft.&lt;br /&gt;
&lt;br /&gt;
Esta es una buena herramienta para desarrollar los ficheros YAML.&lt;br /&gt;
Sin embargo, es necesario añadir extensiones&lt;br /&gt;
&lt;br /&gt;
=== Docker (extensión) ===&lt;br /&gt;
Extensión de VS Codium para gestionar contenedores.&lt;br /&gt;
URL: [https://open-vsx.org/extension/ms-azuretools/vscode-docker https://open-vsx.org/extension/ms-azuretools/vscode-docker]&lt;br /&gt;
Instalará automática otra extensión: [https://open-vsx.org/extension/ms-azuretools/vscode-containers Container Tools].&lt;br /&gt;
&lt;br /&gt;
=== YAML (extensión) ===&lt;br /&gt;
Extensión de VS Codium para soporte al formato YAML.&lt;br /&gt;
URL: [https://open-vsx.org/extension/redhat/vscode-yaml https://open-vsx.org/extension/redhat/vscode-yaml]&lt;br /&gt;
&lt;br /&gt;
=== Open Remote - SSH (extensión) ===&lt;br /&gt;
Para poder conectar a servidores SSH en el propio VS Codium.&lt;br /&gt;
URL: [https://open-vsx.org/extension/jeanp413/open-remote-ssh https://open-vsx.org/extension/jeanp413/open-remote-ssh]&lt;br /&gt;
&lt;br /&gt;
=== Spanish Language Pack (extensión) ===&lt;br /&gt;
Para traducir VS Codium al español.&lt;br /&gt;
URL: [https://open-vsx.org/extension/MS-CEINTL/vscode-language-pack-es https://open-vsx.org/extension/MS-CEINTL/vscode-language-pack-es]&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
* [https://docs.docker.com/engine/install/ubuntu/ https://docs.docker.com/engine/install/ubuntu/]&lt;br /&gt;
* [https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw]&lt;br /&gt;
* [https://github.com/nextcloud/all-in-one?tab=readme-ov-file#how-to-resolve-firewall-problems-with-fedora-linux-rhel-os-centos-suse-linux-and-others https://github.com/nextcloud/all-in-one?tab=readme-ov-file#how-to-resolve-firewall-problems-with-fedora-linux-rhel-os-centos-suse-linux-and-others]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Administraci%C3%B3n_servidor_de_correo&amp;diff=114</id>
		<title>Administración servidor de correo</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Administraci%C3%B3n_servidor_de_correo&amp;diff=114"/>
		<updated>2026-02-27T22:10:59Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objetivo ==&lt;br /&gt;
En esta página se muestra cómo administrar el correo genérico instalado en la página [Servidor de Correo].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo dominio ==&lt;br /&gt;
Consiste en configurar el servidor de correo para que sirva correos de un nuevo dominio (en este ejemplo culturetas.net).&lt;br /&gt;
&lt;br /&gt;
=== Añadir nuevo dominio en BD ===&lt;br /&gt;
En mi configuración los dominios, usuarios y aliases se encuentran en una base de datos MariaDB.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mariadb&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;use mailserver;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;INSERT INTO virtual_domains (domain) VALUES ('culturetas.net');&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;COMMIT;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configuración OpenDKIM ===&lt;br /&gt;
* Generamos una clave criptográficas:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /etc/dkimkeys&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;opendkim-genkey -s mail -d culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv mail.private /etc/dkimkeys/culturetas.net-dkim.key&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv mail.txt /etc/dkimkeys/culturetas.net-dkim.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chown opendkim:opendkim /etc/dkimkeys/culturetas.net-dkim.*&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Habilitar dominios en OpenDKIM:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/dkimkeys/key_table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
#KEYID DOMAIN:SELECTOR:KEY&lt;br /&gt;
[...]&lt;br /&gt;
mail._domainkey.culturetas.net culturetas.net:mail:/etc/dkimkeys/culturetas.net-dkim.key&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/dkimkeys/signing_table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
#DOMAIN KEYID&lt;br /&gt;
[...]&lt;br /&gt;
culturetas.net mail._domainkey.culturetas.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Anotar clavé pública de OpenDKIM:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cat /etc/dkimkeys/culturetas.net-dkim.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail._domainkey IN      TXT     ( &amp;quot;v=DKIM1; h=sha256; k=rsa; &amp;quot;&lt;br /&gt;
          &amp;quot;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvRG1MMcJ0XbHKCgwLrr8zO1AVXxNYE+ut/3SQD0VxdHvexIvlIovyKFMagAQlzIJ0Tr+9l7FUNlCdeUoCqIxi4R4mOgOcrqgXRNXAwQoa7ns1j2pFeYnKHCODIiDRsszU0gKmgUX82ps55Feo/Fx5v1xtZNy855G+h8LnGy6lEoXx87TcCIsdXkslWPdGBJZPwNlvO+SCtttSM&amp;quot;&lt;br /&gt;
          &amp;quot;f//sdjGuc5zQnnnqdSLgNa6vSidM/71MvF0L5rPpeaQ0bAAicb2Iv047lDT2G1LnJ+y1wpugDdJGQoEa6D8SV2Q8ffzaPyRJ340wP9d1m2BZT2EvLTJA60wFc22GfkM0ha6N2QtwIDAQAB&amp;quot; )  ; ----- DKIM key mail for culturetas.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar OpenDKIM:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart opendkim&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuración OpenDMARC ===&lt;br /&gt;
* Configurar dominios en OpenDMARC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/opendmarc.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
TrustedAuthservIDs HOSTNAME,culturetas.net&lt;br /&gt;
[...]&lt;br /&gt;
IgnoreMailFrom smtp.castanedo.es,culturetas.net&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar OpenDMARC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart opendmarc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configurar registros DNS ===&lt;br /&gt;
Es necesario acceder a la zona DNS para añadir nuevos dominios para el dominio (culturetas.net en este ejemplo).&lt;br /&gt;
&lt;br /&gt;
* Registro DKIM&lt;br /&gt;
Hay que añadir un registro DNS con la información de la clave pública de DKIM.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail._domainkey IN TXT &amp;quot;v=DKIM1;g=*;h=sha256;k=rsa;s=email;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvRG1MMcJ0XbHKCgwLrr8zO1AVXxNYE+ut/3SQD0VxdHvexIvlIovyKFMagAQlzIJ0Tr+9l7FUNlCdeUoCqIxi4R4mOgOcrqgXRNXAwQoa7ns1j2pFeYnKHCODIiDRsszU0gKmgUX82ps55Feo/Fx5v1xtZNy855G+h8LnGy6lEoXx87TcCIsdXkslWPdGBJZPwNlvO+SCtttSMf//sdjGuc5zQnnnqdSLgNa6vSidM/71MvF0L5rPpeaQ0bAAicb2Iv047lDT2G1LnJ+y1wpugDdJGQoEa6D8SV2Q8ffzaPyRJ340wP9d1m2BZT2EvLTJA60wFc22GfkM0ha6N2QtwIDAQAB;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Registro SPF:&lt;br /&gt;
Hay que añadir un registro DNS con la información de SPF.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
culturetas.net. IN TXT &amp;quot;v=spf1 mx include:smtp.castanedo.es ~all&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** a: permite que el servidor en A envien correo.&lt;br /&gt;
** mx: permite que el servidor en MX envie correo.&lt;br /&gt;
** -all: la información describe a todos los hosts estrictamente.&lt;br /&gt;
&lt;br /&gt;
* Registro ADSP:&lt;br /&gt;
Hay que añadir un registro DNS con la información de ADSP (Author Domain Signing Practices).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
_adsp._domainkey IN TXT &amp;quot;dkim=all&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** unknown: válidos tanto firmados como sin firmar.&lt;br /&gt;
** all: todos los emails firmados.&lt;br /&gt;
** discardable: todos los emails firmados y los que no lo estén pueden eliminarse.&lt;br /&gt;
&lt;br /&gt;
* Registro DMARC:&lt;br /&gt;
Hay que añadir un registro DNS con la información DMAR (Domain bases Message Authentication, Reporting and Conformance).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
_dmarc IN TXT &amp;quot;v=DMARC1; p=none; rua=mailto:admin@culturetas.net; fo=0; adkim=r; aspf=r&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** p puede ser:&lt;br /&gt;
*** none: no hace nada si falla DMARC.&lt;br /&gt;
*** quarantine: si falla que sean tratado como sospechoso.&lt;br /&gt;
*** reject: si falla que sea eliminado.&lt;br /&gt;
** rua: dirección a donde los fallos deben ser reportados.&lt;br /&gt;
** fo puede ser:&lt;br /&gt;
*** 0: generar reporte si falla SPF y DKIM.&lt;br /&gt;
*** 1: generar reporte si falla SPF o DKIM.&lt;br /&gt;
*** s: generar reporte si falla SPF.&lt;br /&gt;
*** d: generar reporte si falla DKIM.&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo buzón ==&lt;br /&gt;
=== Generar contraseña ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;doveadm pw -s SHA512-CRYPT&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Añadir a base de datos ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mariadb&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;use mailserver;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;INSERT INTO virtual_users (domain_id, email, password, access) VALUES ('6', 'admin@culturetas.net', '$6$XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 'OK');&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;COMMIT;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo alias ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mariadb&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;use mailserver;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;INSERT INTO virtual_aliases (domain_id, source, destination) VALUES ('6', 'postmaster@culturetas.net', 'admin@culturetas.net');&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;INSERT INTO virtual_aliases (domain_id, source, destination) VALUES ('6', 'webmaster@culturetas.net', 'admin@culturetas.net');&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;COMMIT;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Administraci%C3%B3n_servidor_de_correo&amp;diff=113</id>
		<title>Administración servidor de correo</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Administraci%C3%B3n_servidor_de_correo&amp;diff=113"/>
		<updated>2026-02-27T21:49:07Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objetivo ==&lt;br /&gt;
En esta página se muestra cómo administrar el correo genérico instalado en la página [Servidor de Correo].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo dominio ==&lt;br /&gt;
Consiste en configurar el servidor de correo para que sirva correos de un nuevo dominio (en este ejemplo culturetas.net).&lt;br /&gt;
&lt;br /&gt;
=== Añadir nuevo dominio en BD ===&lt;br /&gt;
En mi configuración los dominios, usuarios y aliases se encuentran en una base de datos MariaDB.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mariadb&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;use mailserver;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;INSERT INTO virtual_domains (domain) VALUES ('culturetas.net');&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;COMMIT;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configuración OpenDKIM ===&lt;br /&gt;
* Generamos una clave criptográficas:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /etc/dkimkeys&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;opendkim-genkey -s mail -d culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv mail.private /etc/dkimkeys/culturetas.net-dkim.key&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv mail.txt /etc/dkimkeys/culturetas.net-dkim.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chown opendkim:opendkim /etc/dkimkeys/culturetas.net-dkim.*&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Habilitar dominios en OpenDKIM:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/dkimkeys/key_table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
#KEYID DOMAIN:SELECTOR:KEY&lt;br /&gt;
[...]&lt;br /&gt;
mail._domainkey.culturetas.net culturetas.net:mail:/etc/dkimkeys/culturetas.net-dkim.key&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/dkimkeys/signing_table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
#DOMAIN KEYID&lt;br /&gt;
[...]&lt;br /&gt;
culturetas.net mail._domainkey.culturetas.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Anotar clavé pública de OpenDKIM:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cat /etc/dkimkeys/culturetas.net-dkim.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail._domainkey IN      TXT     ( &amp;quot;v=DKIM1; h=sha256; k=rsa; &amp;quot;&lt;br /&gt;
          &amp;quot;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvRG1MMcJ0XbHKCgwLrr8zO1AVXxNYE+ut/3SQD0VxdHvexIvlIovyKFMagAQlzIJ0Tr+9l7FUNlCdeUoCqIxi4R4mOgOcrqgXRNXAwQoa7ns1j2pFeYnKHCODIiDRsszU0gKmgUX82ps55Feo/Fx5v1xtZNy855G+h8LnGy6lEoXx87TcCIsdXkslWPdGBJZPwNlvO+SCtttSM&amp;quot;&lt;br /&gt;
          &amp;quot;f//sdjGuc5zQnnnqdSLgNa6vSidM/71MvF0L5rPpeaQ0bAAicb2Iv047lDT2G1LnJ+y1wpugDdJGQoEa6D8SV2Q8ffzaPyRJ340wP9d1m2BZT2EvLTJA60wFc22GfkM0ha6N2QtwIDAQAB&amp;quot; )  ; ----- DKIM key mail for culturetas.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar OpenDKIM:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart opendkim&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuración OpenDMARC ===&lt;br /&gt;
* Configurar dominios en OpenDMARC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/opendmarc.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
TrustedAuthservIDs HOSTNAME,culturetas.net&lt;br /&gt;
[...]&lt;br /&gt;
IgnoreMailFrom smtp.castanedo.es,culturetas.net&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar OpenDMARC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart opendmarc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configurar registros DNS ===&lt;br /&gt;
Es necesario acceder a la zona DNS para añadir nuevos dominios para el dominio (culturetas.net en este ejemplo).&lt;br /&gt;
&lt;br /&gt;
* Registro DKIM&lt;br /&gt;
Hay que añadir un registro DNS con la información de la clave pública de DKIM.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail._domainkey IN TXT &amp;quot;v=DKIM1;g=*;h=sha256;k=rsa;s=email;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvRG1MMcJ0XbHKCgwLrr8zO1AVXxNYE+ut/3SQD0VxdHvexIvlIovyKFMagAQlzIJ0Tr+9l7FUNlCdeUoCqIxi4R4mOgOcrqgXRNXAwQoa7ns1j2pFeYnKHCODIiDRsszU0gKmgUX82ps55Feo/Fx5v1xtZNy855G+h8LnGy6lEoXx87TcCIsdXkslWPdGBJZPwNlvO+SCtttSMf//sdjGuc5zQnnnqdSLgNa6vSidM/71MvF0L5rPpeaQ0bAAicb2Iv047lDT2G1LnJ+y1wpugDdJGQoEa6D8SV2Q8ffzaPyRJ340wP9d1m2BZT2EvLTJA60wFc22GfkM0ha6N2QtwIDAQAB;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Registro SPF:&lt;br /&gt;
Hay que añadir un registro DNS con la información de SPF.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
culturetas.net. IN TXT &amp;quot;v=spf1 mx include:smtp.castanedo.es ~all&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** a: permite que el servidor en A envien correo.&lt;br /&gt;
** mx: permite que el servidor en MX envie correo.&lt;br /&gt;
** -all: la información describe a todos los hosts estrictamente.&lt;br /&gt;
&lt;br /&gt;
* Registro ADSP:&lt;br /&gt;
Hay que añadir un registro DNS con la información de ADSP (Author Domain Signing Practices).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
_adsp._domainkey IN TXT &amp;quot;dkim=all&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** unknown: válidos tanto firmados como sin firmar.&lt;br /&gt;
** all: todos los emails firmados.&lt;br /&gt;
** discardable: todos los emails firmados y los que no lo estén pueden eliminarse.&lt;br /&gt;
&lt;br /&gt;
* Registro DMARC:&lt;br /&gt;
Hay que añadir un registro DNS con la información DMAR (Domain bases Message Authentication, Reporting and Conformance).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
_dmarc IN TXT &amp;quot;v=DMARC1; p=none; rua=mailto:admin@culturetas.net; fo=0; adkim=r; aspf=r&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** p puede ser:&lt;br /&gt;
*** none: no hace nada si falla DMARC.&lt;br /&gt;
*** quarantine: si falla que sean tratado como sospechoso.&lt;br /&gt;
*** reject: si falla que sea eliminado.&lt;br /&gt;
** rua: dirección a donde los fallos deben ser reportados.&lt;br /&gt;
** fo puede ser:&lt;br /&gt;
*** 0: generar reporte si falla SPF y DKIM.&lt;br /&gt;
*** 1: generar reporte si falla SPF o DKIM.&lt;br /&gt;
*** s: generar reporte si falla SPF.&lt;br /&gt;
*** d: generar reporte si falla DKIM.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Administraci%C3%B3n_servidor_de_correo&amp;diff=112</id>
		<title>Administración servidor de correo</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Administraci%C3%B3n_servidor_de_correo&amp;diff=112"/>
		<updated>2026-02-27T21:40:16Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objetivo ==&lt;br /&gt;
En esta página se muestra cómo administrar el correo genérico instalado en la página [Servidor de Correo].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo dominio ==&lt;br /&gt;
Consiste en configurar el servidor de correo para que sirva correos de un nuevo dominio (en este ejemplo culturetas.net).&lt;br /&gt;
&lt;br /&gt;
=== Configuración OpenDKIM ===&lt;br /&gt;
* Generamos una clave criptográficas:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /etc/dkimkeys&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;opendkim-genkey -s mail -d culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv mail.private /etc/dkimkeys/culturetas.net-dkim.key&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv mail.txt /etc/dkimkeys/culturetas.net-dkim.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chown opendkim:opendkim /etc/dkimkeys/culturetas.net-dkim.*&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Habilitar dominios en OpenDKIM:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/dkimkeys/key_table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
#KEYID DOMAIN:SELECTOR:KEY&lt;br /&gt;
[...]&lt;br /&gt;
mail._domainkey.culturetas.net culturetas.net:mail:/etc/dkimkeys/culturetas.net-dkim.key&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/dkimkeys/signing_table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
#DOMAIN KEYID&lt;br /&gt;
[...]&lt;br /&gt;
culturetas.net mail._domainkey.culturetas.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Anotar clavé pública de OpenDKIM:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cat /etc/dkimkeys/culturetas.net-dkim.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail._domainkey IN      TXT     ( &amp;quot;v=DKIM1; h=sha256; k=rsa; &amp;quot;&lt;br /&gt;
          &amp;quot;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvRG1MMcJ0XbHKCgwLrr8zO1AVXxNYE+ut/3SQD0VxdHvexIvlIovyKFMagAQlzIJ0Tr+9l7FUNlCdeUoCqIxi4R4mOgOcrqgXRNXAwQoa7ns1j2pFeYnKHCODIiDRsszU0gKmgUX82ps55Feo/Fx5v1xtZNy855G+h8LnGy6lEoXx87TcCIsdXkslWPdGBJZPwNlvO+SCtttSM&amp;quot;&lt;br /&gt;
          &amp;quot;f//sdjGuc5zQnnnqdSLgNa6vSidM/71MvF0L5rPpeaQ0bAAicb2Iv047lDT2G1LnJ+y1wpugDdJGQoEa6D8SV2Q8ffzaPyRJ340wP9d1m2BZT2EvLTJA60wFc22GfkM0ha6N2QtwIDAQAB&amp;quot; )  ; ----- DKIM key mail for culturetas.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar OpenDKIM:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart opendkim&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuración OpenDMARC ===&lt;br /&gt;
* Configurar dominios en OpenDMARC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/opendmarc.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
TrustedAuthservIDs HOSTNAME,culturetas.net&lt;br /&gt;
[...]&lt;br /&gt;
IgnoreMailFrom smtp.castanedo.es,culturetas.net&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reiniciar OpenDMARC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;systemctl restart opendmarc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configurar registros DNS ===&lt;br /&gt;
Es necesario acceder a la zona DNS para añadir nuevos dominios para el dominio (culturetas.net en este ejemplo).&lt;br /&gt;
&lt;br /&gt;
* Registro DKIM&lt;br /&gt;
Hay que añadir un registro DNS con la información de la clave pública de DKIM.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail._domainkey IN TXT &amp;quot;v=DKIM1;g=*;h=sha256;k=rsa;s=email;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvRG1MMcJ0XbHKCgwLrr8zO1AVXxNYE+ut/3SQD0VxdHvexIvlIovyKFMagAQlzIJ0Tr+9l7FUNlCdeUoCqIxi4R4mOgOcrqgXRNXAwQoa7ns1j2pFeYnKHCODIiDRsszU0gKmgUX82ps55Feo/Fx5v1xtZNy855G+h8LnGy6lEoXx87TcCIsdXkslWPdGBJZPwNlvO+SCtttSMf//sdjGuc5zQnnnqdSLgNa6vSidM/71MvF0L5rPpeaQ0bAAicb2Iv047lDT2G1LnJ+y1wpugDdJGQoEa6D8SV2Q8ffzaPyRJ340wP9d1m2BZT2EvLTJA60wFc22GfkM0ha6N2QtwIDAQAB;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Registro SPF:&lt;br /&gt;
Hay que añadir un registro DNS con la información de SPF.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
culturetas.net. IN TXT &amp;quot;v=spf1 mx include:smtp.castanedo.es ~all&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** a: permite que el servidor en A envien correo.&lt;br /&gt;
** mx: permite que el servidor en MX envie correo.&lt;br /&gt;
** -all: la información describe a todos los hosts estrictamente.&lt;br /&gt;
&lt;br /&gt;
* Registro ADSP:&lt;br /&gt;
Hay que añadir un registro DNS con la información de ADSP (Author Domain Signing Practices).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
_adsp._domainkey IN TXT &amp;quot;dkim=all&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** unknown: válidos tanto firmados como sin firmar.&lt;br /&gt;
** all: todos los emails firmados.&lt;br /&gt;
** discardable: todos los emails firmados y los que no lo estén pueden eliminarse.&lt;br /&gt;
&lt;br /&gt;
* Registro DMARC:&lt;br /&gt;
Hay que añadir un registro DNS con la información DMAR (Domain bases Message Authentication, Reporting and Conformance).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
_dmarc IN TXT &amp;quot;v=DMARC1; p=none; rua=mailto:admin@culturetas.net; fo=0; adkim=r; aspf=r&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** p puede ser:&lt;br /&gt;
*** none: no hace nada si falla DMARC.&lt;br /&gt;
*** quarantine: si falla que sean tratado como sospechoso.&lt;br /&gt;
*** reject: si falla que sea eliminado.&lt;br /&gt;
** rua: dirección a donde los fallos deben ser reportados.&lt;br /&gt;
** fo puede ser:&lt;br /&gt;
*** 0: generar reporte si falla SPF y DKIM.&lt;br /&gt;
*** 1: generar reporte si falla SPF o DKIM.&lt;br /&gt;
*** s: generar reporte si falla SPF.&lt;br /&gt;
*** d: generar reporte si falla DKIM.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Administraci%C3%B3n_servidor_de_correo&amp;diff=111</id>
		<title>Administración servidor de correo</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Administraci%C3%B3n_servidor_de_correo&amp;diff=111"/>
		<updated>2026-02-27T20:31:09Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objetivo ==&lt;br /&gt;
En esta página se muestra cómo administrar el correo genérico instalado en la página [Servidor de Correo].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo dominio ==&lt;br /&gt;
Consiste en configurar el servidor de correo para que sirva correos de un nuevo dominio (en este ejemplo culturetas.net).&lt;br /&gt;
&lt;br /&gt;
=== Configuración OpenDKIM ===&lt;br /&gt;
* Generamos una clave criptográficas:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /etc/dkimkeys&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;opendkim-genkey -s mail -d culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv mail.private /etc/dkimkeys/culturetas.net-dkim.key&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv mail.txt /etc/dkimkeys/culturetas.net-dkim.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chown opendkim:opendkim /etc/dkimkeys/culturetas.net-dkim.*&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Habilitar dominios en OpenDKIM:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/dkimkeys/key_table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
#KEYID DOMAIN:SELECTOR:KEY&lt;br /&gt;
[...]&lt;br /&gt;
mail._domainkey.culturetas.net culturetas.net:mail:/etc/dkimkeys/culturetas.net-dkim.key&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/dkimkeys/signing_table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
#DOMAIN KEYID&lt;br /&gt;
[...]&lt;br /&gt;
culturetas.net mail._domainkey.culturetas.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Anotar clavé pública de OpenDKIM:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cat /etc/dkimkeys/culturetas.net-dkim.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail._domainkey IN      TXT     ( &amp;quot;v=DKIM1; h=sha256; k=rsa; &amp;quot;&lt;br /&gt;
          &amp;quot;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvRG1MMcJ0XbHKCgwLrr8zO1AVXxNYE+ut/3SQD0VxdHvexIvlIovyKFMagAQlzIJ0Tr+9l7FUNlCdeUoCqIxi4R4mOgOcrqgXRNXAwQoa7ns1j2pFeYnKHCODIiDRsszU0gKmgUX82ps55Feo/Fx5v1xtZNy855G+h8LnGy6lEoXx87TcCIsdXkslWPdGBJZPwNlvO+SCtttSM&amp;quot;&lt;br /&gt;
          &amp;quot;f//sdjGuc5zQnnnqdSLgNa6vSidM/71MvF0L5rPpeaQ0bAAicb2Iv047lDT2G1LnJ+y1wpugDdJGQoEa6D8SV2Q8ffzaPyRJ340wP9d1m2BZT2EvLTJA60wFc22GfkM0ha6N2QtwIDAQAB&amp;quot; )  ; ----- DKIM key mail for culturetas.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurar registros DNS ===&lt;br /&gt;
Es necesario acceder a la zona DNS para añadir nuevos dominios para el dominio (culturetas.net en este ejemplo).&lt;br /&gt;
&lt;br /&gt;
* Registro DKIM&lt;br /&gt;
Hay que añadir un registro DNS con la información de la clave pública de DKIM.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail._domainkey IN TXT &amp;quot;v=DKIM1;g=*;h=sha256;k=rsa;s=email;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvRG1MMcJ0XbHKCgwLrr8zO1AVXxNYE+ut/3SQD0VxdHvexIvlIovyKFMagAQlzIJ0Tr+9l7FUNlCdeUoCqIxi4R4mOgOcrqgXRNXAwQoa7ns1j2pFeYnKHCODIiDRsszU0gKmgUX82ps55Feo/Fx5v1xtZNy855G+h8LnGy6lEoXx87TcCIsdXkslWPdGBJZPwNlvO+SCtttSMf//sdjGuc5zQnnnqdSLgNa6vSidM/71MvF0L5rPpeaQ0bAAicb2Iv047lDT2G1LnJ+y1wpugDdJGQoEa6D8SV2Q8ffzaPyRJ340wP9d1m2BZT2EvLTJA60wFc22GfkM0ha6N2QtwIDAQAB;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Administraci%C3%B3n_servidor_de_correo&amp;diff=110</id>
		<title>Administración servidor de correo</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Administraci%C3%B3n_servidor_de_correo&amp;diff=110"/>
		<updated>2026-02-27T20:23:52Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objetivo ==&lt;br /&gt;
En esta página se muestra cómo administrar el correo genérico instalado en la página [Servidor de Correo].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo dominio ==&lt;br /&gt;
Consiste en configurar el servidor de correo para que sirva correos de un nuevo dominio (en este ejemplo culturetas.net).&lt;br /&gt;
&lt;br /&gt;
=== Configuración OpenDKIM ===&lt;br /&gt;
* Generamos una clave criptográficas:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /etc/dkimkeys&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;opendkim-genkey -s mail -d culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv mail.private /etc/dkimkeys/culturetas.net-dkim.key&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv mail.txt /etc/dkimkeys/culturetas.net-dkim.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chown opendkim:opendkim /etc/dkimkeys/culturetas.net-dkim.*&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Habilitar dominios en OpenDKIM:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/dkimkeys/key_table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
#KEYID DOMAIN:SELECTOR:KEY&lt;br /&gt;
[...]&lt;br /&gt;
mail._domainkey.culturetas.net culturetas.net:mail:/etc/dkimkeys/culturetas.net-dkim.key&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/dkimkeys/signing_table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
#DOMAIN KEYID&lt;br /&gt;
[...]&lt;br /&gt;
culturetas.net mail._domainkey.culturetas.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Anotar clavé pública de OpenDKIM:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cat /etc/dkimkeys/culturetas.net-dkim.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurar registros DNS ===&lt;br /&gt;
Es necesario acceder a la zona DNS para añadir nuevos dominios para el dominio (culturetas.net en este ejemplo).&lt;br /&gt;
&lt;br /&gt;
* Registro DKIM&lt;br /&gt;
Hay que añadir un registro DNS con la información de la clave pública de DKIM.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail._domainkey IN TXT &amp;quot;v=DKIM1;g=*;h=sha256;k=rsa;s=mail;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvRG1MMcJ0XbHKCgwLrr8zO1AVXxNYE+ut/3SQD0VxdHvexIvlIovyKFMagAQlzIJ0Tr+9l7FUNlCdeUoCqIxi4R4mOgOcrqgXRNXAwQoa7ns1j2pFeYnKHCODIiDRsszU0gKmgUX82ps55Feo/Fx5v1xtZNy855G+h8LnGy6lEoXx87TcCIsdXkslWPdGBJZPwNlvO+SCtttSM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Administraci%C3%B3n_servidor_de_correo&amp;diff=109</id>
		<title>Administración servidor de correo</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Administraci%C3%B3n_servidor_de_correo&amp;diff=109"/>
		<updated>2026-02-27T20:09:33Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objetivo ==&lt;br /&gt;
En esta página se muestra cómo administrar el correo genérico instalado en la página [Servidor de Correo].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo dominio ==&lt;br /&gt;
Consiste en configurar el servidor de correo para que sirva correos de un nuevo dominio (en este ejemplo culturetas.net).&lt;br /&gt;
&lt;br /&gt;
=== Configuración OpenDKIM ===&lt;br /&gt;
* Generamos una clave criptográficas:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /etc/dkimkeys&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;opendkim-genkey -t -s mail -d culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv mail.private /etc/dkimkeys/culturetas.net-dkim.key&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv mail.txt /etc/dkimkeys/culturetas.net-dkim.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chown opendkim:opendkim /etc/dkimkeys/culturetas.net-dkim.*&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Habilitar dominios en OpenDKIM:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/dkimkeys/key_table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
#KEYID DOMAIN:SELECTOR:KEY&lt;br /&gt;
[...]&lt;br /&gt;
mail._domainkey.culturetas.net culturetas.net:mail:/etc/dkimkeys/culturetas.net-dkim.key&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;vi /etc/dkimkeys/signing_table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
#DOMAIN KEYID&lt;br /&gt;
[...]&lt;br /&gt;
culturetas.net mail._domainkey.culturetas.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Anotar clavé pública de OpenDKIM:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cat /etc/dkimkeys/culturetas.net-dkim.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurar registros DNS ===&lt;br /&gt;
Es necesario acceder a la zona DNS para añadir nuevos dominios para el dominio (culturetas.net en este ejemplo).&lt;br /&gt;
&lt;br /&gt;
* Registro DKIM&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
	<entry>
		<id>https://wiki.castanedo.es/index.php?title=Administraci%C3%B3n_servidor_de_correo&amp;diff=108</id>
		<title>Administración servidor de correo</title>
		<link rel="alternate" type="text/html" href="https://wiki.castanedo.es/index.php?title=Administraci%C3%B3n_servidor_de_correo&amp;diff=108"/>
		<updated>2026-02-27T20:01:51Z</updated>

		<summary type="html">&lt;p&gt;Guzman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objetivo ==&lt;br /&gt;
En esta página se muestra cómo administrar el correo genérico instalado en la página [Servidor de Correo].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo dominio ==&lt;br /&gt;
Consiste en configurar el servidor de correo para que sirva correos de un nuevo dominio (en este ejemplo culturetas.net).&lt;br /&gt;
&lt;br /&gt;
=== Configuración OpenDKIM ===&lt;br /&gt;
* Generamos una clave criptográficas:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /etc/dkimkeys&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;opendkim-genkey -t -s mail -d culturetas.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv mail.private /etc/dkimkeys/culturetas.net-dkim.key&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;mv mail.txt /etc/dkimkeys/culturetas.net-dkim.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;chown opendkim:opendkim /etc/dkimkeys/culturetas.net-dkim.*&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Habilitar dominios en OpenDKIM:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;cd /etc/dkimkeys&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Notas]]&lt;/div&gt;</summary>
		<author><name>Guzman</name></author>
	</entry>
</feed>