Este guia usa Docker Compose com Traefik na frente para o HTTPS automático. Pré-requisitos: [Docker instalado](/hc/vps/articles/docker-e-portainer-na-vps), domínio [apontado](/hc/vps/articles/como-apontar-seu-dominio-para-a-vps) e portas 80/443 liberadas.

## 1. Arquivos

```
mkdir -p /opt/wordpress && cd /opt/wordpress
nano docker-compose.yml
```

```yaml
services:
  traefik:
    image: traefik:v3
    command:
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --entrypoints.web.http.redirections.entrypoint.to=websecure
      - --certificatesresolvers.le.acme.tlschallenge=true
      - --certificatesresolvers.le.acme.email=seu@email.com
      - --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
    ports: ["80:80", "443:443"]
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - traefik_le:/letsencrypt
    restart: unless-stopped

  db:
    image: mariadb:11
    environment:
      MARIADB_DATABASE: wordpress
      MARIADB_USER: wp
      MARIADB_PASSWORD: TROQUE-ESTA-SENHA
      MARIADB_ROOT_PASSWORD: TROQUE-ESTA-TAMBEM
    volumes: ["db_data:/var/lib/mysql"]
    restart: unless-stopped

  wordpress:
    image: wordpress:php8.3-apache
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wp
      WORDPRESS_DB_PASSWORD: TROQUE-ESTA-SENHA
    volumes: ["wp_data:/var/www/html"]
    labels:
      - traefik.enable=true
      - traefik.http.routers.wp.rule=Host(`seudominio.com`) || Host(`www.seudominio.com`)
      - traefik.http.routers.wp.entrypoints=websecure
      - traefik.http.routers.wp.tls.certresolver=le
      - traefik.http.services.wp.loadbalancer.server.port=80
    depends_on: [db]
    restart: unless-stopped

volumes:
  db_data:
  wp_data:
  traefik_le:
```

## 2. Subir

```
docker compose up -d
docker compose logs -f traefik    # aguarde o certificado
```

Abra `https://seudominio.com` e conclua o assistente do WordPress.

## 3. Ajustes que valem a pena

- **Upload maior:** crie `uploads.ini` com `upload_max_filesize = 64M` e `post_max_size = 64M` e monte em `/usr/local/etc/php/conf.d/uploads.ini` no serviço `wordpress`.
- **Cache:** plugin de cache (LiteSpeed Cache não; use WP Super Cache/W3TC) ou Cloudflare na frente.
- **Mídia no Object Storage:** plugin de offload apontando para o bucket ([guia](/hc/vps/articles/object-storage-como-usar-em-codigo)).
- **E-mail:** o WordPress envia por PHP `mail()`, que não funciona sem SMTP. Use um plugin SMTP com um provedor (a porta 25 é bloqueada).

## 4. Backup

Os dados estão nos volumes `db_data` e `wp_data`:

```
docker compose exec db mariadb-dump -u root -pTROQUE-ESTA-TAMBEM wordpress > /root/wp-$(date +%F).sql
```
Envie o dump e a pasta `/var/lib/docker/volumes/wordpress_wp_data` para o bucket com o [backup automático](/hc/vps/articles/backup-automatico-da-vps-para-o-object-storage).

## 5. Atualizar

Plugins e temas: pelo painel do WordPress. Imagem do PHP/WordPress: `docker compose pull && docker compose up -d` (faça um [snapshot](/hc/vps/articles/como-criar-e-restaurar-snapshot-da-vps) antes).
