# Projenizi yayına almak

> Git deponuzdaki ya da bilgisayarınızdaki projeyi Turguz'da derleyip yayına alın. Turguz projenin dilini tanır, ihtiyaçlarını denetler ve sitenin adresini verir.

Turguz projenizi dilini tanıyarak kendisi derler; .NET, Clojure, Go, Java, Node.js, PHP, Python, Ruby ve Scala projeleri bu yolla derlenir. Deno, Rust ve Leptos projeleri için Turguz bir Dockerfile hazırlar; dili tanınmayan ya da sistem paketi isteyen projeyi kendi Dockerfile'ıyla da derletebilirsiniz (aşağıda). Yayına alınan her proje bir **ortamda** çalışır; ortamları, dağıtımları ve ayarları [Ortamlar ve dağıtımlar](/docs/tr/ortamlar) sayfası anlatır.

Proje oluşturmak ve yayına almak için «Kiracı yöneticisi» ya da «Geliştirici» rolünüz olmalı.

## Kaynağı bağlamak

### Git deposu

Projeler sayfasındaki **Git bağlantıları** sekmesinde, deponuzun durduğu sunucudaki hesabınızı bağlayın:

- **github.com:** «GitHub ile bağlan», ardından «Turguz'u GitHub'a kur». Turguz'un hangi depolara erişeceğini GitHub'da siz seçersiniz; Turguz yalnız okuma izni ister.
- **ciblab.dev:** «ciblab.dev hesabını bağla».

Bağlantıyı aynı sekmeden «Bağlantıyı kes» ile kaldırabilirsiniz; yayındaki siteleriniz çalışmaya devam eder.

GitHub'daki depoların git alt modülleri derlemeye gelir. Erişilemeyen bir alt modül gelmez, derleme sürer ve derleme günlüğü hangisinin gelmediğini söyler. ciblab.dev depolarında alt modüller gelmez.

### Dosya yükleyerek

Git kullanmıyorsanız projeyi bir arşiv olarak (`.zip`, `.tar.gz`, `.tar.bz2`, `.tar.xz` ya da `.tar`) ya da klasörüyle yüklersiniz. Klasörü panele sürükleyebilir ya da «Klasör seç» ile seçebilirsiniz; panel onu kendisi arşive çevirir ve `node_modules`, `.git` gibi derlemeye gerekmeyen klasörleri göndermez. Arşivin sıkıştırılmış hâli en çok 100 MB (platform yöneticiniz bu sınırı değiştirebilir), açılmış hâli en çok 512 MB olabilir ve en çok 50.000 dosya içerebilir. Arşive `node_modules`, `.git` ve derleme çıktısı koymayın.

Arşivde bir `.env` dosyası varsa kurulum, içindeki değerleri ortam değişkenlerine aktarır ve dosyayı yayındaki uygulamadan çıkarır.

## Projeyi oluşturmak

Projeler sayfasında «+ Proje» düğmesine basın:

- «Ad»: projenin adı.
- Kaynak: «GitHub», «ciblab.dev» ya da «Dosya yükle».
- Depo ve «Varsayılan dal». Dalı boş bırakırsanız deponun kendi varsayılan dalı kullanılır.
- «Kimler görür?»: «Kiracıdaki herkes» ya da «Yalnız seçtiğim üyeler».

Sonra «Proje oluştur» düğmesine basın.

**Kurulumunuza bağlı:** Bu özellik kurulumunuzda açık değilse panelde görünmez; açılmasını istiyorsanız platform yöneticinize sorun.

Projeyi yalnız seçtiğiniz üyelere göstermek («Yalnız seçtiğim üyeler») kurulum ayarıdır. Kapalıysa proje kiracıdaki herkese görünür.

## Kur ve dağıt

Projenin henüz bir ortamı yoksa proje sayfasında **Projenizi kurun** kartı çıkar. Kart sırasıyla kotanızı denetler, ortamı açar, gerekiyorsa veritabanını kurar, sitenin adresini ayarlar, gerekiyorsa internet erişimi ister ve ilk derlemeyi yapıp yayına alır.

Başlamadan önce kart projenizin dosyalarına bakar ve ihtiyaçlarını gösterir:

- PostgreSQL kullanan projede veritabanı kurulsun mu,
- eksik ortam değişkenleri ve Turguz'un sizin için üretebileceği gizli anahtarlar,
- sitenin adresini bekleyen bir değişken,
- internete çıkma ihtiyacı (yöneticinizin onayına gider).

Uyarıları «Anladım» ile onayladıktan sonra «Kur ve dağıt» düğmesine basın. Panel projenin büyük olasılıkla açılmayacağını görürse bunu söyler; yine de denemek için «Yine de kur ve dağıt» seçeneği vardır.

Kurulum adım adım ilerler ve bittiğinde sitenin adresini gösterir. Bir adımda durursa «Kaldığı yerden devam et» düğmesine basın. «Vazgeç» kurulumu bırakır ama o ana kadar oluşturulanları silmez. Her şeyi kendiniz ayarlamak isterseniz «Elle kurmak istiyorum» seçeneğini kullanın.

## Hazırlık raporu

Ortamın **Genel bakış** sekmesindeki **Hazırlık** bölümü projenin dosyalarına bakar ve veritabanı, değişkenler, internet ve dosyalarla ilgili ihtiyaçları listeler. İhtiyaçlar üç grupta görünür: yapmanız gerekenler, hazır olanlar ve bilgi. Satıra tıklayınca nedeni ve dayandığı dosya açılır. Ayar önerisini satırdaki «Değiştir» ile kaydedersiniz. Değişkenler için «Değişkenlerde aç →» sizi Değişkenler sekmesine götürür. Kodun okuduğu ama tanımlamadığınız ayarlar da orada listelenir, «Tanımla» ile eklersiniz. Projeyi değiştirdikten sonra «Yenile» ile yeniden baktırırsınız.

## Port ve adres

Uygulamanız `PORT` değişkenindeki kapıyı ve bütün ağ arayüzlerini (`0.0.0.0`) dinlemeli. Yalnız `localhost` ya da `127.0.0.1` dinlerse trafik ona ulaşmaz.

Turguz `PORT` değişkenini ortamın uygulama kapısıyla doldurur. Varsayılan kapı 80; ortamın **Ayarlar** sekmesinde, **Derleme ve çalıştırma** bölümündeki «Uygulama portu» alanından değiştirilir. `PORT` değişkenine elle değer yazmayın.

```text
Node.js   app.listen(process.env.PORT || 8080, "0.0.0.0")
Python    gunicorn app:app --bind 0.0.0.0:$PORT
          uvicorn main:app --host 0.0.0.0 --port $PORT
Go        http.ListenAndServe(":"+os.Getenv("PORT"), nil)
Spring    server.port=${PORT:8080}
```

## PHP projeleri

Turguz PHP projelerini `composer.json`, `composer.lock` ve `public/index.php` dosyaları olan düzende derler (Laravel, Symfony, CodeIgniter 4 ve Slim gibi). Site yalnız `public/` klasöründen sunulur; kaynak dosyalar, `vendor/` ve `.env` dışarı açılmaz. PHP sürümü projenin `composer.json` dosyasındaki `require.php` satırına göre seçilir. Çatının geçici dosya ve günlük klasörleri (`storage/`, `var/`, `writable/` gibi) çalışırken yazılabilir; içerikleri her yeni sürümde sıfırlanır, kalıcı veri için veritabanı kullanın. Symfony projeleri `APP_ENV=prod` ile derlenip çalışır. Laravel projesine bağlı veritabanı varsa `DB_CONNECTION=pgsql` ve `DB_URL` verilir; veritabanı yoksa oturum ve geçici veriler dosyada tutulur, kuyruk işleri hemen koşar. PHP'nin standart hata akışına yazılan günlük satırları uygulamanın günlüğünde görünür; Laravel'in günlüğü de oraya yönlendirilir (`LOG_CHANNEL=stderr`). Bu değişkenlerden birini kendiniz verirseniz sizinki kullanılır. Kökten sunulan düz PHP siteleri ve WordPress gibi MySQL isteyen uygulamalar yayınlanamaz; hazırlık raporu bu durumda ne yapılacağını söyler.

## Tarayıcı kullanan uygulamalar

Python ya da Node uygulamanız Playwright, Puppeteer ya da Selenium kullanıyorsa Turguz derlemede Chromium'u uygulamaya ekler. Kodunuzu değiştirmeniz, tarayıcı indirmeniz gerekmez; tarayıcı çalışırken internete ihtiyaç duymaz. Hazırlık raporu bunu yayından önce söyler.

- Tarayıcı üretim bağımlılığı olan pakette eklenir. Yalnız test için kurulan paket (`devDependencies`) uygulamayı büyütmez.
- Yalnız başsız Chromium vardır: Firefox, WebKit, ekranlı kip ve video kaydı çalışmaz.
- `puppeteer-core` ve `pyppeteer` tarayıcının yolunu koddan ister: Node'da `executablePath: process.env.PUPPETEER_EXECUTABLE_PATH`, Python'da `executablePath=os.environ["CHROME_BIN"]` yazın.
- Tarayıcı kendi kum havuzunda çalışır; kodunuzdaki `--no-sandbox` bayrağı yok sayılır.
- Dış siteye gidecek uygulama için ortamın internet erişimini isteyin.
- Küçük boy tek sekmeye yeter. Aynı anda birkaç sekme ya da çok uzun sayfa görüntüsü için Orta ya da üstünü seçin.
- Web sitesi olmayan bir tarayıcı işini «Arka plan işi» olarak aynı derlemeden çalıştırabilirsiniz.

## Kendi Dockerfile'ınızla derlemek

Turguz projenizin dilini tanıyıp kendisi derler. Diliniz tanınmıyorsa (Elixir gibi), PHP projeniz [beklenen düzene](#php-projeleri) uymuyorsa ya da uygulamanız sistem paketi istiyorsa (ffmpeg gibi), projeyi kendi Dockerfile'ıyla derletebilirsiniz: ortamın **Ayarlar** sekmesinde, **Derleme ve çalıştırma** bölümündeki «Derleme yöntemi» alanını **Dockerfile** yapın. Hazırlık raporu uygun projede bunu önerir, ama öneri şart değildir: uygulama klasöründe Dockerfile varsa rapor önermese de bu alandan seçebilirsiniz. Rapor önerdiyse projeyi kurarken kurulum kartında da «Projenin Dockerfile'ıyla derle» seçeneği çıkar. Birden çok uygulamalı ortamda yöntem uygulama başına seçilir: **Uygulamalar** bölümünde «Uygulamaları düzenle», satırdaki «Derleme» alanı.

**Kurulumunuza bağlı:** Bu özellik kurulumunuzda açık değilse panelde görünmez; açılmasını istiyorsanız platform yöneticinize sorun.

Dockerfile ile derleme kurulumun ayarına bağlıdır, rolünüze bağlı değildir. Bütün ortamlarda açıksa ortamı düzenleyebilen herkes seçer, yeni ortam açarken de. Yalnız seçili ortamlarda açıksa seçim o ortamın **Ayarlar** sekmesinden yapılır; yeni ortam açarken ve projeyi kurarken seçenek çıkmaz.

- Deno, Rust ve Leptos projelerinde kendi Dockerfile'ınız gerekmez: Turguz projenin içeriğine göre bir Dockerfile hazırlar. Hazırlık raporu bunu önerir; «Derleme yöntemi» alanında «Turguz'un hazırladığı Dockerfile» seçilir ve «Dockerfile'ı gör» hazırlanan dosyayı gösterir. Bu Dockerfile deponuza yazılmaz, yalnız derlemede kullanılır. İnternet bağlantısı olmayan kurulumlarda önerilmez.
- Dockerfile uygulama klasörünün kökünde olmalı.
- Uygulama Dockerfile'daki `CMD` satırıyla başlar; «Başlatma komutu» alanı kullanılmaz.
- «Uygulama portu»nu Dockerfile'daki `EXPOSE` portuyla aynı yapın.
- Ortam değişkenleri Dockerfile'a `ARG` olarak gelir. Gizli işaretliler `ARG` olarak değil sır olarak gelir: `RUN --mount=type=secret,id=AD,env=AD komut` ile okursunuz, değer imaja yazılmaz.
- «Derlemede veritabanı» açıksa veritabanının bağlantı değişkenleri de `ARG` olarak gelir (ör. `ARG DATABASE_URL`). Bu bağlantı yalnız okur ve derleme bitince kapanır.
- Derleme yalıtılmış bir makinede koşar: `RUN --security=insecure` ve `RUN --network=host` kullanılamaz, `# syntax=` satırı yok sayılır.
- Dockerfile'daki Python'un pip'i eskiyse bazı paket depoları (ör. PyTorch) okunamaz ve derleme düşer. «Derleme yöntemi»nin altındaki «Eski pip'i derlemede güncelle»yi açarsanız Turguz derlemede `pip install` koşan her aşamanın başına pip'i güncelleyen bir satır ekler; deponuza dokunmaz, derleme günlüğü eklenen satırı söyler.
- İnternet bağlantısı olmayan kurulumlarda .NET (NuGet), Java (Maven, Gradle), Rust (Cargo) ve Alpine (apk) paketleri yalnız sitenin paket aynasından iner. Paketleri indiren adımdan (`dotnet restore`, `mvn package`, `gradle build`, `cargo build`, `apk add` gibi) önce, aynı aşamaya şu satırı ekleyin: `RUN sh -c "${TURGUZ_AYNA_KUR:-}"`. İnterneti olan sitelerde satır hiçbir şey yapmaz; aynı Dockerfile her yerde çalışır.

## `api/` klasöründeki fonksiyonlar

Projenizde `api/` klasörü varsa ve proje kendi sunucusunu başlatmıyorsa (`start` betiği yok), Turguz klasördeki her dosyayı bir uç olarak yayınlar: `api/merhaba.ts` → `/api/merhaba`, `api/urunler/index.js` → `/api/urunler`. Klasörün kökündeki statik dosyalar da sunulur.

- Dosyalar JavaScript (`.js`, `.mjs`, `.cjs`) ya da TypeScript (`.ts`, `.mts`, `.cts`) olabilir; TypeScript için derleme adımı yazmanız gerekmez.
- Değişkenli yollar: `api/urunler/[id].ts` → `/api/urunler/42`; `api/belgeler/[...yol].ts` bir ya da daha çok parçayı yakalar. Değerler `req.query`ye gelir. Aynı yolu karşılayan sabit dosya önce gelir.
- `_` ile başlayan dosya ve klasörler yardımcıdır, uç olmaz.
- İki işleyici biçimi var:
  - `export default function handler(req, res)`: `req.query`, `req.body`, `req.cookies`; `res.status()`, `res.json()`, `res.send()`.
  - Yönteme göre adlı işleyici: `export function GET(request) { return Response.json({ ... }) }`. Dışa aktarılmayan yöntem 405 döner.

## Sitenin adresi

Ortam yayına çıkınca ortamın başlığında sitenin adresi yazar. Adrese tıklayınca site açılır, yanındaki simge adresi kopyalar.

## Site açılırken ve kapalıyken

**Kurulumunuza bağlı:** Bu özellik kurulumunuzda açık değilse panelde görünmez; açılmasını istiyorsanız platform yöneticinize sorun.

Açılış sayfası kurulum ayarıdır. Kapalıysa ziyaretçi bu anlarda tarayıcının hata sayfasını görür.

Uygulamanız çalışmadığı anlarda ziyaretçi, sitenin adresinde Turguz'un açılış sayfasını görür. Sayfa ziyaretçinin diline göre Türkçe ya da İngilizce yazar:

- **"Site açılıyor"**: ilk yayında, yeni sürüm yayına çıkarken, yeniden başlatmada ya da durdurulmuş ortam başlatılırken. Adımlar canlı gösterilir; site hazır olunca sayfa kendiliğinden siteye açılır.
- **"Bu site şu an durduruldu"**: ortam durdurulduğunda. Sayfa sitenin sahibine paneldeki «Başlat»ı hatırlatır; ortam başlatılınca kendiliğinden siteye açılır.
- **"Bu site geçici olarak kullanılamıyor"**: kiracı askıya alındığında. Sebep ziyaretçiye söylenmez.
- **"Site şu an yanıt vermiyor"**: uygulamanız çöktüğünde. Site yeniden açılınca sayfa kendiliğinden yenilenir.

Arama motorları bu sayfayı "geçici olarak yok" diye görür ve dizine almaz; sitenizin dizindeki kaydı korunur.

**Not:**
Uygulamanız çalışırken verdiği her yanıt, 502 ve 503 dahil, ziyaretçiye olduğu gibi gider; kendi hata ya da bakım sayfanız görünür. Turguz'un açılış sayfası yalnız uygulamanız çalışmıyorken çıkar: site açılırken ya da yeniden başlarken, ortam durdurulmuşken, kiracı askıdayken ve uygulama çöktüğünde.

## Dosyalar ve kalıcı veri

Uygulamanın diski her yeni sürümde sıfırlanır. Kullanıcıların yüklediği görseller ve belgeler kaybolur; bunları veritabanında, S3 uyumlu bir nesne deposunda ya da uygulamanın kalıcı diskinde tutun (kiracınızda açıksa; [Ortam boyu](/docs/tr/ortamlar#ortam-boyu)). Veritabanı için [Veritabanı](/docs/tr/veritabani) sayfasına bakın.

## İnternete çıkış

Yayındaki uygulama varsayılan olarak internete çıkamaz. Dış bir hizmete, ödeme sistemine ya da uzaktaki görsellere ulaşması gerekiyorsa ortamın **Ayarlar** sekmesinde, **Alan adı ve erişim** bölümündeki «İnternet erişimi iste» düğmesine basın ve gerekçenizi yazın; yöneticiniz onaylar. Açılan erişim web kapıları ve e-posta gönderimidir (587 ve 465 numaralı kapılar); 25 numaralı kapı kapalıdır, e-posta ayarınızda 587'yi kullanın.

## "Turguz'a dağıt" bağlantısı

Deponuzun README dosyasına şu satırı koyarsanız, bağlantıya tıklayan kişi giriş yaptıktan sonra proje oluşturma penceresi depo adresi dolu olarak açılır. Projeyi o kişi kendisi oluşturur.

```markdown
[![Turguz'a dağıt](https://turguz.app/turguza-dagit.svg)](https://turguz.app/yeni-proje?depo=https://github.com/<hesap>/<depo>)
```

Yalnız github.com ve ciblab.dev depolarının `https` adresi kabul edilir.

## Projeyi silmek

Tek bir projeyi, projenin sayfasındaki **Tehlikeli bölge**den silersiniz. İki pencere sırayla sorar: önce projeyle birlikte silinecek ortamları, veritabanlarını ve ortamlara bağlı öteki verileri listeler, sonra son onayı ister.

Birden çok projeyi birlikte silmek için Projeler listesinde satırlarındaki kutuları işaretleyin ve listenin üstünde beliren çubukta «Sil»e basın. Pencere seçtiğiniz her projeyi, silinecek ortamları ve veritabanlarıyla birlikte listeler; onaylamak için seçtiğiniz proje sayısını yazarsınız. Projeler sırayla silinir ve birkaç dakika sürebilir; sayfadan ayrılsanız da sürer. Silinmekte olan ya da bir ortamında iş süren (dağıtım, komut, veritabanı işlemi) projeler seçilemez. Seçtiklerinizden biri o an silinemiyorsa hiçbiri silinmez; pencere nedenini söyler. Silme sürerken projelerden biri durursa ötekiler silinmeye devam eder; duranın nedeni ortamının satırında yazar. Bir seferde silebileceğiniz proje sayısı sınırlıdır; sınırı çubuk söyler.

Yönetilen veritabanları içindeki verilerle birlikte silinir; saklamak istiyorsanız önce yedek alın. Var olan bir veritabanına bağlıysanız yalnız bağlantı kalkar, veritabanının kendisine dokunulmaz. Kiracının ortak veritabanı sunucusu silinmez. Silme geri alınamaz.

## Desteklenmeyenler

- Ayrı çalışan zamanlanmış işler (cron). Zamanlayıcıyı uygulamanın içinde kurup arka plan işi olarak çalıştırabilirsiniz (bkz. [Web sitesi olmayan süreçler](/docs/tr/ortamlar#web-sitesi-olmayan-surecler)).
- Çalışma ortamında olmayan sistem araçlarına dayanan özellikler (projeyi kendi Dockerfile'ıyla derletirseniz bu araçları Dockerfile'ınızda kurabilirsiniz; bkz. [Kendi Dockerfile'ınızla derlemek](#kendi-dockerfile-inizla-derlemek)).
- Git LFS ile saklanan büyük dosyalar; derlemeye yalnız işaretçileri gelir.
- MySQL, MongoDB ve Redis.
- `api/` klasöründe Python ve Go fonksiyonları (JavaScript ve TypeScript destekleniyor).
- Platform adresinde tarayıcıya sitenin bütün verisini tek yanıtla sildirmek. Bu adres başka sitelerle aynı alan adının altında olduğu için böyle bir istek ziyaretçiye ulaşmaz. Çıkışta uygulamanızın çerezlerini tek tek silin.
