Self-host Drupal
updated Sep 2026prices checked · Jul 2026
We earn commissions when you shop through the links below. Full disclosure →
A PHP content management framework for structured, multilingual websites, extended with contributed modules and themes.
Key facts
CategoryCMS & blogging
LicenseGPL-2.0-or-later
StackPHP, Symfony
Min RAM512 MB
Official imageyes
Difficulty
What you need
- Any VPS with at least 512 MB of RAM
- A domain you control — most self-hosted setups need HTTPS in front of them
- Under an hour if you've used Docker before
Where to host itaffiliate disclosure
Hetzner Cloudrun it on
From $23.59/mo · 2 vCPU / 4 GB / 80 GB · EU + USKamaterafree trial
From $4/mo · 1 vCPU / 1 GB / 20 GB · US + EU + AsiaDigitalOceanalso works on
From $6/mo · 1 vCPU / 1 GB / 25 GB · US + EU + AsiaPaid link — we earn a commission if you shop through it.
Install
Run these commands on your server:
# Drupal 11 — the Docker Official Image with PostgreSQL, adapted from its Docker Hub compose example
mkdir -p drupal && cd drupal
echo "DB_PASS=$(openssl rand -hex 16)" > .env
cat > docker-compose.yml <<'EOF'
services:
drupal:
image: drupal:11-apache
restart: always
ports: ["8080:80"]
depends_on: [postgres]
volumes:
- modules:/var/www/html/modules
- profiles:/var/www/html/profiles
- themes:/var/www/html/themes
- sites:/var/www/html/sites
postgres:
image: postgres:16
restart: always
environment:
POSTGRES_DB: drupal
POSTGRES_USER: drupal
POSTGRES_PASSWORD: ${DB_PASS}
volumes: ["db:/var/lib/postgresql/data"]
volumes:
modules:
profiles:
themes:
sites:
db:
EOF
docker compose up -d # → http://SERVER_IP:8080
# the web installer asks for the database: PostgreSQL, name/user drupal, password = DB_PASS in .env, host (Advanced options) postgresMore in CMS & blogging
CMS & blogging
Ghost
Node.jsMySQL
easyRead guide →
CMS & blogging
Halo
JavaSpring BootVue
easyRead guide →
CMS & blogging
Joomla
PHPMySQL
easyRead guide →
CMS & blogging
WordPress
PHPMySQL
easyRead guide →