@yunuseon/kayra 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ansible/playbooks/edge.yml +2 -0
- package/ansible/roles/common/tasks/main.yml +2 -0
- package/ansible/roles/forgejo-config/tasks/main.yml +47 -4
- package/ansible/roles/platform/tasks/main.yml +6 -0
- package/cli/dist/cli.js +12 -6
- package/cli/dist/commands/server.js +33 -16
- package/cli/dist/commands/validate.js +84 -0
- package/cli/dist/fleet.js +21 -4
- package/cli/dist/gather.js +57 -0
- package/cli/dist/load.js +18 -3
- package/cli/dist/main.js +14 -0
- package/cli/dist/schemas.js +53 -0
- package/cli/dist/settings.js +137 -0
- package/cli/dist/validate.js +50 -0
- package/compose/docker-compose.yml +29 -1
- package/compose/traefik/traefik.yml +2 -1
- package/package.json +7 -4
- package/schema/app-values.json +15 -0
- package/schema/app.json +45 -0
- package/schema/defaults.json +534 -0
- package/schema/server.json +71 -0
- package/schema/vars-edge.json +121 -0
- package/schema/vars-nas.json +124 -0
- package/schema/vars-platform.json +333 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"properties": {
|
|
5
|
+
"acme_email": {
|
|
6
|
+
"type": "string",
|
|
7
|
+
"description": "The Let's Encrypt account contact: expiry warnings land here."
|
|
8
|
+
},
|
|
9
|
+
"docker_version": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"description": "The Docker CE major the docker role pins and holds, as an apt version glob (default 5:29*)."
|
|
12
|
+
},
|
|
13
|
+
"wireguard": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"properties": {
|
|
16
|
+
"address": {
|
|
17
|
+
"type": "string"
|
|
18
|
+
},
|
|
19
|
+
"port": {
|
|
20
|
+
"type": "number"
|
|
21
|
+
},
|
|
22
|
+
"peer_public_key": {
|
|
23
|
+
"type": "string"
|
|
24
|
+
},
|
|
25
|
+
"peer_allowed_ips": {
|
|
26
|
+
"type": "array",
|
|
27
|
+
"items": {
|
|
28
|
+
"type": "string"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"keepalive": {
|
|
32
|
+
"type": "number"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"required": [
|
|
36
|
+
"address",
|
|
37
|
+
"port",
|
|
38
|
+
"peer_public_key",
|
|
39
|
+
"peer_allowed_ips"
|
|
40
|
+
],
|
|
41
|
+
"additionalProperties": {},
|
|
42
|
+
"description": "The tunnel into the private network: the edge's address, port, and the one peer (its key, what it may reach)."
|
|
43
|
+
},
|
|
44
|
+
"edge_routes": {
|
|
45
|
+
"type": "array",
|
|
46
|
+
"items": {
|
|
47
|
+
"type": "object",
|
|
48
|
+
"properties": {
|
|
49
|
+
"subdomains": {
|
|
50
|
+
"type": "array",
|
|
51
|
+
"items": {
|
|
52
|
+
"type": "string"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"upstream": {
|
|
56
|
+
"type": "string"
|
|
57
|
+
},
|
|
58
|
+
"forwarded_headers": {
|
|
59
|
+
"type": "boolean"
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"required": [
|
|
63
|
+
"subdomains",
|
|
64
|
+
"upstream"
|
|
65
|
+
],
|
|
66
|
+
"additionalProperties": {}
|
|
67
|
+
},
|
|
68
|
+
"description": "Public names the edge serves: subdomains of the domain and the upstream inside the tunnel they go to."
|
|
69
|
+
},
|
|
70
|
+
"backup_check": {
|
|
71
|
+
"type": "object",
|
|
72
|
+
"properties": {
|
|
73
|
+
"stale_after_hours": {
|
|
74
|
+
"type": "number"
|
|
75
|
+
},
|
|
76
|
+
"github_repository": {
|
|
77
|
+
"type": "string"
|
|
78
|
+
},
|
|
79
|
+
"github_app_id": {
|
|
80
|
+
"type": "string"
|
|
81
|
+
},
|
|
82
|
+
"repositories": {
|
|
83
|
+
"type": "array",
|
|
84
|
+
"items": {
|
|
85
|
+
"type": "object",
|
|
86
|
+
"properties": {
|
|
87
|
+
"name": {
|
|
88
|
+
"type": "string"
|
|
89
|
+
},
|
|
90
|
+
"url": {
|
|
91
|
+
"type": "string"
|
|
92
|
+
},
|
|
93
|
+
"user": {
|
|
94
|
+
"type": "string"
|
|
95
|
+
},
|
|
96
|
+
"restore_test_max_days": {
|
|
97
|
+
"type": "number"
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"required": [
|
|
101
|
+
"name",
|
|
102
|
+
"url",
|
|
103
|
+
"user"
|
|
104
|
+
],
|
|
105
|
+
"additionalProperties": {}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
"required": [
|
|
110
|
+
"stale_after_hours",
|
|
111
|
+
"github_repository",
|
|
112
|
+
"github_app_id",
|
|
113
|
+
"repositories"
|
|
114
|
+
],
|
|
115
|
+
"additionalProperties": {},
|
|
116
|
+
"description": "The hourly check of the private network's backups: when a snapshot is stale, where issues go, which repositories."
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"additionalProperties": false,
|
|
120
|
+
"title": "vars.yml (kind edge)"
|
|
121
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"properties": {
|
|
5
|
+
"compose_stacks": {
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"dir": {
|
|
9
|
+
"type": "string"
|
|
10
|
+
},
|
|
11
|
+
"stacks": {
|
|
12
|
+
"type": "array",
|
|
13
|
+
"items": {
|
|
14
|
+
"type": "string"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"required": [
|
|
19
|
+
"dir",
|
|
20
|
+
"stacks"
|
|
21
|
+
],
|
|
22
|
+
"additionalProperties": {},
|
|
23
|
+
"description": "The server's own compose stacks: their directory on the server and the names under stacks/ to run."
|
|
24
|
+
},
|
|
25
|
+
"nas_root": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"description": "The only directory the NAS play writes in, asserted before any change (e.g. /volume2)."
|
|
28
|
+
},
|
|
29
|
+
"restic_backup": {
|
|
30
|
+
"type": "object",
|
|
31
|
+
"properties": {
|
|
32
|
+
"dir": {
|
|
33
|
+
"type": "string"
|
|
34
|
+
},
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "string"
|
|
37
|
+
},
|
|
38
|
+
"schedule": {
|
|
39
|
+
"type": "string"
|
|
40
|
+
},
|
|
41
|
+
"restore_test_schedule": {
|
|
42
|
+
"type": "string"
|
|
43
|
+
},
|
|
44
|
+
"paths": {
|
|
45
|
+
"type": "array",
|
|
46
|
+
"items": {
|
|
47
|
+
"type": "string"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"restore_test_paths": {
|
|
51
|
+
"type": "array",
|
|
52
|
+
"items": {
|
|
53
|
+
"type": "string"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"exclude": {
|
|
57
|
+
"type": "array",
|
|
58
|
+
"items": {
|
|
59
|
+
"type": "string"
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"keep": {
|
|
63
|
+
"type": "object",
|
|
64
|
+
"properties": {
|
|
65
|
+
"daily": {
|
|
66
|
+
"type": "number"
|
|
67
|
+
},
|
|
68
|
+
"weekly": {
|
|
69
|
+
"type": "number"
|
|
70
|
+
},
|
|
71
|
+
"monthly": {
|
|
72
|
+
"type": "number"
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"required": [
|
|
76
|
+
"daily",
|
|
77
|
+
"weekly",
|
|
78
|
+
"monthly"
|
|
79
|
+
],
|
|
80
|
+
"additionalProperties": {}
|
|
81
|
+
},
|
|
82
|
+
"ssh": {
|
|
83
|
+
"type": "object",
|
|
84
|
+
"properties": {
|
|
85
|
+
"public_key": {
|
|
86
|
+
"type": "string"
|
|
87
|
+
},
|
|
88
|
+
"host": {
|
|
89
|
+
"type": "string"
|
|
90
|
+
},
|
|
91
|
+
"user": {
|
|
92
|
+
"type": "string"
|
|
93
|
+
},
|
|
94
|
+
"port": {
|
|
95
|
+
"type": "number"
|
|
96
|
+
},
|
|
97
|
+
"known_host": {
|
|
98
|
+
"type": "string"
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
"required": [
|
|
102
|
+
"public_key",
|
|
103
|
+
"host",
|
|
104
|
+
"user",
|
|
105
|
+
"port",
|
|
106
|
+
"known_host"
|
|
107
|
+
],
|
|
108
|
+
"additionalProperties": {}
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
"required": [
|
|
112
|
+
"dir",
|
|
113
|
+
"repository",
|
|
114
|
+
"schedule",
|
|
115
|
+
"restore_test_schedule",
|
|
116
|
+
"paths"
|
|
117
|
+
],
|
|
118
|
+
"additionalProperties": {},
|
|
119
|
+
"description": "The nightly restic backup: what, where to (SFTP), when, how long kept, and the monthly restore test."
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
"additionalProperties": false,
|
|
123
|
+
"title": "vars.yml (kind nas)"
|
|
124
|
+
}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"properties": {
|
|
5
|
+
"acme_email": {
|
|
6
|
+
"type": "string",
|
|
7
|
+
"description": "The Let's Encrypt account contact: expiry warnings land here."
|
|
8
|
+
},
|
|
9
|
+
"docker_version": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"description": "The Docker CE major the docker role pins and holds, as an apt version glob (default 5:29*)."
|
|
12
|
+
},
|
|
13
|
+
"git_remote_url": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "kayra's repository: Jenkins loads the pipeline library and platform jobs from it."
|
|
16
|
+
},
|
|
17
|
+
"platform_ref": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"description": "The ref of git_remote_url Jenkins loads from; defaults to the tag of the kayra version that ran (v<version>). Only a test server sets a branch."
|
|
20
|
+
},
|
|
21
|
+
"jenkins_admin_user": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"description": "Jenkins' local admin user (default admin)."
|
|
24
|
+
},
|
|
25
|
+
"authelia_policy": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"enum": [
|
|
28
|
+
"one_factor",
|
|
29
|
+
"two_factor"
|
|
30
|
+
],
|
|
31
|
+
"description": "What Authelia asks of staff: two_factor (default) or one_factor."
|
|
32
|
+
},
|
|
33
|
+
"authelia_smtp_address": {
|
|
34
|
+
"type": "string",
|
|
35
|
+
"description": "SMTP server for Authelia's mails (passkey enrolment); empty: mails go to a file."
|
|
36
|
+
},
|
|
37
|
+
"authelia_smtp_username": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"description": "SMTP user for Authelia."
|
|
40
|
+
},
|
|
41
|
+
"authelia_smtp_sender": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"description": "Sender address of Authelia's mails."
|
|
44
|
+
},
|
|
45
|
+
"acme_dns": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"enum": [
|
|
48
|
+
"",
|
|
49
|
+
"hetzner"
|
|
50
|
+
],
|
|
51
|
+
"description": "Certificates by DNS-01 instead of HTTP-01, for a server the internet never reaches: the DNS provider (hetzner)."
|
|
52
|
+
},
|
|
53
|
+
"renovate_repositories": {
|
|
54
|
+
"type": "array",
|
|
55
|
+
"items": {
|
|
56
|
+
"type": "string"
|
|
57
|
+
},
|
|
58
|
+
"description": "owner/repo of the repos this server's platform-renovate keeps up to date; the job exists only where the list is not empty."
|
|
59
|
+
},
|
|
60
|
+
"renovate_schedule": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"description": "When platform-renovate runs, as a Jenkins cron spec (default weekly: H 4 * * 1)."
|
|
63
|
+
},
|
|
64
|
+
"renovate_platform": {
|
|
65
|
+
"type": "string",
|
|
66
|
+
"enum": [
|
|
67
|
+
"github",
|
|
68
|
+
"forgejo"
|
|
69
|
+
],
|
|
70
|
+
"description": "Where the repos live: github (default) or forgejo."
|
|
71
|
+
},
|
|
72
|
+
"renovate_endpoint": {
|
|
73
|
+
"type": "string",
|
|
74
|
+
"description": "With a Forgejo: its API on platform-internal, e.g. http://forgejo:3000/api/v1."
|
|
75
|
+
},
|
|
76
|
+
"renovate_git_url": {
|
|
77
|
+
"type": "string",
|
|
78
|
+
"enum": [
|
|
79
|
+
"default",
|
|
80
|
+
"ssh",
|
|
81
|
+
"endpoint"
|
|
82
|
+
],
|
|
83
|
+
"description": "How Renovate clones; endpoint with a Forgejo, so it uses the internal address."
|
|
84
|
+
},
|
|
85
|
+
"renovate_host_rules": {
|
|
86
|
+
"type": "array",
|
|
87
|
+
"items": {
|
|
88
|
+
"type": "object",
|
|
89
|
+
"properties": {
|
|
90
|
+
"matchHost": {
|
|
91
|
+
"type": "string"
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
"required": [
|
|
95
|
+
"matchHost"
|
|
96
|
+
],
|
|
97
|
+
"additionalProperties": {}
|
|
98
|
+
},
|
|
99
|
+
"description": "Renovate hostRules: allowInternal for a Forgejo on platform-internal, credentials for a private registry."
|
|
100
|
+
},
|
|
101
|
+
"vm": {
|
|
102
|
+
"type": "object",
|
|
103
|
+
"properties": {
|
|
104
|
+
"address": {
|
|
105
|
+
"type": "string"
|
|
106
|
+
},
|
|
107
|
+
"gateway": {
|
|
108
|
+
"type": "string"
|
|
109
|
+
},
|
|
110
|
+
"disk": {
|
|
111
|
+
"type": "string"
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"required": [
|
|
115
|
+
"address",
|
|
116
|
+
"gateway",
|
|
117
|
+
"disk"
|
|
118
|
+
],
|
|
119
|
+
"additionalProperties": {},
|
|
120
|
+
"description": "target home: the VM kayra provision builds — fixed address (CIDR), gateway, disk size."
|
|
121
|
+
},
|
|
122
|
+
"forgejo_config": {
|
|
123
|
+
"type": "object",
|
|
124
|
+
"properties": {
|
|
125
|
+
"url": {
|
|
126
|
+
"type": "string"
|
|
127
|
+
},
|
|
128
|
+
"container": {
|
|
129
|
+
"type": "string"
|
|
130
|
+
},
|
|
131
|
+
"runners": {
|
|
132
|
+
"type": "array",
|
|
133
|
+
"items": {
|
|
134
|
+
"type": "object",
|
|
135
|
+
"properties": {
|
|
136
|
+
"name": {
|
|
137
|
+
"type": "string"
|
|
138
|
+
},
|
|
139
|
+
"scope": {
|
|
140
|
+
"type": "string"
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
"required": [
|
|
144
|
+
"name"
|
|
145
|
+
],
|
|
146
|
+
"additionalProperties": {}
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
"tokens": {
|
|
150
|
+
"type": "array",
|
|
151
|
+
"items": {
|
|
152
|
+
"type": "object",
|
|
153
|
+
"properties": {
|
|
154
|
+
"user": {
|
|
155
|
+
"type": "string"
|
|
156
|
+
},
|
|
157
|
+
"name": {
|
|
158
|
+
"type": "string"
|
|
159
|
+
},
|
|
160
|
+
"scopes": {
|
|
161
|
+
"type": "array",
|
|
162
|
+
"items": {
|
|
163
|
+
"type": "string"
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
"secret": {
|
|
167
|
+
"type": "string"
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
"required": [
|
|
171
|
+
"user",
|
|
172
|
+
"name",
|
|
173
|
+
"scopes",
|
|
174
|
+
"secret"
|
|
175
|
+
],
|
|
176
|
+
"additionalProperties": {}
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
"users": {
|
|
180
|
+
"type": "array",
|
|
181
|
+
"items": {
|
|
182
|
+
"type": "object",
|
|
183
|
+
"properties": {
|
|
184
|
+
"name": {
|
|
185
|
+
"type": "string"
|
|
186
|
+
},
|
|
187
|
+
"email": {
|
|
188
|
+
"type": "string"
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
"required": [
|
|
192
|
+
"name",
|
|
193
|
+
"email"
|
|
194
|
+
],
|
|
195
|
+
"additionalProperties": {}
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
"orgs": {
|
|
199
|
+
"type": "array",
|
|
200
|
+
"items": {
|
|
201
|
+
"type": "object",
|
|
202
|
+
"properties": {
|
|
203
|
+
"name": {
|
|
204
|
+
"type": "string"
|
|
205
|
+
},
|
|
206
|
+
"owner": {
|
|
207
|
+
"type": "string"
|
|
208
|
+
},
|
|
209
|
+
"visibility": {
|
|
210
|
+
"type": "string",
|
|
211
|
+
"enum": [
|
|
212
|
+
"public",
|
|
213
|
+
"limited",
|
|
214
|
+
"private"
|
|
215
|
+
]
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
"required": [
|
|
219
|
+
"name",
|
|
220
|
+
"owner",
|
|
221
|
+
"visibility"
|
|
222
|
+
],
|
|
223
|
+
"additionalProperties": {}
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
"ssh_keys": {
|
|
227
|
+
"type": "array",
|
|
228
|
+
"items": {
|
|
229
|
+
"type": "object",
|
|
230
|
+
"properties": {
|
|
231
|
+
"user": {
|
|
232
|
+
"type": "string"
|
|
233
|
+
},
|
|
234
|
+
"title": {
|
|
235
|
+
"type": "string"
|
|
236
|
+
},
|
|
237
|
+
"key": {
|
|
238
|
+
"type": "string"
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
"required": [
|
|
242
|
+
"user",
|
|
243
|
+
"title",
|
|
244
|
+
"key"
|
|
245
|
+
],
|
|
246
|
+
"additionalProperties": {}
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
"repos": {
|
|
250
|
+
"type": "array",
|
|
251
|
+
"items": {
|
|
252
|
+
"type": "object",
|
|
253
|
+
"properties": {
|
|
254
|
+
"name": {
|
|
255
|
+
"type": "string"
|
|
256
|
+
},
|
|
257
|
+
"settings": {
|
|
258
|
+
"type": "object",
|
|
259
|
+
"propertyNames": {
|
|
260
|
+
"type": "string"
|
|
261
|
+
},
|
|
262
|
+
"additionalProperties": {}
|
|
263
|
+
},
|
|
264
|
+
"collaborators": {
|
|
265
|
+
"type": "array",
|
|
266
|
+
"items": {
|
|
267
|
+
"type": "object",
|
|
268
|
+
"properties": {
|
|
269
|
+
"user": {
|
|
270
|
+
"type": "string"
|
|
271
|
+
},
|
|
272
|
+
"permission": {
|
|
273
|
+
"type": "string"
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
"required": [
|
|
277
|
+
"user",
|
|
278
|
+
"permission"
|
|
279
|
+
],
|
|
280
|
+
"additionalProperties": {}
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
"webhooks": {
|
|
284
|
+
"type": "array",
|
|
285
|
+
"items": {
|
|
286
|
+
"type": "string"
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
"push_mirror": {
|
|
290
|
+
"type": "string"
|
|
291
|
+
},
|
|
292
|
+
"pull_mirror": {
|
|
293
|
+
"type": "string"
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
"required": [
|
|
297
|
+
"name"
|
|
298
|
+
],
|
|
299
|
+
"additionalProperties": {}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
},
|
|
303
|
+
"required": [
|
|
304
|
+
"url",
|
|
305
|
+
"container"
|
|
306
|
+
],
|
|
307
|
+
"additionalProperties": {},
|
|
308
|
+
"description": "What this server's own Forgejo holds, as code: users, SSH keys, organizations, runners, repos (settings, collaborators, webhooks, mirrors) and the tokens it mints for the platform."
|
|
309
|
+
},
|
|
310
|
+
"compose_stacks": {
|
|
311
|
+
"type": "object",
|
|
312
|
+
"properties": {
|
|
313
|
+
"dir": {
|
|
314
|
+
"type": "string"
|
|
315
|
+
},
|
|
316
|
+
"stacks": {
|
|
317
|
+
"type": "array",
|
|
318
|
+
"items": {
|
|
319
|
+
"type": "string"
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
"required": [
|
|
324
|
+
"dir",
|
|
325
|
+
"stacks"
|
|
326
|
+
],
|
|
327
|
+
"additionalProperties": {},
|
|
328
|
+
"description": "The server's own compose stacks: their directory on the server and the names under stacks/ to run."
|
|
329
|
+
}
|
|
330
|
+
},
|
|
331
|
+
"additionalProperties": false,
|
|
332
|
+
"title": "vars.yml (kind platform)"
|
|
333
|
+
}
|