> ## Documentation Index
> Fetch the complete documentation index at: https://ayakaleaf-pro.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# S3

> Kubernetes dağıtımında proje dosyalarını ve geçmişini S3 uyumlu depolamada tutun.

Proje dosyaları ve geçmişleri **history-v1** hizmeti, şablon dosyaları ise **filestore** hizmeti tarafından depolanır; her ikisi de her Ayakaleaf Pro pod'unun içindedir. Varsayılan olarak veri birimine yazarlar; S3 ile bucket'lara yazarlar. Hangi bucket'ların ve izinlerin gerektiği [S3](https://ayakaleaf-pro.mintlify.site/tr/on-premises/configuration/overleaf-toolkit/s3.md) sayfasında açıklanmıştır.

| | |
| - | - |
| Hizmetler | history-v1 (proje dosyaları ve geçmiş), filestore (şablon dosyaları), her Ayakaleaf Pro pod'unda |
| Pod → S3 | okunan veya yazılan her dosya için S3 uç noktası |
| Gerekli | [birden fazla replika](https://ayakaleaf-pro.mintlify.site/tr/on-premises/configuration/kubernetes/horizontal-scaling.md) için: veri birimleri paylaşılmaz, bucket'lar paylaşılır |
| Periyodik işler | yok |

> [!WARNING]
>
> Kullanıcılar proje oluşturmadan önce S3'ü seçin. Dosyaları zaten kendi biriminde tutan bir örnek önce [S3 geçişine](https://ayakaleaf-pro.mintlify.site/tr/on-premises/maintenance/s3-migration.md) ihtiyaç duyar.

### Yapılandırma

**1. Bucket'lar ve anahtarlar**

`overleaf-template-files`, `overleaf-project-blobs` ve `overleaf-chunks` adlı üç bucket'ı ve iki kısıtlı kullanıcıyı S3 hizmetinizle [S3 kurulumu](https://ayakaleaf-pro.mintlify.site/tr/on-premises/configuration/overleaf-toolkit/s3.md#s3-setup) sayfasında anlatıldığı gibi oluşturun ya da aşağıda gösterildiği gibi kümede Garage çalıştırın. Dört anahtarı bir Secret'a koyun:

```bash wrap theme={null}
kubectl -n overleaf create secret generic overleaf-s3 \
  --from-literal=OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID=<filestore key> \
  --from-literal=OVERLEAF_FILESTORE_S3_SECRET_ACCESS_KEY=<filestore secret> \
  --from-literal=OVERLEAF_HISTORY_S3_ACCESS_KEY_ID=<history key> \
  --from-literal=OVERLEAF_HISTORY_S3_SECRET_ACCESS_KEY=<history secret>
```

**2. ConfigMap**

```yaml title="30-config.yaml (additions)" wrap theme={null}
  OVERLEAF_FILESTORE_BACKEND: s3
  OVERLEAF_FILESTORE_TEMPLATE_FILES_BUCKET_NAME: overleaf-template-files
  OVERLEAF_FILESTORE_S3_REGION: eu-west-1
  OVERLEAF_HISTORY_BACKEND: s3
  OVERLEAF_HISTORY_PROJECT_BLOBS_BUCKET: overleaf-project-blobs
  OVERLEAF_HISTORY_CHUNKS_BUCKET: overleaf-chunks
  OVERLEAF_HISTORY_S3_REGION: eu-west-1
  # a self-hosted S3 service also needs its endpoint and path-style addressing
  # OVERLEAF_FILESTORE_S3_ENDPOINT: http://garage:3900
  # OVERLEAF_FILESTORE_S3_PATH_STYLE: "true"
  # OVERLEAF_HISTORY_S3_ENDPOINT: http://garage:3900
  # OVERLEAF_HISTORY_S3_PATH_STYLE: "true"
```

**3. Secret'ı pod'a ekleyin ve yeniden başlatın**

Deployment'ta (veya StatefulSet'te) Secret'ı diğerlerinin yanına ekleyin:

```yaml theme={null}
          envFrom:
            - configMapRef: {name: overleaf-env}
            - secretRef: {name: overleaf-secrets}
            - secretRef: {name: overleaf-s3}
```

```bash theme={null}
kubectl apply -f 30-config.yaml -f 40-overleaf.yaml
kubectl -n overleaf rollout restart deployment/overleaf     # or statefulset/overleaf
```

### Kümede Garage

Bir S3 hizmetiniz yoksa, [Garage](https://garagehq.deuxfleurs.fr/) kümede çalışan küçük bir S3 sunucusudur. [Yatay ölçeklendirme](https://ayakaleaf-pro.mintlify.site/tr/on-premises/configuration/kubernetes/horizontal-scaling.md) kurulumu onunla test edilmiştir. Aşağıdaki komutlar anahtarları üretir ve `overleaf-s3` Secret'ını kendileri oluşturur; bu nedenle 1. adımdaki Secret komutu yerine bunları kullanın.

> [!NOTE]
>
> Overleaf'in örneğinde kullanılan MinIO artık konteyner imajı yayımlamıyor: `minio/minio` Docker Hub'dan ve quay.io'dan kaldırıldı.

```yaml title="50-garage.yaml" wrap theme={null}
apiVersion: v1
kind: ConfigMap
metadata:
  name: garage-config
  namespace: overleaf
data:
  garage.toml: |
    metadata_dir = "/var/lib/garage/meta"
    data_dir = "/var/lib/garage/data"
    db_engine = "lmdb"
    replication_factor = 1
    rpc_bind_addr = "[::]:3901"
    rpc_public_addr = "127.0.0.1:3901"
    # rpc_secret and admin_token come from GARAGE_RPC_SECRET / GARAGE_ADMIN_TOKEN
    [s3_api]
    s3_region = "garage"          # Overleaf's OVERLEAF_*_S3_REGION must match
    api_bind_addr = "[::]:3900"
    [admin]
    api_bind_addr = "[::]:3903"
---
apiVersion: v1
kind: Service
metadata:
  name: garage
  namespace: overleaf
spec:
  selector:
    app: garage
  ports:
    - name: s3
      port: 3900
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: garage
  namespace: overleaf
spec:
  serviceName: garage
  replicas: 1
  selector:
    matchLabels:
      app: garage
  template:
    metadata:
      labels:
        app: garage
    spec:
      containers:
        - name: garage
          image: dxflrs/garage:v2.5.0
          env:
            - name: GARAGE_RPC_SECRET
              valueFrom: {secretKeyRef: {name: garage-secrets, key: rpc_secret}}
            - name: GARAGE_ADMIN_TOKEN
              valueFrom: {secretKeyRef: {name: garage-secrets, key: admin_token}}
          ports:
            - containerPort: 3900
          readinessProbe:
            tcpSocket:
              port: 3900
          resources:
            requests: {cpu: 50m, memory: 64Mi}
            limits: {memory: 512Mi}
          volumeMounts:
            - {name: config, mountPath: /etc/garage.toml, subPath: garage.toml}
            - {name: data, mountPath: /var/lib/garage}
      volumes:
        - name: config
          configMap:
            name: garage-config
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: [ReadWriteOnce]
        resources:
          requests:
            storage: 10Gi
```

Gizli anahtarları üretin, Garage'ı başlatın, ardından yerleşimi, bucket'ları ve iki kısıtlı anahtarı oluşturun. Garage anahtar kimlikleri `GK` artı 24 onaltılık karakterden, gizli anahtarlar ise 64 onaltılık karakterden oluşur:

```bash wrap theme={null}
kubectl -n overleaf create secret generic garage-secrets \
  --from-literal=rpc_secret="$(openssl rand -hex 32)" \
  --from-literal=admin_token="$(openssl rand -base64 32)"
kubectl -n overleaf create secret generic overleaf-s3 \
  --from-literal=OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID="GK$(openssl rand -hex 12)" \
  --from-literal=OVERLEAF_FILESTORE_S3_SECRET_ACCESS_KEY="$(openssl rand -hex 32)" \
  --from-literal=OVERLEAF_HISTORY_S3_ACCESS_KEY_ID="GK$(openssl rand -hex 12)" \
  --from-literal=OVERLEAF_HISTORY_S3_SECRET_ACCESS_KEY="$(openssl rand -hex 32)"
kubectl apply -f 50-garage.yaml
kubectl -n overleaf rollout status statefulset/garage

g() { kubectl -n overleaf exec garage-0 -- /garage "$@"; }
s() { kubectl -n overleaf get secret overleaf-s3 -o jsonpath="{.data.$1}" | base64 -d; }
g layout assign -z dc1 -c 8G "$(g status 2>/dev/null | awk '/^[0-9a-f]{16}/{print $1; exit}')"
g layout apply --version 1
for b in overleaf-template-files overleaf-project-blobs overleaf-chunks; do g bucket create "$b"; done
g key import --yes -n overleaf-filestore "$(s OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID)" "$(s OVERLEAF_FILESTORE_S3_SECRET_ACCESS_KEY)"
g key import --yes -n overleaf-history "$(s OVERLEAF_HISTORY_S3_ACCESS_KEY_ID)" "$(s OVERLEAF_HISTORY_S3_SECRET_ACCESS_KEY)"
g bucket allow --read --write overleaf-template-files --key overleaf-filestore
g bucket allow --read overleaf-project-blobs --key overleaf-filestore
g bucket allow --read --write overleaf-project-blobs --key overleaf-history
g bucket allow --read --write overleaf-chunks --key overleaf-history
```

İzinler, [S3](https://ayakaleaf-pro.mintlify.site/tr/on-premises/configuration/overleaf-toolkit/s3.md#access-policies) sayfasındaki ilkelerle eşleşir. Garage bölgeyi denetler: burada bölge `garage`'dır ve `OVERLEAF_*_S3_REGION` aynı olmalıdır.

Garage ile ConfigMap'te her iki hizmet için uç noktayı, `PATH_STYLE: "true"` değerini ve `garage` bölgesini, [Yatay ölçeklendirme](https://ayakaleaf-pro.mintlify.site/tr/on-premises/configuration/kubernetes/horizontal-scaling.md) sayfasındaki `60-config.yaml` dosyasında olduğu gibi ayarlayın.

### Birden fazla replika

Tüm replikalar aynı bucket'ları ve anahtarları kullanmalıdır. Bucket'ları S3 sağlayıcınızın araçlarıyla yedekleyin; bu durumda replikaların kendi disklerinde yedeklenmesi gereken veri bulunmaz.

### Kubernetes üzerinde test edildi

Üç replikalı ve yukarıdaki gibi Garage kullanan Kubernetes 1.37 üzerinde, bu sayfalarda proje oluşturan, dosya yükleyen, geçmişi kullanan veya şablon yayımlayan her uçtan uca test başarılı oldu; ardından `overleaf-project-blobs`, `overleaf-chunks` ve `overleaf-template-files` bucket'ları nesneleri içeriyordu, replikaların kendi `/var/lib/overleaf/data/history` dizinleri ise boş kaldı.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.