600 - atareao.es ya es selfhosted

600 - atareao.es ya es selfhosted

atareao.es ya es #selhosted de la mano de #traefik #wordpress #nginx #redis #mariadb integrado con copias de seguridad y herramientas como #crowdsec

1:25
-3:15

Parece que lo haya hecho a propósito, y probablemente haya sido así, o simplemente haya sido una casualidad. Lo cierto es que los tres años de contrato terminaban en junio, casi a finales de junio, y no he querido dejarlo para el último momento. Estaba bastante asustado con este tema y he preferido ser cauto y dejar las sorpresas de última hora para otro. No es que tuviera miedo, sino que mas bien tenía respeto por esto. Pero bueno, la cuestión es que hace unos días me puse y resuelto sin mucho dolor. Por supuesto que he aprovechado para dotar a atareao.es de todas los detalles que he ido testeando en estos años del mundo del selfhosting o autoalojamiento. Así que ahora atareao.es ya está selfhosted.

atareao.es ya es selfhosted

Consejos vendo…

Que feo es eso de consejos vendo y para mi no tengo. Tanto tiempo hablando de las bondades del selfhosting y, la joya de la corona, atareao.es, todavía no estaba bajo esta situación.

La cuestión, es que como mencioné en la WordCamp Valencia 2023, había migrado todas las páginas web que llevo en danza excepto precisamente atareao.es. Pero tienes que entenderlo. Detrás de esta web hay muchos años de trabajo y esfuerzo, para que por algún error se vaya al traste. Y teniendo en cuenta la máxima de si algo funciona no lo toques, ¿porque tocarlo?.

Sin embargo, esto es algo que ya tenía en mente hacer desde hace tres años, desde que renové el último contrato. No tiene sentido. Hoy en día me siento suficientemente a gusto y confortable

Como está montado?

A continuación encontrarás un gráfico realizado con Excalidraw de la que tengo montada para alojar atareao.es.

Y Además te dejo aquí el docker-compose.yml, correspondiente a la parte de WordPress, pero recordarte que en GitHub, puedes encontrar el resto de configuración, tanto de la parte de Traefik, como del resto de componentes.

Nginx

De entre los distintos elementos que he ido añadiendo con el paso del tiempo, sin lugar a dudas el mas novedoso ha sido Nginx. Esto es así, por intentar mejorar el funcionamiento y respuesta de atareao.es.

Con wordpress-fpm y nginx, cada componente se encarga de tareas específicas, wordpress-fpm maneja la ejecución de PHP, nginx sirve contenido estático y gestiona la caché.

Pero además nginx sirve el contenido estático de manera mas eficiente que el típico contenedor de wordpress.

Por otro lado, al aislar los procesos, consigo mejorar la seguridad. Estoy separando wordpress de nginx, con lo que consigo reducir la superfice de ataque y cada uno se dedica a realizar funciones específicas. Además, los tengo separados en redes distintas.

Por otro lado, nginx permite aplicar determinadas configuraciones, que puede llegar hasta incluso la restricción basada en IP. Aunque esto actualmente lo estoy haciendo a través de Traefik.

Y otra característica ventaja que tengo con esta configuración es la escalabilidad, en el sentido de que, en caso de que alguna de las piezas, de este rompezcabezas, se convierta en un cuello de botella, siempre puede escalar la pieza correspondiente.

nginx:
    image: nginx:alpine
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - wordpress:/var/www/html
    depends_on:
      - wordpress
    restart: unless-stopped
    networks:
      - proxy
      - internal
    labels:
      traefik.enable: true
      traefik.http.services.atareao-nginx.loadbalancer.server.port: 80
      traefik.http.routers.atareao-nginx.rule: Host(`${FQDN}`)
      traefik.http.routers.atareao-nginx.entrypoints: websecure

En el interior de nginx puedes encontrar un archivo con llamado wp.conf que tiene el siguiente contenido,

server {
    listen 80;
    gzip on;
    gzip_comp_level    5;
    gzip_min_length    256;
    gzip_proxied       any;
    gzip_vary          on;
    gzip_types
      application/atom+xml
      application/javascript
      application/json
      application/ld+json
      application/manifest+json
      application/rss+xml
      application/vnd.geo+json
      application/vnd.ms-fontobject
      application/x-font-ttf
      application/x-web-app-manifest+json
      application/xhtml+xml
      application/xml
      font/opentype
      image/bmp
      image/svg+xml
      image/x-icon
      text/cache-manifest
      text/css
      text/plain
      text/vcard
      text/vnd.rim.location.xloc
      text/vtt
      text/x-component
      text/x-cross-domain-policy;
  # text/html is always compressed by gzip module

    root /var/www/html;
    index index.php;

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

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass wordpress:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
        expires 7d;
        access_log off;
        add_header Cache-Control "public";
    }

    location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff|woff2)$ {
        add_header Access-Control-Allow-Origin "*";
        expires 7d;
        access_log off;
    }

    location ~ /\. {
        access_log off;
        log_not_found off;
        deny all;
    }

Crowdsec

CrowdSec es una herramienta de seguridad que está basada en la colaboración, y diseñada para proteger servidores, servicios, contenedores o máquinas virtuales de ataques. Funciona de manera algo similar a Fail2Ban, pero con una arquitectura mas moderna y una comunidad, que comparte inteligencia sobre amenazas. Probablemente, en este punto es donde esté claramente la ventaja de esta herramienta frente a otras coluciones. CrowdSec analiza los logs, revisa y estudia comportamientos sospechosos y toma medidas para bloquear las direcciones IP maliciosas. Además, estas IPs bloqueadas se comparten con la comunidad para mejorar la protección global. Algunas de las características de Crowdsec, son las siguientes,

  • Detección en tiempo real: Analiza los registros y detecta actividades maliciosas como intentos de fuerza bruta, escaneo de puertos, etc.
  • Respuesta automatizada: Puede configurar acciones automáticas como bloquear IPs en firewall, enviar notificaciones, etc.
  • Colaboración comunitaria: Compartir y recibir información sobre IPs maliciosas con la comunidad de CrowdSec.
  • Extensible: Soporta múltiples fuentes de registros y se puede integrar con diversas aplicaciones y servicios.

Para la integración con Traefik, que es el que se encarga de habilitar o no el tráfico, te recomiendo que le des un vistazo al repositorio de GitHub, donde puedes eoncontrar mas información.

services:
  crowdsec:
    image: crowdsecurity/crowdsec:latest
    container_name: crowdsec
    init: true
    environment:
      GID: "${GID-1000}"
      COLLECTIONS: "crowdsecurity/linux crowdsecurity/traefik crowdsecurity/sshd crowdsecurity
/http-cve crowdsecurity/linux crowdsecurity/wordpress crowdsecurity/http-dos crowdsecurity/mar
iadb"
    volumes:
      - ./config/acquis.yml:/etc/crowdsec/acquis.yaml
      - ./config/mywhitelists.yml:/etc/crowdsec/parsers/s02-enrich/mywhitelists.yaml
      - ./config/acquis/:/etc/crowdsec/acquis.d/
      - crowdsec-db:/var/lib/crowdsec/data/
      - crowdsec-config:/etc/crowdsec/
      - traefik_logs:/var/log/traefik/:ro
      - /var/log/auth.log:/logs/auth.log:ro
      - /var/log/syslog.log:/logs/syslog.log:ro
    networks:
      - proxy
    restart: unless-stopped

  bouncer-traefik:
    image: docker.io/fbonalair/traefik-crowdsec-bouncer:latest
    container_name: bouncer-traefik
    init: true
    environment:
      CROWDSEC_BOUNCER_API_KEY: 
      CROWDSEC_AGENT_HOST: crowdsec:8080
    networks:
      - proxy
    depends_on:
      - crowdsec
    restart: unless-stopped

volumes:
  crowdsec-db:
  crowdsec-config:
  traefik_logs: 
    external: true

networks:
  proxy:
    external: true

Umami

Por otro lado, no quería dejar sin mencionar a Umami, que es una herramienta de analíticas web de código abierto, y que es realmente ligera y sencilla de utilizar. Algunas de las características de esta herramientas son las siguientes,

  • Privacidad y Cumplimiento: No rastrea información personal de los usuarios y cumple con GDPR, CCPA y otras regulaciones de privacidad.
  • Código Abierto: Al ser de código abierto, puedes revisar, modificar y mejorar el código según tus necesidades. Está disponible en GitHub.
  • Ligero y Eficiente: Consume pocos recursos y es fácil de instalar y mantener.
  • Interfaz Simple y Limpia: Proporciona una interfaz de usuario intuitiva y fácil de navegar.
  • Sin Dependencias de Terceros: No utiliza cookies ni comparte datos con terceros.
  • Soporte para Varios Sitios: Permite monitorear múltiples sitios web desde una sola instalación.

De esta herramienta todavía tengo pendiente explotar su API y si tiene opciones de integrarse con webhooks. Cuando esté mas consolidada la página web, me dedicaré a investigar estos temas a ver que opciones y posibilidades tiene.

Deja una respuesta

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