Dokploy

Wordpress

Wordpress is a free and open source content management system (CMS) for publishing and managing websites.

Wordpress logo

Configuration

services:
  wordpress:
    image: wordpress:latest
    # Resolve the site's own domain to the Traefik container instead of the
    # server's public IP. Loopback requests (REST API, WP-Cron, Site Health)
    # otherwise depend on hairpin NAT, which times out on many hosts
    # (cURL error 28). See https://github.com/Dokploy/templates/issues/128
    command:
      - bash
      - -c
      - |
        if [ -n "$$WP_DOMAIN" ]; then
          (
            for i in $$(seq 1 60); do
              TRAEFIK_IP="$$(getent hosts dokploy-traefik | awk '{print $$1; exit}')"
              if [ -n "$$TRAEFIK_IP" ]; then
                grep -q "[[:space:]]$$WP_DOMAIN\$$" /etc/hosts || echo "$$TRAEFIK_IP $$WP_DOMAIN" >> /etc/hosts
                break
              fi
              sleep 2
            done
          ) &
        fi
        exec docker-entrypoint.sh apache2-foreground
    volumes:
      - wp_app:/var/www/html
      - ../files/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
    environment:
      WORDPRESS_DB_HOST: wp_db
      WORDPRESS_DB_NAME: $DB_NAME
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: $DB_PASSWORD
      WORDPRESS_DEBUG: ${WORDPRESS_DEBUG:-0}
      WP_DOMAIN: ${WP_DOMAIN}
      WORDPRESS_CONFIG_EXTRA: |
        define('WP_MEMORY_LIMIT', '256M');
        define('DISALLOW_FILE_EDIT', true);
    depends_on:
      wp_db:
        condition: service_healthy
    restart: unless-stopped

  wp_db:
    image: mysql:8.4
    restart: unless-stopped
    volumes:
      - wp_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: $DB_PASSWORD
      MYSQL_DATABASE: $DB_NAME
    healthcheck:
      test: ["CMD-SHELL", "exit | mysql -h localhost -P 3306 -u root -p$$MYSQL_ROOT_PASSWORD"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

volumes:
  wp_app:
  wp_data:
[variables]
main_domain = "${domain}"
db_name = "wordpress"
db_user = "wordpress"
db_password = "${password:32}"

[config]
env = [
  "WORDPRESS_DEBUG=0",
  "DB_NAME=${db_name}",
  "DB_USER=${db_user}",
  "DB_PASSWORD=${db_password}",
  "WP_DOMAIN=${main_domain}"
]

[[config.domains]]
serviceName = "wordpress"
port = 80
host = "${main_domain}"

[[config.mounts]]
filePath = "uploads.ini"
content = """upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 300
max_input_vars = 3000
"""

Base64

To import this template in Dokploy: create a Compose service → AdvancedBase64 import and paste the content below:

ewogICJjb21wb3NlIjogInNlcnZpY2VzOlxuICB3b3JkcHJlc3M6XG4gICAgaW1hZ2U6IHdvcmRwcmVzczpsYXRlc3RcbiAgICAjIFJlc29sdmUgdGhlIHNpdGUncyBvd24gZG9tYWluIHRvIHRoZSBUcmFlZmlrIGNvbnRhaW5lciBpbnN0ZWFkIG9mIHRoZVxuICAgICMgc2VydmVyJ3MgcHVibGljIElQLiBMb29wYmFjayByZXF1ZXN0cyAoUkVTVCBBUEksIFdQLUNyb24sIFNpdGUgSGVhbHRoKVxuICAgICMgb3RoZXJ3aXNlIGRlcGVuZCBvbiBoYWlycGluIE5BVCwgd2hpY2ggdGltZXMgb3V0IG9uIG1hbnkgaG9zdHNcbiAgICAjIChjVVJMIGVycm9yIDI4KS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2twbG95L3RlbXBsYXRlcy9pc3N1ZXMvMTI4XG4gICAgY29tbWFuZDpcbiAgICAgIC0gYmFzaFxuICAgICAgLSAtY1xuICAgICAgLSB8XG4gICAgICAgIGlmIFsgLW4gXCIkJFdQX0RPTUFJTlwiIF07IHRoZW5cbiAgICAgICAgICAoXG4gICAgICAgICAgICBmb3IgaSBpbiAkJChzZXEgMSA2MCk7IGRvXG4gICAgICAgICAgICAgIFRSQUVGSUtfSVA9XCIkJChnZXRlbnQgaG9zdHMgZG9rcGxveS10cmFlZmlrIHwgYXdrICd7cHJpbnQgJCQxOyBleGl0fScpXCJcbiAgICAgICAgICAgICAgaWYgWyAtbiBcIiQkVFJBRUZJS19JUFwiIF07IHRoZW5cbiAgICAgICAgICAgICAgICBncmVwIC1xIFwiW1s6c3BhY2U6XV0kJFdQX0RPTUFJTlxcJCRcIiAvZXRjL2hvc3RzIHx8IGVjaG8gXCIkJFRSQUVGSUtfSVAgJCRXUF9ET01BSU5cIiA+PiAvZXRjL2hvc3RzXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgZmlcbiAgICAgICAgICAgICAgc2xlZXAgMlxuICAgICAgICAgICAgZG9uZVxuICAgICAgICAgICkgJlxuICAgICAgICBmaVxuICAgICAgICBleGVjIGRvY2tlci1lbnRyeXBvaW50LnNoIGFwYWNoZTItZm9yZWdyb3VuZFxuICAgIHZvbHVtZXM6XG4gICAgICAtIHdwX2FwcDovdmFyL3d3dy9odG1sXG4gICAgICAtIC4uL2ZpbGVzL3VwbG9hZHMuaW5pOi91c3IvbG9jYWwvZXRjL3BocC9jb25mLmQvdXBsb2Fkcy5pbmlcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIFdPUkRQUkVTU19EQl9IT1NUOiB3cF9kYlxuICAgICAgV09SRFBSRVNTX0RCX05BTUU6ICREQl9OQU1FXG4gICAgICBXT1JEUFJFU1NfREJfVVNFUjogcm9vdFxuICAgICAgV09SRFBSRVNTX0RCX1BBU1NXT1JEOiAkREJfUEFTU1dPUkRcbiAgICAgIFdPUkRQUkVTU19ERUJVRzogJHtXT1JEUFJFU1NfREVCVUc6LTB9XG4gICAgICBXUF9ET01BSU46ICR7V1BfRE9NQUlOfVxuICAgICAgV09SRFBSRVNTX0NPTkZJR19FWFRSQTogfFxuICAgICAgICBkZWZpbmUoJ1dQX01FTU9SWV9MSU1JVCcsICcyNTZNJyk7XG4gICAgICAgIGRlZmluZSgnRElTQUxMT1dfRklMRV9FRElUJywgdHJ1ZSk7XG4gICAgZGVwZW5kc19vbjpcbiAgICAgIHdwX2RiOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG5cbiAgd3BfZGI6XG4gICAgaW1hZ2U6IG15c3FsOjguNFxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgdm9sdW1lczpcbiAgICAgIC0gd3BfZGF0YTovdmFyL2xpYi9teXNxbFxuICAgIGVudmlyb25tZW50OlxuICAgICAgTVlTUUxfUk9PVF9QQVNTV09SRDogJERCX1BBU1NXT1JEXG4gICAgICBNWVNRTF9EQVRBQkFTRTogJERCX05BTUVcbiAgICBoZWFsdGhjaGVjazpcbiAgICAgIHRlc3Q6IFtcIkNNRC1TSEVMTFwiLCBcImV4aXQgfCBteXNxbCAtaCBsb2NhbGhvc3QgLVAgMzMwNiAtdSByb290IC1wJCRNWVNRTF9ST09UX1BBU1NXT1JEXCJdXG4gICAgICBpbnRlcnZhbDogMTBzXG4gICAgICB0aW1lb3V0OiA1c1xuICAgICAgcmV0cmllczogNVxuICAgICAgc3RhcnRfcGVyaW9kOiAzMHNcblxudm9sdW1lczpcbiAgd3BfYXBwOlxuICB3cF9kYXRhOlxuIiwKICAiY29uZmlnIjogIlt2YXJpYWJsZXNdXG5tYWluX2RvbWFpbiA9IFwiJHtkb21haW59XCJcbmRiX25hbWUgPSBcIndvcmRwcmVzc1wiXG5kYl91c2VyID0gXCJ3b3JkcHJlc3NcIlxuZGJfcGFzc3dvcmQgPSBcIiR7cGFzc3dvcmQ6MzJ9XCJcblxuW2NvbmZpZ11cbmVudiA9IFtcbiAgXCJXT1JEUFJFU1NfREVCVUc9MFwiLFxuICBcIkRCX05BTUU9JHtkYl9uYW1lfVwiLFxuICBcIkRCX1VTRVI9JHtkYl91c2VyfVwiLFxuICBcIkRCX1BBU1NXT1JEPSR7ZGJfcGFzc3dvcmR9XCIsXG4gIFwiV1BfRE9NQUlOPSR7bWFpbl9kb21haW59XCJcbl1cblxuW1tjb25maWcuZG9tYWluc11dXG5zZXJ2aWNlTmFtZSA9IFwid29yZHByZXNzXCJcbnBvcnQgPSA4MFxuaG9zdCA9IFwiJHttYWluX2RvbWFpbn1cIlxuXG5bW2NvbmZpZy5tb3VudHNdXVxuZmlsZVBhdGggPSBcInVwbG9hZHMuaW5pXCJcbmNvbnRlbnQgPSBcIlwiXCJ1cGxvYWRfbWF4X2ZpbGVzaXplID0gNjRNXG5wb3N0X21heF9zaXplID0gNjRNXG5tZW1vcnlfbGltaXQgPSAyNTZNXG5tYXhfZXhlY3V0aW9uX3RpbWUgPSAzMDBcbm1heF9pbnB1dF92YXJzID0gMzAwMFxuXCJcIlwiICIKfQ==

Tags

cms


Version: latest

On this page