| local mirko = import "../../kube/mirko.libsonnet"; |
| local kube = import "../../kube/kube.libsonnet"; |
| |
| // Deploy SourceGraph, a code serach tool. Its configuration is fully managed |
| // within sourcegraph itself, including user accounts. |
| |
| { |
| cfg:: { |
| image: "sourcegraph/server:3.17.1", |
| publicFQDN: error "public FQDN must be set", |
| storageClassName: "waw-hdd-redundant-3", |
| }, |
| |
| component(cfg, env):: mirko.Component(env, "sourcegraph") { |
| local sourcegraph = self, |
| cfg+: { |
| image: cfg.image, |
| volumes+: { |
| data: kube.PersistentVolumeClaimVolume(sourcegraph.pvc.data), |
| etc: kube.PersistentVolumeClaimVolume(sourcegraph.pvc.etc), |
| }, |
| securityContext: { |
| runAsUser: 0, |
| fsGroup: 0, |
| }, |
| // This container fixes some permissions that Kubernetes volume mounts break. |
| initContainer: sourcegraph.Container("fixperms") { |
| image: "alpine:3", |
| volumeMounts_+: { |
| data: { mountPath: "/var/opt/sourcegraph" }, |
| }, |
| ports_: {}, |
| command: [ |
| "sh", "-c", |
| "chmod 755 /var/opt/sourcegraph; chmod -R 700 /var/opt/sourcegraph/postgresql", |
| ], |
| }, |
| container: sourcegraph.Container("main") { |
| volumeMounts_+: { |
| data: { mountPath: "/var/opt/sourcegraph" }, |
| etc: { mountPath: "/etc/sourcegraph" }, |
| }, |
| resources: { |
| requests: { |
| cpu: "100m", |
| memory: "1Gi", |
| }, |
| limits: { |
| cpu: "1", |
| memory: "2Gi", |
| }, |
| }, |
| }, |
| ports+: { |
| publicHTTP: { |
| public: { |
| port: 7080, |
| dns: cfg.publicFQDN, |
| // Authenticate as 'Anonymous' user by default. This is done in tandem |
| // with Sourcegraphs authenticate-by-http-header feature, and is a |
| // workaround for the lack of a public view in the self-hosted free |
| // version of Sourcegraph. |
| // https://twitter.com/sqs/status/1272659451292422144 |
| setHeaders: ["X-Forwarded-User Anonymous"], |
| }, |
| }, |
| }, |
| extraPaths: [ |
| { |
| // Redirect anonymous user settings to a service that doesn't |
| // have any endpoints/backends. |
| path: "/users/Anonymous/settings", |
| backend: { serviceName: sourcegraph.blocksvc.metadata.name, servicePort: 8080 }, |
| }, |
| ], |
| }, |
| |
| blocksvc: kube.Service(sourcegraph.makeName("blocksvc")) { |
| metadata+: sourcegraph.metadata, |
| spec+: { |
| selector: null, |
| ports: [{ port: 2137, targetPort: 2137 }], |
| }, |
| }, |
| |
| pvc: { |
| data: kube.PersistentVolumeClaim(sourcegraph.makeName("data")) { |
| metadata+: sourcegraph.metadata, |
| spec+: { |
| storageClassName: cfg.storageClassName, |
| accessModes: [ "ReadWriteOnce" ], |
| resources: { |
| requests: { |
| storage: "40Gi", |
| }, |
| }, |
| }, |
| }, |
| etc: kube.PersistentVolumeClaim(sourcegraph.makeName("etc")) { |
| metadata+: sourcegraph.metadata, |
| spec+: { |
| storageClassName: cfg.storageClassName, |
| accessModes: [ "ReadWriteOnce" ], |
| resources: { |
| requests: { |
| storage: "4Gi", |
| }, |
| }, |
| }, |
| }, |
| }, |
| } |
| } |