De un VPS comercial al salón de casa. Parte 3 – Configuración básica

De un VPS comercial al salón de casa. Parte 3 – Configuración básica

Intro

Voy a omitir la instalación de Raspberry PI OS en la microSD. Disponéis de cientos de videos y artículos al respecto y es por ello que me voy a centrar en los paquetes de software y comandos que considero más importantes.

Requisitos

  • Raspberry Pi con Raspberry Pi OS / Debian 12
  • Acceso a Internet
  • IP pública o servicio DDNS (por ejemplo, DuckDNS)
  • Puertos 80 y 443 abiertos en el router y redirigidos a la IP local de la Raspberry
  • Uno o varios dominios registrados (ej.: midominio.com)
  • Cuenta en DuckDNS y subdominio creado (ej.: tuhost.duckdns.org)

Configuración de DuckDNS en la Raspberry Pi

# 1. Crear cuenta y subdominio en DuckDNS
#    - Acceder a https://www.duckdns.org  
#    - Iniciar sesión con GitHub, Google u otra cuenta compatible  
#    - Crear un subdominio (por ejemplo: `tuhost.duckdns.org`)  
#    - Copiar el **Token** asignado a la cuenta

# 2. Crear script de actualización DDNS
# crear un directorio para DuckDNS:
mkdir -p ~/duckdns
cd ~/duckdns

# crear el archivo duck.sh (Recuerda: en nano copia el script y CTRL+O y enter para guardar y CTRL+X para salir)
sudo nano duck.sh
#!/bin/bash
echo url="https://www.duckdns.org/update?domains=tuhost&token=TU_TOKEN&ip=" \
| curl -k -o ~/duckdns/duck.log -K -
# sustituir tuhost por el subdominio creado y TU_TOKEN por el token de DuckDNS

# dar permiso de ejecución
sudo chmod +x duck.sh

# 3. Programar la actualización automática
crontab -e

# Añadir la siguiente línea para actualizar la IP cada 5 minutos:
*/5 * * * * ~/duckdns/duck.sh >/dev/null 2>&1

# (Recuerda: CTRL+O y enter para guardar y CTRL+X para salir)

# 4. Verificación del funcionamiento
~/duckdns/duck.sh
cat ~/duckdns/duck.log

# Si la respuesta contiene OK, la actualización se ha realizado correctamente.

Instalación de software base

# 1. Actualizar el sistema
sudo apt update && sudo apt upgrade -y

# 2. Instalar servicios base
sudo apt install nginx mariadb-server php php-fpm php-mysql unzip curl -y

# 3. Verificar instalación
php -v
nginx -t

# 4. Crear estructura de directorios del dominio
#    (usuario será el usuario con el que se suben archivos por SFTP/SSH)
sudo mkdir -p /var/www/midominio.com/html
echo "<h1>midominio.com funcionando</h1>" | sudo tee /var/www/midominio.com/html/index.html
sudo chown -R usuario:www-data /var/www/midominio.com
sudo chmod -R 775 /var/www/midominio.com

# 5. Crear configuración nginx (VirtualHost)
#    (Recuerda: en nano copia el script y CTRL+O y enter para guardar y CTRL+X para salir)
sudo nano /etc/nginx/sites-available/midominio.com
server {
    listen 80;
    server_name midominio.com www.midominio.com;

    root /var/www/midominio.com/html;
    index index.php index.html index.htm;

    access_log /var/log/nginx/midominio.com.access.log;
    error_log  /var/log/nginx/midominio.com.error.log;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}
# 6. Activar el sitio
sudo ln -s /etc/nginx/sites-available/midominio.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

# 7. Configuración DNS del dominio (dynadot, namecheap, arsys, nominalia...) con DDNS (DuckDNS por ejemplo)
Tipo CNAME
@     → tuhost.duckdns.org
www   → tuhost.duckdns.org

# 8. Habilitar HTTPS con Let’s Encrypt
sudo apt install certbot python3-certbot-nginx -y

# 8.1 Solicitar certificado
sudo certbot --nginx -d midominio.com -d www.midominio.com

# 9. Renovación automática de certificados
systemctl list-timers | grep certbot

Archivos y rutas relevantes

RutaDescripción
/var/www/midominio.com/html/Web raíz del dominio
/etc/nginx/sites-available/midominio.comVirtualHost nginx
/etc/nginx/sites-enabled/midominio.comEnlace activo
/var/log/nginx/midominio.com.access.logLog de accesos
/var/log/nginx/midominio.com.error.logLog de errores
/etc/letsencrypt/Certificados SSL
/etc/hosts (opcional)Resolución local de dominios

Comprobaciones finales

Una vez completada la instalación y configuración del servidor, se debe comprobar que el acceso al dominio funciona correctamente tanto desde el exterior como desde la red local. En primer lugar, se accede desde un navegador a https://midominio.com para verificar que nginx responde correctamente y que el certificado SSL es válido. A continuación, se comprueba la subida y modificación de archivos mediante SFTP o SSH con el usuario configurado, confirmando que los cambios se reflejan en el navegador. También es recomendable revisar los registros de acceso y errores de nginx para asegurar que no existen incidencias inesperadas.

Para el acceso desde la red local, cuando el router no soporta NAT loopback o el dominio no resuelve internamente a la IP privada de la Raspberry Pi, es necesario modificar el archivo de resolución de nombres del sistema operativo cliente. En Windows, esto se realiza editando el archivo hosts ubicado en C:\Windows\System32\drivers\etc\hosts, añadiendo una línea que asocie la IP local de la Raspberry Pi con el dominio, por ejemplo 192.168.2.160 midominio.com www.midominio.com. En Linux, el procedimiento es equivalente, editando el archivo /etc/hosts con permisos de root y añadiendo la misma correspondencia. De este modo, los equipos de la red local podrán acceder al servidor utilizando el nombre de dominio como si se tratase de un acceso externo. Desde dispositivos Android e IOS lo más sencillo es desconectarse del wifi y acceder desde el exterior (4G, 5G).

Configuración del correo

Gmail como servidor de correo

La configuración basada en el uso de una cuenta de Gmail como servidor de envío —mediante la denominada “aplicación Gmail” o SMTP de Google— presenta importantes limitaciones cuando se emplea en foros o aplicaciones con un volumen mínimo de correos. Gmail impone límites diarios estrictos de envío, controles de frecuencia y políticas cada vez más severas contra el uso automatizado, lo que provoca bloqueos temporales, retrasos o la no entrega de mensajes críticos como recuperaciones de contraseña. Además, el uso de credenciales personales o contraseñas de aplicación implica un mayor riesgo de seguridad y una dependencia directa de la cuenta del administrador. A todo ello se suma que Gmail no está diseñado como plataforma de correo transaccional, por lo que carece de herramientas adecuadas de seguimiento, gestión de reputación y control de entregabilidad, haciendo que esta opción resulte poco adecuada y difícilmente escalable para entornos de producción, incluso en instalaciones domésticas.

Aun así, si se desea utilizar este método, es necesario acceder a la cuenta de Google, entrar en el apartado de Seguridad, activar la verificación en dos pasos y generar una contraseña de aplicación, que será la utilizada por el servidor o la aplicación. Finalmente, en la propia aplicación se debe configurar el envío SMTP apuntando a smtp.gmail.com, habitualmente por el puerto 587 con TLS, indicando como usuario la dirección de Gmail y como contraseña la credencial de aplicación generada previamente.

Postfix + Brevo

Aquí resumo la configuración final utilizada para enviar correos desde un servidor propio (Raspberry Pi / Debian) usando Postfix como MTA local y Brevo como relay SMTP, evitando los límites de Gmail y problemas de entregabilidad.

Como primer paso, es necesario dar de alta el dominio propio en la plataforma de Brevo y autenticarlo correctamente. Este proceso consiste en añadir el dominio (por ejemplo, midominio.com) desde el panel de Brevo y copiar en el proveedor DNS los registros facilitados por la plataforma. Dichos registros incluyen un código de verificación en formato TXT, dos registros CNAME para la firma DKIM y, de forma recomendable, un registro DMARC que permita mejorar la entregabilidad y el control de los envíos. Una vez añadidos y propagados los registros, Brevo debe mostrar el dominio como autenticado, garantizando que los correos enviados desde él serán aceptados por los principales proveedores de correo.

Una vez autenticado el dominio, es imprescindible definir un remitente válido asociado al mismo. Para ello, se debe crear en Brevo una dirección de envío del tipo noreply@midominio.com y establecerla como remitente predeterminado. Es importante no utilizar direcciones de correo de dominios gratuitos como Gmail, Outlook o Yahoo, ya que estos proveedores bloquean o penalizan los mensajes enviados desde servicios externos que simulan ser remitentes gratuitos. Al utilizar un remitente propio y un dominio previamente autenticado mediante SPF, DKIM y DMARC, se garantiza una mayor fiabilidad en la entrega de los correos y se evita que los mensajes sean descartados o enviados a la carpeta de spam.

# 1. Instalación de Postfix
sudo apt update
sudo apt install postfix libsasl2-modules ca-certificates mailutils

# Durante la instalación cuando nos pregunte Tipo = Internet Site y Nombre del sistema de correo: midominio.com

# 2. Configuración de Postfix
#    (Recuerda: en nano copia el script y CTRL+O y enter para guardar y CTRL+X para salir)
sudo nano /etc/postfix/main.cf
# Identidad
myhostname = mail.midominio.com
myorigin = /etc/mailname
mydestination = localhost

# Relay SMTP (Brevo)
relayhost = [smtp-relay.brevo.com]:587

# TLS
smtp_use_tls = yes
smtp_tls_security_level = encrypt
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

# Autenticación SMTP
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain, login

# Control de ritmo (foros)
default_destination_rate_delay = 2s
smtp_destination_concurrency_limit = 5
smtp_destination_recipient_limit = 50
# 3. Credenciales SMTP (Brevo)
## En Brevo → SMTP y API → SMTP:
## Usuario SMTP: XXXXXXXX@smtp-brevo.com
## Generar Clave SMTP (no la API REST)

#    (Recuerda: en nano copia el script y CTRL+O y enter para guardar y CTRL+X para salir)
sudo nano /etc/postfix/sasl_passwd
[smtp-relay.brevo.com]:587 XXXXXX@smtp-brevo.com:CLAVE_SMTP_REAL
# 4. Aplicar cambios
sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd
sudo systemctl restart postfix

# 5. Forzar el remitente correcto
#    (Recuerda: en nano copia el script y CTRL+O y enter para guardar y CTRL+X para salir)
sudo nano /etc/postfix/sender_canonical
/.*/ noreply@midominio.com
# 6. Activar configuración
sudo postmap /etc/postfix/sender_canonical || true
sudo systemctl restart postfix

# 7. Prueba desde consola
echo "Correo de prueba" | mail -s "Test SMTP Brevo" tuemail@gmail.com
mailq

# Resultado esperado: Mail queue is empty

Esta configuración no está ligada a una aplicación concreta, sino al propio sistema de envío de correo del servidor, por lo que resulta igualmente válida para WordPress, otros foros o cualquier aplicación web que genere correos mediante los mecanismos estándar del sistema. Al utilizar Postfix como gestor de correo local, todas las aplicaciones que recurren a mail() o a sendmail delegan el envío real en un único punto, que a su vez reenvía los mensajes a través de Brevo. Esto permite centralizar el correo saliente, evitar configuraciones SMTP duplicadas en cada aplicación y aplicar de forma coherente las políticas de seguridad, control de ritmo y entregabilidad. Como consecuencia, el servidor puede albergar múltiples servicios web con un comportamiento estable y predecible en el envío de correos, convirtiendo esta solución en una infraestructura genérica, robusta y perfectamente válida para entornos de producción domésticos o semi-profesionales.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos
Responsable Garikoitz Martínez Moreno +info...
Finalidad Gestionar y moderar tus comentarios. +info...
Legitimación Consentimiento del interesado. +info...
Destinatarios Automattic Inc., EEUU para filtrar el spam. +info...
Derechos Acceder, rectificar y cancelar los datos, así como otros derechos. +info...
Información adicional Puedes consultar la información adicional y detallada sobre protección de datos en nuestra página de política de privacidad.