Guia completa: Instal·lació de Traefik + WordPress + PHP + MariaDB des de zero

Requisits previs


Part 1: Preparació inicial del servidor

1.1. Actualitzar el sistema

# Connectar al VPS
ssh root@IP_DEL_VPS

# Actualitzar
apt update && apt upgrade -y

# Instal·lar eines bàsiques
apt install -y curl wget git vim nano htop net-tools dnsutils

1.2. Crear usuari no-root (opcional però recomanat)

# Crear usuari
adduser jordi

# Afegir a sudoers
usermod -aG sudo jordi

# Canviar a aquest usuari
su - jordi

1.3. Instal·lar Docker

# Instal·lar dependències
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release

# Afegir clau GPG de Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Afegir repositori Docker
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Instal·lar Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Afegir usuari al grup docker (opcional)
sudo usermod -aG docker $USER

# Reiniciar sessió per aplicar canvis
exit
# Tornar a connectar

1.4. Verificar instal·lació

docker --version
docker compose version

Part 2: Configurar DNS

A Nominalia (o el teu proveïdor), afegeix aquests registres DNS:

A    popotamo.cat           → IP_DEL_VPS
A    www.popotamo.cat       → IP_DEL_VPS
A    wordpress.popotamo.cat → IP_DEL_VPS
A    jordi.popotamo.cat     → IP_DEL_VPS
A    db.popotamo.cat        → IP_DEL_VPS
A    traefik.popotamo.cat   → IP_DEL_VPS

Espera 15-30 minuts per propagació DNS.

Verificar:

dig +short popotamo.cat
dig +short wordpress.popotamo.cat

Part 3: Instal·lar Traefik (Reverse Proxy amb SSL automàtic)

3.1. Crear estructura de directoris

mkdir -p ~/traefik/config
cd ~/traefik

3.2. Generar contrasenya per dashboard

# Instal·lar apache2-utils
sudo apt install -y apache2-utils

# Generar hash de contrasenya
htpasswd -nb admin VostraContrasenya

# Exemple sortida:
# admin:$apr1$ruca1234$abcdefghijklmnop

Guarda aquesta sortida! (recorda duplicar els $ al docker-compose.yml)

3.3. Crear xarxa Docker

docker network create proxy

3.4. Configuració de Traefik

Fitxer ~/traefik/traefik.yml:

cat > ~/traefik/traefik.yml << 'EOFTRAEFIK'
api:
  dashboard: true
  debug: true
  insecure: true

entryPoints:
  http:
    address: ":80"
  https:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
    network: proxy
  file:
    directory: /config
    watch: true

certificatesResolvers:
  letsencrypt:
    acme:
      email: el_teu_email@gmail.com
      storage: acme.json
      httpChallenge:
        entryPoint: http

log:
  level: DEBUG
EOFTRAEFIK

3.5. Middleware CORS (opcional)

mkdir -p ~/traefik/config
cat > ~/traefik/config/middlewares-cors.yml << 'EOFCORS'
http:
  middlewares:
    cors-headers:
      headers:
        accessControlAllowMethods:
          - GET
          - POST
          - PUT
          - DELETE
          - OPTIONS
          - PATCH
        accessControlAllowHeaders:
          - "*"
        accessControlAllowOriginList:
          - "https://jordi.popotamo.cat"
          - "https://wordpress.popotamo.cat"
          - "https://www.popotamo.cat"
        accessControlMaxAge: 100
        addVaryHeader: true
        accessControlAllowCredentials: true

    security-headers:
      headers:
        frameDeny: true
        contentTypeNosniff: true
        browserXssFilter: true
        forceSTSHeader: true
        stsIncludeSubdomains: true
        stsPreload: true
        stsSeconds: 31536000
EOFCORS

3.6. Docker Compose de Traefik

cat > ~/traefik/docker-compose.yml << 'EOFCOMPOSE'
services:
  traefik:
    image: traefik:v2.11
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - proxy
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    environment:
      - TZ=Europe/Madrid
      - DOCKER_API_VERSION=1.44
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/traefik.yml:ro
      - ./acme.json:/acme.json
      - ./config:/config:ro
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik-dashboard.rule=Host(\`traefik.popotamo.cat\`)"
      - "traefik.http.routers.traefik-dashboard.entrypoints=https"
      - "traefik.http.routers.traefik-dashboard.tls=true"
      - "traefik.http.routers.traefik-dashboard.tls.certresolver=letsencrypt"
      - "traefik.http.routers.traefik-dashboard.service=api@internal"
      - "traefik.http.routers.traefik-dashboard.middlewares=traefik-auth"
      - "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$ruca1234$$abcdefghijklmnop"

networks:
  proxy:
    external: true
EOFCOMPOSE

IMPORTANT: Substitueix $$apr1$$ruca1234$$abcdefghijklmnop pel hash generat al pas 3.2.

3.7. Iniciar Traefik

cd ~/traefik
touch acme.json
chmod 600 acme.json
docker compose up -d
docker compose logs -f

Accedeix a: https://traefik.popotamo.cat (usuari: admin, password: la que has posat)


Part 4: Instal·lar WordPress

4.1. Crear estructura

mkdir -p ~/wordpress-popotamo/{backups,scripts}
cd ~/wordpress-popotamo

4.2. Fitxer uploads.ini

```bash cat > ~/wordpress-popotamo/uploads.ini << 'EOF' file_uploads = On memory_limit = 512M upload_max_filesize = 256M post_max_size = 256M max_execution_time = 300 max_input_time = 300 max_input_vars = 3000