İçeriğe geç

[ATÖLYE] Geliştirme Ortamı Kurulumu: Python, Docker, PostgreSQL ve Label Studio'yu Sıfırdan Kuralım

Veri etiketleme & kalite yönetimi kursunun tüm derslerinde kullanacağımız geliştirme ortamı: Python 3.12 (uv ile), Docker Compose, PostgreSQL, Label Studio ve ilk "Hello World" annotation projesi.

Şükrü Yusuf KAYA
45 dakikalık okuma
Başlangıç
[ATÖLYE] Geliştirme Ortamı Kurulumu: Python, Docker, PostgreSQL ve Label Studio'yu Sıfırdan Kuralım
🛠️ Bu atölyede
Tüm kursta kullanacağımız üretim kalitesinde geliştirme ortamını kuracağız. Sonunda: makinende Docker'la çalışan Label Studio + PostgreSQL kurulumu olacak, Python notebook'larından bu ortamla konuşabileceksin, ilk "Hello World" annotation projeni yapacaksın. Süre: ~45 dakika. Sabırlı olursan, geri dönmeyeceğin bir altyapı kuruyoruz.

Önce: Bu Atölye Sonunda Elinde Ne Olacak?#

✓ Python 3.12.x (uv ile) ✓ Docker Desktop (Windows/macOS) veya Docker Engine (Linux) ✓ Docker Compose v2 ✓ PostgreSQL 16 (container'da) ✓ Label Studio 1.13+ (container'da, Postgres backend ile) ✓ Türkçe NER için ilk annotation projesi ✓ Python notebook ile Label Studio API'sine bağlantı ✓ Git deposu, .env yapılandırması
Hepsi tek bir
docker compose up
ile başlayan, tekrarlanabilir, sıfırlanabilir bir kurulum.

Hangi İşletim Sistemi?#

Bu kurs Linux/macOS doğal hedefli. Ama gerçek dünya Windows ağırlıklı. Üç senaryoyu da destekliyoruz:

Senaryo A — Linux (Ubuntu 22.04 / 24.04, Debian, Arch)#

En kolay yol. Doğrudan ilerle.

Senaryo B — macOS (Apple Silicon / Intel)#

Çok kolay. Homebrew ile tüm araçlar 5 dakikada.

Senaryo C — Windows (10/11)#

WSL2 + Ubuntu 22.04 kullanacağız. Yerel Windows Python yerine WSL Linux ortamı çok daha temiz. Docker Desktop WSL2 integration açık olacak.
Önemli: Bu kursun her komutu Bash/Zsh varsayar. PowerShell'de doğrudan çalışmaz. Windows kullanıyorsan WSL2 zorunlu (kursun tamamında).
Adım 1: Sistem güncelleme
sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential curl git wget ca-certificates gnupg lsb-release
Adım 2: Docker Engine + Compose
# Docker'ın resmi repo'sunu ekle sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \ sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # Kullanıcı grubuna ekle (her docker komutunda sudo yazmamak için) sudo usermod -aG docker $USER newgrp docker # Doğrula docker --version docker compose version
Adım 3: uv (Python paket yöneticisi)
curl -LsSf https://astral.sh/uv/install.sh | sh source $HOME/.local/bin/env uv --version
✅ Checkpoint 1
Şu anda elinde çalışan docker, docker compose ve uv olmalı. Doğrulamak için bir terminal aç ve
docker run hello-world
çalıştır. "Hello from Docker!" çıktısı görürsen geçtin. Eğer hata varsa: Linux'te kullanıcıyı
docker
grubuna eklemeyi unuttuysan terminalden çıkıp tekrar gir. Windows'ta Docker Desktop'ın çalıştığından emin ol.

Proje Klasörünü Oluştur#

Kurs boyunca tüm kodlar tek bir proje altında olacak. Hadi başlatalım:
# Tercih ettiğin klasöre git cd ~/projects # veya istediğin yer # Proje klasörü oluştur mkdir veri-etiketleme-atolye cd veri-etiketleme-atolye # Git başlat git init echo "node_modules/\n.venv/\n__pycache__/\n*.pyc\n.env\nls_data/" > .gitignore

Python Sanal Ortamı + uv#

uv, Python paket yönetiminin yeni nesli. pip + virtualenv + poetry'den 10-100x hızlı. Bu kursta tek paket yöneticisi olarak uv kullanacağız.
# Proje için Python 3.12 ortamı uv python install 3.12 uv venv --python 3.12 .venv # Sanal ortamı aktive et source .venv/bin/activate # Linux/macOS/WSL # Windows native (kullanmıyoruz ama bilgi): .venv\Scripts\activate # Doğrula which python python --version # 3.12.x görmen lazım
Şimdi ihtiyaç duyacağımız temel paketleri kuralım:
uv pip install \ "label-studio-sdk>=1.0" \ "pandas>=2.2" \ "numpy>=1.26" \ "scikit-learn>=1.5" \ "matplotlib>=3.9" \ "seaborn>=0.13" \ "jupyterlab>=4.2" \ "ipykernel>=6.29" \ "python-dotenv>=1.0" \ "psycopg[binary]>=3.2" \ "requests>=2.32" # Jupyter kernel kaydı python -m ipykernel install --user --name veri-etiketleme --display-name "Veri Etiketleme (Python 3.12)"

docker-compose.yml — Label Studio + PostgreSQL#

Şimdi production-grade kurulum: Label Studio resmi sqlite ile gelir ama biz PostgreSQL backend kullanacağız. Bu, gerçek dünya kurumsal kurulumun ta kendisi.
Proje kökünde
docker-compose.yml
oluştur:
yaml
# docker-compose.yml
# Veri Etiketleme & Kalite Yönetimi — Atölye Ortamı
# Label Studio + PostgreSQL
 
services:
postgres:
image: postgres:16-alpine
container_name: ve-postgres
restart: unless-stopped
environment:
POSTGRES_DB: ${POSTGRES_DB:-labelstudio}
POSTGRES_USER: ${POSTGRES_USER:-labelstudio}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-labelstudio}"]
interval: 5s
timeout: 5s
retries: 5
 
label-studio:
image: heartexlabs/label-studio:1.13.1
container_name: ve-label-studio
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
DJANGO_DB: default
POSTGRE_NAME: ${POSTGRES_DB:-labelstudio}
POSTGRE_USER: ${POSTGRES_USER:-labelstudio}
POSTGRE_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
POSTGRE_PORT: 5432
POSTGRE_HOST: postgres
LABEL_STUDIO_USERNAME: ${LS_USER:-admin@local.dev}
LABEL_STUDIO_PASSWORD: ${LS_PASSWORD:-changeme123}
LABEL_STUDIO_DISABLE_SIGNUP_WITHOUT_LINK: "true"
LABEL_STUDIO_HOST: http://localhost:8080
ports:
- "8080:8080"
volumes:
- ./ls_data:/label-studio/data
 
volumes:
postgres_data:
name: ve_postgres_data
 
docker-compose.yml — Label Studio + PostgreSQL üretim benzeri kurulum

.env dosyası#

Proje kökünde
.env
oluştur (gizli kalmalı, git'e girmemeli):
# .env — gizli, .gitignore'a eklendi POSTGRES_DB=labelstudio POSTGRES_USER=labelstudio POSTGRES_PASSWORD=guclu-bir-parola-buraya LS_USER=admin@local.dev LS_PASSWORD=Atolye2026!
Production'da bu parolaları kesinlikle değiştir. Yerel atölye için yeterli.

Kalkış!#

# Servisleri başlat docker compose up -d # Logları izle (Label Studio'nun ilk başlatma 30-60 saniye sürer) docker compose logs -f label-studio
Beklenen son loglar:
... Listening at: http://0.0.0.0:8080 ... ... INFO Label Studio is fully ready ...
Tarayıcıdan aç: http://localhost:8080
.env
'de tanımladığın
LS_USER
(admin@local.dev) ve
LS_PASSWORD
ile giriş yap.
Label Studio giriş ekranı — ilk açılış.
Email + parola → ilk proje ekranı.
✅ Checkpoint 2
http://localhost:8080 açıldı ve giriş yapabildiysen ana kurulum tamam. PostgreSQL backend doğru çalışıyor demektir (yoksa Label Studio başlamazdı). Eğer port 8080 dolu hatası gelirse: docker-compose.yml'deki
8080:8080
satırını
8090:8080
olarak değiştir, http://localhost:8090 kullan.

İlk Proje: Türkçe Duygu Analizi Sınıflandırması#

Hadi gerçek bir annotation projesi kuralım. Senaryo: Türk e-ticaret ürün yorumlarının pozitif/negatif/nötr sınıflandırması.

Adım 1: Yeni Proje#

  • Label Studio'da sağ üstte Create Project.
  • Name: "Türkçe Ürün Yorumu Sentiment"
  • Description: "Atölye demo projesi - 3 sınıf duygu analizi"
  • Next.

Adım 2: Data Import#

"Manual Import" sekmesinde aşağıdaki JSON'u kopyala-yapıştır (veya dosyaya kaydet):
json
[
{"text": "Ürün vaktinde geldi, kalitesi beklediğimden çok iyi, kesinlikle tavsiye ederim."},
{"text": "Kargo bir hafta geç geldi, ürünün ambalajı da hasarlıydı. Çok hayal kırıklığıydı."},
{"text": "Ürün açıklamada belirtildiği gibi, ne fazla ne eksik. İdare eder."},
{"text": "Müthiş bir alışveriş deneyimi, satıcı her sorumu hızlıca cevapladı. 5 yıldız az."},
{"text": "Renk fotoğraftakinden çok farklı çıktı. İade etmek istiyorum."},
{"text": "Standart bir ürün, beklenen kalite. Sürpriz yok."},
{"text": "Beklediğimden hızlı geldi ama kutu açıkken geldi. Çelişkili duygular."},
{"text": "Fiyatına göre fena değil, ama lüks beklemeyin. Günlük kullanım için yeterli."},
{"text": "Hediye olarak aldım, çok beğenildi! Tekrar alacağım."},
{"text": "Açıklamada yazan özellikler ürünle uyuşmuyor. Yanıltıcı satıcı."}
]
demo_yorumlar.json — 10 örnek Türkçe yorum

Adım 3: Etiketleme Şablonu Seç#

  • Text Classification kategorisinden Sentiment Analysis şablonunu seç.
  • "Code" sekmesinde aşağıdaki XML'i yapıştır:
xml
<View>
<Header value="Türkçe Ürün Yorumu Sentiment Analizi"/>
 
<Text name="yorum" value="$text"/>
 
<Choices name="sentiment" toName="yorum" choice="single" showInLine="true">
<Choice value="pozitif" hotkey="1" background="#22c55e"/>
<Choice value="nötr" hotkey="2" background="#94a3b8"/>
<Choice value="negatif" hotkey="3" background="#ef4444"/>
</Choices>
 
<View style="margin-top: 1em; padding: 1em; background: #f9fafb; border-radius: 8px;">
<Header value="📋 Kılavuz"/>
<Text name="rehber" value="• Pozitif: Müşteri memnun, tavsiye ediyor. • Nötr: Karışık/notr ifade, hayal kırıklığı yok. • Negatif: Memnuniyetsizlik, şikayet var."/>
</View>
</View>
Label Studio XML config — 3 sınıf sentiment + kılavuz görüntüsü

Adım 4: Etiketle!#

  • "Save" → Projeye gir.
  • "Label All Tasks" → 10 yorumu sırayla etiketle. Hotkey
    1/2/3
    çok hızlı (bilgisayar penceresinde olduğun sürece çalışır).
  • Submit'ten sonra bir sonraki gelir.
10 örneği etiketledikten sonra Export → JSON-MIN formatında indir. Bu, modeline besleyeceğin temel formatın bir örneği.
Label Studio'da Türkçe sentiment annotation — hotkey'lerle hızlı etiketleme.
Modern annotation UI: keyboard-first, anında geri bildirim.

Python'dan Label Studio API'sine Bağlan#

Şimdi en heyecan verici kısım: kodla annotation pipeline'ını kontrol etmek.
bash
# Label Studio'da sağ üstten profilinize tıkla → Account & Settings → Access Token
# Token'ı kopyala, .env dosyasına ekle:
echo "LS_TOKEN=buraya-token-yapistir" >> .env
echo "LS_URL=http://localhost:8080" >> .env
API token'ı .env'ye ekle
python
# notebooks/00_ls_api_test.py
import os
from dotenv import load_dotenv
from label_studio_sdk.client import LabelStudio
 
load_dotenv()
 
ls = LabelStudio(
base_url=os.getenv("LS_URL", "http://localhost:8080"),
api_key=os.getenv("LS_TOKEN"),
)
 
# Tüm projeleri listele
projects = list(ls.projects.list())
print(f"Toplam proje sayısı: {len(projects)}")
 
for p in projects:
print(f" [{p.id}] {p.title} — {p.task_number} task")
 
# İlk projeyi seç
if projects:
proj = projects[0]
print(f"\n📋 Detay: {proj.title}")
print(f" Açıklama: {proj.description}")
print(f" Task sayısı: {proj.task_number}")
 
# Etiketlenen task'ları çek
tasks = list(ls.tasks.list(project=proj.id))
print(f"\n📝 Etiketlenmiş task'lar:")
for t in tasks[:5]:
text = t.data.get("text", "")[:60]
annotations = t.annotations
if annotations:
label = annotations[0]["result"][0]["value"]["choices"][0] \
if annotations[0]["result"] else "?"
print(f" [{label:8s}] {text}...")
 
notebooks/00_ls_api_test.py — Python'dan Label Studio'ya bağlantı testi
Çalıştır:
python notebooks/00_ls_api_test.py
Beklenen çıktı:
Toplam proje sayısı: 1 [1] Türkçe Ürün Yorumu Sentiment — 10 task 📋 Detay: Türkçe Ürün Yorumu Sentiment Açıklama: Atölye demo projesi - 3 sınıf duygu analizi Task sayısı: 10 📝 Etiketlenmiş task'lar: [pozitif ] Ürün vaktinde geldi, kalitesi beklediğimden çok iyi, kesi... [negatif ] Kargo bir hafta geç geldi, ürünün ambalajı da hasarlıydı... [nötr ] Ürün açıklamada belirtildiği gibi, ne fazla ne eksik. İd... ...
Eğer bu çıktıyı aldıysan, veri etiketleme mühendisliği yolculuğun resmen başladı. Kodla annotation kontrol edebiliyorsun — buradan ileride çok şey gelecek.
✅ Checkpoint 3 — Final
Python notebook'tan Label Studio API'sine bağlandın ve task'ları çekebildin. Bu noktada Modül 0 tamamen bitmiş demek. Sonraki tüm modüller (1-22) bu altyapı üzerine kurulacak. Sıfırlamak istersen:
docker compose down -v && docker compose up -d
— temiz başlangıç.

Son Adım: Kodu Git'e Commit Et#

# .env dosyasının .gitignore'da olduğundan emin ol cat .gitignore | grep .env || echo ".env" >> .gitignore # Dosyaları stage'le git add docker-compose.yml .gitignore notebooks/ # İlk commit git commit -m "atölye(modul-0): geliştirme ortamı kurulumu - LS + Postgres + uv"
İsterseni GitHub'a public repo olarak da yükleyebilirsin — kursun her modülünde bu repo büyüyecek.

Sorun Giderme — Yaygın Hatalar#

"Cannot connect to the Docker daemon"#

Linux:
sudo systemctl start docker
. macOS/Windows: Docker Desktop'ı aç.

"Port 8080 already in use"#

docker-compose.yml
'de
8080:8080
8090:8080
. URL: http://localhost:8090.

"Label Studio sürekli yeniden başlıyor"#

docker compose logs label-studio | tail -50
→ genelde Postgres bağlantı sorunu.
.env
'deki parola doğru mu? Container'larda aynı mı?

"uv command not found"#

Yeni terminal aç, ya da
source $HOME/.local/bin/env
çalıştır.

"Permission denied: /var/run/docker.sock" (Linux)#

sudo usermod -aG docker $USER && newgrp docker
.

WSL2'de Docker yavaş#

WSL'i v2'de tutmayı unutma.
wsl --set-default-version 2
. Ayrıca proje klasörünü
/mnt/c/...
yerine
~/projects/...
altında tut (Linux dosya sistemi).

Bellek/CPU az#

Label Studio + Postgres yaklaşık 1.5-2 GB RAM ister. Docker Desktop > Settings > Resources'tan en az 4GB ayır.

Modül 0 Özet#

Bu modülde:
  • Ders 0.1: Veri-merkezli AI manifestosu — neden veriye yatırım?
  • Ders 0.2: Kariyer haritası — 8 rol, maaş bantları, gün-içi
  • Ders 0.3: Türkiye ekosistemi — vendor'lar, KVKK, Türkçe veri fırsatı
  • Ders 0.4 (bu): Atölye kurulumu — Python + Docker + LS + Postgres çalışıyor
Sıradaki: Part I — Temeller
Modül 1'de "Veri Etiketlemenin Anatomisi"ne giriyoruz: etiketleme türleri taksonomisi, supervised/semi-supervised farkı, ve ground truth illüzyonu. Hazırsan, bir sonraki derste görüşürüz.
🙏 Geri bildirim aç
Bu atölye Windows/macOS/Linux üçlüsünde test edildi ama eksik yerler olabilir. Eğer takıldığın bir adım olursa, sukruyusufkaya.com üzerindeki iletişim formundan yaz — hızlıca düzeltirim ve diğer öğrenciler için doküman güncellenir.

Sık Sorulan Sorular

Evet, bu kurs için şart. Windows native PowerShell'de Label Studio çalıştırılabilir ama tüm bash komutları, Linux container'ları ve sonraki modüllerdeki ML backend'leri için WSL2 + Ubuntu çok daha temiz. "Microsoft Store" → "Ubuntu 22.04 LTS" yeterli.

Yorumlar & Soru-Cevap

(0)
Yorum yazmak için giriş yap.
Yorumlar yükleniyor...

İlgili İçerikler