Ultimate Tutorial: Drupal 11 + DDEV + nip.io + SSL via Certbot

Ultimate Tutorial: Drupal 11 + DDEV + nip.io + SSL via Certbot

dev-nip-io-drupal11-setup

What You’ll Build

A secure local Drupal 11 stack with DDEV, nip.io, and Let's Encrypt SSL certificates via Certbot.

Requirements

  • Docker
  • DDEV
  • Composer
  • PHP
  • Optional: custom domain for real cert

STEP 1: Create Drupal 11 Project

mkdir drupal11-ddev && cd drupal11-ddev
composer create-project drupal/recommended-project:^11 .

STEP 2: Initialize DDEV

ddev config --project-type=drupal11 --docroot=web --create-docroot

Edit prompts as needed (project name, docroot, etc).

STEP 3: Enable nip.io DNS

Find your local IP:

# macOS
ipconfig getifaddr en0

# Linux
hostname -I

# Windows
ipconfig

Update .ddev/config.yaml:

additional_fqdns:
  - drupal.192.168.1.100.nip.io

STEP 4: Start DDEV

ddev start

Open: https://drupal.192.168.1.100.nip.io


STEP 5: Add SSL via Certbot (Optional)

Let’s Encrypt does NOT support nip.io. You need a real domain.

Option A: Use Custom Domain

sudo certbot certonly --manual --preferred-challenges dns -d dev.yourdomain.com

Then add the TXT record when prompted.

STEP 6: Copy Certs Into DDEV

mkdir -p .ddev/ssl
cp /etc/letsencrypt/live/dev.yourdomain.com/fullchain.pem .ddev/ssl/
cp /etc/letsencrypt/live/dev.yourdomain.com/privkey.pem .ddev/ssl/

STEP 7: Docker Compose Override

version: '3.6'
services:
  web:
    volumes:
      - ./ssl/fullchain.pem:/etc/ssl/certs/fullchain.pem:ro
      - ./ssl/privkey.pem:/etc/ssl/private/privkey.pem:ro
    environment:
      - HTTPS_CERT=/etc/ssl/certs/fullchain.pem
      - HTTPS_KEY=/etc/ssl/private/privkey.pem

STEP 8: Restart

ddev restart

Verify via: curl -I https://dev.yourdomain.com


Optional: Dynamic Domain Bash Script

#!/bin/bash
IP=$(ipconfig getifaddr en0)
HOST="drupal.$IP.nip.io"
echo "Using dev domain: $HOST"

yq e ".additional_fqdns += [\"$HOST\"]" -i .ddev/config.yaml
ddev restart
echo "Access at https://$HOST"

Final Project Structure

drupal11-ddev/
├── .ddev/
│   ├── config.yaml
│   ├── docker-compose.override.yaml
│   └── ssl/
│       ├── fullchain.pem
│       └── privkey.pem
├── web/
├── composer.json
└── ...

Recap

  • Drupal 11
  • DDEV stack
  • nip.io or custom domain
  • SSL integration

Pro Tips

  • Automate renewals with certbot renew + cron
  • Use Cloudflare API for auto DNS-challenge
  • Traefik or Caddy offer auto-SSL in dev