Skip to content

Workshop Setup — Postgres, MinIO, Kafka, Spark, Jupyter with uv + Docker Compose

Set up your professional local data stack for the whole course: uv + Python 3.12, Docker Compose with Postgres 16 + pgvector + MinIO + Kafka + Spark + JupyterLab. Step-by-step, including error troubleshooting.

Şükrü Yusuf KAYA
65 min read
Beginner
Atölye Kurulumu — uv + Docker Compose ile Postgres, MinIO, Kafka, Spark, Jupyter
🛠️ Bu derste ne yapacağız?
Laptop'una uçtan uca çalışan bir veri stack kuracağız: Python 3.12 environment + Docker Compose ile 6 servis ayağa kalkacak (Postgres + pgvector, MinIO, Kafka, Schema Registry, Spark, JupyterLab). Kurulum sonunda "hello pipeline" çalıştırıp her şeyin entegre çalıştığını teyit edeceğiz. Bu setup kursun TAMAMI boyunca kullanılacak.
🔧 Önkoşullar
Donanım: 16GB RAM minimum (8GB ile de çalışır ama Spark sıkışabilir), 30GB boş disk, herhangi bir modern CPU (Apple Silicon dahil). OS: macOS, Linux veya Windows + WSL2. Yazılım: Docker Desktop (Mac/Windows) ya da Docker Engine (Linux), Git, bir IDE (VS Code öneriyorum). İnternet: İlk image pull için ~6GB indirme; sonra offline çalışır.

Adım 1: Docker'ı Kur ve Doğrula#

Docker tüm stack'in temeli. Kurulu değilse şimdi yapalım.

macOS (Apple Silicon ve Intel)#

Docker Desktop indir → DMG aç → uygulamalar klasörüne sürükle → Docker Desktop'u başlat. İlk açılışta "Use recommended settings" seç.
Apple Silicon ipucu: Settings → General → "Use Rosetta for x86/amd64 emulation" işaretle (bazı imajlar amd64). Settings → Resources → 8GB RAM, 4 CPU minimum ver (varsayılan az olabilir).

Linux (Ubuntu 22.04+)#

# Eski Docker'ı kaldır sudo apt-get remove docker docker-engine docker.io containerd runc # Repository ekle sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg 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 echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # Yükle sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # Kullanıcıyı docker grubuna ekle (relogin gerekli) sudo usermod -aG docker $USER

Windows + WSL2#

  1. WSL2 kur: PowerShell admin →
    wsl --install
  2. Docker Desktop for Windows indir, kur.
  3. Docker Desktop → Settings → Resources → WSL Integration → kullandığın distro'yu enable et.
  4. Bundan sonra bütün komutları WSL2 terminalinden çalıştır (PowerShell'den değil).

Doğrulama#

docker --version # Beklenen: Docker version 25.x veya üzeri docker compose version # Beklenen: Docker Compose version v2.30 veya üzeri docker run --rm hello-world # Beklenen: "Hello from Docker!" mesajı
Hata: "Cannot connect to the Docker daemon" → Docker Desktop açık değil veya Linux'ta servisi başlatmadın:
sudo systemctl start docker
.

Adım 2: uv ile Python 3.12 Kur#

uv
, Astral'in (Ruff'un yapıcısı) Rust ile yazdığı yeni Python paket yöneticisi. pip + venv + pip-tools + pyenv'in işini tek aracıda topluyor. 10–100x daha hızlı. 2025'ten itibaren Python ekosisteminde fiilî standart hâline geldi.

Kurulum#

macOS / Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh # Yeni shell aç veya: source $HOME/.local/bin/env
Windows (WSL2'de yukarıdakini, native PowerShell'de aşağıdakini):
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Doğrulama#

uv --version # Beklenen: uv 0.5.0 veya üzeri

Proje dizinini kur#

# Kurs klasörü oluştur mkdir -p ~/projects/ai-veri-muh cd ~/projects/ai-veri-muh # Python 3.12 ile yeni proje uv init --python 3.12 # Bu şu dosyaları üretir: # pyproject.toml # .python-version # README.md # .gitignore # main.py # Çekirdek paketleri ekle uv add jupyter ipykernel pandas polars duckdb pyarrow psycopg2-binary minio kafka-python pyspark==3.5.3 sqlalchemy great-expectations
Neden bu paketler?
PaketNe için
jupyter
+
ipykernel
Interactive notebook
pandas
Klasik DataFrame ops
polars
Modern Rust-tabanlı DataFrame (10x hızlı)
duckdb
In-process OLAP, lokal Parquet sorgu
pyarrow
Arrow + Parquet için
psycopg2-binary
Postgres connector
minio
MinIO/S3 client
kafka-python
Kafka producer/consumer
pyspark
Distributed batch processing
sqlalchemy
ORM/SQL abstraction
great-expectations
Data quality
bash
# Beklenen çıktı (özetlenmiş):
$ uv add jupyter pandas polars duckdb pyarrow ...
Resolved 142 packages in 1.34s
Prepared 142 packages in 4.12s
Installed 142 packages in 187ms
+ duckdb==1.1.3
+ jupyter==1.1.1
+ kafka-python==2.0.2
+ pandas==2.2.3
+ polars==1.18.0
+ psycopg2-binary==2.9.10
+ pyarrow==18.1.0
+ pyspark==3.5.3
+ ...
uv add komutu — bağımlılıkları çözüp lock'lar, 142 paketi 5 saniyenin altında kurar.
💡 uv ipucu
uv ile çalıştırırken "python ..." yerine "uv run python ..." kullan (otomatik venv activation). Veya "uv pip install -e ." ile geleneksel pip-style da kullanabilirsin. Lock file ("uv.lock") commit etmek standart — aynı setup'ı başka makinede yeniden üretiyor.

Adım 3: Docker Compose Dosyasını Hazırla#

Şimdi tüm servisleri tanımlayan tek bir
docker-compose.yml
yazacağız. Bu dosya, kursun TAMAMI boyunca kullanılacak. Servisler:
ServisImagePortAmaç
postgres
pgvector/pgvector:pg16
5432OLTP + pgvector ile vector store
minio
minio/minio:latest
9000 (API), 9001 (UI)S3-uyumlu object store
kafka
apache/kafka:3.8.0
9092Mesajlaşma backbone
schema-registry
confluentinc/cp-schema-registry:7.6.0
8081Avro/Protobuf schema
spark
bitnami/spark:3.5.3
8080 (UI), 7077 (master)Distributed batch
jupyter
jupyter/pyspark-notebook:latest
8888Notebook IDE
Her servis kendi volume'unda veri tutuyor, böylece
docker compose down
yaptığında veri kaybolmuyor.
Aşağıdaki dosyayı projenin kök dizinine kopyala:
yaml
# docker-compose.yml
name: ai-veri-muh
 
services:
# ============================================================
# Postgres 16 + pgvector — OLTP + vector store
# ============================================================
postgres:
image: pgvector/pgvector:pg16
container_name: ai-veri-postgres
restart: unless-stopped
environment:
POSTGRES_USER: dataeng
POSTGRES_PASSWORD: dataeng_pw_2026
POSTGRES_DB: lab
POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --locale=C"
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
- ./docker/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U dataeng -d lab"]
interval: 10s
timeout: 5s
retries: 5
networks:
- lab-net
 
# ============================================================
# MinIO — S3-uyumlu object store
# ============================================================
minio:
image: minio/minio:latest
container_name: ai-veri-minio
restart: unless-stopped
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin_pw_2026
command: server /data --console-address ":9001"
ports:
- "9000:9000" # API
- "9001:9001" # Console UI
volumes:
- minio_data:/data
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 10s
retries: 5
networks:
- lab-net
 
# MinIO bucket'larını hazırlamak için one-shot init container
minio-init:
image: minio/mc:latest
container_name: ai-veri-minio-init
depends_on:
minio:
condition: service_healthy
entrypoint: >
/bin/sh -c "
mc alias set local http://minio:9000 minioadmin minioadmin_pw_2026;
mc mb -p local/raw 2>/dev/null || true;
mc mb -p local/lakehouse 2>/dev/null || true;
mc mb -p local/landing 2>/dev/null || true;
mc anonymous set public local/raw;
echo '✅ MinIO bucket setup complete';
exit 0;
"
networks:
- lab-net
 
# ============================================================
# Kafka (KRaft mode — Zookeeper yok!)
# ============================================================
kafka:
image: apache/kafka:3.8.0
container_name: ai-veri-kafka
restart: unless-stopped
ports:
- "9092:9092"
- "9093:9093"
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
CLUSTER_ID: "MkU3OEVBNTcwNTJENDM2Qk"
volumes:
- kafka_data:/var/lib/kafka/data
networks:
- lab-net
 
# ============================================================
# Schema Registry — Avro/Protobuf schema yönetimi
# ============================================================
schema-registry:
image: confluentinc/cp-schema-registry:7.6.0
container_name: ai-veri-schema-registry
restart: unless-stopped
depends_on:
- kafka
ports:
- "8081:8081"
environment:
SCHEMA_REGISTRY_HOST_NAME: schema-registry
SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: PLAINTEXT://kafka:9092
SCHEMA_REGISTRY_LISTENERS: http://0.0.0.0:8081
networks:
- lab-net
 
# ============================================================
# Spark master + worker
# ============================================================
spark-master:
image: bitnami/spark:3.5.3
container_name: ai-veri-spark-master
restart: unless-stopped
environment:
SPARK_MODE: master
SPARK_RPC_AUTHENTICATION_ENABLED: "no"
SPARK_RPC_ENCRYPTION_ENABLED: "no"
SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED: "no"
SPARK_SSL_ENABLED: "no"
ports:
- "7077:7077" # master
- "8080:8080" # UI
networks:
- lab-net
 
spark-worker:
image: bitnami/spark:3.5.3
container_name: ai-veri-spark-worker
restart: unless-stopped
depends_on:
- spark-master
environment:
SPARK_MODE: worker
SPARK_MASTER_URL: spark://spark-master:7077
SPARK_WORKER_MEMORY: 2G
SPARK_WORKER_CORES: 2
SPARK_RPC_AUTHENTICATION_ENABLED: "no"
SPARK_RPC_ENCRYPTION_ENABLED: "no"
SPARK_SSL_ENABLED: "no"
networks:
- lab-net
 
# ============================================================
# JupyterLab — interactive notebook environment
# ============================================================
jupyter:
image: jupyter/pyspark-notebook:python-3.11
container_name: ai-veri-jupyter
restart: unless-stopped
user: root
environment:
JUPYTER_TOKEN: "dataeng2026"
GRANT_SUDO: "yes"
JUPYTER_ENABLE_LAB: "yes"
SPARK_OPTS: "--master=spark://spark-master:7077"
ports:
- "8888:8888"
volumes:
- ./notebooks:/home/jovyan/work
- jupyter_data:/home/jovyan/.local
networks:
- lab-net
 
volumes:
postgres_data:
minio_data:
kafka_data:
jupyter_data:
 
networks:
lab-net:
driver: bridge
 
docker-compose.yml — projenin kök dizinine kopyala.

Bonus: Postgres init script#

Postgres ilk açılırken pgvector extension'ını otomatik yüklesin:
mkdir -p docker/postgres
Sonra şu dosyayı oluştur:
sql
-- docker/postgres/init.sql
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
 
-- Lab şeması
CREATE SCHEMA IF NOT EXISTS lab;
GRANT ALL PRIVILEGES ON SCHEMA lab TO dataeng;
 
-- "Hello pipeline" için örnek tablo
CREATE TABLE IF NOT EXISTS lab.events (
event_id BIGSERIAL PRIMARY KEY,
event_type TEXT NOT NULL,
payload JSONB NOT NULL,
embedding VECTOR(384), -- pgvector!
created_at TIMESTAMPTZ DEFAULT now()
);
 
CREATE INDEX idx_events_type ON lab.events(event_type);
CREATE INDEX idx_events_created ON lab.events(created_at DESC);
 
COMMENT ON TABLE lab.events IS 'AI veri mühendisliği kursu — örnek event tablosu';
init.sql — Postgres ilk açılışta extension'ları kurar ve örnek tablo oluşturur.

Adım 4: Stack'i Ayağa Kaldır#

Şimdi her şey yerinde — başlatıyoruz.
# Proje kök dizininde docker compose up -d # Çıktıyı izle (servisler healthy oluyor mu?) docker compose ps
İlk çalıştırmada ~6GB image indirilir, 3–5 dakika sürer. Sonraki başlatmalar 10–15 saniye.

Beklenen
docker compose ps
çıktısı#

NAME STATUS PORTS ai-veri-postgres Up (healthy) 0.0.0.0:5432->5432/tcp ai-veri-minio Up (healthy) 0.0.0.0:9000-9001->9000-9001/tcp ai-veri-kafka Up 0.0.0.0:9092-9093->9092-9093/tcp ai-veri-schema-registry Up 0.0.0.0:8081->8081/tcp ai-veri-spark-master Up 0.0.0.0:7077->7077, 0.0.0.0:8080->8080 ai-veri-spark-worker Up 7077/tcp ai-veri-jupyter Up 0.0.0.0:8888->8888/tcp
ai-veri-minio-init
containerını listede görmeyebilirsin — bucket'ları oluşturup kapanıyor (normal).

Adım 5: Her Servisi Tek Tek Doğrula#

5.1 — Postgres#

docker exec -it ai-veri-postgres psql -U dataeng -d lab -c "SELECT extname, extversion FROM pg_extension;"
Beklenen:
extname | extversion -----------------+------------ plpgsql | 1.0 vector | 0.7.4 pg_trgm | 1.6 pg_stat_statements | 1.11

5.2 — MinIO#

Tarayıcıda aç: http://localhost:9001
  • User:
    minioadmin
  • Pass:
    minioadmin_pw_2026
Sol menüde "Object Browser" →
raw
,
lakehouse
,
landing
bucket'larını görmelisin.

5.3 — Kafka#

# Test topic oluştur docker exec ai-veri-kafka /opt/kafka/bin/kafka-topics.sh \ --bootstrap-server localhost:9092 \ --create --topic test-topic --partitions 3 --replication-factor 1 # Topic'leri listele docker exec ai-veri-kafka /opt/kafka/bin/kafka-topics.sh \ --bootstrap-server localhost:9092 --list
Beklenen çıktı:
Created topic test-topic. test-topic

5.4 — Schema Registry#

curl -s http://localhost:8081/subjects # Beklenen: [] (henüz schema yok ama servis canlı)

5.5 — Spark#

Tarayıcıda aç: http://localhost:8080 "Workers" bölümünde 1 worker görmelisin (2 cores, 2GB RAM).

5.6 — JupyterLab#

Tarayıcıda aç: http://localhost:8888
  • Token:
    dataeng2026
Sol panelde
work/
klasörü görmelisin.

Adım 6: "Hello Pipeline" — Her Şeyi Birleştir#

Şimdi 7 dakikalık bir mini-pipeline yazıyoruz. Tüm servislerle konuşacak:
  1. Postgres'e veri yaz
  2. MinIO'ya Parquet kaydet
  3. Kafka'ya event publish et
  4. DuckDB ile MinIO'daki Parquet'i sorgula
  5. Spark ile aynı veriyi okuyup aggregate et
JupyterLab'i aç (
http://localhost:8888
), yeni Python notebook oluştur, aşağıdakini yapıştır:
python
# === HELLO PIPELINE — Lokal stack entegrasyon testi ===
 
# 1) Bağımlılıklar (notebook içinde olduğun için tek seferlik install)
import subprocess
subprocess.run(["pip", "install", "-q", "psycopg2-binary", "minio", "kafka-python", "duckdb", "pyarrow", "pandas"], check=True)
 
import psycopg2, json, random, uuid, io
from datetime import datetime
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq
from minio import Minio
from kafka import KafkaProducer
import duckdb
 
# 2) Veriyi üret — 10K sahte event
print("🎲 Sahte event'ler üretiliyor...")
events = [
{
"event_id": str(uuid.uuid4()),
"event_type": random.choice(["page_view", "click", "purchase", "search"]),
"user_id": f"user_{random.randint(1, 1000)}",
"amount": round(random.uniform(0, 500), 2),
"ts": datetime.utcnow().isoformat(),
}
for _ in range(10_000)
]
df = pd.DataFrame(events)
print(f" ✅ {len(df):,} event üretildi")
 
# 3) Postgres'e yaz
print("\n🐘 Postgres'e yazılıyor...")
conn = psycopg2.connect(
host="postgres", dbname="lab", user="dataeng", password="dataeng_pw_2026"
)
cur = conn.cursor()
# İlk 100'ünü Postgres'e
for ev in events[:100]:
cur.execute(
"INSERT INTO lab.events (event_type, payload) VALUES (%s, %s)",
(ev["event_type"], json.dumps(ev)),
)
conn.commit()
cur.execute("SELECT COUNT(*) FROM lab.events;")
pg_count = cur.fetchone()[0]
print(f" ✅ Postgres'te şu an {pg_count} satır var")
cur.close()
conn.close()
 
# 4) MinIO'ya Parquet olarak yaz
print("\n📦 MinIO'ya Parquet yazılıyor...")
mc = Minio(
"minio:9000",
access_key="minioadmin",
secret_key="minioadmin_pw_2026",
secure=False,
)
table = pa.Table.from_pandas(df)
buf = io.BytesIO()
pq.write_table(table, buf, compression="snappy")
buf.seek(0)
mc.put_object(
"lakehouse",
"hello/events.parquet",
buf,
length=buf.getbuffer().nbytes,
content_type="application/octet-stream",
)
print(f" ✅ s3://lakehouse/hello/events.parquet yazıldı ({buf.getbuffer().nbytes / 1024:.1f} KB)")
 
# 5) Kafka'ya event publish
print("\n📡 Kafka'ya yayın yapılıyor...")
producer = KafkaProducer(
bootstrap_servers="kafka:9092",
value_serializer=lambda v: json.dumps(v).encode("utf-8"),
)
for ev in events[:50]:
producer.send("hello-topic", ev)
producer.flush()
print(" ✅ 50 event 'hello-topic' topic'ine gönderildi")
 
# 6) DuckDB ile MinIO'daki Parquet'i sorgula (no-download!)
print("\n🦆 DuckDB ile MinIO'daki Parquet'i sorgula...")
conn = duckdb.connect()
conn.execute("INSTALL httpfs; LOAD httpfs;")
conn.execute("""
SET s3_endpoint='minio:9000';
SET s3_access_key_id='minioadmin';
SET s3_secret_access_key='minioadmin_pw_2026';
SET s3_use_ssl=false;
SET s3_url_style='path';
""")
result = conn.execute("""
SELECT event_type, COUNT(*) AS n, ROUND(SUM(amount), 2) AS total
FROM read_parquet('s3://lakehouse/hello/events.parquet')
GROUP BY 1
ORDER BY n DESC;
""").df()
print(result.to_string(index=False))
 
print("\n🎉 HELLO PIPELINE BAŞARILI — bütün servisler birlikte çalışıyor!")
 
Hello pipeline — her servisin entegre çalıştığını teyit eder.

Beklenen çıktı#

🎲 Sahte event'ler üretiliyor... ✅ 10,000 event üretildi 🐘 Postgres'e yazılıyor... ✅ Postgres'te şu an 100 satır var 📦 MinIO'ya Parquet yazılıyor... ✅ s3://lakehouse/hello/events.parquet yazıldı (185.3 KB) 📡 Kafka'ya yayın yapılıyor... ✅ 50 event 'hello-topic' topic'ine gönderildi 🦆 DuckDB ile MinIO'daki Parquet'i sorgula... event_type n total page_view 2516 629342.18 click 2491 624105.87 search 2503 625882.11 purchase 2490 624471.92 🎉 HELLO PIPELINE BAŞARILI — bütün servisler birlikte çalışıyor!
Bu çıktıyı aldıysan: stack hazır, kursun geri kalanına geçebilirsin. Bu küçük örnek aslında gerçek bir AI pipeline'ının kemiklerini taşıyor — log üretimi (Kafka), batch storage (MinIO Parquet), OLTP referans (Postgres), zero-copy sorgu (DuckDB). Bunu çalıştırabilen biri, üzerine her şey kurabilir.

Adım 7: Sık Karşılaşılan Hatalar ve Çözümler#

Kurs boyunca tekrar tekrar bu listeye döneceksin. Bookmark'la.
Sebep: Lokal makinada başka bir servis aynı portu kullanıyor (örn. Postgres 5432, başka bir proje).
Çözüm 1: O servisi durdur (
sudo lsof -i :5432
ile bulup öldür).
Çözüm 2:
docker-compose.yml
içinde port mapping'i değiştir:
ports: - "5433:5432" # external:internal
Sonra Postgres'e bağlanırken host port'u 5433 kullan.

Adım 8: VS Code / Cursor Yapılandırması#

Kursu rahat takip etmek için bir IDE'ye birkaç extension koymanı öneriyorum.

Önerilen extension'lar (VS Code / Cursor ortak)#

ExtensionNe için
Python (ms-python.python)Python language server
Jupyter (ms-toolsai.jupyter)Notebook'u VS Code içinden çalıştır
Docker (ms-azuretools.vscode-docker)docker-compose.yml IntelliSense
PostgreSQL (cweijan.vscode-postgresql-client2)DB explorer + SQL editor
Even Better TOML (tamasfe.even-better-toml)pyproject.toml syntax
Ruff (charliermarsh.ruff)Python linter (uv ile entegre)
GitLens (eamodio.gitlens)Git history içinde dolaş
MyPy (matangover.mypy)Type checking

.vscode/settings.json
(proje kökünde)#

{ "python.defaultInterpreterPath": ".venv/bin/python", "python.analysis.typeCheckingMode": "basic", "[python]": { "editor.defaultFormatter": "charliermarsh.ruff", "editor.formatOnSave": true }, "jupyter.notebookFileRoot": "${workspaceFolder}/notebooks" }

.env
dosyası (kursta tekrar tekrar kullanacaksın)#

# .env POSTGRES_HOST=localhost POSTGRES_PORT=5432 POSTGRES_USER=dataeng POSTGRES_PASSWORD=dataeng_pw_2026 POSTGRES_DB=lab S3_ENDPOINT=http://localhost:9000 S3_ACCESS_KEY=minioadmin S3_SECRET_KEY=minioadmin_pw_2026 KAFKA_BOOTSTRAP=localhost:9092 SCHEMA_REGISTRY=http://localhost:8081 SPARK_MASTER=spark://localhost:7077 JUPYTER_URL=http://localhost:8888
.env
'i
.gitignore
'a ekle — credentials commit edilmez.
🧘 Bir disiplin önerisi
Her ders/atölye için ayrı git branch aç. "00-3-setup", "02-5-modelling-workshop", "12-5-cc-corpus" gibi. Bittiğinde main'e merge et. Bu hem temiz çalışmanı sağlar hem zamanla GitHub'ında kurs çıktılarının ayrıntılı tarihçesi olur — mülakatta gösterirsin.

Bir Sonraki Adım#

Tebrikler — şimdi profesyonel bir veri stack'in var. Kursun geri kalanında her atölye bu setup'la çalışıyor. Yeni bir terminal aç,
docker compose ps
yaz, hepsi yeşilse hazırsın.
Sonraki ders: Modül 01.1 — "Warehouse → Lake → Lakehouse: 30 yıllık evrim". Veri mimarisinin neden bugünkü şekline geldiğini, sen yeni bir şirkete girdiğinde hangi mimarinin senin için ne ifade ettiğini öğreneceğiz.
Bir şeyler kafanı karıştırdıysa ya da setup'ta bir adım çalışmadıysa, ders sayfasının yorum bölümünde sor. Aynı şeyi 10 başka kişi de yaşıyor olabilir; cevap herkese yarar.

Frequently Asked Questions

Yes. Most images are multi-arch (arm64). Confluent Schema Registry is amd64-only — enable Rosetta in Docker Desktop. ~10-15% perf overhead, fine for lab use.

Yorumlar & Soru-Cevap

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

Related Content