Git Connector
Git Connector
Section titled “Git Connector”Git Connector (Express) synchronizuje Strapi eventy organizací a uživatelů do Gitea (git hosting) — vytváří repozitáře, spravuje oprávnění a synchronizuje SSH klíče.
Klíčové údaje
Section titled “Klíčové údaje”- Port: 3002
- Tech: Express, TypeScript, Axios
- Messaging: RabbitMQ (exchange
git.events) - Cíl: Gitea Toolbox (9023) + Gitea Apps (9034)
- Logging: Winston
Git Connector propojuje Strapi eventy a Gitea:
- Vytvoření uživatele → vytvoří Gitea uživatele
- Vytvoření organizace → vytvoří Gitea organizaci
- Přidání člena → přidá uživatele do org v Gitea
- Změna SSH klíče → aktualizuje SSH klíče v Gitea
- Synchronizace repozitáře → mirroruje šablony z Toolbox do Apps
Architektura
Section titled “Architektura”Dvě Gitea instance
Section titled “Dvě Gitea instance”| Instance | Port | Účel | Databáze |
|---|---|---|---|
| Toolbox | 9023 | Systémové repozitáře, šablony, sdílené nástroje | Sdílená MySQL (3308) |
| Apps | 9034 | Uživatelské/org repozitáře, aplikace | Sdílená MySQL (3308) |
| SSH | 9022 (Toolbox), 9033 (Apps) | Git přes SSH | — |
Git Connector spravuje obě instance samostatnými API voláními.
Průběh synchronizace
Section titled “Průběh synchronizace”Strapi event (org.create) ↓RabbitMQ: org.events (routing key: create) ↓Git Connector konzumuje event ├─ Extrahuje data organizace ├─ Vytvoří org v Toolbox (POST /api/v1/orgs) ├─ Vytvoří org v Apps (POST /api/v1/orgs) └─ Synchronizuje členy (přidá uživatele do org v obou instancích) ↓Webhook zpět do Strapi (volitelné, pro audit) ↓Frontend vidí organizaci připravenou pro Git operaceZpracování eventů
Section titled “Zpracování eventů”Organization eventy
Section titled “Organization eventy”| Event | Akce |
|---|---|
org.create | Vytvoří Gitea org v Toolbox + Apps |
org.update | Aktualizuje název/popis Gitea org |
org.delete | Smaže Gitea org (soft delete, pokud existují repozitáře) |
Member eventy
Section titled “Member eventy”| Event | Akce |
|---|---|
org.member.added | Přidá uživatele do Gitea org |
org.member.removed | Odebere uživatele z Gitea org |
org.member.role.changed | Aktualizuje Gitea tým (admin/member) |
User eventy
Section titled “User eventy”| Event | Akce |
|---|---|
user.create | Vytvoří Gitea uživatele |
user.update | Aktualizuje username/email |
user.ssh-key.added | Přidá SSH veřejný klíč do Gitea |
user.ssh-key.removed | Odebere SSH klíč z Gitea |
Konfigurace
Section titled “Konfigurace”.env proměnné:
# Gitea instanceGITEA_TOOLBOX_URL=http://gitea-toolbox:3000GITEA_TOOLBOX_ADMIN_TOKEN=<token>
GITEA_APPS_URL=http://gitea-apps:3000GITEA_APPS_ADMIN_TOKEN=<token>
# RabbitMQRABBITMQ_URL=amqp://admin:admin@sencai-mq:5672
# PortPORT=3002
# LoggingLOG_LEVEL=infoGitea Admin Token
Section titled “Gitea Admin Token”Vytvoření admin tokenu:
- Připojení do Gitea kontejneru:
docker exec -it gitea-toolbox bash - Spustit:
gitea admin user change-password admin --password <newpass> - Přihlásit se do Gitea UI:
http://localhost:9023 - Settings → Applications → Generate new token
- Zkopírovat token a nastavit v
.env
Nebo použít Gitea CLI:
docker exec gitea-toolbox gitea admin user change-password admin --password admindocker exec gitea-toolbox gitea admin user generate-access-token -u admin -n sencaiProvisioning
Section titled “Provisioning”POST /org/provision vytvoří Gitea organizaci v instanci Apps a zaregistruje potřebnou týmovou strukturu. Nevytváří žádné výchozí repozitáře — žádné policies, config ani infrastructure repozitáře se nevytvoří automaticky. Vytvoření repozitáře je vždy explicitní akce uživatele přes frontend nebo přímé volání API.
HTTP API
Section titled “HTTP API”Všechny endpointy jsou dostupné na portu 3002. Endpointy pod /org/ vyžadují hlavičku X-Service-Secret. Kompletní seznam endpointů viz git-connector/CLAUDE.md.
Infrastruktura
Section titled “Infrastruktura”| Metoda | Cesta | Popis |
|---|---|---|
GET | /health | Health check — konektivita Gitea Toolbox + Apps |
GET | /status | Stav instance a statistiky |
POST | /sync | Manuální spuštění synchronizace |
GET | /queue/stats | Statistiky RabbitMQ front |
POST | /cleanup/duplicates | Odstranění duplicitních záznamů repozitářů ve Strapi |
POST | /webhooks/repository | Gitea příchozí webhook (vyžaduje WEBHOOK_ENABLED) |
Provisioning
Section titled “Provisioning”| Metoda | Cesta | Popis |
|---|---|---|
POST | /org/provision | Vytvoření Gitea organizace (bez výchozích repozitářů) |
DELETE | /org/:slug/teardown | Archivace organizace — všechny repozitáře přejdou do read-only |
GET | /org/:slug/repos | Seznam repozitářů organizace |
POST | /org/:slug/repos | Vytvoření nového repozitáře |
GET | /org/:slug/packages | Seznam balíčků (container, helm, generic, npm, pypi) |
GET | /org/:slug/ci | Seznam workflow runů (Gitea Actions API) |
GET | /org/:slug/mirrors | Seznam mirror repozitářů |
POST | /org/:slug/mirrors | Vytvoření mirror repozitáře |
DELETE | /org/:slug/mirrors/:repoName | Smazání mirror repozitáře |
POST | /org/:slug/tokens | Vytvoření personal access tokenu pro člena org |
Repozitáře
Section titled “Repozitáře”| Metoda | Cesta | Popis |
|---|---|---|
GET | /org/:slug/repo/:repo | Detail repozitáře |
DELETE | /org/:slug/repo/:repo | Smazání repozitáře |
PUT | /org/:slug/repo/:repo | Aktualizace nastavení repozitáře (name, description, private, has_issues, website) |
GET | /org/:slug/repo/:repo/branches | Seznam větví |
GET | /org/:slug/repo/:repo/commits | Nedávné commity (query: limit, max 50) |
GET | /org/:slug/repo/:repo/issues | Seznam issues (query: state, limit) |
Webhooky
Section titled “Webhooky”| Metoda | Cesta | Popis |
|---|---|---|
GET | /org/:slug/repo/:repo/webhooks | Seznam webhooků repozitáře |
POST | /org/:slug/repo/:repo/webhooks | Vytvoření webhooku (body: url, secret, events, active) |
DELETE | /org/:slug/repo/:repo/webhooks/:id | Smazání webhooku |
Deploy Keys
Section titled “Deploy Keys”| Metoda | Cesta | Popis |
|---|---|---|
GET | /org/:slug/repo/:repo/keys | Seznam deploy klíčů |
POST | /org/:slug/repo/:repo/keys | Přidání deploy klíče (body: title, key, read_only) |
DELETE | /org/:slug/repo/:repo/keys/:id | Smazání deploy klíče |
Secrets & Variables (Actions)
Section titled “Secrets & Variables (Actions)”| Metoda | Cesta | Popis |
|---|---|---|
GET | /org/:slug/repo/:repo/secrets | Seznam Actions secrets |
PUT | /org/:slug/repo/:repo/secrets/:name | Vytvoření nebo aktualizace secretu (body: data) |
DELETE | /org/:slug/repo/:repo/secrets/:name | Smazání secretu |
GET | /org/:slug/repo/:repo/variables | Seznam Actions variables |
PUT | /org/:slug/repo/:repo/variables/:name | Vytvoření nebo aktualizace variable (body: value) |
DELETE | /org/:slug/repo/:repo/variables/:name | Smazání variable |
Soubory
Section titled “Soubory”| Metoda | Cesta | Popis |
|---|---|---|
GET | /org/:slug/repo/:repo/tree | Adresářový strom (query: path, ref — výchozí HEAD) |
GET | /org/:slug/repo/:repo/content | Obsah souboru jako raw text (query: path povinný, ref) |
Gitea Actions
Section titled “Gitea Actions”Gitea Actions je povolena přes sekci [actions] v app.ini:
[actions]ENABLED = trueWORKFLOW_DIRS = .sencai/workflows,.gitea/workflows,.github/workflowsAdresář .sencai/workflows/ se prohledá jako první — je to doporučené umístění pro Sencai-nativní workflow soubory. Adresáře .gitea/workflows/ a .github/workflows/ jsou podporovány kvůli kompatibilitě s existujícími pipeline.
Omezení:
- Mirror repozitáře nespouštějí Actions. Při synchronizaci mirroru Gitea nevygeneruje event
push, takže workflow son: pushse nespustí. Použijte místo tohoon: scheduleneboon: workflow_dispatch. - Runnery musí být zaregistrovány, než může jakýkoliv workflow proběhnout. Fronta čeká donekonečna, dokud se nepřipojí odpovídající runner.
API endpoints (legacy sekce)
Section titled “API endpoints (legacy sekce)”Health
Section titled “Health”GET /health
Response:{ "status": "up", "gitea": { "toolbox": "connected", "apps": "connected" }}Webhook (od RabbitMQ consumeru)
Section titled “Webhook (od RabbitMQ consumeru)”POST /api/webhook (interní, přímý přístup není potřeba)Trigger Sync
Section titled “Trigger Sync”POST /api/sync/:organisationId
Response:{ "status": "synced", "organisation": "org-name", "toolbox": "created", "apps": "created"}Gitea API operace
Section titled “Gitea API operace”Git Connector volá Gitea API (v1):
Vytvoření organizace
Section titled “Vytvoření organizace”POST http://gitea-toolbox:3000/api/v1/orgsAuthorization: token <ADMIN_TOKEN>
{ "username": "org-name", "full_name": "Organization Name", "description": "Org description", "website": "https://sencai.space", "location": "Remote"}Přidání uživatele do organizace
Section titled “Přidání uživatele do organizace”POST http://gitea-toolbox:3000/api/v1/orgs/org-name/teamsAuthorization: token <ADMIN_TOKEN>
{ "name": "Developers", "permission": "write", # nebo "read", "admin" "includes_all_repositories": true}Vytvoření SSH klíče pro uživatele
Section titled “Vytvoření SSH klíče pro uživatele”POST http://gitea-toolbox:3000/api/v1/user/keysAuthorization: token <USER_TOKEN>
{ "title": "My SSH Key", "key": "ssh-rsa AAAAB3...", "read_only": false}RabbitMQ eventy
Section titled “RabbitMQ eventy”Git Connector konzumuje z exchange git.events a org.events.
Příklad payloadu eventu:
{ "event": "org.create", "organisation": { "id": 1, "name": "acme-corp", "description": "Acme AI Team", "ownerId": 10 }, "timestamp": "2024-01-01T12:00:00Z"}Logging
Section titled “Logging”# Zobrazení logůdocker logs -f git-connector
# Ukázka výstupu:2024-01-01T12:00:00Z [INFO] Received event: org.create2024-01-01T12:00:00Z [INFO] Creating Gitea org: acme-corp in Toolbox2024-01-01T12:00:01Z [INFO] Creating Gitea org: acme-corp in Apps2024-01-01T12:00:02Z [INFO] Organization synced successfullyTroubleshooting
Section titled “Troubleshooting”Q: „Gitea connection refused”
A: Gitea neběží nebo není dostupná:
docker logs gitea-toolboxdocker logs gitea-apps
# Ověřte, že profil git běží: ./run-local.sh gitQ: „Invalid admin token”
A: Token je expirovaný nebo nesprávný. Vygenerujte nový token v Gitea UI (Settings → Applications).
Q: Organizace se nevytvoří v Gitea
A: Zkontrolujte logy Git Connectoru kvůli chybám. Ověřte:
- RabbitMQ běží:
docker logs sencai-mq - Event je publikován: zkontrolujte RabbitMQ UI (localhost:15672)
- Git Connector konzumuje:
docker logs git-connector
Q: SSH klíče se nesynchronizují
A: Ověřte:
- Formát SSH klíče je platný (začíná
ssh-rsanebossh-ed25519) - Uživatel existuje v Gitea
- Token uživatele má oprávnění write
Q: Chyba „User already exists”
A: Uživatel už v Gitea může existovat z předchozí synchronizace. Kontrola idempotence možná potřebuje zlepšit.
Q: Nelze pushnout do Gitea repa přes SSH
A: Ověřte:
- SSH klíč je přidán k Gitea uživateli
- SSH port (9022 pro Toolbox, 9033 pro Apps) je otevřený
- Git URL používá správný formát:
git@localhost:orgname/reponame.git