haproxy.cfg
· 1.4 KiB · INI
Raw
global
log /dev/log local0 debug
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global
mode tcp
option tcplog
option dontlognull
timeout connect 5s
timeout client 50s
timeout server 50s
frontend http_in
bind :80
mode http
# Redirige todo el tráfico entrante de HTTP a HTTPS conservando la URL original
redirect scheme https code 301 if !{ ssl_fc }
frontend https_in
bind :443
mode tcp
default_backend traefik_backend
backend traefik_backend
mode tcp
log global
# Envía el tráfico a Traefik agregando el protocolo PROXY (v2)
server traefik 127.0.0.1:8443 send-proxy-v2
| 1 | global |
| 2 | log /dev/log local0 debug |
| 3 | log /dev/log local1 notice |
| 4 | chroot /var/lib/haproxy |
| 5 | stats socket /run/haproxy/admin.sock mode 660 level admin |
| 6 | stats timeout 30s |
| 7 | user haproxy |
| 8 | group haproxy |
| 9 | daemon |
| 10 | |
| 11 | # Default SSL material locations |
| 12 | ca-base /etc/ssl/certs |
| 13 | crt-base /etc/ssl/private |
| 14 | |
| 15 | # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate |
| 16 | ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 |
| 17 | ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 |
| 18 | ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets |
| 19 | |
| 20 | defaults |
| 21 | log global |
| 22 | mode tcp |
| 23 | option tcplog |
| 24 | option dontlognull |
| 25 | timeout connect 5s |
| 26 | timeout client 50s |
| 27 | timeout server 50s |
| 28 | |
| 29 | frontend http_in |
| 30 | bind :80 |
| 31 | mode http |
| 32 | # Redirige todo el tráfico entrante de HTTP a HTTPS conservando la URL original |
| 33 | redirect scheme https code 301 if !{ ssl_fc } |
| 34 | |
| 35 | frontend https_in |
| 36 | bind :443 |
| 37 | mode tcp |
| 38 | default_backend traefik_backend |
| 39 | |
| 40 | backend traefik_backend |
| 41 | mode tcp |
| 42 | log global |
| 43 | # Envía el tráfico a Traefik agregando el protocolo PROXY (v2) |
| 44 | server traefik 127.0.0.1:8443 send-proxy-v2 |
proxy.network
· 102 B · SYSTEMD
Raw
[Unit]
Description=Red interna de comunicación entre Traefik y Servicios
[Network]
NetworkName=proxy
| 1 | [Unit] |
| 2 | Description=Red interna de comunicación entre Traefik y Servicios |
| 3 | |
| 4 | [Network] |
| 5 | NetworkName=proxy |
traefik.container
· 828 B · INI
Raw
[Unit]
Description=Servicio Proxy Inverso Traefik con Podman
After=network-online.target
Requires=proxy-network.service
[Container]
Image=docker.io/library/traefik:v3.7.15
ContainerName=traefik
Environment=TZ=Europe/Madrid
Environment=CF_DNS_API_TOKEN=cfut_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx
Network=proxy.network
LogDriver=journald
# Mapeo de puertos
PublishPort=8443:8443/tcp
# PublishPort=8443:8443/udp
# Deshabilitar SELinux/AppArmor labels para acceder al socket de podman
# SecurityLabelDisable=true
# Volúmenes montados
Volume=/run/user/1002/podman/podman.sock:/run/user/1002/podman/podman.sock:ro
Volume=%h/traefik/data/traefik.yml:/etc/traefik/traefik.yml:ro
Volume=%h/traefik/data/config.yml:/etc/traefik/config.yml:ro
Volume=%h/traefik/data/acme.json:/etc/traefik/acme.json
[Install]
WantedBy=default.target
| 1 | [Unit] |
| 2 | Description=Servicio Proxy Inverso Traefik con Podman |
| 3 | After=network-online.target |
| 4 | Requires=proxy-network.service |
| 5 | |
| 6 | [Container] |
| 7 | Image=docker.io/library/traefik:v3.7.15 |
| 8 | ContainerName=traefik |
| 9 | Environment=TZ=Europe/Madrid |
| 10 | Environment=CF_DNS_API_TOKEN=cfut_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx |
| 11 | Network=proxy.network |
| 12 | |
| 13 | LogDriver=journald |
| 14 | |
| 15 | # Mapeo de puertos |
| 16 | PublishPort=8443:8443/tcp |
| 17 | # PublishPort=8443:8443/udp |
| 18 | |
| 19 | # Deshabilitar SELinux/AppArmor labels para acceder al socket de podman |
| 20 | # SecurityLabelDisable=true |
| 21 | |
| 22 | # Volúmenes montados |
| 23 | Volume=/run/user/1002/podman/podman.sock:/run/user/1002/podman/podman.sock:ro |
| 24 | Volume=%h/traefik/data/traefik.yml:/etc/traefik/traefik.yml:ro |
| 25 | Volume=%h/traefik/data/config.yml:/etc/traefik/config.yml:ro |
| 26 | Volume=%h/traefik/data/acme.json:/etc/traefik/acme.json |
| 27 | |
| 28 | [Install] |
| 29 | WantedBy=default.target |
traefik.yml
· 911 B · YAML
Raw
global:
checkNewVersion: false
sendAnonymousUsage: false
log:
level: INFO
accessLog:
filePath: "" # Vacio para volcar a stdout/journald
format: json
filters:
statusCodes:
- "400-499" # Captura errores de autenticación y accesos no autorizados
api:
dashboard: false
insecure: false
entryPoints:
websecure:
address: ":8443"
proxyProtocol:
trustedIPs:
- "127.0.0.1/32"
- "10.89.0.0/16"
providers:
docker:
endpoint: "unix:///run/user/1002/podman/podman.sock"
exposedByDefault: false
file:
filename: "/etc/traefik/config.yml"
watch: true
certificatesResolvers:
cloudflare:
acme:
email: "tu-email@servidor.es"
storage: "/etc/traefik/acme.json"
dnsChallenge:
provider: cloudflare
propagation:
delayBeforeChecks: 10s
resolvers:
- "1.1.1.1:53"
- "8.8.8.8:53"
| 1 | global: |
| 2 | checkNewVersion: false |
| 3 | sendAnonymousUsage: false |
| 4 | |
| 5 | log: |
| 6 | level: INFO |
| 7 | |
| 8 | accessLog: |
| 9 | filePath: "" # Vacio para volcar a stdout/journald |
| 10 | format: json |
| 11 | filters: |
| 12 | statusCodes: |
| 13 | - "400-499" # Captura errores de autenticación y accesos no autorizados |
| 14 | api: |
| 15 | dashboard: false |
| 16 | insecure: false |
| 17 | |
| 18 | entryPoints: |
| 19 | websecure: |
| 20 | address: ":8443" |
| 21 | proxyProtocol: |
| 22 | trustedIPs: |
| 23 | - "127.0.0.1/32" |
| 24 | - "10.89.0.0/16" |
| 25 | |
| 26 | providers: |
| 27 | docker: |
| 28 | endpoint: "unix:///run/user/1002/podman/podman.sock" |
| 29 | exposedByDefault: false |
| 30 | file: |
| 31 | filename: "/etc/traefik/config.yml" |
| 32 | watch: true |
| 33 | |
| 34 | certificatesResolvers: |
| 35 | cloudflare: |
| 36 | acme: |
| 37 | email: "tu-email@servidor.es" |
| 38 | storage: "/etc/traefik/acme.json" |
| 39 | dnsChallenge: |
| 40 | provider: cloudflare |
| 41 | propagation: |
| 42 | delayBeforeChecks: 10s |
| 43 | resolvers: |
| 44 | - "1.1.1.1:53" |
| 45 | - "8.8.8.8:53" |
umami-db-data.volume
· 104 B · INI
Raw
[Unit]
Description=Volumen de datos persistente para Umami PostgreSQL
[Volume]
VolumeName=umami-db-data
| 1 | [Unit] |
| 2 | Description=Volumen de datos persistente para Umami PostgreSQL |
| 3 | |
| 4 | [Volume] |
| 5 | VolumeName=umami-db-data |
umami-db.container
· 454 B · INI
Raw
[Unit]
Description=Base de Datos PostgreSQL para Umami
After=proxy-network.service
[Container]
Image=docker.io/library/postgres:17-alpine
ContainerName=umami-db
Network=umami.network
# Variables de entorno de PostgreSQL
Environment=POSTGRES_DB=umami
Environment=POSTGRES_USER=umami
Environment=POSTGRES_PASSWORD=password
# Montaje del volumen persistente de datos
Volume=umami-db-data.volume:/var/lib/postgresql/data
[Install]
WantedBy=default.target
| 1 | [Unit] |
| 2 | Description=Base de Datos PostgreSQL para Umami |
| 3 | After=proxy-network.service |
| 4 | |
| 5 | [Container] |
| 6 | Image=docker.io/library/postgres:17-alpine |
| 7 | ContainerName=umami-db |
| 8 | Network=umami.network |
| 9 | |
| 10 | # Variables de entorno de PostgreSQL |
| 11 | Environment=POSTGRES_DB=umami |
| 12 | Environment=POSTGRES_USER=umami |
| 13 | Environment=POSTGRES_PASSWORD=password |
| 14 | |
| 15 | # Montaje del volumen persistente de datos |
| 16 | Volume=umami-db-data.volume:/var/lib/postgresql/data |
| 17 | |
| 18 | [Install] |
| 19 | WantedBy=default.target |
umami.container
· 846 B · INI
Raw
[Unit]
Description=Servicio de Analítica Umami
After=umami-db.service umami-network.service proxy-network.service
[Container]
Image=ghcr.io/umami-software/umami:postgresql-latest
ContainerName=umami
Network=umami.network
Network=proxy
Environment=DATABASE_URL=postgresql://umami:password@umami-db:5432/umami
Environment=APP_SECRET=tu_hash_aleatorio_largo
# Le indica a Umami qué cabecera HTTP contiene la IP real del cliente
Environment=CLIENT_IP_HEADER=cf-connecting-ip
# Etiquetas de Traefik
Label=traefik.enable=true
Label=traefik.http.routers.umami.rule=Host(`umami.servidor.es`)
Label=traefik.http.routers.umami.entrypoints=websecure
Label=traefik.http.routers.umami.tls=true
Label=traefik.http.routers.umami.tls.certresolver=cloudflare
Label=traefik.http.services.umami.loadbalancer.server.port=3000
[Install]
WantedBy=default.target
| 1 | [Unit] |
| 2 | Description=Servicio de Analítica Umami |
| 3 | After=umami-db.service umami-network.service proxy-network.service |
| 4 | |
| 5 | [Container] |
| 6 | Image=ghcr.io/umami-software/umami:postgresql-latest |
| 7 | ContainerName=umami |
| 8 | Network=umami.network |
| 9 | Network=proxy |
| 10 | |
| 11 | Environment=DATABASE_URL=postgresql://umami:password@umami-db:5432/umami |
| 12 | Environment=APP_SECRET=tu_hash_aleatorio_largo |
| 13 | |
| 14 | # Le indica a Umami qué cabecera HTTP contiene la IP real del cliente |
| 15 | Environment=CLIENT_IP_HEADER=cf-connecting-ip |
| 16 | |
| 17 | # Etiquetas de Traefik |
| 18 | Label=traefik.enable=true |
| 19 | Label=traefik.http.routers.umami.rule=Host(`umami.servidor.es`) |
| 20 | Label=traefik.http.routers.umami.entrypoints=websecure |
| 21 | Label=traefik.http.routers.umami.tls=true |
| 22 | Label=traefik.http.routers.umami.tls.certresolver=cloudflare |
| 23 | Label=traefik.http.services.umami.loadbalancer.server.port=3000 |
| 24 | |
| 25 | [Install] |
| 26 | WantedBy=default.target |
| 1 | [Network] |
| 2 | NetworkName=umami |
whoami.container
· 521 B · INI
Raw
[Unit]
Description=Contenedor Whoami de prueba para Traefik
After=traefik.service
Requires=traefik.service
[Container]
Image=docker.io/traefik/whoami
ContainerName=whoami
Network=proxy.network
# Etiquetas de Traefik para autodescubrimiento
Label=traefik.enable=true
Label=traefik.http.routers.whoami.rule=Host(`whoami.servidor.es`)
Label=traefik.http.routers.whoami.entrypoints=websecure
Label=traefik.http.routers.whoami.tls.certresolver=cloudflare
Label=traefik.docker.network=proxy
[Install]
WantedBy=default.target
| 1 | [Unit] |
| 2 | Description=Contenedor Whoami de prueba para Traefik |
| 3 | After=traefik.service |
| 4 | Requires=traefik.service |
| 5 | |
| 6 | [Container] |
| 7 | Image=docker.io/traefik/whoami |
| 8 | ContainerName=whoami |
| 9 | Network=proxy.network |
| 10 | |
| 11 | # Etiquetas de Traefik para autodescubrimiento |
| 12 | Label=traefik.enable=true |
| 13 | Label=traefik.http.routers.whoami.rule=Host(`whoami.servidor.es`) |
| 14 | Label=traefik.http.routers.whoami.entrypoints=websecure |
| 15 | Label=traefik.http.routers.whoami.tls.certresolver=cloudflare |
| 16 | Label=traefik.docker.network=proxy |
| 17 | |
| 18 | [Install] |
| 19 | WantedBy=default.target |