blob: 2c4d4e0e0de83d55badc010f2387597d00ddb7de [file] [log] [blame]
Piotr Dobrowolski0572fff2021-02-06 22:23:53 +01001local kube = import "../../kube/kube.libsonnet";
2local postgres = import "../../kube/postgres.libsonnet";
3
4{
5 local app = self,
6 local cfg = app.cfg,
7
8 cfg:: {
9 namespace: "redmine",
10 image: "registry.k0.hswaw.net/informatic/redmine@sha256:b04d1fd04549424e505722c9feb0b6741a057cb8f0fab68ad3730ecb167417df",
11 domain: error "domain must be set",
12 storageClassName: "waw-hdd-redundant-3",
13 database: {
14 host: "postgres",
15 name: "redmine",
16 username: "redmine",
17 password: { secretKeyRef: { name: "redmine", key: "postgres_password" } },
18 port: 5432,
19 },
20
21 storage: {
22 endpoint: error "storage.endpoint must be set",
23 region: error "storage.region must be set",
24 bucket: error "storage.bucket must be set",
25 accessKey: error "storage.accessKey must be set",
26 secretKey: error "storage.secretKey must be set",
27 },
28
29 oidc: {
30 server: error "oidc.server must be set",
31 clientID: error "oidc.clientID must be set",
32 clientSecret: error "oidc.clientSecret must be set",
33 },
Piotr Dobrowolski054c5b42021-02-09 10:05:59 +010034
35 # Mailing configuration object passed to smtp_settings
36 mailing: {
37 address: error "mailing.address must be set",
38 port: 465,
39 ssl: true,
40 domain: error "mailing.domain must be set",
41 authentication: ":login",
42 user_name: error "mailing.user_name must be set",
43 password: error "mailing.password must be set",
44 },
Piotr Dobrowolski0572fff2021-02-06 22:23:53 +010045 },
46
Piotr Dobrowolski054c5b42021-02-09 10:05:59 +010047 # Generates YAML file while preserving specified ruby-style symbols.
48 # (ie. removes surrounding quotes)
49 rubyYaml(obj, symbols):: std.foldr(function (symbol, str) std.strReplace(str, '"%s"' % symbol, symbol), symbols, std.manifestYamlDoc(obj)),
50
Piotr Dobrowolski0572fff2021-02-06 22:23:53 +010051 ns: kube.Namespace(app.cfg.namespace),
52
53 postgres: postgres {
54 cfg+: {
55 namespace: cfg.namespace,
56 appName: "redmine",
57 database: cfg.database.name,
58 username: cfg.database.username,
59 password: cfg.database.password,
60 storageClassName: cfg.storageClassName,
61 },
62 },
63
64 deployment: app.ns.Contain(kube.Deployment("redmine")) {
65 spec+: {
66 replicas: 1,
67 template+: {
68 spec+: {
69 securityContext: {
70 runAsUser: 999,
71 runAsGroup: 999,
72 fsGroup: 999,
73 },
74 containers_: {
75 web: kube.Container("redmine") {
76 image: cfg.image,
Piotr Dobrowolski054c5b42021-02-09 10:05:59 +010077 args: ['sh', '-c', |||
78 set -e
79 echo "${X_EXTRA_CONFIGURATION}" > config/configuration.yml
80 exec /docker-entrypoint.sh rails server -b 0.0.0.0
81 |||],
Piotr Dobrowolski0572fff2021-02-06 22:23:53 +010082 ports_: {
83 http: { containerPort: 3000 },
84 },
85 env_: {
86 REDMINE_DB_POSTGRES: cfg.database.host,
87 REDMINE_DB_PORT: cfg.database.port,
88 REDMINE_DB_USERNAME: cfg.database.username,
89 REDMINE_DB_PASSWORD: cfg.database.password,
90 REDMINE_DB_DATABASE: cfg.database.name,
91
92 REDMINE_SECRET_KEY_BASE: { secretKeyRef: { name: "redmine", key: "secret_key" } },
93
94 REDMINE_OIDC_SERVER: cfg.oidc.server,
95 REDMINE_OIDC_CLIENT_ID: cfg.oidc.clientID,
96 REDMINE_OIDC_CLIENT_SECRET: cfg.oidc.clientSecret,
97 REDMINE_OIDC_ADMIN_GROUP: "issues-admin",
98
99 REDMINE_S3_ENDPOINT: cfg.storage.endpoint,
100 REDMINE_S3_BUCKET: cfg.storage.bucket,
101 REDMINE_S3_ACCESS_KEY_ID: cfg.storage.accessKey,
102 REDMINE_S3_SECRET_ACCESS_KEY: cfg.storage.secretKey,
103 REDMINE_S3_REGION: cfg.storage.region,
Piotr Dobrowolski054c5b42021-02-09 10:05:59 +0100104
105 REDMINE_MAILING_PASSWORD: cfg.mailing.password,
106 X_EXTRA_CONFIGURATION: app.rubyYaml({
107 production: {
108 email_delivery: {
109 delivery_method: ":smtp",
110 smtp_settings: cfg.mailing {
111 password: "$(REDMINE_MAILING_PASSWORD)",
112 },
113 }
114 },
115 }, [":smtp", ":login"]),
Piotr Dobrowolski0572fff2021-02-06 22:23:53 +0100116 },
117 },
118 },
119 },
120 },
121 },
122 },
123
124 svc: app.ns.Contain(kube.Service("redmine")) {
125 target_pod:: app.deployment.spec.template,
126 },
127
128 ingress: app.ns.Contain(kube.Ingress("redmine")) {
129 metadata+: {
130 annotations+: {
131 "kubernetes.io/tls-acme": "true",
132 "certmanager.k8s.io/cluster-issuer": "letsencrypt-prod",
133 "nginx.ingress.kubernetes.io/proxy-body-size": "0",
134 },
135 },
136 spec+: {
137 tls: [
138 {
139 hosts: [cfg.domain],
140 secretName: "redmine-tls",
141 },
142 ],
143 rules: [
144 {
145 host: cfg.domain,
146 http: {
147 paths: [
148 { path: "/", backend: app.svc.name_port },
149 ]
150 },
151 }
152 ],
153 },
154 },
155}