Flask ile geliştirilmiş, yönetim panelli kişisel özgeçmiş, portfolyo ve blog uygulaması.
- Özgeçmiş, yetenek, proje ve iletişim bölümleri
- Markdown tabanlı blog, arama ve etiket filtreleme
- İçerik ve görsel yönetim paneli
- Yönetici parolasıyla korunan tam ZIP yedekleme ve geri yükleme
- CSRF koruması ve doğrulanan görsel yükleme
- Docker healthcheck ve kalıcı veri volume'u
- Masaüstü ve mobil uyumlu arayüz
Uygulamanın yalnızca üç zorunlu ortam değişkeni vardır:
SECRET_KEY=uretme-komutunun-ciktisini-buraya-yapistirin
ADMIN_USERNAME=yonetici
ADMIN_PASSWORD=benzersiz-ve-guclu-bir-parolaÜretim gereksinimleri:
SECRET_KEYen az 32 karakter olmalıdır.ADMIN_PASSWORDen az 20 karakter olmalıdır.ADMIN_USERNAMEbaşında veya sonunda boşluk içermemelidir.
SECRET_KEY üretmek için:
python3 -c 'import secrets; print(secrets.token_urlsafe(48))'Eksik, boş veya gereksinimleri karşılamayan bir değerle uygulama başlamaz. .env dosyası Git ve Docker build context dışında tutulur; repodaki .env.example yalnız güvenli yer tutucular içerir.
Python 3.12 veya daha yeni bir sürüm kullanın.
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements-dev.txt
cp .env.example .env
chmod 600 .env.env içindeki üç değeri doldurduktan sonra:
set -a
source .env
set +a
python run.pypy -m venv .venv
& .\.venv\Scripts\python.exe -m pip install -r requirements-dev.txt
Copy-Item .env.example .env.env içindeki üç değeri doldurduktan sonra değişkenleri mevcut PowerShell oturumuna yükleyip uygulamayı başlatın:
Get-Content .env | ForEach-Object {
if ($_ -match '^(?!#)\s*([^=]+)=(.*)$') {
[Environment]::SetEnvironmentVariable($matches[1].Trim(), $matches[2].Trim(), 'Process')
}
}
& .\.venv\Scripts\python.exe run.pyUygulama python-dotenv kullanmaz; .env değerleri uygulama başlamadan önce kabuk ortamına yüklenmelidir.
Site http://127.0.0.1:5000, yönetim girişi http://127.0.0.1:5000/admin/giris adresindedir. run.py yalnız geliştirme için debug modunu açar ve güvenli cookie zorunluluğunu yerel HTTP için kapatır.
compose.yaml, yerel image ve volume doğrulaması içindir:
Henüz oluşturmadıysanız .env.example dosyasını .env olarak kopyalayın ve üç değeri doldurun. Linux/macOS üzerinde chmod 600 .env ile dosya erişimini sınırlandırın.
docker compose up -d --build
docker compose ps
curl --fail http://127.0.0.1:8000/healthz
docker compose logs -f appContainer portu yalnız 127.0.0.1:8000 üzerinde yayınlanır. Üretim cookie'si Secure olduğu için yönetim paneli üretimde HTTPS reverse proxy üzerinden kullanılmalıdır.
Container'ı durdurmak veriyi silmez:
docker compose downdocker compose down -v kalıcı storage volume'unu ve tüm yönetilen içeriği siler; normal kullanımda çalıştırılmamalıdır.
İlk açılışta seed/site.json, seed/blog, seed/uploads ve seed/branding içeriği storage/ yapısına kopyalanır. storage/.initialized işaretinden sonraki açılışlar mevcut veriyi değiştirmez. Bu nedenle sonraki deployment'larda seed/ değişiklikleri üretim verisine otomatik birleştirilmez.
storage/
├── state/ Site ayarları
├── blog/ Markdown yazıları
├── uploads/ Proje ve blog görselleri
└── branding/ Profil görseli ve favicon
Yerel Compose ve Dokploy üretim kurulumu kalıcı veriyi /app/storage yolundaki named volume'da tutar. Dosya tabanlı veri modeli nedeniyle uygulama tek worker, tek thread, tek replica ve stop-first deployment ile çalışır.
Yönetim panelindeki /admin/yedekleme sayfası taşınabilir bir mCV ZIP yedeği oluşturur. Arşiv şunları içerir:
- Site ayarları
- Blog yazıları
- Yüklenen proje ve blog görselleri
- Profil görseli ve favicon
- Dosya boyutlarıyla SHA-256 sağlama toplamlarını içeren sürümlü manifest
Geri yükleme arşiv yollarını, dosya türlerini, dosya sayısını, açılmış toplam boyutu ve sağlama toplamlarını doğrular. Doğrulama tamamlanmadan canlı veri değiştirilmez; işlem yönetici parolasının yeniden girilmesini gerektirir. Varsayılan limitler yüklenen ZIP için 256 MB, açılmış içerik için 512 MB ve 5.000 dosyadır.
Geri yükleme, mevcut state, blog, uploads ve branding içeriğini yedekteki sürümle tamamen değiştirir. İşlemden önce güncel bir yedek indirin. ZIP dosyası uygulama kodunu, .env değerlerini veya yönetici parolasını içermez.
Admin ZIP yedeği uygulama verisini taşımak ve elle geri yüklemek içindir. Dokploy control-plane ve named volume yedekleriyle birlikte kullanılmalı, onların yerine geçmemelidir.
- İletişim formu veriyi sunucuya göndermez veya saklamaz; ziyaretçinin kendi e-posta uygulamasını alıcı, konu ve içerik hazırlanmış şekilde açar.
- Normal HTTP isteklerinin toplam üst sınırı 5 MB'tır. Görsel yüklemelerinde PNG, JPG, JPEG, WEBP ve GIF desteklenir.
/healthz, storage ve temel JSON şeması hazırsa204, kullanılamıyorsa503döndürür.- Dosya tabanlı read-modify-write modeli genel bir dağıtık kilit kullanmadığından worker, thread ve replica sayısı artırılmamalıdır.
- Yönetim girişi ve iletişim formu için uygulama içi rate limit yoktur; üretimde reverse proxy veya Cloudflare kuralı kullanılmalıdır.
python -m pytest -qMevcut test paketi kimlik doğrulama, CSRF, içerik yönetimi, medya doğrulama, seed başlatma ve güvenli yedek geri yükleme senaryolarını kapsar.
Oracle Cloud, Dokploy ve Cloudflare için eksiksiz kurulum ve Coolify'dan geçiş: docs/deployment.md.
Dokploy üretim özeti:
| Ayar | Değer |
|---|---|
| Service tipi | Application |
| Build Type | Dockerfile |
| Domain Container Port | 8000 |
| Healthcheck | /healthz (204) |
| Named volume | mcv-storage:/app/storage |
| Replica | 1 |
| Update order | stop-first |
| Ortam değişkenleri | Yalnız üç zorunlu secret |
Yeni sürüm yayınlamadan önce admin panelinden uygulama yedeği ve Dokploy üzerinden named volume yedeği alın. main branch'ini gönderdikten sonra Dokploy deployment loglarını ve /healthz sonucunu doğrulayın; güvenli update ve rollback adımları deployment rehberindedir.
app/ Flask uygulaması
app/backup.py ZIP yedekleme ve güvenli geri yükleme
seed/ İlk kurulum içeriği
storage/ Çalışma zamanı verisi, Git dışında
tests/ Pytest testleri
docs/deployment.md Üretim kurulum rehberi
.env.example Ortam değişkeni şablonu
.dockerignore Docker build context dışlamaları
Dockerfile Üretim image tanımı
compose.yaml Yerel container doğrulaması
run.py Geliştirme giriş noktası
wsgi.py Üretim WSGI giriş noktası
Bu proje MIT Lisansı ile lisanslanmıştır.
