Files
insta/GUIDE.md
Beyhan Oğur 2be3a313ad first commit
2026-04-26 22:26:46 +03:00

568 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Instagram Clone API - Detaylı Kılavuz
## 📋 İçindekiler
1. [Proje Yapısı](#proje-yapısı)
2. [Kurulum](#kurulum)
3. [Çalıştırma](#çalıştırma)
4. [Özellikler](#özellikler)
5. [API Endpoints](#api-endpoints)
6. [Veritabanı Modelleri](#veritabanı-modelleri)
7. [Celery & Otomasyonlar](#celery--otomasyonlar)
8. [Admin Paneli](#admin-paneli)
9. [Sorun Giderme](#sorun-giderme)
---
## 🏗️ Proje Yapısı
```
insta/
├── core/ # Django ana ayarları
│ ├── settings.py # Proje konfigürasyonu
│ ├── urls.py # Ana URL router
│ ├── celery.py # Celery app tanımı
│ └── wsgi.py
├── accounts/ # Kullanıcı yönetimi
│ ├── models.py # CustomUser model (active_until ile)
│ ├── views.py # Auth views
│ ├── urls.py # Auth endpoints
│ ├── admin.py # Admin paneli
│ ├── middleware.py # Hesap süresi kontrol
│ ├── tasks.py # Celery görevleri
│ └── migrations/
├── namecreate/ # ML model eğitimi
│ ├── models.py # TrainingJob model
│ ├── views.py # Model eğitim endpoints
│ ├── tasks.py # Eğitim task'ı
│ ├── admin.py # Admin paneli
│ ├── urls.py # ML endpoints
│ └── migrations/
├── db.sqlite3 # Veritabanı (geliştirme)
├── requirements.txt # Python dependencies
└── .env # Ortam değişkenleri
```
---
## 🚀 Kurulum
### 1. Virtual Environment Oluştur
```bash
cd /home/beyhan/Projeler/python/insta
python -m venv .venv
source .venv/bin/activate # Linux/Mac
# veya
.venv\Scripts\activate # Windows
```
### 2. Dependencies Yükle
```bash
pip install -r requirements.txt
```
### 3. Veritabanı Hazırla
```bash
python manage.py makemigrations
python manage.py migrate
```
### 4. Admin Kullanıcısı Oluştur
```bash
python manage.py createsuperuser
# Email: admin@example.com
# Password: ***
```
### 5. .env Dosyası Oluştur
```bash
cat > .env << EOF
DEBUG=True
SECRET_KEY=your-secret-key-here
DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1
# Redis (Celery)
CELERY_BROKER_URL=redis://localhost:6379/5
# Go Servisi (opsiyonel)
GO_SERVICE_URL=http://localhost:8080
# Email
EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend
EOF
```
---
## ⚙️ Çalıştırma
### Terminal 1: Django Development Server
```bash
source .venv/bin/activate
python manage.py runserver
# Erişim: http://localhost:8000
```
### Terminal 2: Celery Worker
```bash
source .venv/bin/activate
celery -A core worker -l info
```
### Terminal 3: Celery Beat (Scheduler)
```bash
source .venv/bin/activate
celery -A core beat -l info
```
### Terminal 4: Redis (Gerekli)
```bash
redis-server
# veya
docker run -d -p 6379:6379 redis:latest
```
---
## ⭐ Özellikler
### 1. **Admin-Only Kullanıcı Kaydı**
- Sadece admin kullanıcılar yeni hesap oluşturabilir
- `/api/v1/auth/users/` - POST (admin only)
- `/api/v1/auth/users/activation/` - POST (admin only)
- `/api/v1/auth/users/resend_activation/` - POST (admin only)
### 2. **Zamanlı Hesap Aktifliği**
- Kullanıcılara sınırlı kullanım süresi verilebilir
- `active_until` alanı ile kontrol edilir
- Otomatik pasife çekilir (middleware + Celery)
### 3. **Model Eğitimi (ML)**
- RandomForest modeli eğitilir
- ONNX formatına kaydedilir
- Metrikleri kaydedilir (accuracy, precision, recall, f1)
- Go servisine bildirilir
### 4. **Celery Otomasyonları**
- Süresi dolmuş hesapları günlük deaktif etme
- Model eğitimini arka planda yapma
- Database scheduler ile yönetim
### 5. **Admin Panelden Terminalsiz Uretim (2 Mod)**
- Terminal erisimi olmadan admin panelden kisi uretimi yapabilirsiniz.
- Yol: `Admin > Namecreate > Training jobs`
- Bir veya birden fazla `TrainingJob` secin, sonra `Action` menusunden secin:
- `Secili job(lar) icin 100 kisi uret (Istatistiksel)`
- `Secili job(lar) icin 100 kisi uret (LLM + fallback)`
- `Secili job(lar) icin 1000 kisi uret (Istatistiksel)`
- `Secili job(lar) icin 1000 kisi uret (LLM + fallback)`
- LLM servisi kapaliysa `LLM + fallback` secenegi otomatik olarak istatistiksel uretime duser.
---
## 🔌 API Endpoints
### **Kimlik Doğrulama (Djoser)**
#### Kayıt (Admin Only)
```bash
POST /api/v1/auth/users/
Content-Type: application/json
{
"email": "user@example.com",
"password": "strongpass123",
"re_password": "strongpass123",
"first_name": "John",
"last_name": "Doe"
}
# Yanıt (201 Created)
{
"id": 1,
"email": "user@example.com",
"first_name": "John",
"last_name": "Doe"
}
```
#### Login
```bash
POST /api/v1/auth/jwt/create/
Content-Type: application/json
{
"email": "user@example.com",
"password": "strongpass123"
}
# Yanıt
{
"access": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"refresh": "eyJ0eXAiOiJKV1QiLCJhbGc..."
}
```
#### Profil Bilgileri
```bash
GET /api/v1/auth/users/me/
Authorization: Bearer <access_token>
# Yanıt
{
"id": 1,
"email": "user@example.com",
"first_name": "John",
"last_name": "Doe",
"is_active": true,
"date_joined": "2026-03-27T12:00:00Z"
}
```
### **ML Model Eğitimi**
#### Eğitim Başlat
```bash
POST /api/v1/ml/train-model/
Authorization: Bearer <access_token>
# Yanıt (Task başlatıldı)
{
"status": "queued",
"message": "Model eğitim görevi başlatıldı.",
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"celery_task_id": "abc123xyz"
}
```
#### Eğitim Durumunu Sorgula
```bash
GET /api/v1/ml/training-status/?task_id=550e8400-e29b-41d4-a716-446655440000
Authorization: Bearer <access_token>
# Yanıt (Tamamlandı)
{
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"created_at": "2026-03-27T12:00:00Z",
"started_at": "2026-03-27T12:00:05Z",
"completed_at": "2026-03-27T12:01:30Z",
"model_version": "2026-03-27T12-00-00",
"metrics": {
"accuracy": 0.96,
"precision": 0.97,
"recall": 0.95,
"f1_score": 0.96
}
}
```
---
## 💾 Veritabanı Modelleri
### **CustomUser (accounts/models.py)**
```python
class CustomUser(AbstractBaseUser, PermissionsMixin):
email # Unique email
first_name # İsim
last_name # Soyisim
is_active # Aktif mi?
is_staff # Admin mi?
is_superuser # Superuser mi?
active_until # ⭐ Hesap bitiş tarihi
date_joined # Kayıt tarihi
last_login # Son giriş
# Metodlar:
is_expired() # Süresi doldu mu?
deactivate_if_expired() # Pasif yap
set_active_for_days(days) # N gün için aktif et
```
### **TrainingJob (namecreate/models.py)**
```python
class TrainingJob(models.Model):
task_id # Celery task ID
status # pending, running, completed, failed
model_type # Model tipi (RandomForest)
model_version # Timestamp (versiyonlama)
model_path # Dosya yolu
# Metrikleri
accuracy # Doğruluk
precision # Kesinlik
recall # Geri çağırma
f1_score # F1 skoru
# Zaman damgaları
created_at # Oluşturulma
started_at # Başlama
completed_at # Tamamlanma
# Go Servisi
go_service_notified # Bildirildi mi?
# Hata
error_message # Hata mesajı
```
---
## 🤖 Celery & Otomasyonlar
### **Otomatik Prosesler**
#### 1. Süresi Dolmuş Hesapları Deaktif Etme
**Periyodiklik:** Her 24 saatte 1 kez
**Task:** `accounts.tasks.deactivate_expired_users_task()`
**Veritabanı:** `active_until <= now()` olan users pasif olur
Manuel çalıştırmak:
```bash
python manage.py deactivate_expired_users
```
#### 2. Model Eğitimi
**Periyodiklik:** İsteğe bağlı (manual trigger)
**Task:** `namecreate.tasks.train_model_task(task_id)`
**İşler:**
1. Veriyi yükle (Iris dataset)
2. Modeli eğit (RandomForest)
3. Metrikleri hesapla
4. ONNX formatına kaydet (versiyonlu)
5. Go servisine bildir
### **Celery Settings (core/settings.py)**
```python
CELERY_BROKER_URL = 'redis://localhost:6379/5'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
CELERY_BEAT_SCHEDULE = {
'deactivate-expired-users-daily': {
'task': 'accounts.tasks.deactivate_expired_users_task',
'schedule': 60 * 60 * 24, # Her 24 saat
},
}
```
### **Task Monitoring**
Celery Flower ile gerçek zamanlı monitoring:
```bash
pip install flower
celery -A core flower
# Erişim: http://localhost:5555
```
---
## 👨‍💼 Admin Paneli
### **Admin Erişimi**
```
http://localhost:8000/admin/
Email: admin@example.com
Şifre: ***
```
### **Admin Sayfalarında Neleri Yönetebilirsin?**
#### 1. **Kullanıcılar** (`/admin/accounts/customuser/`)
- Yeni kullanıcı oluştur
- `active_until` tarihi belirle
- Hesabı aktif/pasif yap
- Filtreleme: İçinden çıkış tarihi, aktif durum, staff status
#### 2. **Eğitim Görevleri** (`/admin/namecreate/trainingjob/`)
- Tüm eğitim görevlerini görüntüle
- Status takibi: pending → running → completed/failed
- Metrikleri kontrol et (accuracy, f1, vb.)
- Error loglarını göster (başarısız task'lar)
- Go servisine bildirilip bildirilmediğini kontrol et
#### 3. **Periyodik Görevler** (`/admin/django_celery_beat/periodictask/`)
- Celery Beat task'larını yönet
- Schedule'ı özelleştir
- Yeni periyodik görev ekle
---
## 🔍 Sorun Giderme
### **Problem: Celery Worker hata veriyor**
**Çözüm 1:** Redis çalışıyor mu?
```bash
redis-cli ping
# Yanıt: PONG ise OK
```
**Çözüm 2:** Hata logu kontrol et
```bash
celery -A core worker -l debug
```
**Çözüm 3:** Database migrations kontrol et
```bash
python manage.py migrate
```
---
### **Problem: Model eğitimi başlamıyor**
**Çözüm 1:** Task'ı manuel test et
```bash
python manage.py shell
>>> from namecreate.tasks import train_model_task
>>> task_id = 'test-123'
>>> from namecreate.models import TrainingJob
>>> job = TrainingJob.objects.create(task_id=task_id)
>>> result = train_model_task.delay(task_id)
>>> result.get()
```
**Çözüm 2:** Worker loglarını kontrol et (`celery -A core worker -l info`)
---
### **Problem: Admin panelinde TrainingJob görmüyorum**
**Çözüm:** Migration'ı çalıştır
```bash
python manage.py migrate namecreate
```
---
### **Problem: Djoser endpoints 403 Forbidden dönem**
**Sebep:** Admin değilsin (register/activation admin-only'dir)
- Admin kullanıcı ile yapabilirsin
- Veya superuser token'ı kullan
**Test:**
```bash
# Superuser ile
TOKEN=$(curl -X POST http://localhost:8000/api/v1/auth/jwt/create/ \
-H "Content-Type: application/json" \
-d '{"email":"admin@example.com","password":"***"}' | jq -r '.access')
curl -X POST http://localhost:8000/api/v1/auth/users/ \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"email":"newuser@example.com",
"password":"pass123",
"re_password":"pass123"
}'
```
---
## 📊 Örnek İş Akışı
### **Senaryo 1: Yeni Kullanıcı Ekleme (Admin)**
```bash
# 1. Admin token al
curl -X POST http://localhost:8000/api/v1/auth/jwt/create/ \
-H "Content-Type: application/json" \
-d '{"email":"admin@example.com","password":"adminpass123"}' \
| jq .
# Response: access token vs refresh token
# 2. Yeni kullanıcı oluştur
curl -X POST http://localhost:8000/api/v1/auth/users/ \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"email":"john@example.com",
"password":"johnpass123",
"re_password":"johnpass123",
"first_name":"John",
"last_name":"Doe"
}'
# 3. Admin panelinden active_until tarihi belirle
# http://localhost:8000/admin/accounts/customuser/
# John'ın profiline gir → active_until = 2026-04-27 (30 gün başlar)
# 4. 30 gün sonra otomatik pasif olur
```
### **Senaryo 2: Model Eğitimi**
```bash
# 1. Eğitim başlat
curl -X POST http://localhost:8000/api/v1/ml/train-model/ \
-H "Authorization: Bearer <TOKEN>" \
| jq .
# Response: task_id = "550e8400-e29b-41d4-a716-446655440000"
# 2. Durum sorgula (5-10 saniye sonra)
curl http://localhost:8000/api/v1/ml/training-status/?task_id=550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer <TOKEN>" \
| jq .
# 3. Tamamlanınca:
# - Model: media/models/iris_model_2026-03-27_12-30-45.onnx
# - Metrikler: accuracy=0.96, f1=0.96
# - Go servisi bilgilendirildi (varsa)
```
---
## 📝 Notlar
- **Geliştirme:** SQLite kullanıyor. Production'da PostgreSQL kullan.
- **Redis:** Celery için gerekli. Docker'da `redis:latest` kullan.
- **Go Servisi:** `.env` dosyasında `GO_SERVICE_URL` tanımlarsan otomatik bildirim yapılır.
- **Emails:** Console backend kullanıyor. SMTP konfigürasyonu yapabilirsin.
---
## 📚 Faydalı Commands
```bash
# Veritabanı işlemleri
python manage.py makemigrations
python manage.py migrate
python manage.py flush # Tüm veriyi sil (DİKKAT!)
# Shell (Python repl)
python manage.py shell
# Superuser oluştur
python manage.py createsuperuser
# Celery test
python manage.py celery -A core worker -l info
# Datab Shell (SQL)
python manage.py dbshell
# Yeni app oluştur
python manage.py startapp appname
```
---
## 🎯 Sonraki Adımlar
- [ ] PostgreSQL kurulumu
- [ ] Production settings
- [ ] Docker containerization
- [ ] CI/CD pipeline (GitHub Actions)
- [ ] Monitoring & logging
- [ ] API Rate limiting
- [ ] WebSocket entegrasyonu (asenkron güncellemeler)
---
**Hazırlandı:** 27 Mart 2026
**Versiyon:** 1.0