# Directus Docker Compose, PostgreSQL ve HTTPS ile nasıl kurulur

> Directus'u Ubuntu veya Debian'da Docker Compose ile barındırın: sabit imaj sürümü, PostgreSQL, isteğe bağlı Redis, Caddy HTTPS, güvenli anahtarlar ve yedekler.

Zorluk: Orta\
Denendiği sistemler: Ubuntu 24.04 LTS, Ubuntu 26.04 LTS, Debian 12, Debian 13

Directus açık bir veri platformudur: bir SQL veritabanına bağlanır, size anında bir REST ve GraphQL API'si verir ve editörlerin içerik, dosya ve kullanıcıları yönettiği kod gerektirmeyen bir uygulama ekler. Ekipler onu headless CMS olarak ve web siteleri ile uygulamalar için arka uç olarak kullanır. Bu rehber Directus'u resmi dağıtım örneğini izleyerek **Docker Compose** ile çalıştırır: sabit sürümlü bir Directus imajı, PostGIS'li PostgreSQL, bir Redis önbelleği, yüklemeler ve eklentiler için klasörler ve otomatik HTTPS için önde Caddy. Ardından ilk yöneticiyi güvenceye alır, kurulumu nasıl yedekleyeceğinizi, geri yükleyeceğinizi ve güncelleyeceğinizi öğrenirsiniz.

## Ön koşullar

- **Ubuntu 24.04 LTS**, **Ubuntu 26.04 LTS**, **Debian 12** veya **Debian 13** çalıştıran bir sunucu. Directus bir Docker imajı olarak dağıtıldığı için Docker Engine'in desteklediği her sürüm çalışır.
- `sudo` yetkisi ve SSH anahtarıyla girişi olan, root olmayan bir kullanıcı: [Yeni bir Linux sunucusunu güvenli hale getirin](/guides/secure-a-new-linux-server) ve [SSH anahtarlarını ayarlayın](/guides/ssh-keys).
- Compose eklentisiyle birlikte Docker Engine: [Ubuntu'da Docker](/guides/install-docker-ubuntu) veya [Debian'da Docker](/guides/install-docker-debian). Aşağıdaki komutlar kullanıcınızın `docker` grubunda olduğunu varsayar; değilse başlarına `sudo` ekleyin.
- Sunucuyu gösteren bir A kaydına (isteğe bağlı olarak AAAA kaydına) sahip `directus.example.com` gibi bir alan adı ve [Caddy reverse proxy](/guides/caddy-reverse-proxy) rehberindeki Caddy.

Directus yalnızca kendi konteyneri için değer yayınlar:

| Kaynak | En düşük (resmi) | Önerilen başlangıç |
|---|---|---|
| CPU | Directus konteyneri için 0,25 vCPU | Tüm yığın için 2 vCPU |
| RAM | Directus konteyneri için 512 MB | Directus, PostgreSQL ve Redis için 4 GB |
| Disk | Yayınlanmamış | 20 GB ve yüklemelerinizin boyutu |

Gereksinimler sayfası Directus konteyner kaynakları için gerekli en düşük değer olarak "1x 0.25 vCPU / 512 MB", önerilen en düşük değer olarak da "2x 1 vCPU / 2GB" verir. Veritabanını ve Redis'i kapsamaz; bu yüzden sağdaki sütun, her şeyin aynı sunucuda olduğu durum için temkinli bir başlangıç noktasıdır, resmi bir değer değildir.

## Adım 1 — Proje klasörünü ve gizli değerleri oluşturun

Bu uygulamaya ait her şeyi `/opt/directus` içinde tutun. Veritabanı, yüklemeler ve eklentiler klasörlerini ilk başlatmadan önce oluşturun; böylece Docker onları `root` olarak oluşturmaz, sizin kullanıcınıza ait olurlar:

```bash
sudo mkdir -p /opt/directus
sudo chown $USER:$USER /opt/directus
cd /opt/directus
mkdir -p uploads extensions data/database
```

Bir imzalama anahtarı ve bir veritabanı parolası üretin:

```bash
openssl rand -hex 32
openssl rand -hex 24
```

`SECRET` token'ları imzalar. Ayarlamazsanız Directus her başlangıçta rastgele bir değer kullanır ve her yeniden başlatmadan sonra herkesin oturumu kapanır; belgeleri bu değerin üretimde güvenli bir rastgele değerle mutlaka ayarlanması gerektiğini söyler. `/opt/directus/.env` dosyasını `nano .env` ile oluşturun:

```env
SECRET=paste-the-64-character-value
DB_PASSWORD=paste-the-48-character-value
ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=change-me-to-a-long-unique-password
PUBLIC_URL=https://directus.example.com
```

`ADMIN_EMAIL` ve `ADMIN_PASSWORD` ilk kullanıcıyı bootstrap sırasında oluşturur. `PUBLIC_URL`, API'nize erişilen adrestir; Directus SSO gibi özellikler için tam URL'ye ihtiyaç duyar. Dosyayı koruyun:

```bash
chmod 600 .env
```

## Adım 2 — Compose dosyasını yazın

`/opt/directus/compose.yaml` dosyasını oluşturun. Dosya resmi örneği izler ve üretim için üç değişiklik içerir: Directus yalnızca `127.0.0.1` üzerinde yayınlanır, gizli değerler `.env` dosyasından gelir ve her servis yeniden başlatmadan sonra kalkar.

```yaml
services:
  database:
    image: postgis/postgis:17-3.5
    volumes:
      - ./data/database:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: "directus"
      POSTGRES_PASSWORD: "${DB_PASSWORD}"
      POSTGRES_DB: "directus"
    healthcheck:
      test: ["CMD", "pg_isready", "--host=localhost", "--username=directus"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_interval: 5s
      start_period: 30s
    restart: unless-stopped

  cache:
    image: redis:7
    healthcheck:
      test: ["CMD-SHELL", "[ $$(redis-cli ping) = 'PONG' ]"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_interval: 5s
      start_period: 30s
    restart: unless-stopped

  directus:
    image: directus/directus:12.5.0
    ports:
      - "127.0.0.1:8055:8055"
    volumes:
      - ./uploads:/directus/uploads
      - ./extensions:/directus/extensions
    depends_on:
      database:
        condition: service_healthy
      cache:
        condition: service_healthy
    healthcheck:
      test: ["CMD-SHELL", "wget --spider -q http://localhost:8055/server/ping || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_interval: 5s
      start_period: 30s
    environment:
      SECRET: "${SECRET}"
      DB_CLIENT: "pg"
      DB_HOST: "database"
      DB_PORT: "5432"
      DB_DATABASE: "directus"
      DB_USER: "directus"
      DB_PASSWORD: "${DB_PASSWORD}"
      CACHE_ENABLED: "true"
      CACHE_AUTO_PURGE: "true"
      CACHE_STORE: "redis"
      REDIS: "redis://cache:6379"
      ADMIN_EMAIL: "${ADMIN_EMAIL}"
      ADMIN_PASSWORD: "${ADMIN_PASSWORD}"
      PUBLIC_URL: "${PUBLIC_URL}"
    restart: unless-stopped
```

Dosya hakkında birkaç not:

- **Sabit sürüm.** Directus üretimde belirli bir sürüme sabitlemeyi önerir; çünkü sabit bir etiket, konteyner yeniden başladığında daha yeni bir sürümle değiştirilmez. Bu rehber Ekim 2026'da kontrol edildiğinde en yeni sürüm `12.5.0` idi. Güncel etiketi [Directus sürümler sayfasında](https://github.com/directus/directus/releases) veya Docker Hub'da bulun ve kullanmadan önce kırıcı değişiklik notlarını okuyun.
- **Veritabanı.** Resmi örnek, coğrafi uzantılara sahip PostgreSQL olan PostGIS imajını kullanır. PostgreSQL verisi `./data/database` içinde durur ve ana makineye hiç yayınlanmaz.
- **Yüklemeler ve eklentiler.** Yüklenen dosyalar `./uploads`, özel eklentiler `./extensions` içinde saklanır; ikisi de konteyner güncellemelerinden etkilenmez.
- **Port.** `127.0.0.1:8055`, Directus'u genel arayüzün dışında tutar. Docker'ın yayınladığı portlar ufw kurallarını atlar; portu gerçekten koruyan şey loopback adresine bağlamaktır.

> **İpucu**
>
> Tek sunucuda Redis isteğe bağlıdır. Onsuz çalıştırmak için `cache` servisini, `depends_on` altındaki `cache` girdisini ve dört `CACHE_` ile `REDIS` değişkenini silin.

## Adım 3 — Directus'u başlatın ve kontrol edin

```bash
docker compose up -d
docker compose ps
docker compose logs -f directus
```

İlk başlatmada Directus şemasını PostgreSQL'e kurar ve `.env` dosyasındaki bilgilerle yönetici kullanıcıyı oluşturur. Sunucunun başladığını bildirdiğinde log takibini `Ctrl+C` ile bırakın. Ardından `docker compose ps` çıktısında üç servis de `healthy` görünmelidir. Giriş gerektirmeyen canlılık uç noktasını test edin:

```bash
curl -s http://127.0.0.1:8055/server/ping
```

`pong` görmelisiniz. Directus konteyner içinde yetkisiz `node` kullanıcısıyla çalışır; kullanıcı kimliğini kontrol edip yüklemeler klasörünün sahibiyle karşılaştırın:

```bash
docker compose exec directus id
ls -ln /opt/directus
```

`id` komutunun yazdığı `uid`, `uploads` ve `extensions` klasörlerinin sahibinden farklıysa klasörleri bu kimliğe verin; örneğin konteyner `uid=1000` bildiriyorsa `sudo chown -R 1000:1000 uploads extensions` kullanın.

## Adım 4 — Directus'u Caddy ile HTTPS üzerinden yayınlayın

`/etc/caddy/Caddyfile` dosyasına bir site bloğu ekleyin:

```caddyfile
directus.example.com {
    reverse_proxy 127.0.0.1:8055
}
```

Caddy'yi yeniden yükleyin ve güvenlik duvarında yalnızca SSH ve web trafiğine izin verin:

```bash
sudo systemctl reload caddy
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
```

Genel uç noktayı `curl -s https://directus.example.com/server/ping` ile kontrol edin. Caddy sertifikayı ilk ziyarette alır ve otomatik olarak yeniler. Bunun yerine Nginx kullanmak için [Nginx ve Certbot](/guides/nginx-reverse-proxy-certbot) rehberine bakın; [Traefik](/guides/traefik-reverse-proxy) de çalışır.

## Adım 5 — İlk yöneticiyi güvenceye alın

`https://directus.example.com` adresini açın. Varsayılan olarak kök adres `/admin` altındaki uygulamaya yönlendirir. `ADMIN_EMAIL` ve `ADMIN_PASSWORD` ile giriş yapın, ardından:

1. Kullanıcı profilinizi açın, yalnızca parola yöneticinizde bulunan yeni bir parola belirleyin ve iki adımlı doğrulamayı açın.
2. Yönetici girişini paylaşmak yerine erişmesi gereken diğer kişiler için uygun rollere sahip, isimli hesaplar oluşturun.

İki `ADMIN_` değişkeni yalnızca Directus boş bir veritabanını kurarken işe yarar; sonradan değiştirmek hesabı değiştirmez. İki satırı da `.env` dosyasından ve `compose.yaml` içindeki `environment` bölümünden kaldırın, ardından konteyneri yeniden oluşturun:

```bash
docker compose up -d
```

Directus parola sıfırlama ve kullanıcı daveti e-postaları gönderir; bunları bir relay üzerinden göndermek için `EMAIL_TRANSPORT` değerini `smtp` yapın, `directus` servisinin `environment` bölümüne `EMAIL_FROM`, `EMAIL_SMTP_HOST` (örneğin `smtp.example.com`), `EMAIL_SMTP_PORT` (STARTTLS kullanan `587`), `EMAIL_SMTP_USER` ve `EMAIL_SMTP_PASSWORD` değişkenlerini ekleyin ve `docker compose up -d` komutunu yeniden çalıştırın.

> **Not**
>
> HyperDC VPS'lerde giden 25 numaralı port varsayılan olarak kapalıdır. 3 ay veya daha uzun süreyle satın alınan hizmetlerde talep üzerine açılır: [destek talebi açın](/guides/support-tickets). O zamana kadar e-postaları 587 numaralı port üzerinden bir SMTP relay ile gönderin.

## Yedekleme ve geri yükleme

Durum üç yerde tutulur: PostgreSQL veritabanı, `uploads` ve `extensions` klasörleri ve `compose.yaml` ile `.env` dosyalarınız (`SECRET` ve veritabanı parolası bunlarda). Veritabanını, Directus çalışmaya devam ederken tutarlı bir anlık görüntü alan PostgreSQL'in kendi aracıyla dökün ve dosyaları tarihli adlarla arşivleyin:

```bash
sudo mkdir -p /opt/backups
sudo chown $USER:$USER /opt/backups
chmod 700 /opt/backups
cd /opt/directus
docker compose exec -T database pg_dump -U directus -Fc directus > /opt/backups/directus-db-$(date +%F).dump
tar czf /opt/backups/directus-files-$(date +%F).tar.gz -C /opt/directus uploads extensions compose.yaml .env
```

Geri yüklemek için Directus'u durdurun, veritabanını yeniden oluşturun, dökümü yükleyin ve dosyaları açın. Tarihleri kendi yedeğinizinkilerle değiştirin:

> **Uyarı**
>
> `dropdb` mevcut Directus veritabanını siler. Geri yükleyeceğiniz yedeğin eksiksiz olduğundan emin olun.

```bash
cd /opt/directus
docker compose stop directus
docker compose exec -T database dropdb -U directus --force directus
docker compose exec -T database createdb -U directus directus
docker compose exec -T database pg_restore -U directus -d directus < /opt/backups/directus-db-2026-10-09.dump
tar xzf /opt/backups/directus-files-2026-10-09.tar.gz -C /opt/directus
docker compose up -d
```

Yeni bir sunucuda Docker'ı kurun, `/opt/directus` klasörünü oluşturun, önce dosya arşivini oraya açın (`compose.yaml` ve `.env` bunun içindedir), yalnızca veritabanını `docker compose up -d database` ile başlatın ve ardından geri yükleme komutlarını çalıştırın. Yedeklerinizi sunucunun dışına da kopyalayın ve zaman zaman bir geri yükleme deneyin.

## Directus'u güncelleme

Directus daha yeni bir imaj başladığında veritabanı geçişlerini otomatik olarak uygular; bu da sürüm düşürmenin veritabanı geri yüklemesi gerektirdiği anlamına gelir. Her güncellemeden önce:

1. [Sürümler sayfasındaki](https://github.com/directus/directus/releases) notları, özellikle "Potential Breaking Changes" bölümünü okuyun; Directus bu adımı kritik derecede önemli sayar, çünkü değişiklikler ortam değişkenlerini, API'leri, SDK'yı ve eklentileri etkileyebilir.
2. Yukarıdaki gibi yedek alın.

Ardından `compose.yaml` içindeki `image: directus/directus:` satırındaki etiketi yeni sürümle değiştirin ve uygulayın:

```bash
cd /opt/directus
nano compose.yaml
docker compose pull
docker compose up -d
docker compose logs -f directus
```

Geçişler bitip sunucu başlayana kadar logları izleyin, sonra giriş yapıp ana koleksiyonlarınızı ve eklentilerinizi test edin. `postgis/postgis` etiketindeki PostgreSQL ana sürümünü değiştirmeyin: yeni bir ana sürüme geçmek yalnızca yeni bir imaj değil, döküm ve geri yükleme gerektirir. `docker compose pull`, `redis:7` imajını da kendi ana sürümü içinde yeniler.

## Sorun giderme

### Yüklemeler izin hatasıyla başarısız oluyor

Ana makinedeki `uploads` klasörü, konteyner içindeki `node` kullanıcısından farklı bir kullanıcı kimliğine ait; çoğu zaman Docker onu `root` olarak oluşturduğu için. `docker compose exec directus id` çıktısını `ls -ln /opt/directus` ile karşılaştırın ve sahibi Adım 3'te gösterildiği gibi `sudo chown -R` ile düzeltin.

### Her yeniden başlatmadan sonra herkesin oturumu kapanıyor

`SECRET` ayarlanmamış; bu yüzden Directus her başlangıçta yeni bir rastgele değer üretiyor. Adım 1'deki gibi `.env` dosyasına sabit bir değer ekleyin ve konteyneri `docker compose up -d` ile yeniden oluşturun.

### DB_PASSWORD değiştirildikten sonra Directus veritabanına bağlanamıyor

PostgreSQL `POSTGRES_PASSWORD` değerini yalnızca boş bir veri klasörünü ilk kez hazırlarken uygular; `.env` dosyasını sonradan değiştirmek veritabanında eski parolayı bırakır. Eski parolayı geri koyun ya da önce PostgreSQL içinde `docker compose exec database psql -U directus -c "ALTER USER directus PASSWORD 'new-password';"` ile değiştirip ardından `.env` dosyasını güncelleyin.

### Veritabanı imajı ARM sunucuda çekilemiyor

Docker Hub, `postgis/postgis` imajını yalnızca `amd64` için listeler; bu nedenle arm64 sunucu eşleşen bir manifest bulunmadığını bildirir. Bu yığın için x86-64 bir sunucu kullanın ya da coğrafi alanlara hiç ihtiyacınız yoksa ilk başlatmadan önce imajı resmi `postgres:17` imajıyla değiştirin.

### E-postalardaki bağlantılar veya giriş yönlendirmeleri yanlış adresi kullanıyor

`PUBLIC_URL` eksik, hâlâ bir yer tutucu değerde ya da `http://` kullanıyor. Onu sitenizin tam `https://` adresine ayarlayın ve `docker compose up -d` çalıştırın.

## Sonraki adımlar

- Kod öncelikli bir headless CMS ile karşılaştırın: [Strapi nasıl kurulur](/guides/install-strapi).
- Bu kurulumun arkasındaki Compose temellerini [Docker Compose temelleri](/guides/docker-compose-basics) rehberinde tazeleyin.
- Directus projeleri için sunucu seçeneklerini [Directus hosting](/directus-hosting) sayfasında inceleyin.
- Depolama bağdaştırıcıları, e-posta ve ölçekleme için resmi [Directus self-hosting belgelerini](https://directus.com/docs/self-hosting/deploying) okuyun.

## Sık sorulan sorular

### Directus'u çalıştırmak için Redis gerekli mi?

Hayır. Directus gereksinimleri Redis'i önbellek için isteğe bağlı ama önerilen olarak tanımlar; yalnızca birden fazla Directus konteynerini yan yana çalıştırdığınızda zorunludur. İstemiyorsanız cache servisini ve CACHE ile REDIS değişkenlerini Compose dosyasından kaldırabilirsiniz.

### Directus imajını neden belirli bir sürüme sabitlemeliyim?

Directus üretimde belirli bir sürüme sabitlemeyi önerir. Sabit bir etiketle yeniden başlatma hiçbir zaman sürpriz bir yeni sürüm çekmez; kırıcı değişiklik notlarını okuma, yedek alma ve yükseltme zamanını siz seçersiniz.

### Directus, PostgreSQL yerine MySQL veya başka bir veritabanı kullanabilir mi?

Evet. Directus; PostgreSQL, MySQL, MariaDB, SQLite, MS SQL Server, CockroachDB ve OracleDB'nin uzun süreli destek (LTS) sürümlerini destekler. Veritabanını ilk başlatmadan önce DB_CLIENT ve ilgili DB_ bağlantı değişkenleriyle seçin; bu rehber resmi Compose örneğindeki gibi PostGIS'li PostgreSQL kullanır.

### Directus yüklemeleri yerel klasör yerine nesne depolamada tutabilir mi?

Evet. Directus dosyaları varsayılan olarak yerel dosya sisteminde saklar ve STORAGE ayarlarıyla harici depolama konumlarını destekler. Bu rehber yüklemeleri yerel bir klasörde tutar; tek sunucuda yedeklemesi en kolay yol budur.

### Directus hangi HyperDC sunucularında çalışır?

Root erişiminiz olan ve Docker Engine'in desteklendiği her HyperDC Linux VPS, VDS veya dedicated sunucuda. Sunucuyu Directus, PostgreSQL ve Redis'i birlikte düşünerek boyutlandırın ve editörlerinizin yükleyeceği dosyalar için disk alanı ekleyin.

---

Kaynak: <https://hyperdc.com/tr/guides/tutorials/install-directus>\
Son güncelleme: 2026-10-09
