> ## 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.

# Git entegrasyonu

> Kubernetes üzerinde Ayakaleaf Pro'nun yanında git-bridge çalıştırın.

Git entegrasyonu ayrı git-bridge hizmetini çalıştırır. Kullanıcılar `${OVERLEAF_SITE_URL}/git/<project id>` üzerinden klonlama ve gönderme (push) yapar; Ayakaleaf Pro pod'u bu istekleri git-bridge'e iletir ve git-bridge proje içeriği ve geçmişi için pod'u geri çağırır. Bunu açmak [MCP sunucusunu](https://ayakaleaf-pro.mintlify.site/tr/on-premises/configuration/overleaf-toolkit/integrations/mcp-server.md) da etkinleştirir ve GitHub, GitLab, Gitea ve Dropbox Senkronizasyonu için gereklidir.

Bu sayfa, [Kubernetes'i Kullanma](https://ayakaleaf-pro.mintlify.site/tr/on-premises/installation/using-kubernetes) sayfasındaki tek replikalı kurulumu genişletir. Birden fazla replika için [Yatay ölçeklendirme](https://ayakaleaf-pro.mintlify.site/tr/on-premises/configuration/kubernetes/horizontal-scaling.md) sayfasına bakın.

| | |
| - | - |
| Hizmetler | kendi pod'unda (StatefulSet) **git-bridge**; her Ayakaleaf Pro pod'unda: nginx (`/git/` isteklerini iletir), web (Git token'ları, projenin Git sayfası, git-bridge'in çağırdığı API) ve history-v1 (dosya içerikleri) |
| Git istemcisi → Overleaf | kullanıcı adı olarak `git` ve parola olarak bir Git kimlik doğrulama token'ı ile `${OVERLEAF_SITE_URL}/git/<project id>` |
| Ayakaleaf Pro pod'u ↔ git-bridge | nginx → `git-bridge` Service'i; git-bridge → `overleaf-internal` üzerinden web'in API'si (port 3000) ve history-v1 (port 3100) |
| Depolanan veriler | git-bridge'in biriminde, klonlanan her proje için bir git deposu |
| Periyodik işler | git-bridge'in saatlik takas (swap) işi; yalnızca bir takas deposu yapılandırıldığında (`GIT_BRIDGE_SWAPSTORE_TYPE`, varsayılan `noop`) depoları taşır |

**1. git-bridge'i dağıtın**

```yaml title="45-git-bridge.yaml" wrap theme={null}
# Internal Service for git-bridge: web's API (3000) and history-v1 (3100) of the Overleaf pod.
# Keep it ClusterIP: the NodePort Service would publish these internal ports on every node.
apiVersion: v1
kind: Service
metadata:
  name: overleaf-internal
  namespace: overleaf
spec:
  selector:
    app: overleaf
  ports:
    - {name: web, port: 3000}
    - {name: history, port: 3100}
---
apiVersion: v1
kind: Service
metadata:
  name: git-bridge
  namespace: overleaf
spec:
  # Fixed ClusterIP inside your service CIDR, used as GIT_BRIDGE_HOST: the image's nginx proxies
  # /git/ with Docker's DNS resolver (127.0.0.11), which does not exist in Kubernetes.
  clusterIP: 10.96.100.80
  selector:
    app: git-bridge
  ports:
    - {name: http, port: 8000}
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: git-bridge
  namespace: overleaf
spec:
  serviceName: git-bridge
  replicas: 1                     # git-bridge must run as a singleton
  selector:
    matchLabels:
      app: git-bridge
  template:
    metadata:
      labels:
        app: git-bridge
    spec:
      # The Service "git-bridge" would inject GIT_BRIDGE_PORT=tcp://..., which git-bridge uses as its port
      enableServiceLinks: false
      containers:
        - name: git-bridge
          image: ghcr.io/ayaka-notes/overleaf-pro/git-bridge:6.3.2   # same tag as overleaf-pro
          command: ["/server-pro-start.sh"]
          securityContext:
            runAsUser: 0
          env:
            - {name: GIT_BRIDGE_API_BASE_URL, value: "http://overleaf-internal.overleaf.svc.cluster.local:3000/api/v0/"}
            - {name: GIT_BRIDGE_OAUTH2_SERVER, value: "http://overleaf.overleaf.svc.cluster.local"}
            - {name: GIT_BRIDGE_POSTBACK_BASE_URL, value: "http://git-bridge.overleaf.svc.cluster.local:8000"}
            - {name: GIT_BRIDGE_ROOT_DIR, value: /data/git-bridge}
          ports:
            - containerPort: 8000
          resources:
            requests: {cpu: 100m, memory: 256Mi}
            limits: {memory: 768Mi}
          volumeMounts:
            - {name: data, mountPath: /data/git-bridge}
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: [ReadWriteOnce]
        resources:
          requests:
            storage: 10Gi
```

`10.96.100.80`, kümenizin hizmet CIDR'ı içinde boş bir adres olmalıdır (kubeadm'in varsayılanı `10.96.0.0/12`).

**2. Ayakaleaf Pro'yu ona yönlendirin**

`30-config.yaml` dosyasına ekleyin:

```yaml title="30-config.yaml (additions)" theme={null}
  GIT_BRIDGE_ENABLED: "true"
  GIT_BRIDGE_HOST: "10.96.100.80"     # the fixed ClusterIP of the Service git-bridge
  GIT_BRIDGE_PORT: "8000"
  V1_HISTORY_URL: http://overleaf-internal.overleaf.svc.cluster.local:3100/api
```

```bash theme={null}
kubectl apply -f 45-git-bridge.yaml -f 30-config.yaml
kubectl -n overleaf rollout restart deployment/overleaf
kubectl -n overleaf rollout status statefulset/git-bridge
```

**3. Bir projeyi klonlayın**

**Account Settings** içinde bir Git kimlik doğrulama token'ı oluşturun, ardından:

```bash theme={null}
git clone http://192.0.2.10:30080/git/<project id>
```

Kullanıcı adı olarak `git`, parola olarak token'ı kullanın.

### Manifest neden böyle görünüyor

* **`GIT_BRIDGE_HOST` olarak sabit bir ClusterIP.** Ayakaleaf Pro imajındaki nginx, `/git/` isteklerini Docker'ın yerleşik DNS'i olan `127.0.0.11` olarak ayarlanmış bir çözümleyiciyle iletir. Kubernetes'te orada bir DNS sunucusu yoktur; bu nedenle `git-bridge` gibi bir ana bilgisayar adı `502` ile başarısız olur ve `/var/log/nginx/error.log` içinde "git-bridge could not be resolved" görünür. Bir IP adresi için arama gerekmez.
* **`overleaf-internal`.** git-bridge, Ayakaleaf Pro pod'unun `3000` (web API'si) ve `3100` (geçmiş) portlarına ihtiyaç duyar. Ayrı bir ClusterIP Service'i bunları küme içinde tutar; bunları NodePort Service'ine eklemek onları her düğümde yayımlar.
* **`enableServiceLinks: false`.** `git-bridge` Service'i, Kubernetes'in pod'a `GIT_BRIDGE_PORT=tcp://10.96.100.80:8000` eklemesine neden olur; git-bridge `GIT_BRIDGE_PORT` değerini dinleme portu olarak okur ve `MalformedJsonException ... path $.port` hatasıyla durur.
* **Kendi birimi olan tek bir replika.** git-bridge, klonlanan her proje için diskte bir git deposu tutar ve iki kez çalışmamalıdır. Biriminin yedeğini alın.

### Kubernetes üzerinde test edildi

HAProxy arkasında üç replikalı ve git-bridge'in `overleaf-0`'ın kardeşi olduğu Kubernetes 1.37 üzerinde, Git entegrasyonu için uçtan uca testlerimiz başarılı oldu (19 vaka); git-bridge, nginx'in `GIT_BRIDGE_HOST` ve `GIT_BRIDGE_PORT` değerlerini kullanmak zorunda kalması için 8001 portuna taşındığında da: hesap ayarlarındaki Git token'ları, düzenleyicideki klonlama komutu, klonlama, gönderme ve çekme, ikili dosyalar ve klasörler, yeniden adlandırmalar ve silmeler, güncel olmayan gönderimlerin reddedilmesi, role göre erişim (davet edilen düzenleyiciler ve bağlantı üzerinden düzenleyiciler gönderebilir, görüntüleyiciler ve gözden geçirenler yalnızca klonlayabilir, erişimi olmayan kullanıcılar reddedilir), yanlış ve silinmiş token'ların reddedilmesi, git-bridge'in dahili yollarının nginx arkasında tutulması ve askıya alınmış hesaplar. Git kimlik doğrulama token'larının kendileri (oluşturma, listeleme, kullanıcı başına sınır, silme, süre dolumu, git-bridge'in web'den istediği denetim ve askıya alınmış ve silinmiş hesapların token'ları) tek replikada başarılı oldu (16 vaka).

### Soru\&Cevap

> [accordion] `git clone` 502 döndürüyor.
>
> **Cevap:** `GIT_BRIDGE_HOST` değerini kontrol edin: adı değil, git-bridge Service'inin IP adresi olmalıdır; yukarıya bakın. `kubectl -n overleaf exec deploy/overleaf -- tail /var/log/nginx/error.log` nedeni gösterir.


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