| local kube = import "../../kube/kube.libsonnet"; |
| |
| { |
| AppServiceTelegram(name):: { |
| local bridge = self, |
| local cfg = bridge.cfg, |
| cfg:: { |
| metadata: {}, |
| image: error "image must be set", |
| storageClassName: error "storageClassName must be set", |
| |
| // Data that will be serialized into the appservice's config.yaml. |
| // This is taken straight from a YAML that was generated by |
| // dock.mau.dev/tulir/mautrix-telegram:v0.8.2. We override here |
| // fields that we know are strictly necessary to be configured when |
| // instantiating this template. |
| config: (std.native("parseYaml")(importstr "appservice-telegram.yaml")[0]) + { |
| homeserver+: { |
| address: error "homeserver.address must be set", |
| domain: error "homeserver.domain must be set", |
| }, |
| appservice+: { |
| address: bridge.svc.http_url, |
| // We disable this. I have no idea what it does, but it |
| // wants a secret. ~q3k |
| provisioning+: { |
| enabled: false, |
| shared_secret: if self.enabled then error "appservice.provisioning.shared_secret must be set" else "hackme", |
| }, |
| id: error "appservice.id must be set", |
| as_token: "This value is generated when generating the registration", |
| hs_token: "This value is generated when generating the registration", |
| }, |
| telegram+: { |
| api_id: error "telegram.api_id must be set", |
| api_hash: error "telegram.api_hash must be set", |
| bot_token: error "telegram.bot_token must be set", |
| }, |
| bridge+: { |
| permissions: { |
| '*': "relaybot", |
| }, |
| }, |
| }, |
| }, |
| |
| config: kube.Secret("appservice-telegram-%s" % [name]) { |
| metadata+: cfg.metadata, |
| data: { |
| "config.yaml": std.base64(std.manifestYamlDoc(cfg.config)), |
| }, |
| }, |
| |
| dataVolume: kube.PersistentVolumeClaim("appservice-telegram-%s" % [name]) { |
| metadata+: cfg.metadata, |
| spec+: { |
| storageClassName: cfg.storageClassName, |
| accessModes: [ "ReadWriteOnce" ], |
| resources: { |
| requests: { |
| storage: "10Gi", |
| }, |
| }, |
| }, |
| }, |
| |
| bootstrapJob: kube.Job("appservice-telegram-%s-bootstrap" % [name]) { |
| metadata+: cfg.metadata { |
| labels: { |
| "job-name": "appservice-telegram-%s-bootstrap" % [name], |
| }, |
| }, |
| spec+: { |
| template+: { |
| spec+: { |
| volumes_: { |
| config: kube.SecretVolume(bridge.config), |
| }, |
| containers_: { |
| bootstrap: kube.Container("appservice-telegram-%s-bootstrap" % [name]) { |
| image: cfg.image, |
| command: [ |
| "sh", "-c", |
| "python3 -m mautrix_telegram -g -c /config/config.yaml -r /tmp/registration.yaml && echo SNIPSNIP && cat /tmp/registration.yaml", |
| ], |
| volumeMounts_: { |
| config: { mountPath: "/config" }, |
| }, |
| }, |
| }, |
| }, |
| }, |
| }, |
| }, |
| |
| deployment: kube.Deployment("appservice-telegram-%s" % [name]) { |
| metadata+: cfg.metadata, |
| spec+: { |
| replicas: 1, |
| template+: { |
| spec+: { |
| volumes_: { |
| config: kube.SecretVolume(bridge.config), |
| data: kube.PersistentVolumeClaimVolume(bridge.dataVolume), |
| registration: { secret: { secretName: "appservice-telegram-%s-registration" % [name] } }, |
| }, |
| initContainers: [ |
| // This container takes the stateless config from the Secret, and |
| // updates it with the registration secrets from the registration token. |
| kube.Container("generate-config") { |
| volumeMounts_: { |
| config: { mountPath: "/config", }, |
| registration: { mountPath: "/registration", }, |
| data: { mountPath: "/data" }, |
| }, |
| // Ow, the edge! We need yq. |
| // See: https://github.com/mikefarah/yq/issues/190#issuecomment-667519015 |
| image: "alpine@sha256:156f59dc1cbe233827642e09ed06e259ef6fa1ca9b2e29d52ae14d5e7b79d7f0", |
| command: [ |
| "sh", "-c", ||| |
| set -e -x |
| apk add --no-cache yq |
| cp /config/config.yaml /data/config.yaml |
| yq w -i /data/config.yaml appservice.as_token $(yq r /registration/registration.yaml as_token) |
| yq w -i /data/config.yaml appservice.hs_token $(yq r /registration/registration.yaml hs_token) |
| ||| |
| ], |
| }, |
| ], |
| containers_: { |
| appserviceIrc: kube.Container("appservice-telegram-%s" % [name]) { |
| image: cfg.image, |
| command: [ |
| "sh", "-c", ||| |
| alembic -x config=/data/config.yaml upgrade head |
| python3 -m mautrix_telegram -n -c /data/config.yaml |
| ||| |
| ], |
| ports_: { |
| http: { containerPort: 29317 }, |
| }, |
| volumeMounts_: { |
| data: { mountPath: "/data" }, |
| }, |
| }, |
| }, |
| }, |
| }, |
| }, |
| }, |
| |
| svc: kube.Service("appservice-telegram-%s" % [name]) { |
| metadata+: cfg.metadata, |
| target_pod:: bridge.deployment.spec.template, |
| }, |
| }, |
| } |