# Odoo 20 Community Docker Compose ve HTTPS ile nasıl kurulur

> Odoo 20 Community'yi resmi Docker imajı ve PostgreSQL ile Ubuntu veya Debian'a kurun; ardından Caddy HTTPS, websocket yönlendirmesi, worker ve yedek ekleyin.

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

Odoo açık kaynaklı iş uygulamalarından oluşan bir pakettir: CRM, satış, faturalama, stok, projeler, web sitesi, e-ticaret ve çok daha fazlası tek bir PostgreSQL veritabanını paylaşır. Bu rehber güncel kararlı sürüm olan **Odoo 20.0 Community Edition**'ı (Odoo'nun nightly sunucusu Eylül 2026'da yayımlandığını belirtir) **resmi `odoo` Docker imajı** ve bir PostgreSQL 17 konteyneriyle kurar. `odoo.conf` dosyasını worker'lar, proxy modu, ana parola ve veritabanı filtresiyle üretime göre yapılandırır, Odoo'yu Caddy ile HTTPS ve doğru websocket yönlendirmesiyle yayınlar, veritabanı yöneticisini kapatır, yedeklemeyi ve güncellemeyi kurarsınız.

> **Not**
>
> Neden Docker? Odoo'nun kendi paket sayfası, Odoo 20 deb paketinin şu anda yalnızca Ubuntu 24.04'ü desteklediğini ve üst ile alt bilgili PDF raporları için wkhtmltopdf 0.12.6'nın elle kurulması gerektiğini söyler. Resmi imajın bakımını Odoo yapar; imaj bu kütüphanenin kapsadığı her sürümde (arm64 dahil) çalışır ve wkhtmltopdf 0.12.6.1'i zaten içerir.

## Ön koşullar

- Docker Engine ve Compose eklentisi kurulu, **Ubuntu 24.04 LTS**, **Ubuntu 26.04 LTS**, **Debian 12** veya **Debian 13** çalıştıran bir sunucu: [Ubuntu'da Docker](/guides/install-docker-ubuntu) veya [Debian'da Docker](/guides/install-docker-debian). Komutlar kullanıcınızın `docker` grubunda olduğunu varsayar; değilse başlarına `sudo` ekleyin.
- `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).
- Sunucuyu gösteren bir A kaydına (isteğe bağlı olarak AAAA kaydına) sahip `odoo.example.com` gibi bir alan adı ve [Caddy reverse proxy](/guides/caddy-reverse-proxy) rehberindeki Caddy.

Odoo en düşük donanım gereksinimi yayınlamaz. Dağıtım rehberi bunun yerine bir boyutlandırma yöntemi sunar: en fazla (CPU sayısı × 2) + 1 worker, worker başına yaklaşık altı eş zamanlı kullanıcı ve isteklerin %80'i hafif, %20'si ağır kabul edilerek yaklaşık worker × (0,8 × 150 MB + 0,2 × 1 GB) RAM. Aşağıdaki değerler küçük bir ekip için temkinli bir başlangıç noktasıdır, resmi değerler değildir:

| Kaynak | En düşük (resmi) | Önerilen başlangıç |
|---|---|---|
| CPU | Yayınlanmamış | 2 vCPU |
| RAM | Yayınlanmamış | 4 GB |
| Disk | Yayınlanmamış | 40 GB ve ekleriniz |

Yazılım tarafında Odoo 20, PostgreSQL 16 veya üzerini gerektirir. İmajın Docker Hub sayfasındaki örnekler hâlâ `postgres:15` kullanır; bu nedenle bu rehber bunun yerine `postgres:17` sabitler.

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

Yığını `odoo.conf` için bir `config` klasörü ve özel modüller için bir `addons` klasörüyle birlikte `/opt/odoo` içinde tutun. `odoo.conf` ana parolayı tutacağı için proje klasörünü diğer kullanıcılara kapatın:

```bash
sudo mkdir -p /opt/odoo/config /opt/odoo/addons
sudo chown -R $USER:$USER /opt/odoo
chmod 700 /opt/odoo
cd /opt/odoo
```

Üç farklı gizli değer üretin: biri PostgreSQL süper kullanıcısı, biri `odoo` veritabanı rolü, biri de Odoo'nun ana parolası için:

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

`/opt/odoo/.env` dosyasını `nano .env` ile oluşturun ve ilk iki değeri yapıştırın:

```env
POSTGRES_PASSWORD=paste-the-first-value
ODOO_DB_PASSWORD=paste-the-second-value
```

```bash
chmod 600 .env
```

## Adım 2 — odoo.conf dosyasını yazın

`/opt/odoo/config/odoo.conf` dosyasını `nano config/odoo.conf` ile oluşturun. Üçüncü gizli değeri `admin_passwd` olarak yapıştırın:

```ini
[options]
addons_path = /mnt/extra-addons
data_dir = /var/lib/odoo
admin_passwd = paste-the-third-value
proxy_mode = True
dbfilter = ^odoo$
list_db = True
workers = 4
max_cron_threads = 1
limit_memory_soft = 629145600
limit_memory_hard = 1677721600
limit_time_cpu = 600
limit_time_real = 1200
limit_request = 8192
```

Bu ayarların işlevi:

- `admin_passwd`, veritabanı yönetim ekranlarını koruyan **ana paroladır**. Odoo belgeleri varsayılan değerin rastgele üretilmiş bir değerle değiştirilmesini söyler.
- `proxy_mode = True`, Odoo'nun Caddy'den gelen `X-Forwarded-*` başlıklarını okumasını sağlar; böylece isteklerin HTTPS üzerinden geldiğini bilir. Odoo bunun önünde bir reverse proxy olmadan asla açılmaması gerektiği konusunda uyarır.
- `dbfilter = ^odoo$`, hangi alan adı kullanılırsa kullanılsın yalnızca `odoo` adlı veritabanını sunar.
- `list_db = True` geçicidir. Veritabanı yöneticisine Adım 5'te bir kez ihtiyacınız var, sonra onu kapatırsınız.
- `workers = 4`, Odoo'yu thread tabanlı geliştirme sunucusundan üretim için tasarlanmış çok süreçli sunucuya geçirir. Worker'lar açıkken Odoo canlı sohbet ve anlık bildirimler için 8072 portunda (`--gevent-port` varsayılanı) ayrı bir websocket süreci de başlatır.
- `limit_` değerleri Odoo dağıtım rehberindeki örnek yapılandırmadan gelir. `limit_memory_soft` değerini aşan worker'lar mevcut istekten sonra yeniden başlatılır; `limit_memory_hard` değerini aşanlar ise hemen sonlandırılır.

`workers` değerini Ön koşullar bölümündeki formülle sunucunuza göre ayarlayın ve PostgreSQL'e yer bırakın.

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

`/opt/odoo/compose.yaml` dosyasını oluşturun:

```yaml
services:
  db:
    image: postgres:17
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - odoo-db-data:/var/lib/postgresql/data
    restart: unless-stopped

  odoo:
    image: odoo:20.0
    depends_on:
      - db
    environment:
      HOST: db
      USER: odoo
      PASSWORD: ${ODOO_DB_PASSWORD}
    ports:
      - "127.0.0.1:8069:8069"
      - "127.0.0.1:8072:8072"
    volumes:
      - odoo-web-data:/var/lib/odoo
      - ./config:/etc/odoo
      - ./addons:/mnt/extra-addons
    restart: unless-stopped

volumes:
  odoo-db-data:
  odoo-web-data:
```

İmaj `/etc/odoo/odoo.conf` dosyasını okur, filestore ve oturumları `/var/lib/odoo` içinde saklar ve özel modülleri `/mnt/extra-addons` klasöründen yükler. Giriş betiği `HOST`, `USER` ve `PASSWORD` değerlerini veritabanı bağlantısı olarak Odoo'ya iletir. PostgreSQL kendi süper kullanıcısı `postgres` ile çalışır; Odoo ise ayrı bir `odoo` rolüyle bağlanır, çünkü Odoo `postgres` olarak bağlanmayı reddeder ve dağıtım rehberi veritabanı kullanıcısının süper kullanıcı olmaması gerektiğini söyler. Docker'ın yayınladığı portlar ufw'yi atladığı için iki port da `127.0.0.1` adresine bağlanır.

`20.0` etiketi 20.0 serisinin yeniden derlemelerini izler. Tek bir derlemeye sabitlemek isterseniz Docker Hub `20.0-20260926` gibi tarihli etiketleri de listeler.

## Adım 4 — Veritabanı rolünü oluşturun ve Odoo'yu başlatın

Önce yalnızca PostgreSQL'i başlatın, ardından `odoo` rolünü Odoo belgelerinin kullandığı parametrelerle oluşturun: veritabanı oluşturabilir, ama süper kullanıcı değildir ve rol oluşturamaz. İstendiğinde `.env` dosyasındaki `ODOO_DB_PASSWORD` değerini iki kez yapıştırın:

```bash
docker compose up -d db
docker compose exec db createuser -U postgres --createdb --no-createrole --no-superuser --pwprompt odoo
```

`createuser` bağlanamadığını bildirirse PostgreSQL hâlâ hazırlanıyordur; birkaç saniye bekleyip yeniden çalıştırın. Ardından Odoo'yu başlatın ve logunu izleyin:

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

Log, HTTP servisinin 8069 portunda çalıştığını gösterdiğinde takibi `Ctrl+C` ile bırakın. Veritabanı yöneticisinin yerelde yanıt verdiğini kontrol edin:

```bash
curl -I http://127.0.0.1:8069/web/database/manager
```

`HTTP/1.1 200 OK` almalısınız.

## Adım 5 — Veritabanını oluşturun, sonra veritabanı yöneticisini kapatın

Veritabanı yöneticisi hiçbir zaman internete açılmasın diye veritabanını bir SSH tüneli üzerinden oluşturun. **Kendi bilgisayarınızda** sunucuya bir tünel açın:

```bash
ssh -L 8069:127.0.0.1:8069 admin@203.0.113.10
```

Bu oturumu açık tutun ve tarayıcıda `http://localhost:8069/web/database/manager` adresine gidin. **Create Database** seçeneğini seçin ve şunları girin:

- **Master Password**: `odoo.conf` dosyasındaki `admin_passwd` değeri.
- **Database Name**: `dbfilter` ile eşleşmesi için `odoo`.
- **Email** ve **Password**: ilk yöneticinizin giriş bilgileri. Uzun ve benzersiz bir parola kullanın.
- Diliniz ve ülkeniz. Üretim veritabanında **Demo data** kutusunu işaretlemeyin.

Odoo sizi oturum açmış olarak karşıladığında veritabanı hazırdır. Sunucuya dönün, veritabanı yöneticisini kapatın ve Odoo'yu yeniden başlatın:

```bash
cd /opt/odoo
sed -i 's/^list_db = True/list_db = False/' config/odoo.conf
grep list_db config/odoo.conf
docker compose restart odoo
```

`grep` komutu `list_db = False` yazmalıdır. Veritabanı seçme ve yönetim ekranları artık engellidir; Odoo belgelerinin internete açık sistemler için önerdiği de budur. SSH tünelini kapatın.

## Adım 6 — Odoo'yu websocket yönlendirmesiyle HTTPS üzerinden yayınlayın

Worker'lar açıkken normal HTTP trafiği 8069 portuna, `/websocket` üzerindeki websocket bağlantıları ise 8072 portuna gider. Odoo'nun dağıtım rehberi bu ayrımı Nginx için gösterir; Caddy karşılığı iki `handle` bloğu kullanır. Bu siteyi `/etc/caddy/Caddyfile` dosyasına ekleyin:

```caddyfile
odoo.example.com {
    encode zstd gzip

    handle /websocket* {
        reverse_proxy 127.0.0.1:8072
    }

    handle {
        reverse_proxy 127.0.0.1:8069
    }
}
```

Caddy websocket bağlantılarını kendiliğinden yükseltir ve `proxy_mode` ayarının beklediği `X-Forwarded-For`, `X-Forwarded-Proto` ve `X-Forwarded-Host` başlıklarını kendisi ekler. Caddy'yi yeniden yükleyin ve yalnızca SSH ile 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
```

`https://odoo.example.com` adresini açın ve Adım 5'teki yönetici hesabıyla giriş yapın. Websocket yolunu kontrol etmek için tarayıcınızın geliştirici araçlarında Network sekmesini açın: `/websocket` isteği `101` durum kodunu göstermelidir. Nginx tercih ediyorsanız Odoo'nun [dağıtım rehberindeki](https://www.odoo.com/documentation/20.0/administration/on_premise/deploy.html) örnek yapılandırmayı [Nginx ve Certbot](/guides/nginx-reverse-proxy-certbot) rehberiyle birlikte izleyin.

Odoo kullanıcı davetlerini, parola sıfırlamalarını, bildirimleri ve teklif ile fatura gibi belgeleri, geliştirici modu açıkken **Settings → Technical → Email: Outgoing Mail Servers** altında eklediğiniz giden posta sunucusu üzerinden e-postayla gönderir (sunucu `smtp.example.com`, port `587`, TLS (STARTTLS) şifreleme, SMTP kullanıcı adınız ve parolanız; kaydetmeden önce **Test Connection** düğmesini kullanı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.

## Adım 7 — Uygulamaları ve özel modülleri kurun

Odoo'nun kendi uygulamalarını **Apps** menüsünden kurun. Üçüncü taraf veya şirket içi modüller, her modül için bir klasör olmak üzere ve konteynerin okuyabileceği şekilde `/opt/odoo/addons` içine konur. Bir modülü kopyaladıktan sonra Odoo'yu yeniden başlatın:

```bash
docker compose restart odoo
```

Ardından **Settings** içinde geliştirici modunu açın, **Apps → Update Apps List** seçeneğini seçin ve modülü kurun. Yalnızca güvendiğiniz kaynaklardan modül kurun; bir modül verilerinize tam erişimle çalışır.

## Yedekleme ve geri yükleme

Odoo'nun durumu iki parçaya ayrılır: PostgreSQL veritabanı ve `/var/lib/odoo/filestore/odoo` altındaki **filestore** (ekler ve diğer dosyalar). Bir yedek, aynı anda alınmış ikisini ve yapılandırmanızı birlikte gerektirir. Veritabanı yöneticisinin yedekleme düğmesi böyle bir paket üretir, ancak onu Adım 5'te kapattınız; aşağıdaki komutlar aynı içeriği kabuktan verir:

```bash
sudo mkdir -p /opt/backups
sudo chown $USER:$USER /opt/backups
chmod 700 /opt/backups
cd /opt/odoo
docker compose exec -T db pg_dump -U postgres -Fc odoo > /opt/backups/odoo-db-$(date +%F).dump
docker compose exec -T odoo tar czf - -C /var/lib/odoo filestore/odoo > /opt/backups/odoo-filestore-$(date +%F).tar.gz
tar czf /opt/backups/odoo-config-$(date +%F).tar.gz -C /opt/odoo compose.yaml .env config addons
```

`pg_dump`, Odoo çalışmaya devam ederken tutarlı bir anlık görüntü alır. Geri yüklemek için Odoo'yu durdurun, veritabanını yeniden oluşturun, dökümü yükleyin ve filestore'u volume'a açın. Tarihleri kendi yedeğinizinkilerle değiştirin:

> **Uyarı**
>
> `dropdb` mevcut Odoo veritabanını siler. Devam etmeden önce iki yedek dosyasının da eksiksiz olduğunu kontrol edin.

```bash
cd /opt/odoo
docker compose stop odoo
docker compose exec -T db dropdb -U postgres --if-exists --force odoo
docker compose exec -T db createdb -U postgres --owner=odoo odoo
docker compose exec -T db pg_restore -U postgres -d odoo < /opt/backups/odoo-db-2026-10-09.dump
docker compose run --rm --no-deps -T odoo tar xzf - -C /var/lib/odoo < /opt/backups/odoo-filestore-2026-10-09.tar.gz
docker compose up -d
```

Yeni bir sunucuda önce yapılandırma arşivini `/opt/odoo` içine açın, ardından PostgreSQL'i başlatıp `odoo` rolünü oluşturmak için Adım 4'ü çalıştırın ve ancak bundan sonra geri yükleme komutlarını verin. Her yedeği sunucunun dışına kopyalayın ve düzenli olarak bir geri yükleme deneyin.

## Odoo'yu güncelleme

**20.0 içindeki güncellemeler** hata ve güvenlik düzeltmeleri getirir. Önce yedek alın, ardından yeniden derlenmiş imajı çekip konteyneri yeniden oluşturun:

```bash
cd /opt/odoo
docker compose pull
docker compose up -d
docker compose logs -f odoo
```

Bir düzeltme modül verilerini değiştirirse ve sonrasında eksik alan veya görünüm hataları görürseniz veritabanındaki tüm modülleri bir kez güncelleyin. Bu sırada Odoo durdurulmuş olur:

```bash
docker compose stop odoo
docker compose run --rm odoo odoo -d odoo -u all --stop-after-init
docker compose up -d
```

19.0'dan 20.0'a veya 20.0'dan sonraki bir sürüme geçmek gibi **ana sürüm yükseltmeleri** ayrı bir iştir. Odoo'nun Docker Hub sayfası ana sürümler arasında geçişin ayrıntılı taşıma betikleri gerektirdiği konusunda uyarır. Veritabanı taşımasını Odoo'nun yükseltme belgelerine göre planlayın, özel modüllerinizi uyarlayın ve imaj etiketini değiştirmeden önce tüm süreci veritabanının bir kopyası üzerinde test edin. `odoo:20.0` etiketini asla yeni bir ana sürüme çevirip yalnızca yeniden başlatmayın. `postgres:17` içindeki PostgreSQL ana sürümünü de değiştirmeyin; yeni bir PostgreSQL ana sürümü döküm ve geri yükleme gerektirir.

## Sorun giderme

### Odoo, postgres kullanıcısının bir güvenlik riski olduğunu söyleyerek kapanıyor

Odoo `postgres` olarak bağlanacak şekilde yapılandırılmış ve bunu reddediyor. `compose.yaml` içinde `USER: odoo` ayarlı olduğunu, rolün var olduğunu (`docker compose exec db psql -U postgres -c "\du"`) ve `odoo.conf` içinde `db_user = postgres` satırı bulunmadığını kontrol edin.

### Discuss, bildirimler veya canlı sohbet anlık güncellenmiyor

Websocket istekleri websocket sürecine ulaşmıyor. Caddy'nin `/websocket*` isteklerini `127.0.0.1:8072` adresine gönderdiğini, 8072 portunun `compose.yaml` içinde yayınlandığını, `workers` değerinin 0'dan büyük olduğunu ve `proxy_mode = True` ayarlı olduğunu kontrol edin. Her değişiklikten sonra Caddy'yi yeniden yükleyin ve Odoo'yu yeniden başlatın.

### Giriş sayfası veritabanı göstermiyor veya veritabanı bulunamadı hatası veriyor

`dbfilter` veritabanı adıyla eşleşmiyor. `dbfilter = ^odoo$` ile veritabanının adı tam olarak `odoo` olmalıdır. `odoo.conf` içindeki filtreyi düzeltin veya veritabanını eşleşen adla yeniden oluşturun, ardından Odoo'yu yeniden başlatın.

### İstekler zaman aşımına uğruyor veya worker'lar bellek sınırı mesajlarıyla yeniden başlatılıyor

Bir worker `limit_time_cpu`, `limit_time_real` veya bellek sınırlarını aştı. Ayrıntıları `docker compose logs odoo` ile okuyun; uzun raporlar veya içe aktarmalar gerçekten gerektiriyorsa ilgili sınırı yükseltin, sunucunun kendisi bellek tüketiyorsa `workers` sayısını azaltın veya RAM ekleyin.

### E-postalardaki bağlantılar http:// veya iç bir adres kullanıyor

Odoo bağlantıları `web.base.url` sistem parametresinden oluşturur. `proxy_mode = True` ayarlı olduğundan emin olun, ardından `https://odoo.example.com` üzerinden yönetici olarak giriş yapın ve geliştirici modunda **Settings → Technical → System Parameters** altındaki parametreyi kontrol edin.

## Sonraki adımlar

- CRM'inizin yanına pazarlama otomasyonu ekleyin: [Mautic nasıl kurulur](/guides/install-mautic).
- Compose dosya biçimini [Docker Compose temelleri](/guides/docker-compose-basics) rehberinde tazeleyin.
- Odoo için sunucu seçeneklerini [Odoo hosting](/odoo-hosting), diğer CRM araçları için [CRM hosting](/crm-hosting) sayfasında inceleyin.
- fail2ban kuralları, statik dosya sunumu ve ileri worker ayarları için Odoo'nun [sistem yapılandırma rehberini](https://www.odoo.com/documentation/20.0/administration/on_premise/deploy.html) okuyun.

## Sık sorulan sorular

### Odoo ekleri ve yüklenen dosyaları nerede tutar?

PostgreSQL'de değil, odoo-web-data volume'u içindeki /var/lib/odoo/filestore/odoo konumundaki filestore'da. Bir yedek veya başka bir sunucuya taşıma, yedekleme bölümünde gösterildiği gibi aynı anda alınmış veritabanı dökümünü ve filestore arşivini gerektirir.

### Bu rehber neden deb paketleri yerine Docker kullanıyor?

Odoo'nun paket sayfasına göre Odoo 20 deb paketi şu anda yalnızca Ubuntu 24.04'ü destekler ve PDF üst ve alt bilgileri için wkhtmltopdf 0.12.6'nın elle kurulması gerekir. Odoo'nun bakımını yaptığı resmi imaj Docker'ın desteklediği her sürümde çalışır ve wkhtmltopdf 0.12.6.1'i zaten içerir.

### Kaç worker yapılandırmalıyım?

Odoo'nun dağıtım rehberi üst sınır için (CPU sayısı x 2) + 1 kuralını verir, worker başına yaklaşık altı eş zamanlı kullanıcı öngörür ve hafif istekler için yaklaşık 150 MB, ağır istekler için 1 GB RAM ayırmayı önerir. Küçük sunucularda daha düşük başlayın ve PostgreSQL'e bellek bırakın.

### Odoo 19'dan 20'ye imaj etiketini değiştirerek geçebilir miyim?

Hayır. Ana sürüm değişikliği bir veritabanı taşıması gerektirir ve özel modüllerin de yeni sürüme uyarlanması gerekir. Taşımayı Odoo'nun yükseltme belgelerine göre planlayın ve yükseltmeyi her zaman önce veritabanının bir kopyasında test edin.

### Veritabanı yöneticisini açık tutmalı mıyım?

Hayır. Odoo belgeleri internete açık sistemlerde onu kapatmayı kuvvetle önerir. Veritabanınız oluştuktan sonra list_db = False ayarlayın ve yedekler için web yedekleme düğmesi yerine pg_dump ile filestore arşivini kullanın.

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

Root erişiminiz olan ve Docker Engine'in desteklendiği her HyperDC Linux VPS, VDS veya dedicated sunucuda. Odoo en düşük donanım değeri yayınlamaz; sunucuyu bu rehberdeki worker formülüyle boyutlandırın ve kullanıcılarınız ile modülleriniz arttıkça büyütün.

---

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