// ONLYOFFICE document server. // JWT secret needs to be generated as follows per environment: // kubectl -n onlyoffice-prod create secret generic documentserver-jwt --from-literal=jwt=$(pwgen 32 1) local kube = import "../../kube/hscloud.libsonnet"; local policies = import "../../kube/policies.libsonnet"; { onlyoffice:: { local oo = self, local cfg = oo.cfg, cfg:: { namespace: error "cfg.namespace must be set", image: "onlyoffice/documentserver:7.0.0.132", storageClassName: "waw-hdd-redundant-3", domain: error "cfg.domain must be set", }, ns: kube.Namespace(cfg.namespace), pvc: oo.ns.Contain(kube.PersistentVolumeClaim("documentserver")) { spec+: { storageClassName: cfg.storageClassName, accessModes: [ "ReadWriteOnce" ], resources: { requests: { storage: "10Gi", }, }, }, }, deploy: oo.ns.Contain(kube.Deployment("documentserver")) { spec+: { template+: { spec+: { containers_: { documentserver: kube.Container("default") { image: cfg.image, resources: { requests: { memory: "4G", cpu: "100m" }, limits: { memory: "8G", cpu: "2" }, }, env_: { JWT_ENABLED: "true", JWT_SECRET: { secretKeyRef: { name: "documentserver-jwt", key: "jwt", }}, }, ports_: { http: { containerPort: 80 }, }, local make(sp, p) = { name: "data", mountPath: p, subPath: sp }, volumeMounts: [ // Per upstream Dockerfile: // VOLUME /var/log/$COMPANY_NAME /var/lib/$COMPANY_NAME // /var/www/$COMPANY_NAME/Data /var/lib/postgresql // /var/lib/rabbitmq /var/lib/redis // /usr/share/fonts/truetype/custom make("log", "/var/log/onlyoffice"), make("www-data", "/var/www/onlyoffice/Data"), make("postgres", "/var/lib/postgresql"), make("rabbit", "/var/lib/rabbitmq"), make("redis", "/var/lib/redis"), make("fonts", "/usr/share/fonts/truetype/custom"), ], }, }, volumes_: { data: kube.PersistentVolumeClaimVolume(oo.pvc), }, }, }, }, }, svc: oo.ns.Contain(kube.Service("documentserver")) { target_pod:: oo.deploy.spec.template, }, ingress: oo.ns.Contain(kube.SimpleIngress("office")) { hosts:: [cfg.domain], target_service:: oo.svc, }, // Needed because the documentserver runs its own supervisor, and: // - rabbitmq wants to mkdir in /run, which starts out with the wrong permissions // - nginx wants to bind to port 80 insecure: policies.AllowNamespaceInsecure(cfg.namespace), }, prod: self.onlyoffice { cfg+: { namespace: "onlyoffice-prod", domain: "office.hackerspace.pl", }, }, }