İçeriğe geç
Muslu Yüksektepe

gokhancoskun.com

gokhancoskun.com sitesinin Python ile yazılmış kaynak kodu: migration'lar, dağıtım betikleri ve bir MCP sunucusu içerir.

gokhancoskun.com, Gökhan Coşkun için hazırladığım kişisel web sitesi ve blogdur. Site sunucu tarafında oluşturulan sayfalardan, ayrı bir alt alan adında çalışan bir yönetim panelinden ve yazıların Claude üzerinden de yazılabilmesini sağlayan bir MCP sunucusundan oluşuyor. Üçünü de tek bir FastAPI uygulaması sunuyor.

Amaç

Gökhan günlük işinde CNC tezgâhları ve CAM yazılımlarıyla, özellikle Alphacam ile çalışıyor. Bu projenin iki eşit ayağı var. Birincisi, onun kendini ve işini anlatabileceği hızlı, güvenli ve bakımı kolay bir site. İkincisi, işinde sürekli tekrar eden adımları Alphacam makrolarına ve eklentilerine dönüştürüp ardından bunları blog yazısı olarak paylaşmak.

Çalışma döngümüz şöyle: tekrar eden bir işi birlikte bir makroya dönüştürürüz, Gökhan bunu kendi tezgâhında deniyor, çalıştığını onayladığında da makro, düzgün bir açıklama ve hareketi anlatan animasyonlu SVG çizimleriyle birlikte bir blog yazısına dönüşüyor. Ekran görüntüsü yerine animasyon kullanmamın nedeni, takım yolunun nasıl ilerlediğini durağan bir görselin anlatamaması.

Nasıl çalışır

Herkese açık site anasayfayı, blog listesini, yazı detaylarını, etiket sayfalarını, statik sayfaları ve iletişim formunu sunuyor. Sayfalar Jinja2 şablonlarıyla sunucuda oluşturuluyor. Yönetim paneli aynı uygulamanın parçası ama Nginx düzeyinde ayrı bir alt alan adına yönlendiriliyor. Ana alan adında panel ya da giriş adresine gidildiğinde panele kalıcı olarak yönlendiriliyor, API yolu ise ana alan adında hiç cevap vermiyor.

Yazılar Markdown ile yazılıyor ve HTML'e çevrildikten sonra bleach kütüphanesiyle temizleniyor. Bleach, izin verilmeyen etiketleri ve öznitelikleri silerek yazı içine zararlı kod girmesini engelleyen bir kütüphanedir. Bu yüzden animasyonlu SVG'ler yazının içine gömülmüyor. Ayrı dosya olarak yükleniyor ve görsel etiketiyle yazıya ekleniyor. Bu şekilde SVG içindeki CSS animasyonu çalışıyor ama içine konabilecek herhangi bir betik çalışamıyor.

Öne çıkan özellikler

  • Panelden yazı ekleyip düzenleyebiliyor, taslağa alıp yayımlayabiliyor ve silebiliyorsunuz. Statik sayfalar, profil bilgileri ve parola da panelden yönetiliyor.
  • İletişim formundan gelen mesajlar panelde listeleniyor, okundu olarak işaretlenebiliyor ve panelden yanıtlanabiliyor.
  • Panelde, dış uygulamaların API'yi kullanabilmesi için kapsamı belirli erişim anahtarları oluşturulup iptal edilebiliyor.
  • Yapılan işlemler bir denetim kaydında tutuluyor ve panelde görüntülenebiliyor.
  • MCP sunucusu 15 araçla yazı oluşturma, güncelleme, listeleme, yayımlama, taslağa alma ve silme, etiket ve sayfa yönetimi ile profil güncelleme işlerini Claude'a açıyor. MCP, bir yapay zekâ asistanının dış sistemlerdeki araçları güvenli biçimde çağırabilmesini sağlayan bir protokoldür.
  • Yazılar Claude üzerinden önce taslak olarak oluşturuluyor ve Gökhan okuyup onayladıktan sonra yayımlanıyor.
  • Blogda tam metin arama var ve başlıkta geçen bir kelime parçasıyla da yazı bulunabiliyor.
  • Site açık ve koyu temayı destekliyor, anasayfada ise CNC işlemesini anlatan animasyonlu bir SVG çizimi bulunuyor.

Teknik altyapı

Uygulama Python 3.12 ile FastAPI üzerinde yazıldı ve Gunicorn ile Uvicorn işçileri kullanılarak bir systemd servisi olarak çalışıyor. Veritabanı PostgreSQL. Bağlantılar SQLAlchemy'nin eşzamansız katmanı ve asyncpg ile kuruluyor ve bütün SQL sorguları tek bir depo modülünde toplanıyor. Yazılarda tam metin arama için bir GIN indeksi, başlıktaki parça eşleşmelerini hızlandırmak için pg_trgm eklentisi, Türkçe karakterlerden bağımsız arama için de unaccent eklentisi kullanılıyor. Yayındaki ve öne çıkan yazılar için kısmi indeksler tanımladım.

Önbellek olarak Valkey kullanılıyor. Doğrulama ve ayarlar Pydantic ile, panel oturumu imzalı çerezle, API erişimi ise kapsamlı Bearer anahtarlarla yapılıyor. Hassas veriler için Fernet şifrelemesi ve anahtar döndürme betiği var.

Güvenlik başlıkları Nginx tarafından yönetiliyor. İçerik güvenlik politikası neredeyse tamamen kapalı. Tek istisna, sayfa yüklenmeden önce temayı uygulayan küçük satır içi betik ve o da SHA-256 özetiyle beyaz listeye alınmış durumda. Site HTTP/3 üzerinden de sunuluyor. Kısa sayfalarda kaydırma çubuğu kaybolunca düzenin yana kaymasını önlemek gibi küçük ayrıntılara da dikkat ettim. Animasyonlar, hareketin azaltılmasını isteyen kullanıcıların tercihine uyuyor.

Gizlilik ve güvenlik

İletişim formunda bilinçli olarak reCAPTCHA kullanmadım. Harici bir betik içerik güvenlik politikasını gevşetmeyi gerektirecek, ziyaretçi verisini üçüncü bir tarafa gönderecek ve görsel bulmacalar erişilebilirlik açısından sorun çıkaracaktı. Bunun yerine üç katman birlikte çalışıyor. Gizli bir tuzak alanını dolduran gönderimler bot sayılıyor. Form gösterildiği an imzalı bir belirtece yazılıyor ve gönderim çok hızlı ya da çok geç gelirse reddediliyor. Son olarak form adresine 10 dakikada 5 istekle sınırlı bir hız kısıtlaması uygulanıyor.

Mesajlar önce veritabanına yazılıyor, ardından e-posta olarak da iletiliyor. E-posta gönderimi arka planda yapılıyor ve hata verse bile mesaj kaybolmuyor. Gönderen adresi her zaman sitenin kendi adresi kalıyor, yanıt adresi ise ziyaretçinin adresi oluyor. Böylece SPF ve DKIM doğrulamaları bozulmuyor ve mesajlar spam klasörüne düşmüyor.

Kullanım alanları

  • Kendi işini anlatmak ve teknik yazılar paylaşmak isteyen bir meslek insanı için hazır, hafif bir kişisel site altyapısıdır.
  • CNC ve CAM alanındaki makro ve otomasyon çalışmalarının açıklamalı ve animasyonlu olarak belgelendiği bir bilgi kaynağıdır.
  • Bir yapay zekâ asistanının MCP aracılığıyla taslak yazıp insan onayıyla yayımladığı bir içerik akışının çalışan bir örneğidir.
  • Captcha kullanmadan bot koruması, sıkı içerik güvenlik politikası ve erişilebilirlik gibi konularda uygulanabilir bir referanstır.
Kategori
Web siteleri
Yıl
2026

Teknolojiler

  • Python
  • MCP
  • PostgreSQL

Bağlantılar

  • GitHub https://github.com/muslu/gokhancoskuncom

Tüm projelere dön