gitlab: PostgreSQL service
[slapos.git] / software / gitlab / instance-gitlab.cfg.in
1 # GitLab instance
2 # NOTE instance/software layout is inspired by gitlab omnibus
3 # NOTE all services are interconnected via unix sockets - because of easier
4 #      security and performance reasons (unix has 2x less latency and more
5 #      throughput compared to tcp over loopback).
6 [buildout]
7 parts =
8     directory
9
10     service-postgresql
11
12     service-cron
13
14 # std stuff for slapos instance
15 eggs-directory = {{ eggs_directory }}
16 develop-eggs-directory = {{ develop_eggs_directory }}
17 offline = true
18
19
20 ##################################
21 #   GitLab instance parameters   #
22 ##################################
23
24 [instance-parameter]
25 # std stuff to fetch slapos instance parameters
26 recipe  = slapos.cookbook:slapconfiguration
27 computer= ${slap-connection:computer-id}
28 partition=${slap-connection:partition-id}
29 url     = ${slap-connection:server-url}
30 key     = ${slap-connection:key-file}
31 cert    = ${slap-connection:cert-file}
32
33
34
35 #############################
36 #   GitLab instance setup   #
37 #############################
38
39 # 1. directories
40 [directory]
41 recipe  = slapos.cookbook:mkdirectory
42 home    = ${buildout:directory}
43 bin     = ${:home}/bin
44 etc     = ${:home}/etc
45 var     = ${:home}/var
46 log     = ${:var}/log
47 run     = ${:var}/run
48 srv     = ${:home}/srv
49 # slapos startup/service/promise scripts live here:
50 startup = ${:etc}/run
51 service = ${:etc}/service
52 promise = ${:etc}/promise
53
54
55
56
57 # 2. services
58
59 # [promise-<something>] to generate promise wrapper <something>
60 [promise-wrapper]
61 recipe  = slapos.cookbook:wrapper
62 wrapper-path = !py! '${directory:promise}/' + '${:_buildout_section_name_}'[8:]
63
64
65
66
67 #####################
68 #   Postgresql db   #
69 #####################
70
71 # XXX gitlab-omnibus also tunes:
72 # - shared_buffers
73 # - work_mem
74 # - checkpoint_*
75 # - effective_check_size
76 # - lc_* en_US.UTF-8 -> C  (?)
77 [service-postgresql]
78 recipe  = slapos.cookbook:postgres
79 bin     = {{ postgresql_location }}/bin
80 services= ${directory:service}
81
82 dbname  = gitlabhq_production
83 # NOTE db name must match to what was used in KVM on lab.nexedi.com (restore script grants access to this user)
84 superuser = gitlab-psql
85 # no password - pgsql will listen only on unix sockets (see below) thus access
86 # is protected with filesystem-level permissions.
87 # ( besides, if we use slapos.cookbook:generate.password and do `password = ...`
88 #   the password is stored in plain text in .installed and thus becomes insecure )
89 password=
90
91 pgdata-directory = ${directory:srv}/postgresql
92
93 # empty addresses - listen only on unix socket
94 ipv4    = !py!set([])
95 ipv6    = !py!set([])
96 ipv6-random =
97 port    =
98
99 depend  =
100     ${promise-postgresql:recipe}
101
102 [promise-postgresql]
103 <= promise-wrapper
104 command-line =
105     {{ postgresql_location }}/bin/psql
106         -h ${service-postgresql:pgdata-directory}
107         -U ${service-postgresql:superuser}
108         -d ${service-postgresql:dbname}
109         -c '\q'
110
111 # postgresql logs to stdout/stderr - logs are handled by slapos not us
112 # [logrotate-entry-postgresql]
113
114
115
116 #############
117 #   cron    #
118 #############
119 [cron-dir]
120 recipe  = slapos.cookbook:mkdirectory
121 cron.d  = ${directory:etc}/cron.d
122 crontabs= ${directory:srv}/cron/crontabs
123 cronstamps = ${directory:var}/cron/cronstamps
124 log     = ${directory:log}/cron
125
126 [service-cron]
127 recipe  = slapos.cookbook:cron
128 binary  = ${directory:service}/crond
129 cron-entries    = ${cron-dir:cron.d}
130 crontabs        = ${cron-dir:crontabs}
131 cronstamps      = ${cron-dir:cronstamps}
132 catcher         = ${cron-simplelogger:wrapper}
133
134 dcrond-binary   = {{ dcron_bin }}
135
136 depends =
137     ${logrotate-entry-cron:recipe}
138
139 # "mailer" that cron uses to emit messages to logfile
140 [cron-simplelogger]
141 recipe  = slapos.cookbook:simplelogger
142 wrapper = ${directory:bin}/${:_buildout_section_name_}
143 log     = ${cron-dir:log}/cron.log
144
145
146 # base entry for clients who registers to cron
147 [cron-entry]
148 recipe  = slapos.cookbook:cron.d
149 # name  = <section-name>.strip_prefix('cron-entry-')
150 # XXX len() is not available in !py! - 11 hardcoded
151 name    = !py!'${:_buildout_section_name_}' [11:]
152 # NOTE _not_ ${service-cron:cron-entries}  - though the value is the same we do
153 # not want service-cron to be instantiated just if a cron-entry is registered.
154 cron-entries = ${cron-dir:cron.d}
155
156 # cron logs are also rotated
157 [logrotate-entry-cron]
158 <= logrotate-entry
159 log     = ${cron-dir:log}/*.log
160
161
162 #######################################
163 #   logrotate base for all services   #
164 #######################################
165 [logrotate-dir]
166 recipe  = slapos.cookbook:mkdirectory
167 srv     = ${directory:srv}/logrotate
168 entries = ${directory:etc}/logrotate.d
169
170 [logrotate]
171 recipe  = slapos.cookbook:logrotate
172 wrapper = ${directory:bin}/${:_buildout_section_name_}
173 conf    = ${directory:etc}/logrotate.conf
174 logrotate-entries   = ${logrotate-dir:entries}
175 state-file  = ${logrotate-dir:srv}/logrotate.status
176
177 logrotate-binary    = {{ logrotate_bin }}
178 gzip-binary     = {{ gzip_bin }}
179 gunzip-binary   = {{ gunzip_bin }}
180
181 depend  = ${cron-entry-logrotate:recipe}
182
183
184 # base entry for clients who registers to logrotate
185 [logrotate-entry]
186 recipe  = slapos.cookbook:logrotate.d
187 logrotate-entries   = ${logrotate:logrotate-entries}
188 # name  = <section-name>.strip_prefix('logrotate-entry-')
189 # XXX len is not available in !py! - 16 hardcoded
190 name    = !py!'${:_buildout_section_name_}'[16:]
191 # NOTE frequency is hardcoded to `daily` in slapos.cookbook:logrotate.d
192 # NOTE backup is also used to add custom logrotate options (hack)
193 backup  = ...
194 # TODO settle whether we need/want olddir or not
195     noolddir
196 # override create emitted by slapos.cookbook:logrotate.d
197     nocreate
198 # do not move log file and this way we do not need to signal its program to
199 # reopen the log. There are a lot of bugs when on such reopen / restart /
200 # graceful-restart something bad happens. Even if copytruncate is a bit racy
201 # and can loose some data, it is better to keep the system the stable way.
202     copytruncate
203
204
205 # hook logrotate into cron
206 [cron-entry-logrotate]
207 <= cron-entry
208 time    = daily
209 command = ${logrotate:wrapper}