> ## Documentation Index
> Fetch the complete documentation index at: https://docs.azalt.co/llms.txt
> Use this file to discover all available pages before exploring further.

# S3 Depolama Yapılandırması

> Dosya yükleme ve indirme için S3 uyumlu depolamayı yapılandırın

## Genel Bakış

Azalt şu depolama seçeneklerini destekler:

* **AWS S3** (varsayılan)
* **S3 uyumlu servisler** (MinIO, özel bulut S3, vb.)

Dosya depolama isteğe bağlıdır. Yapılandırılmazsa dosya yükleme özellikleri devre dışı kalır.

## Ortam Değişkenleri

### Dosya Depolama için Zorunlu

| Değişken               | Açıklama                                                   |
| ---------------------- | ---------------------------------------------------------- |
| `S3_BUCKET_NAME`       | S3 bucket adı                                              |
| `S3_ACCESS_KEY_ID`     | AWS erişim anahtarı veya S3 uyumlu servis kimlik bilgileri |
| `S3_SECRET_ACCESS_KEY` | AWS gizli anahtar veya S3 uyumlu servis kimlik bilgileri   |

### İsteğe Bağlı Yapılandırma

| Değişken              | Varsayılan     | Açıklama                                         |
| --------------------- | -------------- | ------------------------------------------------ |
| `S3_REGION`           | `eu-central-1` | AWS bölgesi veya S3 uyumlu servis bölgesi        |
| `S3_ENDPOINT`         | *(yok)*        | S3 uyumlu servisler için özel endpoint URL'i     |
| `S3_PUBLIC_ENDPOINT`  | *(yok)*        | Presigned URL'ler için tarayıcı erişimli URL     |
| `S3_FORCE_PATH_STYLE` | `false`        | MinIO ve çoğu S3 uyumlu servis için `true` yapın |

## Yapılandırma Senaryoları

### AWS S3 (Standart)

Standart AWS S3 için sadece temel kimlik bilgileri gereklidir:

```bash theme={null}
S3_BUCKET_NAME=my-bucket
S3_ACCESS_KEY_ID=AKIA...
S3_SECRET_ACCESS_KEY=...
S3_REGION=eu-central-1
```

AWS SDK otomatik olarak genel AWS endpoint'lerini kullanır. `S3_ENDPOINT` veya `S3_PUBLIC_ENDPOINT` gerekmez.

### MinIO (Tarayıcı Erişimli)

MinIO örneğiniz tarayıcılardan doğrudan erişilebiliyorsa (örneğin, genel IP veya domain üzerinden):

```bash theme={null}
S3_BUCKET_NAME=azalt
S3_ACCESS_KEY_ID=minioadmin
S3_SECRET_ACCESS_KEY=minioadmin
S3_ENDPOINT=https://minio.example.com
S3_FORCE_PATH_STYLE=true
```

`S3_ENDPOINT` tarayıcı erişimli olduğu için `S3_PUBLIC_ENDPOINT` gerekmez.

### MinIO (Docker/Kubernetes Dahili)

MinIO sadece dahili olarak erişilebiliyorsa (örneğin, Docker ağı veya Kubernetes cluster'ı):

```bash theme={null}
S3_BUCKET_NAME=azalt
S3_ACCESS_KEY_ID=minioadmin
S3_SECRET_ACCESS_KEY=minioadmin
S3_ENDPOINT=http://minio:9000                    # Sunucu işlemleri için dahili URL
S3_PUBLIC_ENDPOINT=https://example.com/s3        # Tarayıcı erişimi için harici URL
S3_FORCE_PATH_STYLE=true
```

### Özel Bulut S3

Özel bulutlardaki dahili S3 uyumlu depolama için (örneğin, banka altyapısı):

```bash theme={null}
S3_BUCKET_NAME=azalt
S3_ACCESS_KEY_ID=...
S3_SECRET_ACCESS_KEY=...
S3_ENDPOINT=https://s3.internal.bank.com         # Dahili S3 endpoint'i
S3_PUBLIC_ENDPOINT=https://s3.external.bank.com  # Tarayıcı erişimli endpoint (farklıysa)
S3_FORCE_PATH_STYLE=true                         # S3 uyumlu servisler için genellikle gerekli
```

Dahili S3 endpoint'iniz tarayıcılardan erişilebiliyorsa (örneğin, kullanıcılar VPN'de), `S3_PUBLIC_ENDPOINT`'i atlayabilirsiniz.

## Presigned URL'ler Nasıl Çalışır

Bir kullanıcı dosya yükleyip indirdiğinde, Azalt tarayıcının doğrudan kullandığı bir presigned URL oluşturur.

### Endpoint Çözümleme Sırası

Presigned URL'ler için (tarayıcı dosya erişimi):

1. `S3_PUBLIC_ENDPOINT` (ayarlıysa)
2. `S3_ENDPOINT` (ayarlıysa)
3. AWS SDK varsayılanları (standart AWS S3 için)

Sunucu işlemleri için (yüklemeler, doğrulama):

1. `S3_ENDPOINT` (ayarlıysa)
2. AWS SDK varsayılanları

## Helm Values (Kubernetes)

`values.yaml` içinde:

```yaml theme={null}
env:
  secrets:
    S3_ENDPOINT: "http://minio.storage.svc.cluster.local:9000"
    S3_PUBLIC_ENDPOINT: "https://s3.example.com"
    S3_BUCKET_NAME: "azalt"
    S3_ACCESS_KEY_ID: "..."
    S3_SECRET_ACCESS_KEY: "..."
    S3_FORCE_PATH_STYLE: "true"
  config:
    S3_REGION: "eu-central-1"
```

## Sorun Giderme

<AccordionGroup>
  <Accordion title="Hata: S3 storage is not configured">
    Üç zorunlu değişkenin de ayarlandığından emin olun:

    * `S3_BUCKET_NAME`
    * `S3_ACCESS_KEY_ID`
    * `S3_SECRET_ACCESS_KEY`
  </Accordion>

  <Accordion title="Uyarı: S3_ENDPOINT is set but S3_PUBLIC_ENDPOINT is not">
    Bu uyarı, `S3_ENDPOINT` yapılandırıldığında ancak `S3_PUBLIC_ENDPOINT` yapılandırılmadığında görünür. Uygulama presigned URL'ler için `S3_ENDPOINT`'i kullanacaktır.

    **İşlem gerekli ise**: `S3_ENDPOINT` dahili bir URL'dir (Docker/Kubernetes servis adı) ve tarayıcılar erişemez. `S3_PUBLIC_ENDPOINT`'i tarayıcı erişimli URL olarak ayarlayın.

    **İşlem gerekli değil ise**: `S3_ENDPOINT` zaten tarayıcı erişimliyse (VPN'deki kullanıcılar, genel endpoint, vb.).
  </Accordion>

  <Accordion title="Dosya yüklemeleri/indirmeleri imza hatalarıyla başarısız oluyor">
    Bu genellikle imzalama için kullanılan URL ile tarayıcıların gerçekte eriştiği URL arasında uyumsuzluk olduğu anlamına gelir.

    1. `S3_PUBLIC_ENDPOINT`'in tarayıcıların S3'e ulaşabileceği yeri gösterdiğini doğrulayın
    2. Herhangi bir reverse proxy'nin yolu doğru koruduğunu kontrol edin
    3. `S3_FORCE_PATH_STYLE`'ın S3 servis gereksinimlerinizle eşleştiğinden emin olun
  </Accordion>

  <Accordion title="Dosya yüklemelerinde CORS hataları">
    S3 bucket'ınızın uygulama domain'inizden gelen isteklere izin veren uygun CORS yapılandırmasına sahip olduğundan emin olun.
  </Accordion>
</AccordionGroup>
