Self-hosting multiples blogs

Idea

Recientemente he movido el blog desde mi proveedor de hosting en USA a otro en Europa y me estoy migrando todos los sites que tenía en aquel al nuevo.

Una de las ventajas del proveedor que tenía era la facilidad para crear sites con un par de clicks. Dado mi dominio "jagedn.dev" por ejemplo, era sumamente fácil crear otro site "blog.jagedn.dev", "maps.jagedn.dev" o "whatever.jagedn.dev". Cada site tenía su directorio e incluía PHP

En este blog voy a explicar cómo he hecho la migración de estos sites a mi instancia de tal forma, que aunque no sea con un simple click, me permita crear sites de una forma fácil

Además algunos sites podrán usar carpetas "public" y "private"

Requisitos

Un dominio (por ejemplo "jagedn.dev") y que los DNS apunten a la máquina donde vamos a instalar el multisite

Básicamente, voy a usar Docker en la máquina donde voy a alojar mis sites.

Obviamente, el otro requisito es poder acceder por ssh a la instancia.

Preparación

En el directorio de trabajo elegido vamos a crear directorios por cada site que queramos hostear:

  • ./blog

  • ./maps

  • ./calendar

Blog

En la carpeta blog copio los ficheros de mi static-site. Como es todo html+css simplemente copio los ficheros manteniendo la estructura del mismo

Maps

Esta es una aplicación que usa PHP y que usa una carpeta pública donde hay html y un api en PHP y una carpeta private donde guarda ficheros sensibles

Calendar

Podría ser por ejemplo un Calendy o similar. La incluyo solo a modo de ejemplo

Caddy

En el directorio de trabajo crearemos un fichero Caddyfile similar a :

Caddyfile
maps.jagedn.dev,
blog.jagedn.dev,
jagedn.dev {
    reverse_proxy apache:80
}

Docker

En el directorio de trabajo crearemos un dichero Dockerfile

Dockerfile
FROM php:8.4-apache

RUN apt-get update && apt-get install -y --no-install-recommends \
    sudo \
    && rm -rf /var/lib/apt/lists/*

RUN chown -R www-data:www-data /var/www/html \
    && chmod -R 755 /var/www/html

RUN a2enmod rewrite

USER www-data

y el fichero docker-compose.yml

docker-compose.yml
services:

  caddy:
    image: caddy:latest
    container_name: caddy
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config
      - acme_challenges:/var/www/challenges

  apache:
    container_name: apache
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./blog:/var/www/html/blog
      - ./maps:/var/www/html/maps
      - ./apache2/sites-available:/etc/apache2/sites-available
      - ./apache2/sites-enabled:/etc/apache2/sites-enabled

Por último crearemos los directorios ./apache2/sites-available y ./apache2/sites-enabled

En sites-available mantendremos la configuracion de todos los sites y en sites-enabled los que queremos en cada momento activos. Lo normal es usar enabled como enlaces simbólicos pero yo simplemente hago un copy porque nunca sé cómo usar ln -s

apache2/sites-enabled/blog.conf
<VirtualHost *:80>
ServerName blog.jagedn.dev

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/blog

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
apache2/sites-enabled/maps.conf
<VirtualHost *:80>
ServerName maps.jagedn.dev

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/maps/public

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Aunque son casi similares hay diferencias:

  • ServerName: sirve para que Apache "machee" la petición del usuario con la config a usar

  • DocumentRoot: sirve para indicar qué carpeta debe servir ese server name. Por ejemplo maps usa "maps/public" mientras que blog usa directamente la carpeta "blog" montada

Nuevo Site

Básicamente si tengo que añadir un nuevo site los pasos a seguir serían:

  • crear el DNS en mi proveedor y apuntarlo a la IP de la máquina. Por ejemplo "chat.jagedn.dev"

  • crear una carpeta al mismo nivel que blog o map, donde alojar la aplicación

  • crear una site-enabled similar a los existentes indicando el ServerName y la ruta

  • montar la nueva carpeta en el docker-compose

y simplemente reconfigurar todo con docker-compose up -d

Este texto ha sido escrito por un humano

This post has been written by a human

2019 - 2026 | Mixed with Bootstrap | Baked with JBake v2.6.7 | Terminos Terminos y Privacidad