doc(forgejo): WiP ... added forgejo documentation for 2nd level operation
This commit is contained in:
parent
ea93b7360d
commit
19c30cfa51
8 changed files with 366 additions and 0 deletions
|
@ -0,0 +1,35 @@
|
||||||
|
|
||||||
|
create user with simple password which doesn't need to be changed:
|
||||||
|
|
||||||
|
forgejo admin user create --username user-8 --email user-8@u.de --password p --must-change-password=false
|
||||||
|
|
||||||
|
|
||||||
|
create admin token in forgejo-instance with forgejo admin
|
||||||
|
|
||||||
|
|
||||||
|
410880a9c760:/var/lib/gitea$ forgejo admin user generate-access-token --username admin2 --token-name "automation-token4" --scopes write:admin,write:repository,write:organization,write:user,write:issue,write:misc
|
||||||
|
Access token was successfully created: d7497188e767ec44bfa06424e25cc7d2387399a0
|
||||||
|
|
||||||
|
add logn to tea
|
||||||
|
|
||||||
|
tea login add --url http://localhost:3000 --token d7497188e767ec44bfa06424e25cc7d2387399a0 --name myadmin
|
||||||
|
|
||||||
|
|
||||||
|
login to myadmin
|
||||||
|
|
||||||
|
|
||||||
|
❯ tea login
|
||||||
|
┌────────────────┬───────────────────────┬────────────────┬──────────┬─────────┐
|
||||||
|
│ NAME │ URL │ SSH HOST │ USER │ DEFAULT │
|
||||||
|
├────────────────┼───────────────────────┼────────────────┼──────────┼─────────┤
|
||||||
|
│ localhost:3000 │ http://localhost:3000 │ localhost:3000 │ admin2 │ false │
|
||||||
|
│ admin │ http://localhost:3000 │ localhost:3000 │ johannes │ false │
|
||||||
|
│ myadmin │ http://localhost:3000 │ localhost:3000 │ admin2 │ false │
|
||||||
|
└────────────────┴───────────────────────┴────────────────┴──────────┴─────────┘
|
||||||
|
❯ tea login myadmin
|
||||||
|
|
||||||
|
myadmin
|
||||||
|
|
||||||
|
@admin2 http://localhost:3000/admin2
|
||||||
|
|
||||||
|
Created: 29 Jun 25 12:39 CEST
|
|
@ -0,0 +1,62 @@
|
||||||
|
Das `owners`-Team in Gitea/Forgejo ist **etwas Besonderes** und tatsächlich **hardcoded** – hier sind die Details:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Bedeutung des `owners` Teams
|
||||||
|
|
||||||
|
### 🟩 Es ist **automatisch vorhanden**
|
||||||
|
|
||||||
|
* Jede Organisation hat immer ein Team namens `owners`.
|
||||||
|
* Dieses Team wird **automatisch erstellt**, wenn die Organisation erstellt wird.
|
||||||
|
|
||||||
|
### 🔐 Es hat **immer Admin-Rechte**
|
||||||
|
|
||||||
|
* Mitglieder des `owners`-Teams haben **volle Admin-Rechte** auf:
|
||||||
|
|
||||||
|
* alle Repositories der Organisation
|
||||||
|
* alle Teams
|
||||||
|
* die Organisation selbst (z. B. Mitgliederverwaltung, Einstellungen)
|
||||||
|
* Rechte können **nicht reduziert** oder **entfernt** werden.
|
||||||
|
* Nur Mitglieder dieses Teams können:
|
||||||
|
|
||||||
|
* neue Teams erstellen oder löschen
|
||||||
|
* andere Mitglieder zum `owners`-Team hinzufügen oder entfernen
|
||||||
|
|
||||||
|
### 🔒 Sicherheitsrelevant
|
||||||
|
|
||||||
|
* Dieses Team steuert **letztlich die Kontrolle über die gesamte Organisation**.
|
||||||
|
* Es ist vergleichbar mit „Org Admins“.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Muss ich das `owners`-Team konfigurieren?
|
||||||
|
|
||||||
|
### Nein – aber:
|
||||||
|
|
||||||
|
* Du **musst es nicht konfigurieren**, es funktioniert immer.
|
||||||
|
* Du **kannst Mitglieder hinzufügen oder entfernen**, aber **nicht das Team selbst löschen oder umbenennen**.
|
||||||
|
|
||||||
|
### ✅ Empfehlungen:
|
||||||
|
|
||||||
|
* Nur vertrauenswürdige Personen (z. B. Projekt-Admins) sollten im `owners`-Team sein.
|
||||||
|
* Für andere Rollen (Contributor, Maintainer, Leser) solltest du **eigene Teams** mit passenden Rechten erstellen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📘 Beispiel: Organisation mit klarer Rollentrennung
|
||||||
|
|
||||||
|
| Team | Beschreibung | Rechte |
|
||||||
|
| -------------- | ------------------------- | -------------------------- |
|
||||||
|
| `owners` | Orga-Admins (hartkodiert) | Admin |
|
||||||
|
| `maintainers` | Aktive Maintainer | Admin/Write je nach Bedarf |
|
||||||
|
| `contributors` | Beitragende Entwickler | Write |
|
||||||
|
| `readers` | Dürfen nur lesen | Read |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Wenn du möchtest, kann ich dir auch ein Skript bauen, das sicherstellt:
|
||||||
|
|
||||||
|
* Nur bestimmte Benutzer im `owners`-Team sind
|
||||||
|
* Alle anderen automatisch in passende andere Teams sortiert werden
|
||||||
|
|
||||||
|
Möchtest du so ein Beispiel oder ein Review-Skript für Orga-Mitglieder und deren Rechte?
|
|
@ -0,0 +1,57 @@
|
||||||
|
@startuml
|
||||||
|
package "Forgejo/Gitea User-Organisation-Repo-Modell" {
|
||||||
|
|
||||||
|
class User {
|
||||||
|
+ id: int
|
||||||
|
+ username: string
|
||||||
|
+ email: string
|
||||||
|
}
|
||||||
|
|
||||||
|
class Organisation {
|
||||||
|
+ id: int
|
||||||
|
+ name: string
|
||||||
|
}
|
||||||
|
|
||||||
|
class OrgMember {
|
||||||
|
+ user_id: int
|
||||||
|
+ org_id: int
|
||||||
|
+ is_owner: bool
|
||||||
|
+ role: string
|
||||||
|
}
|
||||||
|
|
||||||
|
class Team {
|
||||||
|
+ id: int
|
||||||
|
+ org_id: int
|
||||||
|
+ name: string
|
||||||
|
+ permission_level: string
|
||||||
|
}
|
||||||
|
|
||||||
|
class Repository {
|
||||||
|
+ id: int
|
||||||
|
+ owner_id: int
|
||||||
|
+ name: string
|
||||||
|
+ is_private: bool
|
||||||
|
}
|
||||||
|
|
||||||
|
User "1" -- "0..*" OrgMember : membership
|
||||||
|
Organisation "1" -- "0..*" OrgMember : members
|
||||||
|
Organisation "1" -- "0..*" Team : teams
|
||||||
|
Team "1" -- "0..*" User : members
|
||||||
|
Team "1" -- "0..*" Repository : repos
|
||||||
|
|
||||||
|
Organisation "1" -- "0..*" Repository : owns
|
||||||
|
|
||||||
|
note right of OrgMember
|
||||||
|
Owner (is_owner = true) kann:
|
||||||
|
- Organisation verwalten
|
||||||
|
- Teams erstellen/löschen
|
||||||
|
- Mitglieder verwalten
|
||||||
|
end note
|
||||||
|
|
||||||
|
note left of Repository
|
||||||
|
Zugriff durch Teams nur möglich, wenn
|
||||||
|
Repository zu Organisation gehört.
|
||||||
|
Owner können Repository voll verwalten.
|
||||||
|
end note
|
||||||
|
}
|
||||||
|
@enduml
|
|
@ -0,0 +1,63 @@
|
||||||
|
@startuml
|
||||||
|
package "Forgejo/Gitea System" {
|
||||||
|
|
||||||
|
package "Systemweite Benutzer & Rollen" {
|
||||||
|
class User {
|
||||||
|
+ id: int
|
||||||
|
+ username: string
|
||||||
|
+ email: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
package Organisation {
|
||||||
|
class Organisation {
|
||||||
|
+ id: int
|
||||||
|
+ name: string
|
||||||
|
}
|
||||||
|
|
||||||
|
class OrgMember {
|
||||||
|
+ user_id: int
|
||||||
|
+ org_id: int
|
||||||
|
+ is_owner: bool
|
||||||
|
+ role: string
|
||||||
|
}
|
||||||
|
|
||||||
|
class Team {
|
||||||
|
+ id: int
|
||||||
|
+ org_id: int
|
||||||
|
+ name: string
|
||||||
|
+ permission_level: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
package Repository {
|
||||||
|
class Repository {
|
||||||
|
+ id: int
|
||||||
|
+ owner_id: int
|
||||||
|
+ name: string
|
||||||
|
+ is_private: bool
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
User "1" -- "0..*" OrgMember : membership
|
||||||
|
Organisation "1" -- "0..*" OrgMember : members
|
||||||
|
Organisation "1" -- "0..*" Team : teams
|
||||||
|
Team "1" -- "0..*" User : members
|
||||||
|
Team "1" -- "0..*" Repository : repos
|
||||||
|
|
||||||
|
Organisation "1" -- "0..*" Repository : owns
|
||||||
|
|
||||||
|
note right of OrgMember
|
||||||
|
Owner (is_owner = true) kann:
|
||||||
|
- Organisation verwalten
|
||||||
|
- Teams erstellen/löschen
|
||||||
|
- Mitglieder verwalten
|
||||||
|
end note
|
||||||
|
|
||||||
|
note left of Repository
|
||||||
|
Zugriff durch Teams nur möglich, wenn
|
||||||
|
Repository zu Organisation gehört.
|
||||||
|
Owner können Repository voll verwalten.
|
||||||
|
end note
|
||||||
|
}
|
||||||
|
@enduml
|
|
@ -0,0 +1,62 @@
|
||||||
|
@startuml
|
||||||
|
left to right direction
|
||||||
|
skinparam linetype ortho
|
||||||
|
skinparam classAttributeIconSize 0
|
||||||
|
hide circle
|
||||||
|
|
||||||
|
' Gruppierungen
|
||||||
|
package "Systemweite Benutzer und Rollen" {
|
||||||
|
class User {
|
||||||
|
+username
|
||||||
|
+email
|
||||||
|
+isAdmin
|
||||||
|
}
|
||||||
|
|
||||||
|
note right of User
|
||||||
|
Kann Organisationen erstellen
|
||||||
|
Kann eigenen Namespace verwalten
|
||||||
|
Kann systemweiter Admin sein
|
||||||
|
end note
|
||||||
|
}
|
||||||
|
|
||||||
|
package "Organisation" {
|
||||||
|
class Organisation {
|
||||||
|
+name
|
||||||
|
+visibility
|
||||||
|
}
|
||||||
|
|
||||||
|
class Team {
|
||||||
|
+name
|
||||||
|
+permissionLevel
|
||||||
|
+canCreateRepos
|
||||||
|
}
|
||||||
|
|
||||||
|
class OrgMember {
|
||||||
|
+role: member / owner
|
||||||
|
}
|
||||||
|
|
||||||
|
Organisation "1" -- "0..*" Team : verwaltet >
|
||||||
|
Organisation "1" -- "0..*" OrgMember : hat Mitglieder >
|
||||||
|
User "1" -- "0..*" OrgMember : ist >
|
||||||
|
|
||||||
|
OrgMember "1" -- "0..*" Team : gehört zu >
|
||||||
|
}
|
||||||
|
|
||||||
|
package "Repository" {
|
||||||
|
class Repository {
|
||||||
|
+name
|
||||||
|
+visibility
|
||||||
|
+owner: User|Organisation
|
||||||
|
}
|
||||||
|
|
||||||
|
Team "1" -- "0..*" Repository : Zugriff auf >
|
||||||
|
User "1" -- "0..*" Repository : direkte Rechte (optional) >
|
||||||
|
|
||||||
|
note right of Repository
|
||||||
|
Teams können nur auf Repositories zugreifen,
|
||||||
|
die zur selben Organisation gehören.
|
||||||
|
Nutzer-Repos können nicht über Teams geteilt werden.
|
||||||
|
end note
|
||||||
|
}
|
||||||
|
|
||||||
|
@enduml
|
|
@ -0,0 +1,56 @@
|
||||||
|
@startuml
|
||||||
|
left to right direction
|
||||||
|
skinparam linetype ortho
|
||||||
|
skinparam classAttributeIconSize 0
|
||||||
|
hide circle
|
||||||
|
|
||||||
|
' Gruppierungen
|
||||||
|
package "Systemweite Benutzer und Rollen" {
|
||||||
|
class User {
|
||||||
|
+username
|
||||||
|
+email
|
||||||
|
+isAdmin
|
||||||
|
}
|
||||||
|
|
||||||
|
note right of User
|
||||||
|
Kann Organisationen erstellen
|
||||||
|
Kann eigenen Namespace verwalten
|
||||||
|
Kann systemweiter Admin sein
|
||||||
|
end note
|
||||||
|
}
|
||||||
|
|
||||||
|
package "Organisation" {
|
||||||
|
class Organisation {
|
||||||
|
+name
|
||||||
|
+visibility
|
||||||
|
}
|
||||||
|
|
||||||
|
class Team {
|
||||||
|
+name
|
||||||
|
+permissionLevel
|
||||||
|
+canCreateRepos
|
||||||
|
}
|
||||||
|
|
||||||
|
class OrgMember {
|
||||||
|
+role: member / owner
|
||||||
|
}
|
||||||
|
|
||||||
|
Organisation "1" -- "0..*" Team : verwaltet >
|
||||||
|
Organisation "1" -- "0..*" OrgMember : hat Mitglieder >
|
||||||
|
User "1" -- "0..*" OrgMember : ist >
|
||||||
|
|
||||||
|
OrgMember "1" -- "0..*" Team : gehört zu >
|
||||||
|
}
|
||||||
|
|
||||||
|
package "Repository" {
|
||||||
|
class Repository {
|
||||||
|
+name
|
||||||
|
+visibility
|
||||||
|
+owner: User|Organisation
|
||||||
|
}
|
||||||
|
|
||||||
|
Team "1" -- "0..*" Repository : Zugriff auf >
|
||||||
|
User "1" -- "0..*" Repository : direkte Rechte (optional) >
|
||||||
|
}
|
||||||
|
|
||||||
|
@enduml
|
|
@ -0,0 +1,31 @@
|
||||||
|
@startuml
|
||||||
|
skinparam defaultTextAlignment center
|
||||||
|
skinparam linetype ortho
|
||||||
|
|
||||||
|
start
|
||||||
|
|
||||||
|
:Neuer Nutzer registriert
|
||||||
|
oder eingeladen;
|
||||||
|
|
||||||
|
:Login am Forgejo-Server;
|
||||||
|
|
||||||
|
partition "Eigenes Nutzerkonto" {
|
||||||
|
:Optional: SSH-Key, Avatar, Bio;
|
||||||
|
:Optional: Eigenes Repo erstellen;
|
||||||
|
}
|
||||||
|
|
||||||
|
partition "Organisationen" {
|
||||||
|
:Neue Organisation erstellen;
|
||||||
|
:Team 'Owners' automatisch vorhanden;
|
||||||
|
:Weitere Teams erstellen;
|
||||||
|
:Bestehende Nutzer zu Teams hinzufügen;
|
||||||
|
}
|
||||||
|
|
||||||
|
partition "Repositories" {
|
||||||
|
:Repo in Organisation erstellen;
|
||||||
|
:Teams Berechtigungen auf Repos geben;
|
||||||
|
:Optional: Webhooks, Labels, Milestones;
|
||||||
|
}
|
||||||
|
|
||||||
|
stop
|
||||||
|
@enduml
|
Loading…
Reference in a new issue