Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e663dcc0ec | ||
|
|
2bc536d9d8 | ||
|
|
bf9c510d76 | ||
|
|
90b41b37b1 | ||
|
|
9b5c77bb8e | ||
|
|
4a5f62d17a | ||
|
|
245cfcc486 | ||
|
|
37327eebe2 | ||
|
|
b7356b8a2b | ||
|
|
6847c52309 | ||
|
|
47768c6761 | ||
|
|
361f02eddb | ||
|
|
9e23202971 | ||
|
|
584adf59d0 | ||
|
|
dc0652ffe7 | ||
|
|
18d23441be | ||
|
|
d7c996b0c9 | ||
|
|
00c2c7b114 | ||
|
|
59eb11d029 | ||
|
|
eb82a385a4 | ||
|
|
189c5a8d2e | ||
|
|
13bb4814b8 | ||
|
|
dd9fdfdca7 |
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
@@ -0,0 +1,37 @@
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Certificate
|
||||
metadata:
|
||||
name: axion-apex-tls
|
||||
namespace: matrix
|
||||
spec:
|
||||
secretName: axion-apex-tls
|
||||
issuerRef:
|
||||
name: letsencrypt-prod
|
||||
kind: ClusterIssuer
|
||||
dnsNames:
|
||||
- axion1337.chat
|
||||
---
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: IngressRoute
|
||||
metadata:
|
||||
name: axion-apex
|
||||
namespace: matrix
|
||||
spec:
|
||||
entryPoints: [websecure]
|
||||
tls:
|
||||
secretName: axion-apex-tls
|
||||
routes:
|
||||
# Höchste Priorität: /.well-known/matrix/* -> wellKnownDelegation-Service
|
||||
- match: Host(`axion1337.chat`) && PathPrefix(`/.well-known/matrix`)
|
||||
kind: Rule
|
||||
priority: 100
|
||||
services:
|
||||
- name: matrix-stack-well-known
|
||||
port: 8010
|
||||
# Niedrigere Priorität: alles andere -> Element Web
|
||||
- match: Host(`axion1337.chat`)
|
||||
kind: Rule
|
||||
priority: 10
|
||||
services:
|
||||
- name: matrix-stack-element-web
|
||||
port: 80
|
||||
@@ -11,16 +11,21 @@ data:
|
||||
{
|
||||
"brand": "aXion1337.Chat",
|
||||
"default_theme": "aXion1337 Dark",
|
||||
"show_labs_settings": true,
|
||||
"features": {
|
||||
"feature_qr_code_login": true
|
||||
},
|
||||
"setting_defaults": {
|
||||
"custom_themes": [
|
||||
{
|
||||
"name": "aXion1337 Dark",
|
||||
"is_dark": true,
|
||||
"colors": {
|
||||
"accent-color": "#ffaf0f"
|
||||
// Deine restlichen Theme-Farben hier...
|
||||
"accent-color": "#ffaf0f",
|
||||
"primary-color": "#ffaf0f",
|
||||
"secondary-color": "#ffaf0f"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: ess-mas-values-secret
|
||||
namespace: matrix
|
||||
stringData:
|
||||
values.yaml: ENC[AES256_GCM,data:K692tDSLoftfKmsd4nIc8BzJw9CwXkOc4qSGTw78qF7L7UolTlH456WYeuwXiajDHmsVJCLhxDjCAhGyYUgbEC1mwuX1ZpkJefJkXvkGtQqnVbpS5MLYWt2SMQo+Yuz5L3Qxkop8Y02/U8jFxu5w7LQT71aAJphI1Po6r0wWjCIP0pDLTSUXd5Tk4eLq7o1a8nCrkJxSDQc95sRPTlZ/cfVhBE4xDzDK/CD/Yajv6yUceqUr7j7aBHOlg82+y0HU8xY44B/NtAzphJJf706z0X80Q5Dboeks5Rj9Na0lld5hwcOQPocYO28Tb6RDYOkNOQUELZKoc64JcpYJNyUkxfJl0hjtC1TmtAy1ZljLytnbnc9abNnHWgKcBt9TCcLIJJbZAI2snSHON8uNYpf7+erXx0wHVGxL/WZWEiFlAhnTfNx/Dqr2l0tKTjzRgibSpeA9rBmEm1/2PnJjexRpyewbS2MASGy2C1lfqaAPfjxf,iv:tguaH5u/67ubPSzhrhk3QMkpsE3flvrEZf50U3bcXvc=,tag:KY3T9RcV9KVBKb1SKXCjmw==,type:str]
|
||||
sops:
|
||||
age:
|
||||
- recipient: age14l0hwfqylwpemz5y2ghh2yxk0phszlnj3qlejhue0fw0kz3tmfgqdsjzdh
|
||||
enc: |
|
||||
-----BEGIN AGE ENCRYPTED FILE-----
|
||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBJYUEvbDF0azNsM0RSS3pZ
|
||||
eG1sNEZKOXAzUVRZWWVTbjlpazJqaVpBRWtBCkE4SW9qVVhxa1dKSXhXV2pSN0lK
|
||||
VVZET0E2bWZSclkvSzlqdlRxcjVNOEEKLS0tIEZtdm9xRU81WXpkTGQ1UW5HZUl2
|
||||
UERlYmtRc21PSnFGNjFkZFVVcm9nUTgKuxWcqg1MRWq7Yhp61lHHKPZsdiNeHXSd
|
||||
72OCNMaUiz58kTKt+tpthUxXlGUlf3y0VA1/KigeA+L5Z2bk/bdMmw==
|
||||
-----END AGE ENCRYPTED FILE-----
|
||||
lastmodified: "2026-04-22T13:49:01Z"
|
||||
mac: ENC[AES256_GCM,data:wHDBVBTvNycXTKTVBK1MNrGg2C0XufPpNTx9ksp1V5rtfcPvZNbiw8aUcjHt6hNtT3tPPmUt82jwzAbAm3hnPsAVfnue+bB2BZ91AI11tcqr4o+l3djeJODntF5d6TfdIWchtwMisy7bBMtLPS4Vs++JPbP90p/CtCdOxPwh1CQ=,iv:CQ24u8xSpzG3QU4JzzpZIx5cBrMH5RxVPl/S6gLylxU=,tag:f8FdKvtyxz8ks0gV6ct9iQ==,type:str]
|
||||
encrypted_regex: ^(data|stringData)$
|
||||
version: 3.12.2
|
||||
@@ -4,19 +4,19 @@ metadata:
|
||||
name: ess-mas-custom-secrets
|
||||
namespace: matrix
|
||||
stringData:
|
||||
values.yaml: ENC[AES256_GCM,data:K+L4N3tdwZn6u2InPkOgk+hKIp8vp+cy8rE3mbBCXCXpsluxZPDJhhyZ+iNu3enhQBe4CfY+7bND6iGJnmWlkh8hwclLpT1MsG/nIOVwNiV6xaNAwBcdqMe6WMbucvlhQ/fT3JSKt9Eds/Q/O0UyhJE0RGGCVW5jc6ahnud9TqvMY/wqwgtBLbF7mKy9VTwUJIIFVtpC3NKJiwAVEkNJ8p1oDfTzo4MuXURyLdoQH+MClMAs/BCEwrszQv38YS/6kbki7OUurv26caK+PrTsrA2eBZIunMuXPTlUzrb+nI9XgBaj/Ccq4YkTHE9zUXD/fFnOYKy6EwrsBkF0vYmZtMwyRUeNE9V10xL68d1vG8K9,iv:/6eaFfPvFt1RrhBwuiDsudzn+fbAQW5wcxbRjKWH9Og=,tag:ADRRhusFIuJ2Z78wDmxMQw==,type:str]
|
||||
values.yaml: ENC[AES256_GCM,data:Vk5TvaBui8gK6ftcRvZA8aEmw+QmWhn6pp9/2T5ndw8YPiggAtpqZszms5yoOxPK2Jy+GAVZ3M1whWFrdqy2WPjCAVEKlg5i7qeC1wKfgjMV2txWRlQjYAu2n4IYxi1aOaFcqzxLGYclAlQh6J0PmSYKtbWZO0nsjjcbXt9AXRgmjjZnIcNEBcQg9DoSew4MiHr5BQ0dsN0hJx96UhtTAVwssDgE1eKlTz2K/VD/xz3Odd/WuFKjThpa4E3p66Azc+4WNuQpxFejUgEg5ZzMvup8GGEzH5L3jBtxdBNmNFn6GNwFfYwq/ohWTXafVTj1mEpwTYBcKEtsmks8fl/qzb6QBobOOPqKTD4chRhv72yeYE7rv9x6530TxNXGUd++jxtQm1G+ZOjje05k3x2i9SQv5CNBM2jSyoh2uktoVyaJLpgJMv35VdyLAWY+nNXD4yj0isI=,iv:7GmbMaMDWY+agQC3Xr9SpOzGPyb82RDCSEyPHaWwMhQ=,tag:FUpe4v9BybS0M+8L7yvB4A==,type:str]
|
||||
sops:
|
||||
age:
|
||||
- recipient: age14l0hwfqylwpemz5y2ghh2yxk0phszlnj3qlejhue0fw0kz3tmfgqdsjzdh
|
||||
enc: |
|
||||
-----BEGIN AGE ENCRYPTED FILE-----
|
||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBUeENKREZQU0k5aTk0RTY1
|
||||
REl2S3VCNEFPSjMwcURIeVNQUHgwaEs4VzBZCjZQeWFKWStUUDlhZElBV2JGb21h
|
||||
Sk9tUHYyT0VIZFZjdm0xRGtXU0NORGMKLS0tIHAzbDNTNThxbCt1a0k0S0gzWTd2
|
||||
bjlBU0ZkU2EreXROeSttSVVUeVpmaTQKhzIFvPZSCaX2ocBOCQQ47Xax96XYb/8B
|
||||
PVNP8QAkQabMXsPPyaTbccTHe6GBu4fQ1Kw8f7JVkL0Ml+Ss6uSyaA==
|
||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBCUWlDYkY4NVpWNFVHb1Bo
|
||||
b3FpR0w5NmttcW9IV1RXWENwTnE2NU9tR0hvCnJyNU9xWEpYZWRXVURtTis3aEp2
|
||||
MmtCZXZXemlKNnZrbW1OL0NlMXlQbzQKLS0tIG81ZXIyd2pGOVlXeEVtRy92RzFp
|
||||
VU9sa0tOdlBqcnZ2VTVaQWpaN3Y3L0UKUel3SRju6rFbMa9Di++EAci8+fsMjx4X
|
||||
X8fM/N4jTHerXOBCT/bnD/Tk/2jAcwg9PC3e906VDUdsIZw+xU+grw==
|
||||
-----END AGE ENCRYPTED FILE-----
|
||||
lastmodified: "2026-04-21T21:31:26Z"
|
||||
mac: ENC[AES256_GCM,data:2GHrA5POscfBk/uBQjP+9vxcrR6WpaGDO8dRU/y/3hBlVRJuqGKmblLLEdFglsTFa7OvNKIfsMDJmgHkki3iCwwOf6ItxqOUmcN/HjDzHH2JuuQE/w0kx0WAOYqTmBAj2nP8pskbCeca/irZvENtBXrqEp4cMZDa0nqkD2AGHlc=,iv:oOF+7MwY2lv8NKYr+OsXzr6Q1W8edIG0s2MQck24Lyk=,tag:3k4pMloKtm6UxVi8IYMHjw==,type:str]
|
||||
lastmodified: "2026-04-22T10:12:35Z"
|
||||
mac: ENC[AES256_GCM,data:zMIPahMwgSgF9vdEkp7DyECL3s6IuEHWs0JE1G9A+xYmm0mAFYbzMPwgg6oB57gNpX3EaPovHOOvKlTjZVWUbv892mU63GPi4W5kRxsZya5FyC3PxyZlsvMX9U/F8Hwvo9tymbGYpsGGkxv0doRZvTuKDzj1j1+VO0VVcY2i3Gc=,iv:dq6GtQ0vfQWiew6s6gWjPRZPtQ1rD3cO3aQXPDT0Sos=,tag:7UrcQ8Q420HK/vW01SsRkg==,type:str]
|
||||
encrypted_regex: ^(data|stringData)$
|
||||
version: 3.12.2
|
||||
|
||||
@@ -14,5 +14,12 @@ data:
|
||||
url-previews:
|
||||
config: |
|
||||
url_preview_enabled: true
|
||||
max_spider_size: 10M
|
||||
# Deine restlichen URL-Preview und Retention Settings hier...
|
||||
url_preview_ip_range_blacklist:
|
||||
- '127.0.0.0/8'
|
||||
- '10.0.0.0/8'
|
||||
- '172.16.0.0/12'
|
||||
- '192.168.0.0/16'
|
||||
- '::1/128'
|
||||
- 'fe80::/10'
|
||||
- 'fc00::/7'
|
||||
max_spider_size: 10M
|
||||
@@ -23,7 +23,7 @@ spec:
|
||||
name: ess-element-custom
|
||||
valuesKey: values.yaml
|
||||
- kind: Secret
|
||||
name: ess-mas-custom-secrets
|
||||
name: ess-mas-values-secret
|
||||
valuesKey: values.yaml
|
||||
|
||||
values:
|
||||
@@ -69,6 +69,8 @@ spec:
|
||||
host: admin.axion1337.chat
|
||||
|
||||
# Well-Known auf der Apex-Domain (axion1337.chat/.well-known/matrix/*)
|
||||
# Deaktiviert — verursacht ACME-Konflikt mit elementWeb auf gleicher Domain
|
||||
# Aktiviert – notwendig für MatrixRTC-Discovery
|
||||
wellKnownDelegation:
|
||||
enabled: false
|
||||
enabled: true
|
||||
ingress:
|
||||
className: "none" # Deaktiviert den Chart-Ingress, wir erstellen einen eigenen
|
||||
@@ -6,6 +6,8 @@ resources:
|
||||
# Neue Dateien:
|
||||
- custom-configs/synapse-values.yaml
|
||||
- custom-configs/element-values.yaml
|
||||
- custom-configs/mas-secrets.yaml # (oder .sops.yaml, je nach deiner SOPS-Einrichtung)
|
||||
- custom-configs/mas-secret.yaml
|
||||
# HelmRelease (muss ganz unten stehen, damit die ConfigMaps vorher da sind!)
|
||||
- element-server-suite.yaml
|
||||
- element-server-suite.yaml
|
||||
# Custom Apex Ingress für Element Web + Well-Known auf axion1337.chat
|
||||
- apex-ingress.yaml # Custom Apex Ingress für Element Web + Well-Known auf axion1337.chat
|
||||
@@ -0,0 +1,78 @@
|
||||
## 🚀 Step-by-Step Installationsanleitung (From Scratch)
|
||||
|
||||
Diese Anleitung geht davon aus, dass du einen frischen Server (Ubuntu/Debian) mit öffentlicher IP hast und deine lokalen Tools (Flux CLI, kubectl, sops, age) installiert sind.
|
||||
|
||||
### Schritt 1: Kubernetes (K3s) auf dem Server installieren
|
||||
Logge dich per SSH auf deinem Server ein und installiere ein frisches K3s. Wir nutzen K3s mit dem Standard-Traefik-Ingress.
|
||||
|
||||
```bash
|
||||
# Auf dem Server ausführen:
|
||||
curl -sfL https://get.k3s.io | sh -
|
||||
|
||||
# Kubeconfig kopieren und Berechtigungen setzen (für den lokalen Zugriff)
|
||||
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
|
||||
sudo chown $USER ~/.kube/config
|
||||
```
|
||||
*Kopiere dir den Inhalt der `~/.kube/config` auf deinen lokalen Rechner, damit dein lokales `kubectl` den Server steuern kann. Vergiss nicht, die IP `127.0.0.1` in der Datei durch die öffentliche IP deines Servers zu ersetzen.*
|
||||
|
||||
### Schritt 2: Den SOPS-Verschlüsselungs-Key generieren
|
||||
Damit Flux deine verschlüsselten Passwörter (SMTP, Datenbank) im Cluster lesen kann, braucht es einen privaten Schlüssel. Wir nutzen `age`.
|
||||
|
||||
```bash
|
||||
# Auf deinem lokalen Rechner ausführen:
|
||||
# 1. Key generieren
|
||||
age-keygen -o age.agekey
|
||||
|
||||
# 2. Den Public Key (steht in der Datei) in die .sops.yaml des Repos eintragen!
|
||||
|
||||
# 3. Den Private Key als Secret in den Cluster laden (in den flux-system Namespace)
|
||||
cat age.agekey | kubectl create secret generic sops-age \
|
||||
--namespace=flux-system \
|
||||
--from-file=age.agekey=/dev/stdin
|
||||
```
|
||||
|
||||
### Schritt 3: Das Git-Repository vorbereiten
|
||||
Stelle sicher, dass deine GitOps-Struktur gepusht ist und du ein Personal Access Token (PAT) für dein Git-Repository hast (bei GitHub/GitLab).
|
||||
* Das Token benötigt Lese- und Schreibrechte auf das Repository.
|
||||
|
||||
### Schritt 4: Flux Bootstrap (Der Startschuss)
|
||||
Das ist der magische Befehl. Er installiert den Flux-Controller in deinem Cluster und verbindet ihn mit deinem Repository. Ab diesem Moment übernimmt Flux das Steuer.
|
||||
|
||||
**Für GitHub:**
|
||||
```bash
|
||||
export GITHUB_TOKEN="dein-personal-access-token"
|
||||
export GITHUB_USER="dein-github-username"
|
||||
|
||||
flux bootstrap github \
|
||||
--owner=$GITHUB_USER \
|
||||
--repository=dein-repo-name \
|
||||
--branch=main \
|
||||
--path=prod/gitops/clusters/matrix \
|
||||
--personal
|
||||
```
|
||||
|
||||
**Für Gitea/GitLab/Generisches Git (wie in deinem Setup scheinbar genutzt):**
|
||||
```bash
|
||||
flux bootstrap git \
|
||||
--url=https://rohana.axion1337.de/sorb/axion1337.chat-gitops.git \
|
||||
--branch=main \
|
||||
--path=prod/gitops/clusters/matrix \
|
||||
--username=dein-git-user \
|
||||
--password=dein-git-token
|
||||
```
|
||||
|
||||
### Schritt 5: Zurücklehnen und beobachten
|
||||
Flux klont jetzt dein Repo, liest die Kustomizations und wendet sie in der richtigen Reihenfolge an (`infra-apps` -> `production-apps`).
|
||||
|
||||
Du kannst den Fortschritt live verfolgen:
|
||||
```bash
|
||||
# Zeigt den GitOps-Sync-Status:
|
||||
flux get kustomizations --watch
|
||||
|
||||
# Zeigt das Helm-Deployment der Element Server Suite:
|
||||
flux get helmreleases -n matrix --watch
|
||||
|
||||
# Zeigt, wie die Pods hochfahren:
|
||||
kubectl get pods -n matrix -w
|
||||
```
|
||||
Sobald alle Pods auf `Running` stehen und die Zertifikate über Let's Encrypt validiert wurden (`kubectl get certificate -n matrix`), ist dein Matrix-Stack unter `https://axion1337.chat` erreichbar.
|
||||
Reference in New Issue
Block a user