WordPress con docker-compose e traefik

wordpress-docker-compose

Eseguire wordpress su docker o migrare un Wordpress esistente su Docker

Se alcuni link non dovessero funzionare prova qui
https://github.com/MaoX17/wordpress-docker-compose/
o
qui

GreMaPro

Dockerizzare un wordpress esistente

Questa versione è valida sia con traefik che con nginx di jwilder come reverse proxy

Adesso iniziamo

Di seguito ci sono i passaggi per ralizzare il tutto da zero…

Altrimenti … quick install

Partiamo dal traefik

Traefik

Traefik

Primo comando:

docker network create proxy

Genero la stringa di auth:

htpasswd -n username

ottengo:

username:$apr1$VDSty0Wy$5nrZ7nthjusltZXM0eE2s/

Creo il file acme.json

touch conf/acme.json
chmod 600 conf/acme.json

Creo il file ./conf/traefik.toml


[entryPoints]
  [entryPoints.web]
    address = ":80"
    [entryPoints.web.http.redirections.entryPoint]
      to = "websecure"
      scheme = "https"

  [entryPoints.websecure]
    address = ":443"

[api]
  dashboard = true

[certificatesResolvers.lets-encrypt.acme]
  email = "maurizio.proietti(AT)EMAIL.com"
  storage = "acme.json"
  [certificatesResolvers.lets-encrypt.acme.tlsChallenge]

[providers.docker]
  watch = true
  network = "proxy"


[providers.file]
  filename = "traefik_dynamic.toml"
  

Creo il file ./conf/traefik_dynamic.toml

[http.middlewares.simpleAuth.basicAuth]
  users = [
    "username:$apr1$VDSty0Wy$5nrZ7nthjusltZXM0XXeE2s/"
  ]

[http.routers.api]
  rule = "Host(`traefik.proietti.net`)"
  entrypoints = ["websecure"]
  middlewares = ["simpleAuth"]
  service = "api@internal"
  [http.routers.api.tls]
    certResolver = "lets-encrypt"


Creo il ./docker-compose.yaml:

version: "3.3"

services:

  traefik:
    image: "traefik:v2.2"
    container_name: "traefik"

    ports:
      - "80:80"
      - "443:443"

    networks:
      - "proxy"
    volumes:
      - "./data/letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./conf/traefik.toml:/traefik.toml"
      - "./conf/traefik_dynamic.toml:/traefik_dynamic.toml"
      - "./conf/acme.json:/acme.json"
      


networks:
  proxy:
    external: true


Lancio il docker-compose up -d

docker-compose up -d

Et voilà!!!

Per vedere il risultato mi collego a

traefik.proietti.net

e faccio login

WordPress

Per usare il docker-compose occorre creare prima di tutto un file .env esempio env.example

Di seguito un esempio:

## WP ENV
WORDPRESS_DB_HOST=db
WORDPRESS_DB_USER=userdb
WORDPRESS_DB_PASSWORD=passworddb
WORDPRESS_DB_NAME=database
VIRTUAL_HOST=www.maurizio.proietti.name,blog.proietti.net
VIRTUAL_PORT=80
LETSENCRYPT_HOST=www.maurizio.proietti.name
LETSENCRYPT_EMAIL=maurizio.proietti(AT))EMAIL.com

## MYSQL ENV
MYSQL_DATABASE=database
MYSQL_USER=userdb
MYSQL_PASSWORD=passworddb
MYSQL_ROOT_PASSWORD=segretissima

##TRAEFIK
TRAEFIK_ROUTE_NAME=wp_mp


Nella dir dockerfile/wp trovo:

Ho personalizzato un po’ l’immagine di WordPress per avere un po’ di performance in più e per distinguere un sito con meggior traffico da uno con meno traffico.
Per cambiare impostazione vedi (dockerfile/wp/Dockerfile) e in particolare le righe:

## APACHE
#COPY ./mpm_prefork_low_trafic.conf /etc/apache2/mods-available/mpm_prefork.conf
COPY ./mpm_prefork_low_trafic.conf /etc/apache2/mods-available/mpm_prefork.conf

Anche il php.ini è modificato per gestire le dimensioni di upload
v. dockerfile/wp/php-wp.ini

Creo il mio docker-compose.yml

version: '3.1'

services:


  wordpress:
#    image: wordpress
    build:
      # call the Dockerfile in ./wordpress
      context: ./dockerfile/wp
    restart: always
    container_name: wp_www.maurizio.proietti.name
    environment:
      WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST}
      WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
      WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD}
      WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME}
      VIRTUAL_HOST: ${VIRTUAL_HOST}
      VIRTUAL_PORT: ${VIRTUAL_PORT}
      LETSENCRYPT_HOST: ${LETSENCRYPT_HOST}
      LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL}
    labels:
      - traefik.http.routers.${TRAEFIK_ROUTE_NAME}.rule=Host(`${LETSENCRYPT_HOST}`)
      - traefik.http.routers.${TRAEFIK_ROUTE_NAME}.tls=true
      - traefik.http.routers.${TRAEFIK_ROUTE_NAME}.tls.certresolver=lets-encrypt
      - traefik.port=${VIRTUAL_PORT}
    depends_on:
      - db
      - redis
    restart: unless-stopped
    networks:
      - proxy
      - backend
    volumes:
      - ./data/html:/var/www/html

  db:
    container_name: mysql_www.maurizio.proietti.name
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    labels:
      - traefik.enable=false
    volumes:
      - ./data/mysql:/var/lib/mysql
    networks:
      - backend


  redis:
    image: redis:6
    container_name: redis_www.maurizio.proietti.name
    restart: always
    sysctls:
      - net.core.somaxconn=1024
    labels:
      - traefik.enable=false
    volumes:
      - ./data/redis:/data
    networks:
      - backend
    # launch Redis in cache mode with :
    #     #  - max memory up to 50% of your RAM if needed (--maxmemory 512mb)
    #         #  - deleting oldest data when max memory is reached (--maxmemory-policy allkeys-lru)
#    entrypoint: redis-server --maxmemory 512mb -maxmemory-policy allkeys-lru
    entrypoint: redis-server /data/redis.conf




networks:
  proxy:
    external: true
  backend:
    external: false






Lancio:

docker-compose build
docker-compose up -d

Entro nel sito e completo l’installazione con dati casuali

Poi faccio un rsync della SOLA directory wp-content:

rsync -uazv /var/www/maurizioproietti/wp/wp-content data/html/

Poi eseguo il dump del vecchio DB:

mysqldump --opt maurizioproietti > dump.sql

E controllo che la prefix delle tabelle sia wp_

Se non lo fosse sostituisco la prefix che ha il dump con wp_

Poi importo il dump nel nuovo db sotto docker:

cat dump.sql | docker exec -i mysql_www.maurizio.proietti.name /usr/bin/mysql -u root --password=secret123 db

Imposto i permessi sul filesystem per bene oppure (se ho fretta)

chmod -R 777 data

Entro nella sezione wp-admin e inizio gli aggiornamenti suggeriti nel seguente ordine (che penso possa variare la per scaramanzia non vario 🙂 )

1.) Plugins

2.) Temi

3.) WordPress Core

Posso poi installare w3 total cache.

Attenzione!!!

Occorre settare correttamente l’indirizzo di redis:

redis:6379
.