##// END OF EJS Templates
i18n: make sure 'en' in Accept-Language is recognized as having 100% coverage - i18n.lang is for source language...
Mads Kiilerich -
r8012:7c7d6b5c stable
parent child Browse files
Show More
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
@@ -1,515 +1,517 b''
1 ################################################################################
1 ################################################################################
2 ################################################################################
2 ################################################################################
3 # Kallithea - config file generated with kallithea-config #
3 # Kallithea - config file generated with kallithea-config #
4 # #
4 # #
5 # The %(here)s variable will be replaced with the parent directory of this file#
5 # The %(here)s variable will be replaced with the parent directory of this file#
6 ################################################################################
6 ################################################################################
7 ################################################################################
7 ################################################################################
8
8
9 [DEFAULT]
9 [DEFAULT]
10
10
11 ################################################################################
11 ################################################################################
12 ## Email settings ##
12 ## Email settings ##
13 ## ##
13 ## ##
14 ## Refer to the documentation ("Email settings") for more details. ##
14 ## Refer to the documentation ("Email settings") for more details. ##
15 ## ##
15 ## ##
16 ## It is recommended to use a valid sender address that passes access ##
16 ## It is recommended to use a valid sender address that passes access ##
17 ## validation and spam filtering in mail servers. ##
17 ## validation and spam filtering in mail servers. ##
18 ################################################################################
18 ################################################################################
19
19
20 ## 'From' header for application emails. You can optionally add a name.
20 ## 'From' header for application emails. You can optionally add a name.
21 ## Default:
21 ## Default:
22 #app_email_from = Kallithea
22 #app_email_from = Kallithea
23 ## Examples:
23 ## Examples:
24 #app_email_from = Kallithea <kallithea-noreply@example.com>
24 #app_email_from = Kallithea <kallithea-noreply@example.com>
25 #app_email_from = kallithea-noreply@example.com
25 #app_email_from = kallithea-noreply@example.com
26
26
27 ## Subject prefix for application emails.
27 ## Subject prefix for application emails.
28 ## A space between this prefix and the real subject is automatically added.
28 ## A space between this prefix and the real subject is automatically added.
29 ## Default:
29 ## Default:
30 #email_prefix =
30 #email_prefix =
31 ## Example:
31 ## Example:
32 #email_prefix = [Kallithea]
32 #email_prefix = [Kallithea]
33
33
34 ## Recipients for error emails and fallback recipients of application mails.
34 ## Recipients for error emails and fallback recipients of application mails.
35 ## Multiple addresses can be specified, comma-separated.
35 ## Multiple addresses can be specified, comma-separated.
36 ## Only addresses are allowed, do not add any name part.
36 ## Only addresses are allowed, do not add any name part.
37 ## Default:
37 ## Default:
38 #email_to =
38 #email_to =
39 ## Examples:
39 ## Examples:
40 #email_to = admin@example.com
40 #email_to = admin@example.com
41 #email_to = admin@example.com,another_admin@example.com
41 #email_to = admin@example.com,another_admin@example.com
42 email_to =
42 email_to =
43
43
44 ## 'From' header for error emails. You can optionally add a name.
44 ## 'From' header for error emails. You can optionally add a name.
45 ## Default: (none)
45 ## Default: (none)
46 ## Examples:
46 ## Examples:
47 #error_email_from = Kallithea Errors <kallithea-noreply@example.com>
47 #error_email_from = Kallithea Errors <kallithea-noreply@example.com>
48 #error_email_from = kallithea_errors@example.com
48 #error_email_from = kallithea_errors@example.com
49 error_email_from =
49 error_email_from =
50
50
51 ## SMTP server settings
51 ## SMTP server settings
52 ## If specifying credentials, make sure to use secure connections.
52 ## If specifying credentials, make sure to use secure connections.
53 ## Default: Send unencrypted unauthenticated mails to the specified smtp_server.
53 ## Default: Send unencrypted unauthenticated mails to the specified smtp_server.
54 ## For "SSL", use smtp_use_ssl = true and smtp_port = 465.
54 ## For "SSL", use smtp_use_ssl = true and smtp_port = 465.
55 ## For "STARTTLS", use smtp_use_tls = true and smtp_port = 587.
55 ## For "STARTTLS", use smtp_use_tls = true and smtp_port = 587.
56 smtp_server =
56 smtp_server =
57 #smtp_username =
57 #smtp_username =
58 #smtp_password =
58 #smtp_password =
59 smtp_port =
59 smtp_port =
60 #smtp_use_ssl = false
60 #smtp_use_ssl = false
61 #smtp_use_tls = false
61 #smtp_use_tls = false
62
62
63 ## Entry point for 'gearbox serve'
63 ## Entry point for 'gearbox serve'
64 [server:main]
64 [server:main]
65 #host = 127.0.0.1
65 #host = 127.0.0.1
66 host = 0.0.0.0
66 host = 0.0.0.0
67 port = 5000
67 port = 5000
68
68
69 ## WAITRESS ##
69 ## WAITRESS ##
70 use = egg:waitress#main
70 use = egg:waitress#main
71 ## number of worker threads
71 ## number of worker threads
72 threads = 1
72 threads = 1
73 ## MAX BODY SIZE 100GB
73 ## MAX BODY SIZE 100GB
74 max_request_body_size = 107374182400
74 max_request_body_size = 107374182400
75 ## use poll instead of select, fixes fd limits, may not work on old
75 ## use poll instead of select, fixes fd limits, may not work on old
76 ## windows systems.
76 ## windows systems.
77 #asyncore_use_poll = True
77 #asyncore_use_poll = True
78
78
79 ## middleware for hosting the WSGI application under a URL prefix
79 ## middleware for hosting the WSGI application under a URL prefix
80 #[filter:proxy-prefix]
80 #[filter:proxy-prefix]
81 #use = egg:PasteDeploy#prefix
81 #use = egg:PasteDeploy#prefix
82 #prefix = /<your-prefix>
82 #prefix = /<your-prefix>
83
83
84 [app:main]
84 [app:main]
85 use = egg:kallithea
85 use = egg:kallithea
86 ## enable proxy prefix middleware
86 ## enable proxy prefix middleware
87 #filter-with = proxy-prefix
87 #filter-with = proxy-prefix
88
88
89 full_stack = true
89 full_stack = true
90 static_files = true
90 static_files = true
91
91
92 ## Internationalization (see setup documentation for details)
92 ## Internationalization (see setup documentation for details)
93 ## By default, the language requested by the browser is used if available.
93 ## By default, the languages requested by the browser are used if available, with English as default.
94 #i18n.enabled = false
94 ## Set i18n.enabled=false to disable automatic language choice.
95 ## Fallback language, empty for English (valid values are the names of subdirectories in kallithea/i18n):
95 #i18n.enabled = true
96 i18n.lang =
96 ## To Force a language, set i18n.enabled=false and specify the language in i18n.lang.
97 ## Valid values are the names of subdirectories in kallithea/i18n with a LC_MESSAGES/kallithea.mo
98 #i18n.lang = en
97
99
98 cache_dir = %(here)s/data
100 cache_dir = %(here)s/data
99 index_dir = %(here)s/data/index
101 index_dir = %(here)s/data/index
100
102
101 ## uncomment and set this path to use archive download cache
103 ## uncomment and set this path to use archive download cache
102 archive_cache_dir = %(here)s/tarballcache
104 archive_cache_dir = %(here)s/tarballcache
103
105
104 ## change this to unique ID for security
106 ## change this to unique ID for security
105 #app_instance_uuid = VERY-SECRET
107 #app_instance_uuid = VERY-SECRET
106 app_instance_uuid = development-not-secret
108 app_instance_uuid = development-not-secret
107
109
108 ## cut off limit for large diffs (size in bytes)
110 ## cut off limit for large diffs (size in bytes)
109 cut_off_limit = 256000
111 cut_off_limit = 256000
110
112
111 ## force https in Kallithea, fixes https redirects, assumes it's always https
113 ## force https in Kallithea, fixes https redirects, assumes it's always https
112 force_https = false
114 force_https = false
113
115
114 ## use Strict-Transport-Security headers
116 ## use Strict-Transport-Security headers
115 use_htsts = false
117 use_htsts = false
116
118
117 ## number of commits stats will parse on each iteration
119 ## number of commits stats will parse on each iteration
118 commit_parse_limit = 25
120 commit_parse_limit = 25
119
121
120 ## Path to Python executable to be used for git hooks.
122 ## Path to Python executable to be used for git hooks.
121 ## This value will be written inside the git hook scripts as the text
123 ## This value will be written inside the git hook scripts as the text
122 ## after '#!' (shebang). When empty or not defined, the value of
124 ## after '#!' (shebang). When empty or not defined, the value of
123 ## 'sys.executable' at the time of installation of the git hooks is
125 ## 'sys.executable' at the time of installation of the git hooks is
124 ## used, which is correct in many cases but for example not when using uwsgi.
126 ## used, which is correct in many cases but for example not when using uwsgi.
125 ## If you change this setting, you should reinstall the Git hooks via
127 ## If you change this setting, you should reinstall the Git hooks via
126 ## Admin > Settings > Remap and Rescan.
128 ## Admin > Settings > Remap and Rescan.
127 # git_hook_interpreter = /srv/kallithea/venv/bin/python2
129 # git_hook_interpreter = /srv/kallithea/venv/bin/python2
128
130
129 ## path to git executable
131 ## path to git executable
130 git_path = git
132 git_path = git
131
133
132 ## git rev filter option, --all is the default filter, if you need to
134 ## git rev filter option, --all is the default filter, if you need to
133 ## hide all refs in changelog switch this to --branches --tags
135 ## hide all refs in changelog switch this to --branches --tags
134 #git_rev_filter = --branches --tags
136 #git_rev_filter = --branches --tags
135
137
136 ## RSS feed options
138 ## RSS feed options
137 rss_cut_off_limit = 256000
139 rss_cut_off_limit = 256000
138 rss_items_per_page = 10
140 rss_items_per_page = 10
139 rss_include_diff = false
141 rss_include_diff = false
140
142
141 ## options for showing and identifying changesets
143 ## options for showing and identifying changesets
142 show_sha_length = 12
144 show_sha_length = 12
143 show_revision_number = false
145 show_revision_number = false
144
146
145 ## Canonical URL to use when creating full URLs in UI and texts.
147 ## Canonical URL to use when creating full URLs in UI and texts.
146 ## Useful when the site is available under different names or protocols.
148 ## Useful when the site is available under different names or protocols.
147 ## Defaults to what is provided in the WSGI environment.
149 ## Defaults to what is provided in the WSGI environment.
148 #canonical_url = https://kallithea.example.com/repos
150 #canonical_url = https://kallithea.example.com/repos
149
151
150 ## gist URL alias, used to create nicer urls for gist. This should be an
152 ## gist URL alias, used to create nicer urls for gist. This should be an
151 ## url that does rewrites to _admin/gists/<gistid>.
153 ## url that does rewrites to _admin/gists/<gistid>.
152 ## example: http://gist.example.com/{gistid}. Empty means use the internal
154 ## example: http://gist.example.com/{gistid}. Empty means use the internal
153 ## Kallithea url, ie. http[s]://kallithea.example.com/_admin/gists/<gistid>
155 ## Kallithea url, ie. http[s]://kallithea.example.com/_admin/gists/<gistid>
154 gist_alias_url =
156 gist_alias_url =
155
157
156 ## default encoding used to convert from and to unicode
158 ## default encoding used to convert from and to unicode
157 ## can be also a comma separated list of encoding in case of mixed encodings
159 ## can be also a comma separated list of encoding in case of mixed encodings
158 default_encoding = utf-8
160 default_encoding = utf-8
159
161
160 ## Set Mercurial encoding, similar to setting HGENCODING before launching Kallithea
162 ## Set Mercurial encoding, similar to setting HGENCODING before launching Kallithea
161 hgencoding = utf-8
163 hgencoding = utf-8
162
164
163 ## issue tracker for Kallithea (leave blank to disable, absent for default)
165 ## issue tracker for Kallithea (leave blank to disable, absent for default)
164 #bugtracker = https://bitbucket.org/conservancy/kallithea/issues
166 #bugtracker = https://bitbucket.org/conservancy/kallithea/issues
165
167
166 ## issue tracking mapping for commit messages, comments, PR descriptions, ...
168 ## issue tracking mapping for commit messages, comments, PR descriptions, ...
167 ## Refer to the documentation ("Integration with issue trackers") for more details.
169 ## Refer to the documentation ("Integration with issue trackers") for more details.
168
170
169 ## regular expression to match issue references
171 ## regular expression to match issue references
170 ## This pattern may/should contain parenthesized groups, that can
172 ## This pattern may/should contain parenthesized groups, that can
171 ## be referred to in issue_server_link or issue_sub using Python backreferences
173 ## be referred to in issue_server_link or issue_sub using Python backreferences
172 ## (e.g. \1, \2, ...). You can also create named groups with '(?P<groupname>)'.
174 ## (e.g. \1, \2, ...). You can also create named groups with '(?P<groupname>)'.
173 ## To require mandatory whitespace before the issue pattern, use:
175 ## To require mandatory whitespace before the issue pattern, use:
174 ## (?:^|(?<=\s)) before the actual pattern, and for mandatory whitespace
176 ## (?:^|(?<=\s)) before the actual pattern, and for mandatory whitespace
175 ## behind the issue pattern, use (?:$|(?=\s)) after the actual pattern.
177 ## behind the issue pattern, use (?:$|(?=\s)) after the actual pattern.
176
178
177 issue_pat = #(\d+)
179 issue_pat = #(\d+)
178
180
179 ## server url to the issue
181 ## server url to the issue
180 ## This pattern may/should contain backreferences to parenthesized groups in issue_pat.
182 ## This pattern may/should contain backreferences to parenthesized groups in issue_pat.
181 ## A backreference can be \1, \2, ... or \g<groupname> if you specified a named group
183 ## A backreference can be \1, \2, ... or \g<groupname> if you specified a named group
182 ## called 'groupname' in issue_pat.
184 ## called 'groupname' in issue_pat.
183 ## The special token {repo} is replaced with the full repository name
185 ## The special token {repo} is replaced with the full repository name
184 ## including repository groups, while {repo_name} is replaced with just
186 ## including repository groups, while {repo_name} is replaced with just
185 ## the name of the repository.
187 ## the name of the repository.
186
188
187 issue_server_link = https://issues.example.com/{repo}/issue/\1
189 issue_server_link = https://issues.example.com/{repo}/issue/\1
188
190
189 ## substitution pattern to use as the link text
191 ## substitution pattern to use as the link text
190 ## If issue_sub is empty, the text matched by issue_pat is retained verbatim
192 ## If issue_sub is empty, the text matched by issue_pat is retained verbatim
191 ## for the link text. Otherwise, the link text is that of issue_sub, with any
193 ## for the link text. Otherwise, the link text is that of issue_sub, with any
192 ## backreferences to groups in issue_pat replaced.
194 ## backreferences to groups in issue_pat replaced.
193
195
194 issue_sub =
196 issue_sub =
195
197
196 ## issue_pat, issue_server_link and issue_sub can have suffixes to specify
198 ## issue_pat, issue_server_link and issue_sub can have suffixes to specify
197 ## multiple patterns, to other issues server, wiki or others
199 ## multiple patterns, to other issues server, wiki or others
198 ## below an example how to create a wiki pattern
200 ## below an example how to create a wiki pattern
199 # wiki-some-id -> https://wiki.example.com/some-id
201 # wiki-some-id -> https://wiki.example.com/some-id
200
202
201 #issue_pat_wiki = wiki-(\S+)
203 #issue_pat_wiki = wiki-(\S+)
202 #issue_server_link_wiki = https://wiki.example.com/\1
204 #issue_server_link_wiki = https://wiki.example.com/\1
203 #issue_sub_wiki = WIKI-\1
205 #issue_sub_wiki = WIKI-\1
204
206
205 ## alternative return HTTP header for failed authentication. Default HTTP
207 ## alternative return HTTP header for failed authentication. Default HTTP
206 ## response is 401 HTTPUnauthorized. Currently Mercurial clients have trouble with
208 ## response is 401 HTTPUnauthorized. Currently Mercurial clients have trouble with
207 ## handling that. Set this variable to 403 to return HTTPForbidden
209 ## handling that. Set this variable to 403 to return HTTPForbidden
208 auth_ret_code =
210 auth_ret_code =
209
211
210 ## allows to change the repository location in settings page
212 ## allows to change the repository location in settings page
211 allow_repo_location_change = True
213 allow_repo_location_change = True
212
214
213 ## allows to setup custom hooks in settings page
215 ## allows to setup custom hooks in settings page
214 allow_custom_hooks_settings = True
216 allow_custom_hooks_settings = True
215
217
216 ## extra extensions for indexing, space separated and without the leading '.'.
218 ## extra extensions for indexing, space separated and without the leading '.'.
217 # index.extensions =
219 # index.extensions =
218 # gemfile
220 # gemfile
219 # lock
221 # lock
220
222
221 ## extra filenames for indexing, space separated
223 ## extra filenames for indexing, space separated
222 # index.filenames =
224 # index.filenames =
223 # .dockerignore
225 # .dockerignore
224 # .editorconfig
226 # .editorconfig
225 # INSTALL
227 # INSTALL
226 # CHANGELOG
228 # CHANGELOG
227
229
228 ####################################
230 ####################################
229 ### SSH CONFIG ####
231 ### SSH CONFIG ####
230 ####################################
232 ####################################
231
233
232 ## SSH is disabled by default, until an Administrator decides to enable it.
234 ## SSH is disabled by default, until an Administrator decides to enable it.
233 ssh_enabled = false
235 ssh_enabled = false
234
236
235 ## File where users' SSH keys will be stored *if* ssh_enabled is true.
237 ## File where users' SSH keys will be stored *if* ssh_enabled is true.
236 #ssh_authorized_keys = /home/kallithea/.ssh/authorized_keys
238 #ssh_authorized_keys = /home/kallithea/.ssh/authorized_keys
237
239
238 ## Path to be used in ssh_authorized_keys file to invoke kallithea-cli with ssh-serve.
240 ## Path to be used in ssh_authorized_keys file to invoke kallithea-cli with ssh-serve.
239 #kallithea_cli_path = /srv/kallithea/venv/bin/kallithea-cli
241 #kallithea_cli_path = /srv/kallithea/venv/bin/kallithea-cli
240
242
241 ## Locale to be used in the ssh-serve command.
243 ## Locale to be used in the ssh-serve command.
242 ## This is needed because an SSH client may try to use its own locale
244 ## This is needed because an SSH client may try to use its own locale
243 ## settings, which may not be available on the server.
245 ## settings, which may not be available on the server.
244 ## See `locale -a` for valid values on this system.
246 ## See `locale -a` for valid values on this system.
245 #ssh_locale = C.UTF-8
247 #ssh_locale = C.UTF-8
246
248
247 ####################################
249 ####################################
248 ### CELERY CONFIG ####
250 ### CELERY CONFIG ####
249 ####################################
251 ####################################
250
252
251 use_celery = false
253 use_celery = false
252
254
253 ## Example: connect to the virtual host 'rabbitmqhost' on localhost as rabbitmq:
255 ## Example: connect to the virtual host 'rabbitmqhost' on localhost as rabbitmq:
254 broker.url = amqp://rabbitmq:qewqew@localhost:5672/rabbitmqhost
256 broker.url = amqp://rabbitmq:qewqew@localhost:5672/rabbitmqhost
255
257
256 celery.imports = kallithea.lib.celerylib.tasks
258 celery.imports = kallithea.lib.celerylib.tasks
257 celery.accept.content = pickle
259 celery.accept.content = pickle
258 celery.result.backend = amqp
260 celery.result.backend = amqp
259 celery.result.dburi = amqp://
261 celery.result.dburi = amqp://
260 celery.result.serialier = json
262 celery.result.serialier = json
261
263
262 #celery.send.task.error.emails = true
264 #celery.send.task.error.emails = true
263 #celery.amqp.task.result.expires = 18000
265 #celery.amqp.task.result.expires = 18000
264
266
265 celeryd.concurrency = 2
267 celeryd.concurrency = 2
266 celeryd.max.tasks.per.child = 1
268 celeryd.max.tasks.per.child = 1
267
269
268 ## If true, tasks will never be sent to the queue, but executed locally instead.
270 ## If true, tasks will never be sent to the queue, but executed locally instead.
269 celery.always.eager = false
271 celery.always.eager = false
270
272
271 ####################################
273 ####################################
272 ### BEAKER CACHE ####
274 ### BEAKER CACHE ####
273 ####################################
275 ####################################
274
276
275 beaker.cache.data_dir = %(here)s/data/cache/data
277 beaker.cache.data_dir = %(here)s/data/cache/data
276 beaker.cache.lock_dir = %(here)s/data/cache/lock
278 beaker.cache.lock_dir = %(here)s/data/cache/lock
277
279
278 beaker.cache.regions = short_term,long_term,sql_cache_short
280 beaker.cache.regions = short_term,long_term,sql_cache_short
279
281
280 beaker.cache.short_term.type = memory
282 beaker.cache.short_term.type = memory
281 beaker.cache.short_term.expire = 60
283 beaker.cache.short_term.expire = 60
282 beaker.cache.short_term.key_length = 256
284 beaker.cache.short_term.key_length = 256
283
285
284 beaker.cache.long_term.type = memory
286 beaker.cache.long_term.type = memory
285 beaker.cache.long_term.expire = 36000
287 beaker.cache.long_term.expire = 36000
286 beaker.cache.long_term.key_length = 256
288 beaker.cache.long_term.key_length = 256
287
289
288 beaker.cache.sql_cache_short.type = memory
290 beaker.cache.sql_cache_short.type = memory
289 beaker.cache.sql_cache_short.expire = 10
291 beaker.cache.sql_cache_short.expire = 10
290 beaker.cache.sql_cache_short.key_length = 256
292 beaker.cache.sql_cache_short.key_length = 256
291
293
292 ####################################
294 ####################################
293 ### BEAKER SESSION ####
295 ### BEAKER SESSION ####
294 ####################################
296 ####################################
295
297
296 ## Name of session cookie. Should be unique for a given host and path, even when running
298 ## Name of session cookie. Should be unique for a given host and path, even when running
297 ## on different ports. Otherwise, cookie sessions will be shared and messed up.
299 ## on different ports. Otherwise, cookie sessions will be shared and messed up.
298 session.key = kallithea
300 session.key = kallithea
299 ## Sessions should always only be accessible by the browser, not directly by JavaScript.
301 ## Sessions should always only be accessible by the browser, not directly by JavaScript.
300 session.httponly = true
302 session.httponly = true
301 ## Session lifetime. 2592000 seconds is 30 days.
303 ## Session lifetime. 2592000 seconds is 30 days.
302 session.timeout = 2592000
304 session.timeout = 2592000
303
305
304 ## Server secret used with HMAC to ensure integrity of cookies.
306 ## Server secret used with HMAC to ensure integrity of cookies.
305 #session.secret = VERY-SECRET
307 #session.secret = VERY-SECRET
306 session.secret = development-not-secret
308 session.secret = development-not-secret
307 ## Further, encrypt the data with AES.
309 ## Further, encrypt the data with AES.
308 #session.encrypt_key = <key_for_encryption>
310 #session.encrypt_key = <key_for_encryption>
309 #session.validate_key = <validation_key>
311 #session.validate_key = <validation_key>
310
312
311 ## Type of storage used for the session, current types are
313 ## Type of storage used for the session, current types are
312 ## dbm, file, memcached, database, and memory.
314 ## dbm, file, memcached, database, and memory.
313
315
314 ## File system storage of session data. (default)
316 ## File system storage of session data. (default)
315 #session.type = file
317 #session.type = file
316
318
317 ## Cookie only, store all session data inside the cookie. Requires secure secrets.
319 ## Cookie only, store all session data inside the cookie. Requires secure secrets.
318 #session.type = cookie
320 #session.type = cookie
319
321
320 ## Database storage of session data.
322 ## Database storage of session data.
321 #session.type = ext:database
323 #session.type = ext:database
322 #session.sa.url = postgresql://postgres:qwe@localhost/kallithea
324 #session.sa.url = postgresql://postgres:qwe@localhost/kallithea
323 #session.table_name = db_session
325 #session.table_name = db_session
324
326
325 ############################
327 ############################
326 ## ERROR HANDLING SYSTEMS ##
328 ## ERROR HANDLING SYSTEMS ##
327 ############################
329 ############################
328
330
329 # Propagate email settings to ErrorReporter of TurboGears2
331 # Propagate email settings to ErrorReporter of TurboGears2
330 # You do not normally need to change these lines
332 # You do not normally need to change these lines
331 get trace_errors.error_email = email_to
333 get trace_errors.error_email = email_to
332 get trace_errors.smtp_server = smtp_server
334 get trace_errors.smtp_server = smtp_server
333 get trace_errors.smtp_port = smtp_port
335 get trace_errors.smtp_port = smtp_port
334 get trace_errors.from_address = error_email_from
336 get trace_errors.from_address = error_email_from
335
337
336 ################################################################################
338 ################################################################################
337 ## WARNING: *DEBUG MODE MUST BE OFF IN A PRODUCTION ENVIRONMENT* ##
339 ## WARNING: *DEBUG MODE MUST BE OFF IN A PRODUCTION ENVIRONMENT* ##
338 ## Debug mode will enable the interactive debugging tool, allowing ANYONE to ##
340 ## Debug mode will enable the interactive debugging tool, allowing ANYONE to ##
339 ## execute malicious code after an exception is raised. ##
341 ## execute malicious code after an exception is raised. ##
340 ################################################################################
342 ################################################################################
341 #debug = false
343 #debug = false
342 debug = true
344 debug = true
343
345
344 ##################################
346 ##################################
345 ### LOGVIEW CONFIG ###
347 ### LOGVIEW CONFIG ###
346 ##################################
348 ##################################
347
349
348 logview.sqlalchemy = #faa
350 logview.sqlalchemy = #faa
349 logview.pylons.templating = #bfb
351 logview.pylons.templating = #bfb
350 logview.pylons.util = #eee
352 logview.pylons.util = #eee
351
353
352 #########################################################
354 #########################################################
353 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
355 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
354 #########################################################
356 #########################################################
355
357
356 # SQLITE [default]
358 # SQLITE [default]
357 sqlalchemy.url = sqlite:///%(here)s/kallithea.db?timeout=60
359 sqlalchemy.url = sqlite:///%(here)s/kallithea.db?timeout=60
358
360
359 # see sqlalchemy docs for others
361 # see sqlalchemy docs for others
360
362
361 sqlalchemy.pool_recycle = 3600
363 sqlalchemy.pool_recycle = 3600
362
364
363 ################################
365 ################################
364 ### ALEMBIC CONFIGURATION ####
366 ### ALEMBIC CONFIGURATION ####
365 ################################
367 ################################
366
368
367 [alembic]
369 [alembic]
368 script_location = kallithea:alembic
370 script_location = kallithea:alembic
369
371
370 ################################
372 ################################
371 ### LOGGING CONFIGURATION ####
373 ### LOGGING CONFIGURATION ####
372 ################################
374 ################################
373
375
374 [loggers]
376 [loggers]
375 keys = root, routes, kallithea, sqlalchemy, tg, gearbox, beaker, templates, whoosh_indexer, werkzeug, backlash
377 keys = root, routes, kallithea, sqlalchemy, tg, gearbox, beaker, templates, whoosh_indexer, werkzeug, backlash
376
378
377 [handlers]
379 [handlers]
378 keys = console, console_color, console_color_sql, null
380 keys = console, console_color, console_color_sql, null
379
381
380 [formatters]
382 [formatters]
381 keys = generic, color_formatter, color_formatter_sql
383 keys = generic, color_formatter, color_formatter_sql
382
384
383 #############
385 #############
384 ## LOGGERS ##
386 ## LOGGERS ##
385 #############
387 #############
386
388
387 [logger_root]
389 [logger_root]
388 level = NOTSET
390 level = NOTSET
389 #handlers = console
391 #handlers = console
390 handlers = console_color
392 handlers = console_color
391 # For coloring based on log level:
393 # For coloring based on log level:
392 # handlers = console_color
394 # handlers = console_color
393
395
394 [logger_routes]
396 [logger_routes]
395 #level = WARN
397 #level = WARN
396 level = DEBUG
398 level = DEBUG
397 handlers =
399 handlers =
398 qualname = routes.middleware
400 qualname = routes.middleware
399 ## "level = DEBUG" logs the route matched and routing variables.
401 ## "level = DEBUG" logs the route matched and routing variables.
400
402
401 [logger_beaker]
403 [logger_beaker]
402 #level = WARN
404 #level = WARN
403 level = DEBUG
405 level = DEBUG
404 handlers =
406 handlers =
405 qualname = beaker.container
407 qualname = beaker.container
406
408
407 [logger_templates]
409 [logger_templates]
408 #level = WARN
410 #level = WARN
409 level = INFO
411 level = INFO
410 handlers =
412 handlers =
411 qualname = pylons.templating
413 qualname = pylons.templating
412
414
413 [logger_kallithea]
415 [logger_kallithea]
414 #level = WARN
416 #level = WARN
415 level = DEBUG
417 level = DEBUG
416 handlers =
418 handlers =
417 qualname = kallithea
419 qualname = kallithea
418
420
419 [logger_tg]
421 [logger_tg]
420 #level = WARN
422 #level = WARN
421 level = DEBUG
423 level = DEBUG
422 handlers =
424 handlers =
423 qualname = tg
425 qualname = tg
424
426
425 [logger_gearbox]
427 [logger_gearbox]
426 #level = WARN
428 #level = WARN
427 level = DEBUG
429 level = DEBUG
428 handlers =
430 handlers =
429 qualname = gearbox
431 qualname = gearbox
430
432
431 [logger_sqlalchemy]
433 [logger_sqlalchemy]
432 level = WARN
434 level = WARN
433 handlers =
435 handlers =
434 qualname = sqlalchemy.engine
436 qualname = sqlalchemy.engine
435 # For coloring based on log level and pretty printing of SQL:
437 # For coloring based on log level and pretty printing of SQL:
436 # level = INFO
438 # level = INFO
437 # handlers = console_color_sql
439 # handlers = console_color_sql
438 # propagate = 0
440 # propagate = 0
439
441
440 [logger_whoosh_indexer]
442 [logger_whoosh_indexer]
441 #level = WARN
443 #level = WARN
442 level = DEBUG
444 level = DEBUG
443 handlers =
445 handlers =
444 qualname = whoosh_indexer
446 qualname = whoosh_indexer
445
447
446 [logger_werkzeug]
448 [logger_werkzeug]
447 level = WARN
449 level = WARN
448 handlers =
450 handlers =
449 qualname = werkzeug
451 qualname = werkzeug
450
452
451 [logger_backlash]
453 [logger_backlash]
452 level = WARN
454 level = WARN
453 handlers =
455 handlers =
454 qualname = backlash
456 qualname = backlash
455
457
456 ##############
458 ##############
457 ## HANDLERS ##
459 ## HANDLERS ##
458 ##############
460 ##############
459
461
460 [handler_console]
462 [handler_console]
461 class = StreamHandler
463 class = StreamHandler
462 args = (sys.stderr,)
464 args = (sys.stderr,)
463 formatter = generic
465 formatter = generic
464
466
465 [handler_console_color]
467 [handler_console_color]
466 # ANSI color coding based on log level
468 # ANSI color coding based on log level
467 class = StreamHandler
469 class = StreamHandler
468 args = (sys.stderr,)
470 args = (sys.stderr,)
469 formatter = color_formatter
471 formatter = color_formatter
470
472
471 [handler_console_color_sql]
473 [handler_console_color_sql]
472 # ANSI color coding and pretty printing of SQL statements
474 # ANSI color coding and pretty printing of SQL statements
473 class = StreamHandler
475 class = StreamHandler
474 args = (sys.stderr,)
476 args = (sys.stderr,)
475 formatter = color_formatter_sql
477 formatter = color_formatter_sql
476
478
477 [handler_null]
479 [handler_null]
478 class = NullHandler
480 class = NullHandler
479 args = ()
481 args = ()
480
482
481 ################
483 ################
482 ## FORMATTERS ##
484 ## FORMATTERS ##
483 ################
485 ################
484
486
485 [formatter_generic]
487 [formatter_generic]
486 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
488 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
487 datefmt = %Y-%m-%d %H:%M:%S
489 datefmt = %Y-%m-%d %H:%M:%S
488
490
489 [formatter_color_formatter]
491 [formatter_color_formatter]
490 class = kallithea.lib.colored_formatter.ColorFormatter
492 class = kallithea.lib.colored_formatter.ColorFormatter
491 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
493 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
492 datefmt = %Y-%m-%d %H:%M:%S
494 datefmt = %Y-%m-%d %H:%M:%S
493
495
494 [formatter_color_formatter_sql]
496 [formatter_color_formatter_sql]
495 class = kallithea.lib.colored_formatter.ColorFormatterSql
497 class = kallithea.lib.colored_formatter.ColorFormatterSql
496 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
498 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
497 datefmt = %Y-%m-%d %H:%M:%S
499 datefmt = %Y-%m-%d %H:%M:%S
498
500
499 #################
501 #################
500 ## SSH LOGGING ##
502 ## SSH LOGGING ##
501 #################
503 #################
502
504
503 # The default loggers use 'handler_console' that uses StreamHandler with
505 # The default loggers use 'handler_console' that uses StreamHandler with
504 # destination 'sys.stderr'. In the context of the SSH server process, these log
506 # destination 'sys.stderr'. In the context of the SSH server process, these log
505 # messages would be sent to the client, which is normally not what you want.
507 # messages would be sent to the client, which is normally not what you want.
506 # By default, when running ssh-serve, just use NullHandler and disable logging
508 # By default, when running ssh-serve, just use NullHandler and disable logging
507 # completely. For other logging options, see:
509 # completely. For other logging options, see:
508 # https://docs.python.org/2/library/logging.handlers.html
510 # https://docs.python.org/2/library/logging.handlers.html
509
511
510 [ssh_serve:logger_root]
512 [ssh_serve:logger_root]
511 level = CRITICAL
513 level = CRITICAL
512 handlers = null
514 handlers = null
513
515
514 # Note: If logging is configured with other handlers, they might need similar
516 # Note: If logging is configured with other handlers, they might need similar
515 # muting for ssh-serve too.
517 # muting for ssh-serve too.
@@ -1,638 +1,637 b''
1 .. _setup:
1 .. _setup:
2
2
3 =====
3 =====
4 Setup
4 Setup
5 =====
5 =====
6
6
7
7
8 Setting up Kallithea
8 Setting up Kallithea
9 --------------------
9 --------------------
10
10
11 First, you will need to create a Kallithea configuration file. Run the
11 First, you will need to create a Kallithea configuration file. Run the
12 following command to do so::
12 following command to do so::
13
13
14 kallithea-cli config-create my.ini
14 kallithea-cli config-create my.ini
15
15
16 This will create the file ``my.ini`` in the current directory. This
16 This will create the file ``my.ini`` in the current directory. This
17 configuration file contains the various settings for Kallithea, e.g.
17 configuration file contains the various settings for Kallithea, e.g.
18 proxy port, email settings, usage of static files, cache, Celery
18 proxy port, email settings, usage of static files, cache, Celery
19 settings, and logging. Extra settings can be specified like::
19 settings, and logging. Extra settings can be specified like::
20
20
21 kallithea-cli config-create my.ini host=8.8.8.8 "[handler_console]" formatter=color_formatter
21 kallithea-cli config-create my.ini host=8.8.8.8 "[handler_console]" formatter=color_formatter
22
22
23 Next, you need to create the databases used by Kallithea. It is recommended to
23 Next, you need to create the databases used by Kallithea. It is recommended to
24 use PostgreSQL or SQLite (default). If you choose a database other than the
24 use PostgreSQL or SQLite (default). If you choose a database other than the
25 default, ensure you properly adjust the database URL in your ``my.ini``
25 default, ensure you properly adjust the database URL in your ``my.ini``
26 configuration file to use this other database. Kallithea currently supports
26 configuration file to use this other database. Kallithea currently supports
27 PostgreSQL, SQLite and MySQL databases. Create the database by running
27 PostgreSQL, SQLite and MySQL databases. Create the database by running
28 the following command::
28 the following command::
29
29
30 kallithea-cli db-create -c my.ini
30 kallithea-cli db-create -c my.ini
31
31
32 This will prompt you for a "root" path. This "root" path is the location where
32 This will prompt you for a "root" path. This "root" path is the location where
33 Kallithea will store all of its repositories on the current machine. After
33 Kallithea will store all of its repositories on the current machine. After
34 entering this "root" path ``db-create`` will also prompt you for a username
34 entering this "root" path ``db-create`` will also prompt you for a username
35 and password for the initial admin account which ``db-create`` sets
35 and password for the initial admin account which ``db-create`` sets
36 up for you.
36 up for you.
37
37
38 The ``db-create`` values can also be given on the command line.
38 The ``db-create`` values can also be given on the command line.
39 Example::
39 Example::
40
40
41 kallithea-cli db-create -c my.ini --user=nn --password=secret --email=nn@example.com --repos=/srv/repos
41 kallithea-cli db-create -c my.ini --user=nn --password=secret --email=nn@example.com --repos=/srv/repos
42
42
43 The ``db-create`` command will create all needed tables and an
43 The ``db-create`` command will create all needed tables and an
44 admin account. When choosing a root path you can either use a new
44 admin account. When choosing a root path you can either use a new
45 empty location, or a location which already contains existing
45 empty location, or a location which already contains existing
46 repositories. If you choose a location which contains existing
46 repositories. If you choose a location which contains existing
47 repositories Kallithea will add all of the repositories at the chosen
47 repositories Kallithea will add all of the repositories at the chosen
48 location to its database. (Note: make sure you specify the correct
48 location to its database. (Note: make sure you specify the correct
49 path to the root).
49 path to the root).
50
50
51 .. note:: the given path for Mercurial_ repositories **must** be write
51 .. note:: the given path for Mercurial_ repositories **must** be write
52 accessible for the application. It's very important since
52 accessible for the application. It's very important since
53 the Kallithea web interface will work without write access,
53 the Kallithea web interface will work without write access,
54 but when trying to do a push it will fail with permission
54 but when trying to do a push it will fail with permission
55 denied errors unless it has write access.
55 denied errors unless it has write access.
56
56
57 Finally, prepare the front-end by running::
57 Finally, prepare the front-end by running::
58
58
59 kallithea-cli front-end-build
59 kallithea-cli front-end-build
60
60
61 You are now ready to use Kallithea. To run it simply execute::
61 You are now ready to use Kallithea. To run it simply execute::
62
62
63 gearbox serve -c my.ini
63 gearbox serve -c my.ini
64
64
65 - This command runs the Kallithea server. The web app should be available at
65 - This command runs the Kallithea server. The web app should be available at
66 http://127.0.0.1:5000. The IP address and port is configurable via the
66 http://127.0.0.1:5000. The IP address and port is configurable via the
67 configuration file created in the previous step.
67 configuration file created in the previous step.
68 - Log in to Kallithea using the admin account created when running ``db-create``.
68 - Log in to Kallithea using the admin account created when running ``db-create``.
69 - The default permissions on each repository is read, and the owner is admin.
69 - The default permissions on each repository is read, and the owner is admin.
70 Remember to update these if needed.
70 Remember to update these if needed.
71 - In the admin panel you can toggle LDAP, anonymous, and permissions
71 - In the admin panel you can toggle LDAP, anonymous, and permissions
72 settings, as well as edit more advanced options on users and
72 settings, as well as edit more advanced options on users and
73 repositories.
73 repositories.
74
74
75
75
76 Internationalization (i18n support)
76 Internationalization (i18n support)
77 -----------------------------------
77 -----------------------------------
78
78
79 The Kallithea web interface is automatically displayed in the user's preferred
79 The Kallithea web interface is automatically displayed in the user's preferred
80 language, as indicated by the browser. Thus, different users may see the
80 language, as indicated by the browser. Thus, different users may see the
81 application in different languages. If the requested language is not available
81 application in different languages. If the requested language is not available
82 (because the translation file for that language does not yet exist or is
82 (because the translation file for that language does not yet exist or is
83 incomplete), the language specified in setting ``i18n.lang`` in the Kallithea
83 incomplete), English is used.
84 configuration file is used as fallback. If no fallback language is explicitly
85 specified, English is used.
86
84
87 If you want to disable automatic language detection and instead configure a
85 If you want to disable automatic language detection and instead configure a
88 fixed language regardless of user preference, set ``i18n.enabled = false`` and
86 fixed language regardless of user preference, set ``i18n.enabled = false`` and
89 set ``i18n.lang`` to the desired language (or leave empty for English).
87 specify another language by setting ``i18n.lang`` in the Kallithea
88 configuration file.
90
89
91
90
92 Using Kallithea with SSH
91 Using Kallithea with SSH
93 ------------------------
92 ------------------------
94
93
95 Kallithea supports repository access via SSH key based authentication.
94 Kallithea supports repository access via SSH key based authentication.
96 This means:
95 This means:
97
96
98 - repository URLs like ``ssh://kallithea@example.com/name/of/repository``
97 - repository URLs like ``ssh://kallithea@example.com/name/of/repository``
99
98
100 - all network traffic for both read and write happens over the SSH protocol on
99 - all network traffic for both read and write happens over the SSH protocol on
101 port 22, without using HTTP/HTTPS nor the Kallithea WSGI application
100 port 22, without using HTTP/HTTPS nor the Kallithea WSGI application
102
101
103 - encryption and authentication protocols are managed by the system's ``sshd``
102 - encryption and authentication protocols are managed by the system's ``sshd``
104 process, with all users using the same Kallithea system user (e.g.
103 process, with all users using the same Kallithea system user (e.g.
105 ``kallithea``) when connecting to the SSH server, but with users' public keys
104 ``kallithea``) when connecting to the SSH server, but with users' public keys
106 in the Kallithea system user's `.ssh/authorized_keys` file granting each user
105 in the Kallithea system user's `.ssh/authorized_keys` file granting each user
107 sandboxed access to the repositories.
106 sandboxed access to the repositories.
108
107
109 - users and admins can manage SSH public keys in the web UI
108 - users and admins can manage SSH public keys in the web UI
110
109
111 - in their SSH client configuration, users can configure how the client should
110 - in their SSH client configuration, users can configure how the client should
112 control access to their SSH key - without passphrase, with passphrase, and
111 control access to their SSH key - without passphrase, with passphrase, and
113 optionally with passphrase caching in the local shell session (``ssh-agent``).
112 optionally with passphrase caching in the local shell session (``ssh-agent``).
114 This is standard SSH functionality, not something Kallithea provides or
113 This is standard SSH functionality, not something Kallithea provides or
115 interferes with.
114 interferes with.
116
115
117 - network communication between client and server happens in a bidirectional
116 - network communication between client and server happens in a bidirectional
118 stateful stream, and will in some cases be faster than HTTP/HTTPS with several
117 stateful stream, and will in some cases be faster than HTTP/HTTPS with several
119 stateless round-trips.
118 stateless round-trips.
120
119
121 .. note:: At this moment, repository access via SSH has been tested on Unix
120 .. note:: At this moment, repository access via SSH has been tested on Unix
122 only. Windows users that care about SSH are invited to test it and report
121 only. Windows users that care about SSH are invited to test it and report
123 problems, ideally contributing patches that solve these problems.
122 problems, ideally contributing patches that solve these problems.
124
123
125 Users and admins can upload SSH public keys (e.g. ``.ssh/id_rsa.pub``) through
124 Users and admins can upload SSH public keys (e.g. ``.ssh/id_rsa.pub``) through
126 the web interface. The server's ``.ssh/authorized_keys`` file is automatically
125 the web interface. The server's ``.ssh/authorized_keys`` file is automatically
127 maintained with an entry for each SSH key. Each entry will tell ``sshd`` to run
126 maintained with an entry for each SSH key. Each entry will tell ``sshd`` to run
128 ``kallithea-cli`` with the ``ssh-serve`` sub-command and the right Kallithea user ID
127 ``kallithea-cli`` with the ``ssh-serve`` sub-command and the right Kallithea user ID
129 when encountering the corresponding SSH key.
128 when encountering the corresponding SSH key.
130
129
131 To enable SSH repository access, Kallithea must be configured with the path to
130 To enable SSH repository access, Kallithea must be configured with the path to
132 the ``.ssh/authorized_keys`` file for the Kallithea user, and the path to the
131 the ``.ssh/authorized_keys`` file for the Kallithea user, and the path to the
133 ``kallithea-cli`` command. Put something like this in the ``.ini`` file::
132 ``kallithea-cli`` command. Put something like this in the ``.ini`` file::
134
133
135 ssh_enabled = true
134 ssh_enabled = true
136 ssh_authorized_keys = /home/kallithea/.ssh/authorized_keys
135 ssh_authorized_keys = /home/kallithea/.ssh/authorized_keys
137 kallithea_cli_path = /srv/kallithea/venv/bin/kallithea-cli
136 kallithea_cli_path = /srv/kallithea/venv/bin/kallithea-cli
138
137
139 The SSH service must be running, and the Kallithea user account must be active
138 The SSH service must be running, and the Kallithea user account must be active
140 (not necessarily with password access, but public key access must be enabled),
139 (not necessarily with password access, but public key access must be enabled),
141 all file permissions must be set as sshd wants it, and ``authorized_keys`` must
140 all file permissions must be set as sshd wants it, and ``authorized_keys`` must
142 be writeable by the Kallithea user.
141 be writeable by the Kallithea user.
143
142
144 .. note:: The ``authorized_keys`` file will be rewritten from scratch on
143 .. note:: The ``authorized_keys`` file will be rewritten from scratch on
145 each update. If it already exists with other data, Kallithea will not
144 each update. If it already exists with other data, Kallithea will not
146 overwrite the existing ``authorized_keys``, and the server process will
145 overwrite the existing ``authorized_keys``, and the server process will
147 instead throw an exception. The system administrator thus cannot ssh
146 instead throw an exception. The system administrator thus cannot ssh
148 directly to the Kallithea user but must use su/sudo from another account.
147 directly to the Kallithea user but must use su/sudo from another account.
149
148
150 If ``/home/kallithea/.ssh/`` (the directory of the path specified in the
149 If ``/home/kallithea/.ssh/`` (the directory of the path specified in the
151 ``ssh_authorized_keys`` setting of the ``.ini`` file) does not exist as a
150 ``ssh_authorized_keys`` setting of the ``.ini`` file) does not exist as a
152 directory, Kallithea will attempt to create it. If that path exists but is
151 directory, Kallithea will attempt to create it. If that path exists but is
153 *not* a directory, or is not readable-writable-executable by the server
152 *not* a directory, or is not readable-writable-executable by the server
154 process, the server process will raise an exception each time it attempts to
153 process, the server process will raise an exception each time it attempts to
155 write the ``authorized_keys`` file.
154 write the ``authorized_keys`` file.
156
155
157 .. warning:: The handling of SSH access is steered directly by the command
156 .. warning:: The handling of SSH access is steered directly by the command
158 specified in the ``authorized_keys`` file. There is no interaction with the
157 specified in the ``authorized_keys`` file. There is no interaction with the
159 web UI. Once SSH access is correctly configured and enabled, it will work
158 web UI. Once SSH access is correctly configured and enabled, it will work
160 regardless of whether the Kallithea web process is actually running. Hence,
159 regardless of whether the Kallithea web process is actually running. Hence,
161 if you want to perform repository or server maintenance and want to fully
160 if you want to perform repository or server maintenance and want to fully
162 disable all access to the repositories, disable SSH access by setting
161 disable all access to the repositories, disable SSH access by setting
163 ``ssh_enabled = false`` in the correct ``.ini`` file (i.e. the ``.ini`` file
162 ``ssh_enabled = false`` in the correct ``.ini`` file (i.e. the ``.ini`` file
164 specified in the ``authorized_keys`` file.)
163 specified in the ``authorized_keys`` file.)
165
164
166 The ``authorized_keys`` file can be updated manually with ``kallithea-cli
165 The ``authorized_keys`` file can be updated manually with ``kallithea-cli
167 ssh-update-authorized-keys -c my.ini``. This command is not needed in normal
166 ssh-update-authorized-keys -c my.ini``. This command is not needed in normal
168 operation but is for example useful after changing SSH-related settings in the
167 operation but is for example useful after changing SSH-related settings in the
169 ``.ini`` file or renaming that file. (The path to the ``.ini`` file is used in
168 ``.ini`` file or renaming that file. (The path to the ``.ini`` file is used in
170 the generated ``authorized_keys`` file).
169 the generated ``authorized_keys`` file).
171
170
172
171
173 Setting up Whoosh full text search
172 Setting up Whoosh full text search
174 ----------------------------------
173 ----------------------------------
175
174
176 Kallithea provides full text search of repositories using `Whoosh`__.
175 Kallithea provides full text search of repositories using `Whoosh`__.
177
176
178 .. __: https://whoosh.readthedocs.io/en/latest/
177 .. __: https://whoosh.readthedocs.io/en/latest/
179
178
180 For an incremental index build, run::
179 For an incremental index build, run::
181
180
182 kallithea-cli index-create -c my.ini
181 kallithea-cli index-create -c my.ini
183
182
184 For a full index rebuild, run::
183 For a full index rebuild, run::
185
184
186 kallithea-cli index-create -c my.ini --full
185 kallithea-cli index-create -c my.ini --full
187
186
188 The ``--repo-location`` option allows the location of the repositories to be overridden;
187 The ``--repo-location`` option allows the location of the repositories to be overridden;
189 usually, the location is retrieved from the Kallithea database.
188 usually, the location is retrieved from the Kallithea database.
190
189
191 The ``--index-only`` option can be used to limit the indexed repositories to a comma-separated list::
190 The ``--index-only`` option can be used to limit the indexed repositories to a comma-separated list::
192
191
193 kallithea-cli index-create -c my.ini --index-only=vcs,kallithea
192 kallithea-cli index-create -c my.ini --index-only=vcs,kallithea
194
193
195 To keep your index up-to-date it is necessary to do periodic index builds;
194 To keep your index up-to-date it is necessary to do periodic index builds;
196 for this, it is recommended to use a crontab entry. Example::
195 for this, it is recommended to use a crontab entry. Example::
197
196
198 0 3 * * * /path/to/virtualenv/bin/kallithea-cli index-create -c /path/to/kallithea/my.ini
197 0 3 * * * /path/to/virtualenv/bin/kallithea-cli index-create -c /path/to/kallithea/my.ini
199
198
200 When using incremental mode (the default), Whoosh will check the last
199 When using incremental mode (the default), Whoosh will check the last
201 modification date of each file and add it to be reindexed if a newer file is
200 modification date of each file and add it to be reindexed if a newer file is
202 available. The indexing daemon checks for any removed files and removes them
201 available. The indexing daemon checks for any removed files and removes them
203 from index.
202 from index.
204
203
205 If you want to rebuild the index from scratch, you can use the ``-f`` flag as above,
204 If you want to rebuild the index from scratch, you can use the ``-f`` flag as above,
206 or in the admin panel you can check the "build from scratch" checkbox.
205 or in the admin panel you can check the "build from scratch" checkbox.
207
206
208
207
209 Integration with issue trackers
208 Integration with issue trackers
210 -------------------------------
209 -------------------------------
211
210
212 Kallithea provides a simple integration with issue trackers. It's possible
211 Kallithea provides a simple integration with issue trackers. It's possible
213 to define a regular expression that will match an issue ID in commit messages,
212 to define a regular expression that will match an issue ID in commit messages,
214 and have that replaced with a URL to the issue.
213 and have that replaced with a URL to the issue.
215
214
216 This is achieved with following three variables in the ini file::
215 This is achieved with following three variables in the ini file::
217
216
218 issue_pat = #(\d+)
217 issue_pat = #(\d+)
219 issue_server_link = https://issues.example.com/{repo}/issue/\1
218 issue_server_link = https://issues.example.com/{repo}/issue/\1
220 issue_sub =
219 issue_sub =
221
220
222 ``issue_pat`` is the regular expression describing which strings in
221 ``issue_pat`` is the regular expression describing which strings in
223 commit messages will be treated as issue references. The expression can/should
222 commit messages will be treated as issue references. The expression can/should
224 have one or more parenthesized groups that can later be referred to in
223 have one or more parenthesized groups that can later be referred to in
225 ``issue_server_link`` and ``issue_sub`` (see below). If you prefer, named groups
224 ``issue_server_link`` and ``issue_sub`` (see below). If you prefer, named groups
226 can be used instead of simple parenthesized groups.
225 can be used instead of simple parenthesized groups.
227
226
228 If the pattern should only match if it is preceded by whitespace, add the
227 If the pattern should only match if it is preceded by whitespace, add the
229 following string before the actual pattern: ``(?:^|(?<=\s))``.
228 following string before the actual pattern: ``(?:^|(?<=\s))``.
230 If the pattern should only match if it is followed by whitespace, add the
229 If the pattern should only match if it is followed by whitespace, add the
231 following string after the actual pattern: ``(?:$|(?=\s))``.
230 following string after the actual pattern: ``(?:$|(?=\s))``.
232 These expressions use lookbehind and lookahead assertions of the Python regular
231 These expressions use lookbehind and lookahead assertions of the Python regular
233 expression module to avoid the whitespace to be part of the actual pattern,
232 expression module to avoid the whitespace to be part of the actual pattern,
234 otherwise the link text will also contain that whitespace.
233 otherwise the link text will also contain that whitespace.
235
234
236 Matched issue references are replaced with the link specified in
235 Matched issue references are replaced with the link specified in
237 ``issue_server_link``, in which any backreferences are resolved. Backreferences
236 ``issue_server_link``, in which any backreferences are resolved. Backreferences
238 can be ``\1``, ``\2``, ... or for named groups ``\g<groupname>``.
237 can be ``\1``, ``\2``, ... or for named groups ``\g<groupname>``.
239 The special token ``{repo}`` is replaced with the full repository path
238 The special token ``{repo}`` is replaced with the full repository path
240 (including repository groups), while token ``{repo_name}`` is replaced with the
239 (including repository groups), while token ``{repo_name}`` is replaced with the
241 repository name (without repository groups).
240 repository name (without repository groups).
242
241
243 The link text is determined by ``issue_sub``, which can be a string containing
242 The link text is determined by ``issue_sub``, which can be a string containing
244 backreferences to the groups specified in ``issue_pat``. If ``issue_sub`` is
243 backreferences to the groups specified in ``issue_pat``. If ``issue_sub`` is
245 empty, then the text matched by ``issue_pat`` is used verbatim.
244 empty, then the text matched by ``issue_pat`` is used verbatim.
246
245
247 The example settings shown above match issues in the format ``#<number>``.
246 The example settings shown above match issues in the format ``#<number>``.
248 This will cause the text ``#300`` to be transformed into a link:
247 This will cause the text ``#300`` to be transformed into a link:
249
248
250 .. code-block:: html
249 .. code-block:: html
251
250
252 <a href="https://issues.example.com/example_repo/issue/300">#300</a>
251 <a href="https://issues.example.com/example_repo/issue/300">#300</a>
253
252
254 The following example transforms a text starting with either of 'pullrequest',
253 The following example transforms a text starting with either of 'pullrequest',
255 'pull request' or 'PR', followed by an optional space, then a pound character
254 'pull request' or 'PR', followed by an optional space, then a pound character
256 (#) and one or more digits, into a link with the text 'PR #' followed by the
255 (#) and one or more digits, into a link with the text 'PR #' followed by the
257 digits::
256 digits::
258
257
259 issue_pat = (pullrequest|pull request|PR) ?#(\d+)
258 issue_pat = (pullrequest|pull request|PR) ?#(\d+)
260 issue_server_link = https://issues.example.com/\2
259 issue_server_link = https://issues.example.com/\2
261 issue_sub = PR #\2
260 issue_sub = PR #\2
262
261
263 The following example demonstrates how to require whitespace before the issue
262 The following example demonstrates how to require whitespace before the issue
264 reference in order for it to be recognized, such that the text ``issue#123`` will
263 reference in order for it to be recognized, such that the text ``issue#123`` will
265 not cause a match, but ``issue #123`` will::
264 not cause a match, but ``issue #123`` will::
266
265
267 issue_pat = (?:^|(?<=\s))#(\d+)
266 issue_pat = (?:^|(?<=\s))#(\d+)
268 issue_server_link = https://issues.example.com/\1
267 issue_server_link = https://issues.example.com/\1
269 issue_sub =
268 issue_sub =
270
269
271 If needed, more than one pattern can be specified by appending a unique suffix to
270 If needed, more than one pattern can be specified by appending a unique suffix to
272 the variables. For example, also demonstrating the use of named groups::
271 the variables. For example, also demonstrating the use of named groups::
273
272
274 issue_pat_wiki = wiki-(?P<pagename>\S+)
273 issue_pat_wiki = wiki-(?P<pagename>\S+)
275 issue_server_link_wiki = https://wiki.example.com/\g<pagename>
274 issue_server_link_wiki = https://wiki.example.com/\g<pagename>
276 issue_sub_wiki = WIKI-\g<pagename>
275 issue_sub_wiki = WIKI-\g<pagename>
277
276
278 With these settings, wiki pages can be referenced as wiki-some-id, and every
277 With these settings, wiki pages can be referenced as wiki-some-id, and every
279 such reference will be transformed into:
278 such reference will be transformed into:
280
279
281 .. code-block:: html
280 .. code-block:: html
282
281
283 <a href="https://wiki.example.com/some-id">WIKI-some-id</a>
282 <a href="https://wiki.example.com/some-id">WIKI-some-id</a>
284
283
285 Refer to the `Python regular expression documentation`_ for more details about
284 Refer to the `Python regular expression documentation`_ for more details about
286 the supported syntax in ``issue_pat``, ``issue_server_link`` and ``issue_sub``.
285 the supported syntax in ``issue_pat``, ``issue_server_link`` and ``issue_sub``.
287
286
288
287
289 Hook management
288 Hook management
290 ---------------
289 ---------------
291
290
292 Hooks can be managed in similar way to that used in ``.hgrc`` files.
291 Hooks can be managed in similar way to that used in ``.hgrc`` files.
293 To manage hooks, choose *Admin > Settings > Hooks*.
292 To manage hooks, choose *Admin > Settings > Hooks*.
294
293
295 The built-in hooks cannot be modified, though they can be enabled or disabled in the *VCS* section.
294 The built-in hooks cannot be modified, though they can be enabled or disabled in the *VCS* section.
296
295
297 To add another custom hook simply fill in the first textbox with
296 To add another custom hook simply fill in the first textbox with
298 ``<name>.<hook_type>`` and the second with the hook path. Example hooks
297 ``<name>.<hook_type>`` and the second with the hook path. Example hooks
299 can be found in ``kallithea.lib.hooks``.
298 can be found in ``kallithea.lib.hooks``.
300
299
301
300
302 Changing default encoding
301 Changing default encoding
303 -------------------------
302 -------------------------
304
303
305 By default, Kallithea uses UTF-8 encoding.
304 By default, Kallithea uses UTF-8 encoding.
306 This is configurable as ``default_encoding`` in the .ini file.
305 This is configurable as ``default_encoding`` in the .ini file.
307 This affects many parts in Kallithea including user names, filenames, and
306 This affects many parts in Kallithea including user names, filenames, and
308 encoding of commit messages. In addition Kallithea can detect if the ``chardet``
307 encoding of commit messages. In addition Kallithea can detect if the ``chardet``
309 library is installed. If ``chardet`` is detected Kallithea will fallback to it
308 library is installed. If ``chardet`` is detected Kallithea will fallback to it
310 when there are encode/decode errors.
309 when there are encode/decode errors.
311
310
312 The Mercurial encoding is configurable as ``hgencoding``. It is similar to
311 The Mercurial encoding is configurable as ``hgencoding``. It is similar to
313 setting the ``HGENCODING`` environment variable, but will override it.
312 setting the ``HGENCODING`` environment variable, but will override it.
314
313
315
314
316 Celery configuration
315 Celery configuration
317 --------------------
316 --------------------
318
317
319 Kallithea can use the distributed task queue system Celery_ to run tasks like
318 Kallithea can use the distributed task queue system Celery_ to run tasks like
320 cloning repositories or sending emails.
319 cloning repositories or sending emails.
321
320
322 Kallithea will in most setups work perfectly fine out of the box (without
321 Kallithea will in most setups work perfectly fine out of the box (without
323 Celery), executing all tasks in the web server process. Some tasks can however
322 Celery), executing all tasks in the web server process. Some tasks can however
324 take some time to run and it can be better to run such tasks asynchronously in
323 take some time to run and it can be better to run such tasks asynchronously in
325 a separate process so the web server can focus on serving web requests.
324 a separate process so the web server can focus on serving web requests.
326
325
327 For installation and configuration of Celery, see the `Celery documentation`_.
326 For installation and configuration of Celery, see the `Celery documentation`_.
328 Note that Celery requires a message broker service like RabbitMQ_ (recommended)
327 Note that Celery requires a message broker service like RabbitMQ_ (recommended)
329 or Redis_.
328 or Redis_.
330
329
331 The use of Celery is configured in the Kallithea ini configuration file.
330 The use of Celery is configured in the Kallithea ini configuration file.
332 To enable it, simply set::
331 To enable it, simply set::
333
332
334 use_celery = true
333 use_celery = true
335
334
336 and add or change the ``celery.*`` and ``broker.*`` configuration variables.
335 and add or change the ``celery.*`` and ``broker.*`` configuration variables.
337
336
338 Remember that the ini files use the format with '.' and not with '_' like
337 Remember that the ini files use the format with '.' and not with '_' like
339 Celery. So for example setting `BROKER_HOST` in Celery means setting
338 Celery. So for example setting `BROKER_HOST` in Celery means setting
340 `broker.host` in the configuration file.
339 `broker.host` in the configuration file.
341
340
342 To start the Celery process, run::
341 To start the Celery process, run::
343
342
344 kallithea-cli celery-run -c my.ini
343 kallithea-cli celery-run -c my.ini
345
344
346 Extra options to the Celery worker can be passed after ``--`` - see ``-- -h``
345 Extra options to the Celery worker can be passed after ``--`` - see ``-- -h``
347 for more info.
346 for more info.
348
347
349 .. note::
348 .. note::
350 Make sure you run this command from the same virtualenv, and with the same
349 Make sure you run this command from the same virtualenv, and with the same
351 user that Kallithea runs.
350 user that Kallithea runs.
352
351
353
352
354 HTTPS support
353 HTTPS support
355 -------------
354 -------------
356
355
357 Kallithea will by default generate URLs based on the WSGI environment.
356 Kallithea will by default generate URLs based on the WSGI environment.
358
357
359 Alternatively, you can use some special configuration settings to control
358 Alternatively, you can use some special configuration settings to control
360 directly which scheme/protocol Kallithea will use when generating URLs:
359 directly which scheme/protocol Kallithea will use when generating URLs:
361
360
362 - With ``https_fixup = true``, the scheme will be taken from the
361 - With ``https_fixup = true``, the scheme will be taken from the
363 ``X-Url-Scheme``, ``X-Forwarded-Scheme`` or ``X-Forwarded-Proto`` HTTP header
362 ``X-Url-Scheme``, ``X-Forwarded-Scheme`` or ``X-Forwarded-Proto`` HTTP header
364 (default ``http``).
363 (default ``http``).
365 - With ``force_https = true`` the default will be ``https``.
364 - With ``force_https = true`` the default will be ``https``.
366 - With ``use_htsts = true``, Kallithea will set ``Strict-Transport-Security`` when using https.
365 - With ``use_htsts = true``, Kallithea will set ``Strict-Transport-Security`` when using https.
367
366
368 .. _nginx_virtual_host:
367 .. _nginx_virtual_host:
369
368
370
369
371 Nginx virtual host example
370 Nginx virtual host example
372 --------------------------
371 --------------------------
373
372
374 Sample config for Nginx using proxy:
373 Sample config for Nginx using proxy:
375
374
376 .. code-block:: nginx
375 .. code-block:: nginx
377
376
378 upstream kallithea {
377 upstream kallithea {
379 server 127.0.0.1:5000;
378 server 127.0.0.1:5000;
380 # add more instances for load balancing
379 # add more instances for load balancing
381 #server 127.0.0.1:5001;
380 #server 127.0.0.1:5001;
382 #server 127.0.0.1:5002;
381 #server 127.0.0.1:5002;
383 }
382 }
384
383
385 ## gist alias
384 ## gist alias
386 server {
385 server {
387 listen 443;
386 listen 443;
388 server_name gist.example.com;
387 server_name gist.example.com;
389 access_log /var/log/nginx/gist.access.log;
388 access_log /var/log/nginx/gist.access.log;
390 error_log /var/log/nginx/gist.error.log;
389 error_log /var/log/nginx/gist.error.log;
391
390
392 ssl on;
391 ssl on;
393 ssl_certificate gist.your.kallithea.server.crt;
392 ssl_certificate gist.your.kallithea.server.crt;
394 ssl_certificate_key gist.your.kallithea.server.key;
393 ssl_certificate_key gist.your.kallithea.server.key;
395
394
396 ssl_session_timeout 5m;
395 ssl_session_timeout 5m;
397
396
398 ssl_protocols SSLv3 TLSv1;
397 ssl_protocols SSLv3 TLSv1;
399 ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA:RC4-MD5;
398 ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA:RC4-MD5;
400 ssl_prefer_server_ciphers on;
399 ssl_prefer_server_ciphers on;
401
400
402 rewrite ^/(.+)$ https://kallithea.example.com/_admin/gists/$1;
401 rewrite ^/(.+)$ https://kallithea.example.com/_admin/gists/$1;
403 rewrite (.*) https://kallithea.example.com/_admin/gists;
402 rewrite (.*) https://kallithea.example.com/_admin/gists;
404 }
403 }
405
404
406 server {
405 server {
407 listen 443;
406 listen 443;
408 server_name kallithea.example.com
407 server_name kallithea.example.com
409 access_log /var/log/nginx/kallithea.access.log;
408 access_log /var/log/nginx/kallithea.access.log;
410 error_log /var/log/nginx/kallithea.error.log;
409 error_log /var/log/nginx/kallithea.error.log;
411
410
412 ssl on;
411 ssl on;
413 ssl_certificate your.kallithea.server.crt;
412 ssl_certificate your.kallithea.server.crt;
414 ssl_certificate_key your.kallithea.server.key;
413 ssl_certificate_key your.kallithea.server.key;
415
414
416 ssl_session_timeout 5m;
415 ssl_session_timeout 5m;
417
416
418 ssl_protocols SSLv3 TLSv1;
417 ssl_protocols SSLv3 TLSv1;
419 ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA:RC4-MD5;
418 ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA:RC4-MD5;
420 ssl_prefer_server_ciphers on;
419 ssl_prefer_server_ciphers on;
421
420
422 ## uncomment root directive if you want to serve static files by nginx
421 ## uncomment root directive if you want to serve static files by nginx
423 ## requires static_files = false in .ini file
422 ## requires static_files = false in .ini file
424 #root /srv/kallithea/kallithea/kallithea/public;
423 #root /srv/kallithea/kallithea/kallithea/public;
425 include /etc/nginx/proxy.conf;
424 include /etc/nginx/proxy.conf;
426 location / {
425 location / {
427 try_files $uri @kallithea;
426 try_files $uri @kallithea;
428 }
427 }
429
428
430 location @kallithea {
429 location @kallithea {
431 proxy_pass http://127.0.0.1:5000;
430 proxy_pass http://127.0.0.1:5000;
432 }
431 }
433
432
434 }
433 }
435
434
436 Here's the proxy.conf. It's tuned so it will not timeout on long
435 Here's the proxy.conf. It's tuned so it will not timeout on long
437 pushes or large pushes::
436 pushes or large pushes::
438
437
439 proxy_redirect off;
438 proxy_redirect off;
440 proxy_set_header Host $host;
439 proxy_set_header Host $host;
441 ## needed for container auth
440 ## needed for container auth
442 #proxy_set_header REMOTE_USER $remote_user;
441 #proxy_set_header REMOTE_USER $remote_user;
443 #proxy_set_header X-Forwarded-User $remote_user;
442 #proxy_set_header X-Forwarded-User $remote_user;
444 proxy_set_header X-Url-Scheme $scheme;
443 proxy_set_header X-Url-Scheme $scheme;
445 proxy_set_header X-Host $http_host;
444 proxy_set_header X-Host $http_host;
446 proxy_set_header X-Real-IP $remote_addr;
445 proxy_set_header X-Real-IP $remote_addr;
447 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
446 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
448 proxy_set_header Proxy-host $proxy_host;
447 proxy_set_header Proxy-host $proxy_host;
449 proxy_buffering off;
448 proxy_buffering off;
450 proxy_connect_timeout 7200;
449 proxy_connect_timeout 7200;
451 proxy_send_timeout 7200;
450 proxy_send_timeout 7200;
452 proxy_read_timeout 7200;
451 proxy_read_timeout 7200;
453 proxy_buffers 8 32k;
452 proxy_buffers 8 32k;
454 client_max_body_size 1024m;
453 client_max_body_size 1024m;
455 client_body_buffer_size 128k;
454 client_body_buffer_size 128k;
456 large_client_header_buffers 8 64k;
455 large_client_header_buffers 8 64k;
457
456
458 .. _apache_virtual_host_reverse_proxy:
457 .. _apache_virtual_host_reverse_proxy:
459
458
460
459
461 Apache virtual host reverse proxy example
460 Apache virtual host reverse proxy example
462 -----------------------------------------
461 -----------------------------------------
463
462
464 Here is a sample configuration file for Apache using proxy:
463 Here is a sample configuration file for Apache using proxy:
465
464
466 .. code-block:: apache
465 .. code-block:: apache
467
466
468 <VirtualHost *:80>
467 <VirtualHost *:80>
469 ServerName kallithea.example.com
468 ServerName kallithea.example.com
470
469
471 <Proxy *>
470 <Proxy *>
472 # For Apache 2.4 and later:
471 # For Apache 2.4 and later:
473 Require all granted
472 Require all granted
474
473
475 # For Apache 2.2 and earlier, instead use:
474 # For Apache 2.2 and earlier, instead use:
476 # Order allow,deny
475 # Order allow,deny
477 # Allow from all
476 # Allow from all
478 </Proxy>
477 </Proxy>
479
478
480 #important !
479 #important !
481 #Directive to properly generate url (clone url) for Kallithea
480 #Directive to properly generate url (clone url) for Kallithea
482 ProxyPreserveHost On
481 ProxyPreserveHost On
483
482
484 #kallithea instance
483 #kallithea instance
485 ProxyPass / http://127.0.0.1:5000/
484 ProxyPass / http://127.0.0.1:5000/
486 ProxyPassReverse / http://127.0.0.1:5000/
485 ProxyPassReverse / http://127.0.0.1:5000/
487
486
488 #to enable https use line below
487 #to enable https use line below
489 #SetEnvIf X-Url-Scheme https HTTPS=1
488 #SetEnvIf X-Url-Scheme https HTTPS=1
490 </VirtualHost>
489 </VirtualHost>
491
490
492 Additional tutorial
491 Additional tutorial
493 http://pylonsbook.com/en/1.1/deployment.html#using-apache-to-proxy-requests-to-pylons
492 http://pylonsbook.com/en/1.1/deployment.html#using-apache-to-proxy-requests-to-pylons
494
493
495 .. _apache_subdirectory:
494 .. _apache_subdirectory:
496
495
497
496
498 Apache as subdirectory
497 Apache as subdirectory
499 ----------------------
498 ----------------------
500
499
501 Apache subdirectory part:
500 Apache subdirectory part:
502
501
503 .. code-block:: apache
502 .. code-block:: apache
504
503
505 <Location /PREFIX >
504 <Location /PREFIX >
506 ProxyPass http://127.0.0.1:5000/PREFIX
505 ProxyPass http://127.0.0.1:5000/PREFIX
507 ProxyPassReverse http://127.0.0.1:5000/PREFIX
506 ProxyPassReverse http://127.0.0.1:5000/PREFIX
508 SetEnvIf X-Url-Scheme https HTTPS=1
507 SetEnvIf X-Url-Scheme https HTTPS=1
509 </Location>
508 </Location>
510
509
511 Besides the regular apache setup you will need to add the following line
510 Besides the regular apache setup you will need to add the following line
512 into ``[app:main]`` section of your .ini file::
511 into ``[app:main]`` section of your .ini file::
513
512
514 filter-with = proxy-prefix
513 filter-with = proxy-prefix
515
514
516 Add the following at the end of the .ini file::
515 Add the following at the end of the .ini file::
517
516
518 [filter:proxy-prefix]
517 [filter:proxy-prefix]
519 use = egg:PasteDeploy#prefix
518 use = egg:PasteDeploy#prefix
520 prefix = /PREFIX
519 prefix = /PREFIX
521
520
522 then change ``PREFIX`` into your chosen prefix
521 then change ``PREFIX`` into your chosen prefix
523
522
524 .. _apache_mod_wsgi:
523 .. _apache_mod_wsgi:
525
524
526
525
527 Apache with mod_wsgi
526 Apache with mod_wsgi
528 --------------------
527 --------------------
529
528
530 Alternatively, Kallithea can be set up with Apache under mod_wsgi. For
529 Alternatively, Kallithea can be set up with Apache under mod_wsgi. For
531 that, you'll need to:
530 that, you'll need to:
532
531
533 - Install mod_wsgi. If using a Debian-based distro, you can install
532 - Install mod_wsgi. If using a Debian-based distro, you can install
534 the package libapache2-mod-wsgi::
533 the package libapache2-mod-wsgi::
535
534
536 aptitude install libapache2-mod-wsgi
535 aptitude install libapache2-mod-wsgi
537
536
538 - Enable mod_wsgi::
537 - Enable mod_wsgi::
539
538
540 a2enmod wsgi
539 a2enmod wsgi
541
540
542 - Add global Apache configuration to tell mod_wsgi that Python only will be
541 - Add global Apache configuration to tell mod_wsgi that Python only will be
543 used in the WSGI processes and shouldn't be initialized in the Apache
542 used in the WSGI processes and shouldn't be initialized in the Apache
544 processes::
543 processes::
545
544
546 WSGIRestrictEmbedded On
545 WSGIRestrictEmbedded On
547
546
548 - Create a WSGI dispatch script, like the one below. Make sure you
547 - Create a WSGI dispatch script, like the one below. Make sure you
549 check that the paths correctly point to where you installed Kallithea
548 check that the paths correctly point to where you installed Kallithea
550 and its Python Virtual Environment.
549 and its Python Virtual Environment.
551
550
552 .. code-block:: python
551 .. code-block:: python
553
552
554 import os
553 import os
555 os.environ['PYTHON_EGG_CACHE'] = '/srv/kallithea/.egg-cache'
554 os.environ['PYTHON_EGG_CACHE'] = '/srv/kallithea/.egg-cache'
556
555
557 # sometimes it's needed to set the current dir
556 # sometimes it's needed to set the current dir
558 os.chdir('/srv/kallithea/')
557 os.chdir('/srv/kallithea/')
559
558
560 import site
559 import site
561 site.addsitedir("/srv/kallithea/venv/lib/python2.7/site-packages")
560 site.addsitedir("/srv/kallithea/venv/lib/python2.7/site-packages")
562
561
563 ini = '/srv/kallithea/my.ini'
562 ini = '/srv/kallithea/my.ini'
564 from logging.config import fileConfig
563 from logging.config import fileConfig
565 fileConfig(ini, {'__file__': ini, 'here': '/srv/kallithea'})
564 fileConfig(ini, {'__file__': ini, 'here': '/srv/kallithea'})
566 from paste.deploy import loadapp
565 from paste.deploy import loadapp
567 application = loadapp('config:' + ini)
566 application = loadapp('config:' + ini)
568
567
569 Or using proper virtualenv activation:
568 Or using proper virtualenv activation:
570
569
571 .. code-block:: python
570 .. code-block:: python
572
571
573 activate_this = '/srv/kallithea/venv/bin/activate_this.py'
572 activate_this = '/srv/kallithea/venv/bin/activate_this.py'
574 execfile(activate_this, dict(__file__=activate_this))
573 execfile(activate_this, dict(__file__=activate_this))
575
574
576 import os
575 import os
577 os.environ['HOME'] = '/srv/kallithea'
576 os.environ['HOME'] = '/srv/kallithea'
578
577
579 ini = '/srv/kallithea/kallithea.ini'
578 ini = '/srv/kallithea/kallithea.ini'
580 from logging.config import fileConfig
579 from logging.config import fileConfig
581 fileConfig(ini, {'__file__': ini, 'here': '/srv/kallithea'})
580 fileConfig(ini, {'__file__': ini, 'here': '/srv/kallithea'})
582 from paste.deploy import loadapp
581 from paste.deploy import loadapp
583 application = loadapp('config:' + ini)
582 application = loadapp('config:' + ini)
584
583
585 - Add the necessary ``WSGI*`` directives to the Apache Virtual Host configuration
584 - Add the necessary ``WSGI*`` directives to the Apache Virtual Host configuration
586 file, like in the example below. Notice that the WSGI dispatch script created
585 file, like in the example below. Notice that the WSGI dispatch script created
587 above is referred to with the ``WSGIScriptAlias`` directive.
586 above is referred to with the ``WSGIScriptAlias`` directive.
588 The default locale settings Apache provides for web services are often not
587 The default locale settings Apache provides for web services are often not
589 adequate, with `C` as the default language and `ASCII` as the encoding.
588 adequate, with `C` as the default language and `ASCII` as the encoding.
590 Instead, use the ``lang`` parameter of ``WSGIDaemonProcess`` to specify a
589 Instead, use the ``lang`` parameter of ``WSGIDaemonProcess`` to specify a
591 suitable locale. See also the :ref:`overview` section and the
590 suitable locale. See also the :ref:`overview` section and the
592 `WSGIDaemonProcess documentation`_.
591 `WSGIDaemonProcess documentation`_.
593
592
594 Apache will by default run as a special Apache user, on Linux systems
593 Apache will by default run as a special Apache user, on Linux systems
595 usually ``www-data`` or ``apache``. If you need to have the repositories
594 usually ``www-data`` or ``apache``. If you need to have the repositories
596 directory owned by a different user, use the user and group options to
595 directory owned by a different user, use the user and group options to
597 WSGIDaemonProcess to set the name of the user and group.
596 WSGIDaemonProcess to set the name of the user and group.
598
597
599 Once again, check that all paths are correctly specified.
598 Once again, check that all paths are correctly specified.
600
599
601 .. code-block:: apache
600 .. code-block:: apache
602
601
603 WSGIDaemonProcess kallithea processes=5 threads=1 maximum-requests=100 \
602 WSGIDaemonProcess kallithea processes=5 threads=1 maximum-requests=100 \
604 python-home=/srv/kallithea/venv lang=C.UTF-8
603 python-home=/srv/kallithea/venv lang=C.UTF-8
605 WSGIProcessGroup kallithea
604 WSGIProcessGroup kallithea
606 WSGIScriptAlias / /srv/kallithea/dispatch.wsgi
605 WSGIScriptAlias / /srv/kallithea/dispatch.wsgi
607 WSGIPassAuthorization On
606 WSGIPassAuthorization On
608
607
609 Or if using a dispatcher WSGI script with proper virtualenv activation:
608 Or if using a dispatcher WSGI script with proper virtualenv activation:
610
609
611 .. code-block:: apache
610 .. code-block:: apache
612
611
613 WSGIDaemonProcess kallithea processes=5 threads=1 maximum-requests=100 lang=en_US.utf8
612 WSGIDaemonProcess kallithea processes=5 threads=1 maximum-requests=100 lang=en_US.utf8
614 WSGIProcessGroup kallithea
613 WSGIProcessGroup kallithea
615 WSGIScriptAlias / /srv/kallithea/dispatch.wsgi
614 WSGIScriptAlias / /srv/kallithea/dispatch.wsgi
616 WSGIPassAuthorization On
615 WSGIPassAuthorization On
617
616
618
617
619 Other configuration files
618 Other configuration files
620 -------------------------
619 -------------------------
621
620
622 A number of `example init.d scripts`__ can be found in
621 A number of `example init.d scripts`__ can be found in
623 the ``init.d`` directory of the Kallithea source.
622 the ``init.d`` directory of the Kallithea source.
624
623
625 .. __: https://kallithea-scm.org/repos/kallithea/files/tip/init.d/ .
624 .. __: https://kallithea-scm.org/repos/kallithea/files/tip/init.d/ .
626
625
627
626
628 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
627 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
629 .. _python: http://www.python.org/
628 .. _python: http://www.python.org/
630 .. _Python regular expression documentation: https://docs.python.org/2/library/re.html
629 .. _Python regular expression documentation: https://docs.python.org/2/library/re.html
631 .. _Mercurial: https://www.mercurial-scm.org/
630 .. _Mercurial: https://www.mercurial-scm.org/
632 .. _Celery: http://celeryproject.org/
631 .. _Celery: http://celeryproject.org/
633 .. _Celery documentation: http://docs.celeryproject.org/en/latest/getting-started/index.html
632 .. _Celery documentation: http://docs.celeryproject.org/en/latest/getting-started/index.html
634 .. _RabbitMQ: http://www.rabbitmq.com/
633 .. _RabbitMQ: http://www.rabbitmq.com/
635 .. _Redis: http://redis.io/
634 .. _Redis: http://redis.io/
636 .. _mercurial-server: http://www.lshift.net/mercurial-server.html
635 .. _mercurial-server: http://www.lshift.net/mercurial-server.html
637 .. _PublishingRepositories: https://www.mercurial-scm.org/wiki/PublishingRepositories
636 .. _PublishingRepositories: https://www.mercurial-scm.org/wiki/PublishingRepositories
638 .. _WSGIDaemonProcess documentation: https://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html
637 .. _WSGIDaemonProcess documentation: https://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html
@@ -1,211 +1,216 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 # This program is free software: you can redistribute it and/or modify
2 # This program is free software: you can redistribute it and/or modify
3 # it under the terms of the GNU General Public License as published by
3 # it under the terms of the GNU General Public License as published by
4 # the Free Software Foundation, either version 3 of the License, or
4 # the Free Software Foundation, either version 3 of the License, or
5 # (at your option) any later version.
5 # (at your option) any later version.
6 #
6 #
7 # This program is distributed in the hope that it will be useful,
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
10 # GNU General Public License for more details.
11 #
11 #
12 # You should have received a copy of the GNU General Public License
12 # You should have received a copy of the GNU General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 """
14 """
15 Global configuration file for TurboGears2 specific settings in Kallithea.
15 Global configuration file for TurboGears2 specific settings in Kallithea.
16
16
17 This file complements the .ini file.
17 This file complements the .ini file.
18 """
18 """
19
19
20 import logging
20 import logging
21 import os
21 import os
22 import platform
22 import platform
23 import sys
23 import sys
24
24
25 import alembic.config
25 import alembic.config
26 import mercurial
26 import mercurial
27 import tg
27 import tg
28 from alembic.migration import MigrationContext
28 from alembic.migration import MigrationContext
29 from alembic.script.base import ScriptDirectory
29 from alembic.script.base import ScriptDirectory
30 from sqlalchemy import create_engine
30 from sqlalchemy import create_engine
31 from tg import hooks
31 from tg import hooks
32 from tg.configuration import AppConfig
32 from tg.configuration import AppConfig
33 from tg.support.converters import asbool
33 from tg.support.converters import asbool
34
34
35 import kallithea.lib.locale
35 import kallithea.lib.locale
36 import kallithea.model.base
36 import kallithea.model.base
37 from kallithea.lib.auth import set_available_permissions
37 from kallithea.lib.auth import set_available_permissions
38 from kallithea.lib.middleware.https_fixup import HttpsFixup
38 from kallithea.lib.middleware.https_fixup import HttpsFixup
39 from kallithea.lib.middleware.permanent_repo_url import PermanentRepoUrl
39 from kallithea.lib.middleware.permanent_repo_url import PermanentRepoUrl
40 from kallithea.lib.middleware.simplegit import SimpleGit
40 from kallithea.lib.middleware.simplegit import SimpleGit
41 from kallithea.lib.middleware.simplehg import SimpleHg
41 from kallithea.lib.middleware.simplehg import SimpleHg
42 from kallithea.lib.middleware.wrapper import RequestWrapper
42 from kallithea.lib.middleware.wrapper import RequestWrapper
43 from kallithea.lib.utils import check_git_version, load_rcextensions, make_ui, set_app_settings, set_indexer_config, set_vcs_config
43 from kallithea.lib.utils import check_git_version, load_rcextensions, make_ui, set_app_settings, set_indexer_config, set_vcs_config
44 from kallithea.lib.utils2 import str2bool
44 from kallithea.lib.utils2 import str2bool
45
45
46
46
47 log = logging.getLogger(__name__)
47 log = logging.getLogger(__name__)
48
48
49
49
50 class KallitheaAppConfig(AppConfig):
50 class KallitheaAppConfig(AppConfig):
51 # Note: AppConfig has a misleading name, as it's not the application
51 # Note: AppConfig has a misleading name, as it's not the application
52 # configuration, but the application configurator. The AppConfig values are
52 # configuration, but the application configurator. The AppConfig values are
53 # used as a template to create the actual configuration, which might
53 # used as a template to create the actual configuration, which might
54 # overwrite or extend the one provided by the configurator template.
54 # overwrite or extend the one provided by the configurator template.
55
55
56 # To make it clear, AppConfig creates the config and sets into it the same
56 # To make it clear, AppConfig creates the config and sets into it the same
57 # values that AppConfig itself has. Then the values from the config file and
57 # values that AppConfig itself has. Then the values from the config file and
58 # gearbox options are loaded and merged into the configuration. Then an
58 # gearbox options are loaded and merged into the configuration. Then an
59 # after_init_config(conf) method of AppConfig is called for any change that
59 # after_init_config(conf) method of AppConfig is called for any change that
60 # might depend on options provided by configuration files.
60 # might depend on options provided by configuration files.
61
61
62 def __init__(self):
62 def __init__(self):
63 super(KallitheaAppConfig, self).__init__()
63 super(KallitheaAppConfig, self).__init__()
64
64
65 self['package'] = kallithea
65 self['package'] = kallithea
66
66
67 self['prefer_toscawidgets2'] = False
67 self['prefer_toscawidgets2'] = False
68 self['use_toscawidgets'] = False
68 self['use_toscawidgets'] = False
69
69
70 self['renderers'] = []
70 self['renderers'] = []
71
71
72 # Enable json in expose
72 # Enable json in expose
73 self['renderers'].append('json')
73 self['renderers'].append('json')
74
74
75 # Configure template rendering
75 # Configure template rendering
76 self['renderers'].append('mako')
76 self['renderers'].append('mako')
77 self['default_renderer'] = 'mako'
77 self['default_renderer'] = 'mako'
78 self['use_dotted_templatenames'] = False
78 self['use_dotted_templatenames'] = False
79
79
80 # Configure Sessions, store data as JSON to avoid pickle security issues
80 # Configure Sessions, store data as JSON to avoid pickle security issues
81 self['session.enabled'] = True
81 self['session.enabled'] = True
82 self['session.data_serializer'] = 'json'
82 self['session.data_serializer'] = 'json'
83
83
84 # Configure the base SQLALchemy Setup
84 # Configure the base SQLALchemy Setup
85 self['use_sqlalchemy'] = True
85 self['use_sqlalchemy'] = True
86 self['model'] = kallithea.model.base
86 self['model'] = kallithea.model.base
87 self['DBSession'] = kallithea.model.meta.Session
87 self['DBSession'] = kallithea.model.meta.Session
88
88
89 # Configure App without an authentication backend.
89 # Configure App without an authentication backend.
90 self['auth_backend'] = None
90 self['auth_backend'] = None
91
91
92 # Use custom error page for these errors. By default, Turbogears2 does not add
92 # Use custom error page for these errors. By default, Turbogears2 does not add
93 # 400 in this list.
93 # 400 in this list.
94 # Explicitly listing all is considered more robust than appending to defaults,
94 # Explicitly listing all is considered more robust than appending to defaults,
95 # in light of possible future framework changes.
95 # in light of possible future framework changes.
96 self['errorpage.status_codes'] = [400, 401, 403, 404]
96 self['errorpage.status_codes'] = [400, 401, 403, 404]
97
97
98 # Disable transaction manager -- currently Kallithea takes care of transactions itself
98 # Disable transaction manager -- currently Kallithea takes care of transactions itself
99 self['tm.enabled'] = False
99 self['tm.enabled'] = False
100
100
101 # Set the i18n source language so TG doesn't search beyond 'en' in Accept-Language.
102 # Don't force the default here if configuration force something else.
103 if not self.get('i18n.lang'):
104 self['i18n.lang'] = 'en'
105
101
106
102 base_config = KallitheaAppConfig()
107 base_config = KallitheaAppConfig()
103
108
104 # TODO still needed as long as we use pylonslib
109 # TODO still needed as long as we use pylonslib
105 sys.modules['pylons'] = tg
110 sys.modules['pylons'] = tg
106
111
107 # DebugBar, a debug toolbar for TurboGears2.
112 # DebugBar, a debug toolbar for TurboGears2.
108 # (https://github.com/TurboGears/tgext.debugbar)
113 # (https://github.com/TurboGears/tgext.debugbar)
109 # To enable it, install 'tgext.debugbar' and 'kajiki', and run Kallithea with
114 # To enable it, install 'tgext.debugbar' and 'kajiki', and run Kallithea with
110 # 'debug = true' (not in production!)
115 # 'debug = true' (not in production!)
111 # See the Kallithea documentation for more information.
116 # See the Kallithea documentation for more information.
112 try:
117 try:
113 from tgext.debugbar import enable_debugbar
118 from tgext.debugbar import enable_debugbar
114 import kajiki # only to check its existence
119 import kajiki # only to check its existence
115 except ImportError:
120 except ImportError:
116 pass
121 pass
117 else:
122 else:
118 base_config['renderers'].append('kajiki')
123 base_config['renderers'].append('kajiki')
119 enable_debugbar(base_config)
124 enable_debugbar(base_config)
120
125
121
126
122 def setup_configuration(app):
127 def setup_configuration(app):
123 config = app.config
128 config = app.config
124
129
125 if not kallithea.lib.locale.current_locale_is_valid():
130 if not kallithea.lib.locale.current_locale_is_valid():
126 log.error("Terminating ...")
131 log.error("Terminating ...")
127 sys.exit(1)
132 sys.exit(1)
128
133
129 # Mercurial sets encoding at module import time, so we have to monkey patch it
134 # Mercurial sets encoding at module import time, so we have to monkey patch it
130 hgencoding = config.get('hgencoding')
135 hgencoding = config.get('hgencoding')
131 if hgencoding:
136 if hgencoding:
132 mercurial.encoding.encoding = hgencoding
137 mercurial.encoding.encoding = hgencoding
133
138
134 if config.get('ignore_alembic_revision', False):
139 if config.get('ignore_alembic_revision', False):
135 log.warn('database alembic revision checking is disabled')
140 log.warn('database alembic revision checking is disabled')
136 else:
141 else:
137 dbconf = config['sqlalchemy.url']
142 dbconf = config['sqlalchemy.url']
138 alembic_cfg = alembic.config.Config()
143 alembic_cfg = alembic.config.Config()
139 alembic_cfg.set_main_option('script_location', 'kallithea:alembic')
144 alembic_cfg.set_main_option('script_location', 'kallithea:alembic')
140 alembic_cfg.set_main_option('sqlalchemy.url', dbconf)
145 alembic_cfg.set_main_option('sqlalchemy.url', dbconf)
141 script_dir = ScriptDirectory.from_config(alembic_cfg)
146 script_dir = ScriptDirectory.from_config(alembic_cfg)
142 available_heads = sorted(script_dir.get_heads())
147 available_heads = sorted(script_dir.get_heads())
143
148
144 engine = create_engine(dbconf)
149 engine = create_engine(dbconf)
145 with engine.connect() as conn:
150 with engine.connect() as conn:
146 context = MigrationContext.configure(conn)
151 context = MigrationContext.configure(conn)
147 current_heads = sorted(str(s) for s in context.get_current_heads())
152 current_heads = sorted(str(s) for s in context.get_current_heads())
148 if current_heads != available_heads:
153 if current_heads != available_heads:
149 log.error('Failed to run Kallithea:\n\n'
154 log.error('Failed to run Kallithea:\n\n'
150 'The database version does not match the Kallithea version.\n'
155 'The database version does not match the Kallithea version.\n'
151 'Please read the documentation on how to upgrade or downgrade the database.\n'
156 'Please read the documentation on how to upgrade or downgrade the database.\n'
152 'Current database version id(s): %s\n'
157 'Current database version id(s): %s\n'
153 'Expected database version id(s): %s\n'
158 'Expected database version id(s): %s\n'
154 'If you are a developer and you know what you are doing, you can add `ignore_alembic_revision = True` '
159 'If you are a developer and you know what you are doing, you can add `ignore_alembic_revision = True` '
155 'to your .ini file to skip the check.\n' % (' '.join(current_heads), ' '.join(available_heads)))
160 'to your .ini file to skip the check.\n' % (' '.join(current_heads), ' '.join(available_heads)))
156 sys.exit(1)
161 sys.exit(1)
157
162
158 # store some globals into kallithea
163 # store some globals into kallithea
159 kallithea.CELERY_ON = str2bool(config.get('use_celery'))
164 kallithea.CELERY_ON = str2bool(config.get('use_celery'))
160 kallithea.CELERY_EAGER = str2bool(config.get('celery.always.eager'))
165 kallithea.CELERY_EAGER = str2bool(config.get('celery.always.eager'))
161 kallithea.CONFIG = config
166 kallithea.CONFIG = config
162
167
163 load_rcextensions(root_path=config['here'])
168 load_rcextensions(root_path=config['here'])
164
169
165 set_available_permissions(config)
170 set_available_permissions(config)
166 repos_path = make_ui().configitems('paths')[0][1]
171 repos_path = make_ui().configitems('paths')[0][1]
167 config['base_path'] = repos_path
172 config['base_path'] = repos_path
168 set_app_settings(config)
173 set_app_settings(config)
169
174
170 instance_id = kallithea.CONFIG.get('instance_id', '*')
175 instance_id = kallithea.CONFIG.get('instance_id', '*')
171 if instance_id == '*':
176 if instance_id == '*':
172 instance_id = '%s-%s' % (platform.uname()[1], os.getpid())
177 instance_id = '%s-%s' % (platform.uname()[1], os.getpid())
173 kallithea.CONFIG['instance_id'] = instance_id
178 kallithea.CONFIG['instance_id'] = instance_id
174
179
175 # update kallithea.CONFIG with the meanwhile changed 'config'
180 # update kallithea.CONFIG with the meanwhile changed 'config'
176 kallithea.CONFIG.update(config)
181 kallithea.CONFIG.update(config)
177
182
178 # configure vcs and indexer libraries (they are supposed to be independent
183 # configure vcs and indexer libraries (they are supposed to be independent
179 # as much as possible and thus avoid importing tg.config or
184 # as much as possible and thus avoid importing tg.config or
180 # kallithea.CONFIG).
185 # kallithea.CONFIG).
181 set_vcs_config(kallithea.CONFIG)
186 set_vcs_config(kallithea.CONFIG)
182 set_indexer_config(kallithea.CONFIG)
187 set_indexer_config(kallithea.CONFIG)
183
188
184 check_git_version()
189 check_git_version()
185
190
186
191
187 hooks.register('configure_new_app', setup_configuration)
192 hooks.register('configure_new_app', setup_configuration)
188
193
189
194
190 def setup_application(app):
195 def setup_application(app):
191 config = app.config
196 config = app.config
192
197
193 # we want our low level middleware to get to the request ASAP. We don't
198 # we want our low level middleware to get to the request ASAP. We don't
194 # need any stack middleware in them - especially no StatusCodeRedirect buffering
199 # need any stack middleware in them - especially no StatusCodeRedirect buffering
195 app = SimpleHg(app, config)
200 app = SimpleHg(app, config)
196 app = SimpleGit(app, config)
201 app = SimpleGit(app, config)
197
202
198 # Enable https redirects based on HTTP_X_URL_SCHEME set by proxy
203 # Enable https redirects based on HTTP_X_URL_SCHEME set by proxy
199 if any(asbool(config.get(x)) for x in ['https_fixup', 'force_https', 'use_htsts']):
204 if any(asbool(config.get(x)) for x in ['https_fixup', 'force_https', 'use_htsts']):
200 app = HttpsFixup(app, config)
205 app = HttpsFixup(app, config)
201
206
202 app = PermanentRepoUrl(app, config)
207 app = PermanentRepoUrl(app, config)
203
208
204 # Optional and undocumented wrapper - gives more verbose request/response logging, but has a slight overhead
209 # Optional and undocumented wrapper - gives more verbose request/response logging, but has a slight overhead
205 if str2bool(config.get('use_wsgi_wrapper')):
210 if str2bool(config.get('use_wsgi_wrapper')):
206 app = RequestWrapper(app, config)
211 app = RequestWrapper(app, config)
207
212
208 return app
213 return app
209
214
210
215
211 hooks.register('before_config', setup_application)
216 hooks.register('before_config', setup_application)
@@ -1,697 +1,699 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2 <%text>################################################################################</%text>
2 <%text>################################################################################</%text>
3 <%text>################################################################################</%text>
3 <%text>################################################################################</%text>
4 # Kallithea - config file generated with kallithea-config #
4 # Kallithea - config file generated with kallithea-config #
5 # #
5 # #
6 # The %(here)s variable will be replaced with the parent directory of this file#
6 # The %(here)s variable will be replaced with the parent directory of this file#
7 <%text>################################################################################</%text>
7 <%text>################################################################################</%text>
8 <%text>################################################################################</%text>
8 <%text>################################################################################</%text>
9
9
10 [DEFAULT]
10 [DEFAULT]
11
11
12 <%text>################################################################################</%text>
12 <%text>################################################################################</%text>
13 <%text>## Email settings ##</%text>
13 <%text>## Email settings ##</%text>
14 <%text>## ##</%text>
14 <%text>## ##</%text>
15 <%text>## Refer to the documentation ("Email settings") for more details. ##</%text>
15 <%text>## Refer to the documentation ("Email settings") for more details. ##</%text>
16 <%text>## ##</%text>
16 <%text>## ##</%text>
17 <%text>## It is recommended to use a valid sender address that passes access ##</%text>
17 <%text>## It is recommended to use a valid sender address that passes access ##</%text>
18 <%text>## validation and spam filtering in mail servers. ##</%text>
18 <%text>## validation and spam filtering in mail servers. ##</%text>
19 <%text>################################################################################</%text>
19 <%text>################################################################################</%text>
20
20
21 <%text>## 'From' header for application emails. You can optionally add a name.</%text>
21 <%text>## 'From' header for application emails. You can optionally add a name.</%text>
22 <%text>## Default:</%text>
22 <%text>## Default:</%text>
23 #app_email_from = Kallithea
23 #app_email_from = Kallithea
24 <%text>## Examples:</%text>
24 <%text>## Examples:</%text>
25 #app_email_from = Kallithea <kallithea-noreply@example.com>
25 #app_email_from = Kallithea <kallithea-noreply@example.com>
26 #app_email_from = kallithea-noreply@example.com
26 #app_email_from = kallithea-noreply@example.com
27
27
28 <%text>## Subject prefix for application emails.</%text>
28 <%text>## Subject prefix for application emails.</%text>
29 <%text>## A space between this prefix and the real subject is automatically added.</%text>
29 <%text>## A space between this prefix and the real subject is automatically added.</%text>
30 <%text>## Default:</%text>
30 <%text>## Default:</%text>
31 #email_prefix =
31 #email_prefix =
32 <%text>## Example:</%text>
32 <%text>## Example:</%text>
33 #email_prefix = [Kallithea]
33 #email_prefix = [Kallithea]
34
34
35 <%text>## Recipients for error emails and fallback recipients of application mails.</%text>
35 <%text>## Recipients for error emails and fallback recipients of application mails.</%text>
36 <%text>## Multiple addresses can be specified, comma-separated.</%text>
36 <%text>## Multiple addresses can be specified, comma-separated.</%text>
37 <%text>## Only addresses are allowed, do not add any name part.</%text>
37 <%text>## Only addresses are allowed, do not add any name part.</%text>
38 <%text>## Default:</%text>
38 <%text>## Default:</%text>
39 #email_to =
39 #email_to =
40 <%text>## Examples:</%text>
40 <%text>## Examples:</%text>
41 #email_to = admin@example.com
41 #email_to = admin@example.com
42 #email_to = admin@example.com,another_admin@example.com
42 #email_to = admin@example.com,another_admin@example.com
43 email_to =
43 email_to =
44
44
45 <%text>## 'From' header for error emails. You can optionally add a name.</%text>
45 <%text>## 'From' header for error emails. You can optionally add a name.</%text>
46 <%text>## Default: (none)</%text>
46 <%text>## Default: (none)</%text>
47 <%text>## Examples:</%text>
47 <%text>## Examples:</%text>
48 #error_email_from = Kallithea Errors <kallithea-noreply@example.com>
48 #error_email_from = Kallithea Errors <kallithea-noreply@example.com>
49 #error_email_from = kallithea_errors@example.com
49 #error_email_from = kallithea_errors@example.com
50 error_email_from =
50 error_email_from =
51
51
52 <%text>## SMTP server settings</%text>
52 <%text>## SMTP server settings</%text>
53 <%text>## If specifying credentials, make sure to use secure connections.</%text>
53 <%text>## If specifying credentials, make sure to use secure connections.</%text>
54 <%text>## Default: Send unencrypted unauthenticated mails to the specified smtp_server.</%text>
54 <%text>## Default: Send unencrypted unauthenticated mails to the specified smtp_server.</%text>
55 <%text>## For "SSL", use smtp_use_ssl = true and smtp_port = 465.</%text>
55 <%text>## For "SSL", use smtp_use_ssl = true and smtp_port = 465.</%text>
56 <%text>## For "STARTTLS", use smtp_use_tls = true and smtp_port = 587.</%text>
56 <%text>## For "STARTTLS", use smtp_use_tls = true and smtp_port = 587.</%text>
57 smtp_server =
57 smtp_server =
58 #smtp_username =
58 #smtp_username =
59 #smtp_password =
59 #smtp_password =
60 smtp_port =
60 smtp_port =
61 #smtp_use_ssl = false
61 #smtp_use_ssl = false
62 #smtp_use_tls = false
62 #smtp_use_tls = false
63
63
64 %if http_server != 'uwsgi':
64 %if http_server != 'uwsgi':
65 <%text>## Entry point for 'gearbox serve'</%text>
65 <%text>## Entry point for 'gearbox serve'</%text>
66 [server:main]
66 [server:main]
67 host = ${host}
67 host = ${host}
68 port = ${port}
68 port = ${port}
69
69
70 %if http_server == 'gearbox':
70 %if http_server == 'gearbox':
71 <%text>## Gearbox default web server ##</%text>
71 <%text>## Gearbox default web server ##</%text>
72 use = egg:gearbox#wsgiref
72 use = egg:gearbox#wsgiref
73 <%text>## nr of worker threads to spawn</%text>
73 <%text>## nr of worker threads to spawn</%text>
74 threadpool_workers = 1
74 threadpool_workers = 1
75 <%text>## max request before thread respawn</%text>
75 <%text>## max request before thread respawn</%text>
76 threadpool_max_requests = 100
76 threadpool_max_requests = 100
77 <%text>## option to use threads of process</%text>
77 <%text>## option to use threads of process</%text>
78 use_threadpool = true
78 use_threadpool = true
79
79
80 %elif http_server == 'gevent':
80 %elif http_server == 'gevent':
81 <%text>## Gearbox gevent web server ##</%text>
81 <%text>## Gearbox gevent web server ##</%text>
82 use = egg:gearbox#gevent
82 use = egg:gearbox#gevent
83
83
84 %elif http_server == 'waitress':
84 %elif http_server == 'waitress':
85 <%text>## WAITRESS ##</%text>
85 <%text>## WAITRESS ##</%text>
86 use = egg:waitress#main
86 use = egg:waitress#main
87 <%text>## number of worker threads</%text>
87 <%text>## number of worker threads</%text>
88 threads = 1
88 threads = 1
89 <%text>## MAX BODY SIZE 100GB</%text>
89 <%text>## MAX BODY SIZE 100GB</%text>
90 max_request_body_size = 107374182400
90 max_request_body_size = 107374182400
91 <%text>## use poll instead of select, fixes fd limits, may not work on old</%text>
91 <%text>## use poll instead of select, fixes fd limits, may not work on old</%text>
92 <%text>## windows systems.</%text>
92 <%text>## windows systems.</%text>
93 #asyncore_use_poll = True
93 #asyncore_use_poll = True
94
94
95 %elif http_server == 'gunicorn':
95 %elif http_server == 'gunicorn':
96 <%text>## GUNICORN ##</%text>
96 <%text>## GUNICORN ##</%text>
97 use = egg:gunicorn#main
97 use = egg:gunicorn#main
98 <%text>## number of process workers. You must set `instance_id = *` when this option</%text>
98 <%text>## number of process workers. You must set `instance_id = *` when this option</%text>
99 <%text>## is set to more than one worker</%text>
99 <%text>## is set to more than one worker</%text>
100 workers = 4
100 workers = 4
101 <%text>## process name</%text>
101 <%text>## process name</%text>
102 proc_name = kallithea
102 proc_name = kallithea
103 <%text>## type of worker class, one of sync, eventlet, gevent, tornado</%text>
103 <%text>## type of worker class, one of sync, eventlet, gevent, tornado</%text>
104 <%text>## recommended for bigger setup is using of of other than sync one</%text>
104 <%text>## recommended for bigger setup is using of of other than sync one</%text>
105 worker_class = sync
105 worker_class = sync
106 max_requests = 1000
106 max_requests = 1000
107 <%text>## amount of time a worker can handle request before it gets killed and</%text>
107 <%text>## amount of time a worker can handle request before it gets killed and</%text>
108 <%text>## restarted</%text>
108 <%text>## restarted</%text>
109 timeout = 3600
109 timeout = 3600
110
110
111 %endif
111 %endif
112 %else:
112 %else:
113 <%text>## UWSGI ##</%text>
113 <%text>## UWSGI ##</%text>
114 <%text>## run with uwsgi --ini-paste-logged <inifile.ini></%text>
114 <%text>## run with uwsgi --ini-paste-logged <inifile.ini></%text>
115 [uwsgi]
115 [uwsgi]
116 socket = /tmp/uwsgi.sock
116 socket = /tmp/uwsgi.sock
117 master = true
117 master = true
118 http = ${host}:${port}
118 http = ${host}:${port}
119
119
120 <%text>## set as daemon and redirect all output to file</%text>
120 <%text>## set as daemon and redirect all output to file</%text>
121 #daemonize = ./uwsgi_kallithea.log
121 #daemonize = ./uwsgi_kallithea.log
122
122
123 <%text>## master process PID</%text>
123 <%text>## master process PID</%text>
124 pidfile = ./uwsgi_kallithea.pid
124 pidfile = ./uwsgi_kallithea.pid
125
125
126 <%text>## stats server with workers statistics, use uwsgitop</%text>
126 <%text>## stats server with workers statistics, use uwsgitop</%text>
127 <%text>## for monitoring, `uwsgitop 127.0.0.1:1717`</%text>
127 <%text>## for monitoring, `uwsgitop 127.0.0.1:1717`</%text>
128 stats = 127.0.0.1:1717
128 stats = 127.0.0.1:1717
129 memory-report = true
129 memory-report = true
130
130
131 <%text>## log 5XX errors</%text>
131 <%text>## log 5XX errors</%text>
132 log-5xx = true
132 log-5xx = true
133
133
134 <%text>## Set the socket listen queue size.</%text>
134 <%text>## Set the socket listen queue size.</%text>
135 listen = 128
135 listen = 128
136
136
137 <%text>## Gracefully Reload workers after the specified amount of managed requests</%text>
137 <%text>## Gracefully Reload workers after the specified amount of managed requests</%text>
138 <%text>## (avoid memory leaks).</%text>
138 <%text>## (avoid memory leaks).</%text>
139 max-requests = 1000
139 max-requests = 1000
140
140
141 <%text>## enable large buffers</%text>
141 <%text>## enable large buffers</%text>
142 buffer-size = 65535
142 buffer-size = 65535
143
143
144 <%text>## socket and http timeouts ##</%text>
144 <%text>## socket and http timeouts ##</%text>
145 http-timeout = 3600
145 http-timeout = 3600
146 socket-timeout = 3600
146 socket-timeout = 3600
147
147
148 <%text>## Log requests slower than the specified number of milliseconds.</%text>
148 <%text>## Log requests slower than the specified number of milliseconds.</%text>
149 log-slow = 10
149 log-slow = 10
150
150
151 <%text>## Exit if no app can be loaded.</%text>
151 <%text>## Exit if no app can be loaded.</%text>
152 need-app = true
152 need-app = true
153
153
154 <%text>## Set lazy mode (load apps in workers instead of master).</%text>
154 <%text>## Set lazy mode (load apps in workers instead of master).</%text>
155 lazy = true
155 lazy = true
156
156
157 <%text>## scaling ##</%text>
157 <%text>## scaling ##</%text>
158 <%text>## set cheaper algorithm to use, if not set default will be used</%text>
158 <%text>## set cheaper algorithm to use, if not set default will be used</%text>
159 cheaper-algo = spare
159 cheaper-algo = spare
160
160
161 <%text>## minimum number of workers to keep at all times</%text>
161 <%text>## minimum number of workers to keep at all times</%text>
162 cheaper = 1
162 cheaper = 1
163
163
164 <%text>## number of workers to spawn at startup</%text>
164 <%text>## number of workers to spawn at startup</%text>
165 cheaper-initial = 1
165 cheaper-initial = 1
166
166
167 <%text>## maximum number of workers that can be spawned</%text>
167 <%text>## maximum number of workers that can be spawned</%text>
168 workers = 4
168 workers = 4
169
169
170 <%text>## how many workers should be spawned at a time</%text>
170 <%text>## how many workers should be spawned at a time</%text>
171 cheaper-step = 1
171 cheaper-step = 1
172
172
173 %endif
173 %endif
174 <%text>## middleware for hosting the WSGI application under a URL prefix</%text>
174 <%text>## middleware for hosting the WSGI application under a URL prefix</%text>
175 #[filter:proxy-prefix]
175 #[filter:proxy-prefix]
176 #use = egg:PasteDeploy#prefix
176 #use = egg:PasteDeploy#prefix
177 #prefix = /<your-prefix>
177 #prefix = /<your-prefix>
178
178
179 [app:main]
179 [app:main]
180 use = egg:kallithea
180 use = egg:kallithea
181 <%text>## enable proxy prefix middleware</%text>
181 <%text>## enable proxy prefix middleware</%text>
182 #filter-with = proxy-prefix
182 #filter-with = proxy-prefix
183
183
184 full_stack = true
184 full_stack = true
185 static_files = true
185 static_files = true
186
186
187 <%text>## Internationalization (see setup documentation for details)</%text>
187 <%text>## Internationalization (see setup documentation for details)</%text>
188 <%text>## By default, the language requested by the browser is used if available.</%text>
188 <%text>## By default, the languages requested by the browser are used if available, with English as default.</%text>
189 #i18n.enabled = false
189 <%text>## Set i18n.enabled=false to disable automatic language choice.</%text>
190 <%text>## Fallback language, empty for English (valid values are the names of subdirectories in kallithea/i18n):</%text>
190 #i18n.enabled = true
191 i18n.lang =
191 <%text>## To Force a language, set i18n.enabled=false and specify the language in i18n.lang.</%text>
192 <%text>## Valid values are the names of subdirectories in kallithea/i18n with a LC_MESSAGES/kallithea.mo</%text>
193 #i18n.lang = en
192
194
193 cache_dir = %(here)s/data
195 cache_dir = %(here)s/data
194 index_dir = %(here)s/data/index
196 index_dir = %(here)s/data/index
195
197
196 <%text>## uncomment and set this path to use archive download cache</%text>
198 <%text>## uncomment and set this path to use archive download cache</%text>
197 archive_cache_dir = %(here)s/tarballcache
199 archive_cache_dir = %(here)s/tarballcache
198
200
199 <%text>## change this to unique ID for security</%text>
201 <%text>## change this to unique ID for security</%text>
200 app_instance_uuid = ${uuid()}
202 app_instance_uuid = ${uuid()}
201
203
202 <%text>## cut off limit for large diffs (size in bytes)</%text>
204 <%text>## cut off limit for large diffs (size in bytes)</%text>
203 cut_off_limit = 256000
205 cut_off_limit = 256000
204
206
205 <%text>## force https in Kallithea, fixes https redirects, assumes it's always https</%text>
207 <%text>## force https in Kallithea, fixes https redirects, assumes it's always https</%text>
206 force_https = false
208 force_https = false
207
209
208 <%text>## use Strict-Transport-Security headers</%text>
210 <%text>## use Strict-Transport-Security headers</%text>
209 use_htsts = false
211 use_htsts = false
210
212
211 <%text>## number of commits stats will parse on each iteration</%text>
213 <%text>## number of commits stats will parse on each iteration</%text>
212 commit_parse_limit = 25
214 commit_parse_limit = 25
213
215
214 <%text>## Path to Python executable to be used for git hooks.</%text>
216 <%text>## Path to Python executable to be used for git hooks.</%text>
215 <%text>## This value will be written inside the git hook scripts as the text</%text>
217 <%text>## This value will be written inside the git hook scripts as the text</%text>
216 <%text>## after '#!' (shebang). When empty or not defined, the value of</%text>
218 <%text>## after '#!' (shebang). When empty or not defined, the value of</%text>
217 <%text>## 'sys.executable' at the time of installation of the git hooks is</%text>
219 <%text>## 'sys.executable' at the time of installation of the git hooks is</%text>
218 <%text>## used, which is correct in many cases but for example not when using uwsgi.</%text>
220 <%text>## used, which is correct in many cases but for example not when using uwsgi.</%text>
219 <%text>## If you change this setting, you should reinstall the Git hooks via</%text>
221 <%text>## If you change this setting, you should reinstall the Git hooks via</%text>
220 <%text>## Admin > Settings > Remap and Rescan.</%text>
222 <%text>## Admin > Settings > Remap and Rescan.</%text>
221 # git_hook_interpreter = /srv/kallithea/venv/bin/python2
223 # git_hook_interpreter = /srv/kallithea/venv/bin/python2
222 %if git_hook_interpreter:
224 %if git_hook_interpreter:
223 git_hook_interpreter = ${git_hook_interpreter}
225 git_hook_interpreter = ${git_hook_interpreter}
224 %endif
226 %endif
225
227
226 <%text>## path to git executable</%text>
228 <%text>## path to git executable</%text>
227 git_path = git
229 git_path = git
228
230
229 <%text>## git rev filter option, --all is the default filter, if you need to</%text>
231 <%text>## git rev filter option, --all is the default filter, if you need to</%text>
230 <%text>## hide all refs in changelog switch this to --branches --tags</%text>
232 <%text>## hide all refs in changelog switch this to --branches --tags</%text>
231 #git_rev_filter = --branches --tags
233 #git_rev_filter = --branches --tags
232
234
233 <%text>## RSS feed options</%text>
235 <%text>## RSS feed options</%text>
234 rss_cut_off_limit = 256000
236 rss_cut_off_limit = 256000
235 rss_items_per_page = 10
237 rss_items_per_page = 10
236 rss_include_diff = false
238 rss_include_diff = false
237
239
238 <%text>## options for showing and identifying changesets</%text>
240 <%text>## options for showing and identifying changesets</%text>
239 show_sha_length = 12
241 show_sha_length = 12
240 show_revision_number = false
242 show_revision_number = false
241
243
242 <%text>## Canonical URL to use when creating full URLs in UI and texts.</%text>
244 <%text>## Canonical URL to use when creating full URLs in UI and texts.</%text>
243 <%text>## Useful when the site is available under different names or protocols.</%text>
245 <%text>## Useful when the site is available under different names or protocols.</%text>
244 <%text>## Defaults to what is provided in the WSGI environment.</%text>
246 <%text>## Defaults to what is provided in the WSGI environment.</%text>
245 #canonical_url = https://kallithea.example.com/repos
247 #canonical_url = https://kallithea.example.com/repos
246
248
247 <%text>## gist URL alias, used to create nicer urls for gist. This should be an</%text>
249 <%text>## gist URL alias, used to create nicer urls for gist. This should be an</%text>
248 <%text>## url that does rewrites to _admin/gists/<gistid>.</%text>
250 <%text>## url that does rewrites to _admin/gists/<gistid>.</%text>
249 <%text>## example: http://gist.example.com/{gistid}. Empty means use the internal</%text>
251 <%text>## example: http://gist.example.com/{gistid}. Empty means use the internal</%text>
250 <%text>## Kallithea url, ie. http[s]://kallithea.example.com/_admin/gists/<gistid></%text>
252 <%text>## Kallithea url, ie. http[s]://kallithea.example.com/_admin/gists/<gistid></%text>
251 gist_alias_url =
253 gist_alias_url =
252
254
253 <%text>## default encoding used to convert from and to unicode</%text>
255 <%text>## default encoding used to convert from and to unicode</%text>
254 <%text>## can be also a comma separated list of encoding in case of mixed encodings</%text>
256 <%text>## can be also a comma separated list of encoding in case of mixed encodings</%text>
255 default_encoding = utf-8
257 default_encoding = utf-8
256
258
257 <%text>## Set Mercurial encoding, similar to setting HGENCODING before launching Kallithea</%text>
259 <%text>## Set Mercurial encoding, similar to setting HGENCODING before launching Kallithea</%text>
258 hgencoding = utf-8
260 hgencoding = utf-8
259
261
260 <%text>## issue tracker for Kallithea (leave blank to disable, absent for default)</%text>
262 <%text>## issue tracker for Kallithea (leave blank to disable, absent for default)</%text>
261 #bugtracker = https://bitbucket.org/conservancy/kallithea/issues
263 #bugtracker = https://bitbucket.org/conservancy/kallithea/issues
262
264
263 <%text>## issue tracking mapping for commit messages, comments, PR descriptions, ...</%text>
265 <%text>## issue tracking mapping for commit messages, comments, PR descriptions, ...</%text>
264 <%text>## Refer to the documentation ("Integration with issue trackers") for more details.</%text>
266 <%text>## Refer to the documentation ("Integration with issue trackers") for more details.</%text>
265
267
266 <%text>## regular expression to match issue references</%text>
268 <%text>## regular expression to match issue references</%text>
267 <%text>## This pattern may/should contain parenthesized groups, that can</%text>
269 <%text>## This pattern may/should contain parenthesized groups, that can</%text>
268 <%text>## be referred to in issue_server_link or issue_sub using Python backreferences</%text>
270 <%text>## be referred to in issue_server_link or issue_sub using Python backreferences</%text>
269 <%text>## (e.g. \1, \2, ...). You can also create named groups with '(?P<groupname>)'.</%text>
271 <%text>## (e.g. \1, \2, ...). You can also create named groups with '(?P<groupname>)'.</%text>
270 <%text>## To require mandatory whitespace before the issue pattern, use:</%text>
272 <%text>## To require mandatory whitespace before the issue pattern, use:</%text>
271 <%text>## (?:^|(?<=\s)) before the actual pattern, and for mandatory whitespace</%text>
273 <%text>## (?:^|(?<=\s)) before the actual pattern, and for mandatory whitespace</%text>
272 <%text>## behind the issue pattern, use (?:$|(?=\s)) after the actual pattern.</%text>
274 <%text>## behind the issue pattern, use (?:$|(?=\s)) after the actual pattern.</%text>
273
275
274 issue_pat = #(\d+)
276 issue_pat = #(\d+)
275
277
276 <%text>## server url to the issue</%text>
278 <%text>## server url to the issue</%text>
277 <%text>## This pattern may/should contain backreferences to parenthesized groups in issue_pat.</%text>
279 <%text>## This pattern may/should contain backreferences to parenthesized groups in issue_pat.</%text>
278 <%text>## A backreference can be \1, \2, ... or \g<groupname> if you specified a named group</%text>
280 <%text>## A backreference can be \1, \2, ... or \g<groupname> if you specified a named group</%text>
279 <%text>## called 'groupname' in issue_pat.</%text>
281 <%text>## called 'groupname' in issue_pat.</%text>
280 <%text>## The special token {repo} is replaced with the full repository name</%text>
282 <%text>## The special token {repo} is replaced with the full repository name</%text>
281 <%text>## including repository groups, while {repo_name} is replaced with just</%text>
283 <%text>## including repository groups, while {repo_name} is replaced with just</%text>
282 <%text>## the name of the repository.</%text>
284 <%text>## the name of the repository.</%text>
283
285
284 issue_server_link = https://issues.example.com/{repo}/issue/\1
286 issue_server_link = https://issues.example.com/{repo}/issue/\1
285
287
286 <%text>## substitution pattern to use as the link text</%text>
288 <%text>## substitution pattern to use as the link text</%text>
287 <%text>## If issue_sub is empty, the text matched by issue_pat is retained verbatim</%text>
289 <%text>## If issue_sub is empty, the text matched by issue_pat is retained verbatim</%text>
288 <%text>## for the link text. Otherwise, the link text is that of issue_sub, with any</%text>
290 <%text>## for the link text. Otherwise, the link text is that of issue_sub, with any</%text>
289 <%text>## backreferences to groups in issue_pat replaced.</%text>
291 <%text>## backreferences to groups in issue_pat replaced.</%text>
290
292
291 issue_sub =
293 issue_sub =
292
294
293 <%text>## issue_pat, issue_server_link and issue_sub can have suffixes to specify</%text>
295 <%text>## issue_pat, issue_server_link and issue_sub can have suffixes to specify</%text>
294 <%text>## multiple patterns, to other issues server, wiki or others</%text>
296 <%text>## multiple patterns, to other issues server, wiki or others</%text>
295 <%text>## below an example how to create a wiki pattern</%text>
297 <%text>## below an example how to create a wiki pattern</%text>
296 # wiki-some-id -> https://wiki.example.com/some-id
298 # wiki-some-id -> https://wiki.example.com/some-id
297
299
298 #issue_pat_wiki = wiki-(\S+)
300 #issue_pat_wiki = wiki-(\S+)
299 #issue_server_link_wiki = https://wiki.example.com/\1
301 #issue_server_link_wiki = https://wiki.example.com/\1
300 #issue_sub_wiki = WIKI-\1
302 #issue_sub_wiki = WIKI-\1
301
303
302 <%text>## alternative return HTTP header for failed authentication. Default HTTP</%text>
304 <%text>## alternative return HTTP header for failed authentication. Default HTTP</%text>
303 <%text>## response is 401 HTTPUnauthorized. Currently Mercurial clients have trouble with</%text>
305 <%text>## response is 401 HTTPUnauthorized. Currently Mercurial clients have trouble with</%text>
304 <%text>## handling that. Set this variable to 403 to return HTTPForbidden</%text>
306 <%text>## handling that. Set this variable to 403 to return HTTPForbidden</%text>
305 auth_ret_code =
307 auth_ret_code =
306
308
307 <%text>## allows to change the repository location in settings page</%text>
309 <%text>## allows to change the repository location in settings page</%text>
308 allow_repo_location_change = True
310 allow_repo_location_change = True
309
311
310 <%text>## allows to setup custom hooks in settings page</%text>
312 <%text>## allows to setup custom hooks in settings page</%text>
311 allow_custom_hooks_settings = True
313 allow_custom_hooks_settings = True
312
314
313 <%text>## extra extensions for indexing, space separated and without the leading '.'.</%text>
315 <%text>## extra extensions for indexing, space separated and without the leading '.'.</%text>
314 # index.extensions =
316 # index.extensions =
315 # gemfile
317 # gemfile
316 # lock
318 # lock
317
319
318 <%text>## extra filenames for indexing, space separated</%text>
320 <%text>## extra filenames for indexing, space separated</%text>
319 # index.filenames =
321 # index.filenames =
320 # .dockerignore
322 # .dockerignore
321 # .editorconfig
323 # .editorconfig
322 # INSTALL
324 # INSTALL
323 # CHANGELOG
325 # CHANGELOG
324
326
325 <%text>####################################</%text>
327 <%text>####################################</%text>
326 <%text>### SSH CONFIG ####</%text>
328 <%text>### SSH CONFIG ####</%text>
327 <%text>####################################</%text>
329 <%text>####################################</%text>
328
330
329 <%text>## SSH is disabled by default, until an Administrator decides to enable it.</%text>
331 <%text>## SSH is disabled by default, until an Administrator decides to enable it.</%text>
330 ssh_enabled = false
332 ssh_enabled = false
331
333
332 <%text>## File where users' SSH keys will be stored *if* ssh_enabled is true.</%text>
334 <%text>## File where users' SSH keys will be stored *if* ssh_enabled is true.</%text>
333 #ssh_authorized_keys = /home/kallithea/.ssh/authorized_keys
335 #ssh_authorized_keys = /home/kallithea/.ssh/authorized_keys
334 %if user_home_path:
336 %if user_home_path:
335 ssh_authorized_keys = ${user_home_path}/.ssh/authorized_keys
337 ssh_authorized_keys = ${user_home_path}/.ssh/authorized_keys
336 %endif
338 %endif
337
339
338 <%text>## Path to be used in ssh_authorized_keys file to invoke kallithea-cli with ssh-serve.</%text>
340 <%text>## Path to be used in ssh_authorized_keys file to invoke kallithea-cli with ssh-serve.</%text>
339 #kallithea_cli_path = /srv/kallithea/venv/bin/kallithea-cli
341 #kallithea_cli_path = /srv/kallithea/venv/bin/kallithea-cli
340 %if kallithea_cli_path:
342 %if kallithea_cli_path:
341 kallithea_cli_path = ${kallithea_cli_path}
343 kallithea_cli_path = ${kallithea_cli_path}
342 %endif
344 %endif
343
345
344 <%text>## Locale to be used in the ssh-serve command.</%text>
346 <%text>## Locale to be used in the ssh-serve command.</%text>
345 <%text>## This is needed because an SSH client may try to use its own locale</%text>
347 <%text>## This is needed because an SSH client may try to use its own locale</%text>
346 <%text>## settings, which may not be available on the server.</%text>
348 <%text>## settings, which may not be available on the server.</%text>
347 <%text>## See `locale -a` for valid values on this system.</%text>
349 <%text>## See `locale -a` for valid values on this system.</%text>
348 #ssh_locale = C.UTF-8
350 #ssh_locale = C.UTF-8
349 %if ssh_locale:
351 %if ssh_locale:
350 ssh_locale = ${ssh_locale}
352 ssh_locale = ${ssh_locale}
351 %endif
353 %endif
352
354
353 <%text>####################################</%text>
355 <%text>####################################</%text>
354 <%text>### CELERY CONFIG ####</%text>
356 <%text>### CELERY CONFIG ####</%text>
355 <%text>####################################</%text>
357 <%text>####################################</%text>
356
358
357 use_celery = false
359 use_celery = false
358
360
359 <%text>## Example: connect to the virtual host 'rabbitmqhost' on localhost as rabbitmq:</%text>
361 <%text>## Example: connect to the virtual host 'rabbitmqhost' on localhost as rabbitmq:</%text>
360 broker.url = amqp://rabbitmq:qewqew@localhost:5672/rabbitmqhost
362 broker.url = amqp://rabbitmq:qewqew@localhost:5672/rabbitmqhost
361
363
362 celery.imports = kallithea.lib.celerylib.tasks
364 celery.imports = kallithea.lib.celerylib.tasks
363 celery.accept.content = pickle
365 celery.accept.content = pickle
364 celery.result.backend = amqp
366 celery.result.backend = amqp
365 celery.result.dburi = amqp://
367 celery.result.dburi = amqp://
366 celery.result.serialier = json
368 celery.result.serialier = json
367
369
368 #celery.send.task.error.emails = true
370 #celery.send.task.error.emails = true
369 #celery.amqp.task.result.expires = 18000
371 #celery.amqp.task.result.expires = 18000
370
372
371 celeryd.concurrency = 2
373 celeryd.concurrency = 2
372 celeryd.max.tasks.per.child = 1
374 celeryd.max.tasks.per.child = 1
373
375
374 <%text>## If true, tasks will never be sent to the queue, but executed locally instead.</%text>
376 <%text>## If true, tasks will never be sent to the queue, but executed locally instead.</%text>
375 celery.always.eager = false
377 celery.always.eager = false
376
378
377 <%text>####################################</%text>
379 <%text>####################################</%text>
378 <%text>### BEAKER CACHE ####</%text>
380 <%text>### BEAKER CACHE ####</%text>
379 <%text>####################################</%text>
381 <%text>####################################</%text>
380
382
381 beaker.cache.data_dir = %(here)s/data/cache/data
383 beaker.cache.data_dir = %(here)s/data/cache/data
382 beaker.cache.lock_dir = %(here)s/data/cache/lock
384 beaker.cache.lock_dir = %(here)s/data/cache/lock
383
385
384 beaker.cache.regions = short_term,long_term,sql_cache_short
386 beaker.cache.regions = short_term,long_term,sql_cache_short
385
387
386 beaker.cache.short_term.type = memory
388 beaker.cache.short_term.type = memory
387 beaker.cache.short_term.expire = 60
389 beaker.cache.short_term.expire = 60
388 beaker.cache.short_term.key_length = 256
390 beaker.cache.short_term.key_length = 256
389
391
390 beaker.cache.long_term.type = memory
392 beaker.cache.long_term.type = memory
391 beaker.cache.long_term.expire = 36000
393 beaker.cache.long_term.expire = 36000
392 beaker.cache.long_term.key_length = 256
394 beaker.cache.long_term.key_length = 256
393
395
394 beaker.cache.sql_cache_short.type = memory
396 beaker.cache.sql_cache_short.type = memory
395 beaker.cache.sql_cache_short.expire = 10
397 beaker.cache.sql_cache_short.expire = 10
396 beaker.cache.sql_cache_short.key_length = 256
398 beaker.cache.sql_cache_short.key_length = 256
397
399
398 <%text>####################################</%text>
400 <%text>####################################</%text>
399 <%text>### BEAKER SESSION ####</%text>
401 <%text>### BEAKER SESSION ####</%text>
400 <%text>####################################</%text>
402 <%text>####################################</%text>
401
403
402 <%text>## Name of session cookie. Should be unique for a given host and path, even when running</%text>
404 <%text>## Name of session cookie. Should be unique for a given host and path, even when running</%text>
403 <%text>## on different ports. Otherwise, cookie sessions will be shared and messed up.</%text>
405 <%text>## on different ports. Otherwise, cookie sessions will be shared and messed up.</%text>
404 session.key = kallithea
406 session.key = kallithea
405 <%text>## Sessions should always only be accessible by the browser, not directly by JavaScript.</%text>
407 <%text>## Sessions should always only be accessible by the browser, not directly by JavaScript.</%text>
406 session.httponly = true
408 session.httponly = true
407 <%text>## Session lifetime. 2592000 seconds is 30 days.</%text>
409 <%text>## Session lifetime. 2592000 seconds is 30 days.</%text>
408 session.timeout = 2592000
410 session.timeout = 2592000
409
411
410 <%text>## Server secret used with HMAC to ensure integrity of cookies.</%text>
412 <%text>## Server secret used with HMAC to ensure integrity of cookies.</%text>
411 session.secret = ${uuid()}
413 session.secret = ${uuid()}
412 <%text>## Further, encrypt the data with AES.</%text>
414 <%text>## Further, encrypt the data with AES.</%text>
413 #session.encrypt_key = <key_for_encryption>
415 #session.encrypt_key = <key_for_encryption>
414 #session.validate_key = <validation_key>
416 #session.validate_key = <validation_key>
415
417
416 <%text>## Type of storage used for the session, current types are</%text>
418 <%text>## Type of storage used for the session, current types are</%text>
417 <%text>## dbm, file, memcached, database, and memory.</%text>
419 <%text>## dbm, file, memcached, database, and memory.</%text>
418
420
419 <%text>## File system storage of session data. (default)</%text>
421 <%text>## File system storage of session data. (default)</%text>
420 #session.type = file
422 #session.type = file
421
423
422 <%text>## Cookie only, store all session data inside the cookie. Requires secure secrets.</%text>
424 <%text>## Cookie only, store all session data inside the cookie. Requires secure secrets.</%text>
423 #session.type = cookie
425 #session.type = cookie
424
426
425 <%text>## Database storage of session data.</%text>
427 <%text>## Database storage of session data.</%text>
426 #session.type = ext:database
428 #session.type = ext:database
427 #session.sa.url = postgresql://postgres:qwe@localhost/kallithea
429 #session.sa.url = postgresql://postgres:qwe@localhost/kallithea
428 #session.table_name = db_session
430 #session.table_name = db_session
429
431
430 <%text>############################</%text>
432 <%text>############################</%text>
431 <%text>## ERROR HANDLING SYSTEMS ##</%text>
433 <%text>## ERROR HANDLING SYSTEMS ##</%text>
432 <%text>############################</%text>
434 <%text>############################</%text>
433
435
434 # Propagate email settings to ErrorReporter of TurboGears2
436 # Propagate email settings to ErrorReporter of TurboGears2
435 # You do not normally need to change these lines
437 # You do not normally need to change these lines
436 get trace_errors.error_email = email_to
438 get trace_errors.error_email = email_to
437 get trace_errors.smtp_server = smtp_server
439 get trace_errors.smtp_server = smtp_server
438 get trace_errors.smtp_port = smtp_port
440 get trace_errors.smtp_port = smtp_port
439 get trace_errors.from_address = error_email_from
441 get trace_errors.from_address = error_email_from
440
442
441 %if error_aggregation_service == 'appenlight':
443 %if error_aggregation_service == 'appenlight':
442 <%text>####################</%text>
444 <%text>####################</%text>
443 <%text>### [appenlight] ###</%text>
445 <%text>### [appenlight] ###</%text>
444 <%text>####################</%text>
446 <%text>####################</%text>
445
447
446 <%text>## AppEnlight is tailored to work with Kallithea, see</%text>
448 <%text>## AppEnlight is tailored to work with Kallithea, see</%text>
447 <%text>## http://appenlight.com for details how to obtain an account</%text>
449 <%text>## http://appenlight.com for details how to obtain an account</%text>
448 <%text>## you must install python package `appenlight_client` to make it work</%text>
450 <%text>## you must install python package `appenlight_client` to make it work</%text>
449
451
450 <%text>## appenlight enabled</%text>
452 <%text>## appenlight enabled</%text>
451 appenlight = false
453 appenlight = false
452
454
453 appenlight.server_url = https://api.appenlight.com
455 appenlight.server_url = https://api.appenlight.com
454 appenlight.api_key = YOUR_API_KEY
456 appenlight.api_key = YOUR_API_KEY
455
457
456 <%text>## TWEAK AMOUNT OF INFO SENT HERE</%text>
458 <%text>## TWEAK AMOUNT OF INFO SENT HERE</%text>
457
459
458 <%text>## enables 404 error logging (default False)</%text>
460 <%text>## enables 404 error logging (default False)</%text>
459 appenlight.report_404 = false
461 appenlight.report_404 = false
460
462
461 <%text>## time in seconds after request is considered being slow (default 1)</%text>
463 <%text>## time in seconds after request is considered being slow (default 1)</%text>
462 appenlight.slow_request_time = 1
464 appenlight.slow_request_time = 1
463
465
464 <%text>## record slow requests in application</%text>
466 <%text>## record slow requests in application</%text>
465 <%text>## (needs to be enabled for slow datastore recording and time tracking)</%text>
467 <%text>## (needs to be enabled for slow datastore recording and time tracking)</%text>
466 appenlight.slow_requests = true
468 appenlight.slow_requests = true
467
469
468 <%text>## enable hooking to application loggers</%text>
470 <%text>## enable hooking to application loggers</%text>
469 #appenlight.logging = true
471 #appenlight.logging = true
470
472
471 <%text>## minimum log level for log capture</%text>
473 <%text>## minimum log level for log capture</%text>
472 #appenlight.logging.level = WARNING
474 #appenlight.logging.level = WARNING
473
475
474 <%text>## send logs only from erroneous/slow requests</%text>
476 <%text>## send logs only from erroneous/slow requests</%text>
475 <%text>## (saves API quota for intensive logging)</%text>
477 <%text>## (saves API quota for intensive logging)</%text>
476 appenlight.logging_on_error = false
478 appenlight.logging_on_error = false
477
479
478 <%text>## list of additional keywords that should be grabbed from environ object</%text>
480 <%text>## list of additional keywords that should be grabbed from environ object</%text>
479 <%text>## can be string with comma separated list of words in lowercase</%text>
481 <%text>## can be string with comma separated list of words in lowercase</%text>
480 <%text>## (by default client will always send following info:</%text>
482 <%text>## (by default client will always send following info:</%text>
481 <%text>## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that</%text>
483 <%text>## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that</%text>
482 <%text>## start with HTTP* this list be extended with additional keywords here</%text>
484 <%text>## start with HTTP* this list be extended with additional keywords here</%text>
483 appenlight.environ_keys_whitelist =
485 appenlight.environ_keys_whitelist =
484
486
485 <%text>## list of keywords that should be blanked from request object</%text>
487 <%text>## list of keywords that should be blanked from request object</%text>
486 <%text>## can be string with comma separated list of words in lowercase</%text>
488 <%text>## can be string with comma separated list of words in lowercase</%text>
487 <%text>## (by default client will always blank keys that contain following words</%text>
489 <%text>## (by default client will always blank keys that contain following words</%text>
488 <%text>## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'</%text>
490 <%text>## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'</%text>
489 <%text>## this list be extended with additional keywords set here</%text>
491 <%text>## this list be extended with additional keywords set here</%text>
490 appenlight.request_keys_blacklist =
492 appenlight.request_keys_blacklist =
491
493
492 <%text>## list of namespaces that should be ignores when gathering log entries</%text>
494 <%text>## list of namespaces that should be ignores when gathering log entries</%text>
493 <%text>## can be string with comma separated list of namespaces</%text>
495 <%text>## can be string with comma separated list of namespaces</%text>
494 <%text>## (by default the client ignores own entries: appenlight_client.client)</%text>
496 <%text>## (by default the client ignores own entries: appenlight_client.client)</%text>
495 appenlight.log_namespace_blacklist =
497 appenlight.log_namespace_blacklist =
496
498
497 %elif error_aggregation_service == 'sentry':
499 %elif error_aggregation_service == 'sentry':
498 <%text>################</%text>
500 <%text>################</%text>
499 <%text>### [sentry] ###</%text>
501 <%text>### [sentry] ###</%text>
500 <%text>################</%text>
502 <%text>################</%text>
501
503
502 <%text>## sentry is a alternative open source error aggregator</%text>
504 <%text>## sentry is a alternative open source error aggregator</%text>
503 <%text>## you must install python packages `sentry` and `raven` to enable</%text>
505 <%text>## you must install python packages `sentry` and `raven` to enable</%text>
504
506
505 sentry.dsn = YOUR_DNS
507 sentry.dsn = YOUR_DNS
506 sentry.servers =
508 sentry.servers =
507 sentry.name =
509 sentry.name =
508 sentry.key =
510 sentry.key =
509 sentry.public_key =
511 sentry.public_key =
510 sentry.secret_key =
512 sentry.secret_key =
511 sentry.project =
513 sentry.project =
512 sentry.site =
514 sentry.site =
513 sentry.include_paths =
515 sentry.include_paths =
514 sentry.exclude_paths =
516 sentry.exclude_paths =
515
517
516 %endif
518 %endif
517 <%text>################################################################################</%text>
519 <%text>################################################################################</%text>
518 <%text>## WARNING: *DEBUG MODE MUST BE OFF IN A PRODUCTION ENVIRONMENT* ##</%text>
520 <%text>## WARNING: *DEBUG MODE MUST BE OFF IN A PRODUCTION ENVIRONMENT* ##</%text>
519 <%text>## Debug mode will enable the interactive debugging tool, allowing ANYONE to ##</%text>
521 <%text>## Debug mode will enable the interactive debugging tool, allowing ANYONE to ##</%text>
520 <%text>## execute malicious code after an exception is raised. ##</%text>
522 <%text>## execute malicious code after an exception is raised. ##</%text>
521 <%text>################################################################################</%text>
523 <%text>################################################################################</%text>
522 debug = false
524 debug = false
523
525
524 <%text>##################################</%text>
526 <%text>##################################</%text>
525 <%text>### LOGVIEW CONFIG ###</%text>
527 <%text>### LOGVIEW CONFIG ###</%text>
526 <%text>##################################</%text>
528 <%text>##################################</%text>
527
529
528 logview.sqlalchemy = #faa
530 logview.sqlalchemy = #faa
529 logview.pylons.templating = #bfb
531 logview.pylons.templating = #bfb
530 logview.pylons.util = #eee
532 logview.pylons.util = #eee
531
533
532 <%text>#########################################################</%text>
534 <%text>#########################################################</%text>
533 <%text>### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###</%text>
535 <%text>### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###</%text>
534 <%text>#########################################################</%text>
536 <%text>#########################################################</%text>
535
537
536 %if database_engine == 'sqlite':
538 %if database_engine == 'sqlite':
537 # SQLITE [default]
539 # SQLITE [default]
538 sqlalchemy.url = sqlite:///%(here)s/kallithea.db?timeout=60
540 sqlalchemy.url = sqlite:///%(here)s/kallithea.db?timeout=60
539
541
540 %elif database_engine == 'postgres':
542 %elif database_engine == 'postgres':
541 # POSTGRESQL
543 # POSTGRESQL
542 sqlalchemy.url = postgresql://user:pass@localhost/kallithea
544 sqlalchemy.url = postgresql://user:pass@localhost/kallithea
543
545
544 %elif database_engine == 'mysql':
546 %elif database_engine == 'mysql':
545 # MySQL
547 # MySQL
546 sqlalchemy.url = mysql://user:pass@localhost/kallithea?charset=utf8
548 sqlalchemy.url = mysql://user:pass@localhost/kallithea?charset=utf8
547
549
548 %endif
550 %endif
549 # see sqlalchemy docs for others
551 # see sqlalchemy docs for others
550
552
551 sqlalchemy.pool_recycle = 3600
553 sqlalchemy.pool_recycle = 3600
552
554
553 <%text>################################</%text>
555 <%text>################################</%text>
554 <%text>### ALEMBIC CONFIGURATION ####</%text>
556 <%text>### ALEMBIC CONFIGURATION ####</%text>
555 <%text>################################</%text>
557 <%text>################################</%text>
556
558
557 [alembic]
559 [alembic]
558 script_location = kallithea:alembic
560 script_location = kallithea:alembic
559
561
560 <%text>################################</%text>
562 <%text>################################</%text>
561 <%text>### LOGGING CONFIGURATION ####</%text>
563 <%text>### LOGGING CONFIGURATION ####</%text>
562 <%text>################################</%text>
564 <%text>################################</%text>
563
565
564 [loggers]
566 [loggers]
565 keys = root, routes, kallithea, sqlalchemy, tg, gearbox, beaker, templates, whoosh_indexer, werkzeug, backlash
567 keys = root, routes, kallithea, sqlalchemy, tg, gearbox, beaker, templates, whoosh_indexer, werkzeug, backlash
566
568
567 [handlers]
569 [handlers]
568 keys = console, console_color, console_color_sql, null
570 keys = console, console_color, console_color_sql, null
569
571
570 [formatters]
572 [formatters]
571 keys = generic, color_formatter, color_formatter_sql
573 keys = generic, color_formatter, color_formatter_sql
572
574
573 <%text>#############</%text>
575 <%text>#############</%text>
574 <%text>## LOGGERS ##</%text>
576 <%text>## LOGGERS ##</%text>
575 <%text>#############</%text>
577 <%text>#############</%text>
576
578
577 [logger_root]
579 [logger_root]
578 level = NOTSET
580 level = NOTSET
579 handlers = console
581 handlers = console
580 # For coloring based on log level:
582 # For coloring based on log level:
581 # handlers = console_color
583 # handlers = console_color
582
584
583 [logger_routes]
585 [logger_routes]
584 level = WARN
586 level = WARN
585 handlers =
587 handlers =
586 qualname = routes.middleware
588 qualname = routes.middleware
587 <%text>## "level = DEBUG" logs the route matched and routing variables.</%text>
589 <%text>## "level = DEBUG" logs the route matched and routing variables.</%text>
588
590
589 [logger_beaker]
591 [logger_beaker]
590 level = WARN
592 level = WARN
591 handlers =
593 handlers =
592 qualname = beaker.container
594 qualname = beaker.container
593
595
594 [logger_templates]
596 [logger_templates]
595 level = WARN
597 level = WARN
596 handlers =
598 handlers =
597 qualname = pylons.templating
599 qualname = pylons.templating
598
600
599 [logger_kallithea]
601 [logger_kallithea]
600 level = WARN
602 level = WARN
601 handlers =
603 handlers =
602 qualname = kallithea
604 qualname = kallithea
603
605
604 [logger_tg]
606 [logger_tg]
605 level = WARN
607 level = WARN
606 handlers =
608 handlers =
607 qualname = tg
609 qualname = tg
608
610
609 [logger_gearbox]
611 [logger_gearbox]
610 level = WARN
612 level = WARN
611 handlers =
613 handlers =
612 qualname = gearbox
614 qualname = gearbox
613
615
614 [logger_sqlalchemy]
616 [logger_sqlalchemy]
615 level = WARN
617 level = WARN
616 handlers =
618 handlers =
617 qualname = sqlalchemy.engine
619 qualname = sqlalchemy.engine
618 # For coloring based on log level and pretty printing of SQL:
620 # For coloring based on log level and pretty printing of SQL:
619 # level = INFO
621 # level = INFO
620 # handlers = console_color_sql
622 # handlers = console_color_sql
621 # propagate = 0
623 # propagate = 0
622
624
623 [logger_whoosh_indexer]
625 [logger_whoosh_indexer]
624 level = WARN
626 level = WARN
625 handlers =
627 handlers =
626 qualname = whoosh_indexer
628 qualname = whoosh_indexer
627
629
628 [logger_werkzeug]
630 [logger_werkzeug]
629 level = WARN
631 level = WARN
630 handlers =
632 handlers =
631 qualname = werkzeug
633 qualname = werkzeug
632
634
633 [logger_backlash]
635 [logger_backlash]
634 level = WARN
636 level = WARN
635 handlers =
637 handlers =
636 qualname = backlash
638 qualname = backlash
637
639
638 <%text>##############</%text>
640 <%text>##############</%text>
639 <%text>## HANDLERS ##</%text>
641 <%text>## HANDLERS ##</%text>
640 <%text>##############</%text>
642 <%text>##############</%text>
641
643
642 [handler_console]
644 [handler_console]
643 class = StreamHandler
645 class = StreamHandler
644 args = (sys.stderr,)
646 args = (sys.stderr,)
645 formatter = generic
647 formatter = generic
646
648
647 [handler_console_color]
649 [handler_console_color]
648 # ANSI color coding based on log level
650 # ANSI color coding based on log level
649 class = StreamHandler
651 class = StreamHandler
650 args = (sys.stderr,)
652 args = (sys.stderr,)
651 formatter = color_formatter
653 formatter = color_formatter
652
654
653 [handler_console_color_sql]
655 [handler_console_color_sql]
654 # ANSI color coding and pretty printing of SQL statements
656 # ANSI color coding and pretty printing of SQL statements
655 class = StreamHandler
657 class = StreamHandler
656 args = (sys.stderr,)
658 args = (sys.stderr,)
657 formatter = color_formatter_sql
659 formatter = color_formatter_sql
658
660
659 [handler_null]
661 [handler_null]
660 class = NullHandler
662 class = NullHandler
661 args = ()
663 args = ()
662
664
663 <%text>################</%text>
665 <%text>################</%text>
664 <%text>## FORMATTERS ##</%text>
666 <%text>## FORMATTERS ##</%text>
665 <%text>################</%text>
667 <%text>################</%text>
666
668
667 [formatter_generic]
669 [formatter_generic]
668 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
670 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
669 datefmt = %Y-%m-%d %H:%M:%S
671 datefmt = %Y-%m-%d %H:%M:%S
670
672
671 [formatter_color_formatter]
673 [formatter_color_formatter]
672 class = kallithea.lib.colored_formatter.ColorFormatter
674 class = kallithea.lib.colored_formatter.ColorFormatter
673 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
675 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
674 datefmt = %Y-%m-%d %H:%M:%S
676 datefmt = %Y-%m-%d %H:%M:%S
675
677
676 [formatter_color_formatter_sql]
678 [formatter_color_formatter_sql]
677 class = kallithea.lib.colored_formatter.ColorFormatterSql
679 class = kallithea.lib.colored_formatter.ColorFormatterSql
678 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
680 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
679 datefmt = %Y-%m-%d %H:%M:%S
681 datefmt = %Y-%m-%d %H:%M:%S
680
682
681 <%text>#################</%text>
683 <%text>#################</%text>
682 <%text>## SSH LOGGING ##</%text>
684 <%text>## SSH LOGGING ##</%text>
683 <%text>#################</%text>
685 <%text>#################</%text>
684
686
685 # The default loggers use 'handler_console' that uses StreamHandler with
687 # The default loggers use 'handler_console' that uses StreamHandler with
686 # destination 'sys.stderr'. In the context of the SSH server process, these log
688 # destination 'sys.stderr'. In the context of the SSH server process, these log
687 # messages would be sent to the client, which is normally not what you want.
689 # messages would be sent to the client, which is normally not what you want.
688 # By default, when running ssh-serve, just use NullHandler and disable logging
690 # By default, when running ssh-serve, just use NullHandler and disable logging
689 # completely. For other logging options, see:
691 # completely. For other logging options, see:
690 # https://docs.python.org/2/library/logging.handlers.html
692 # https://docs.python.org/2/library/logging.handlers.html
691
693
692 [ssh_serve:logger_root]
694 [ssh_serve:logger_root]
693 level = CRITICAL
695 level = CRITICAL
694 handlers = null
696 handlers = null
695
697
696 # Note: If logging is configured with other handlers, they might need similar
698 # Note: If logging is configured with other handlers, they might need similar
697 # muting for ssh-serve too.
699 # muting for ssh-serve too.
General Comments 0
You need to be logged in to leave comments. Login now