[WORKSHOP] Setting Up Your Development Environment: Python, Docker, PostgreSQL and Label Studio from Scratch
The development environment we'll use throughout the Data Labeling & Quality Management course: Python 3.12 (with uv), Docker Compose, PostgreSQL, Label Studio, and your first 'Hello World' annotation project.
Şükrü Yusuf KAYA
45 min read
Beginner🛠️ 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 ile başlayan, tekrarlanabilir, sıfırlanabilir bir kurulum.
docker compose upHangi İş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 çalıştır. "Hello from Docker!" çıktısı görürsen geçtin. Eğer hata varsa: Linux'te kullanıcıyı grubuna eklemeyi unuttuysan terminalden çıkıp tekrar gir. Windows'ta Docker Desktop'ın çalıştığından emin ol.
docker run hello-worlddockerProje 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 oluştur:
docker-compose.ymlyaml
# 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 oluştur (gizli kalmalı, git'e girmemeli):
.env# .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
✅ 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 satırını olarak değiştir, http://localhost:8090 kullan.
8080:80808090:8080İ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 çok hızlı (bilgisayar penceresinde olduğun sürece çalışır).
1/2/3 - 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.
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" >> .envecho "LS_URL=http://localhost:8080" >> .envAPI token'ı .env'ye ekle
python
# notebooks/00_ls_api_test.pyimport osfrom dotenv import load_dotenvfrom 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 listeleprojects = 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: — temiz başlangıç.
docker compose down -v && docker compose up -dSon 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: . macOS/Windows: Docker Desktop'ı aç.
sudo systemctl start docker"Port 8080 already in use"#
"Label Studio sürekli yeniden başlıyor"#
docker compose logs label-studio | tail -50.env"uv command not found"#
Yeni terminal aç, ya da çalıştır.
source $HOME/.local/bin/env"Permission denied: /var/run/docker.sock" (Linux)#
sudo usermod -aG docker $USER && newgrp dockerWSL2'de Docker yavaş#
WSL'i v2'de tutmayı unutma. . Ayrıca proje klasörünü yerine altında tut (Linux dosya sistemi).
wsl --set-default-version 2/mnt/c/...~/projects/...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.
Frequently Asked Questions
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...
Related Content
Module 0: Introduction & Framework
The Data-Centric AI Manifesto: Why You Should Invest in Data More Than Models
Start LearningModule 0: Introduction & Framework
The Data Labeling Engineer Career Map: From Annotator to Head of Data Operations
Start LearningModule 0: Introduction & Framework