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
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.