]> Sergey Matveev's repositories - public-inbox.git/blob - Documentation/public-inbox-config.pod
mda, watch: wire up List-ID header support
[public-inbox.git] / Documentation / public-inbox-config.pod
1 =head1 NAME
2
3 public-inbox-config - public-inbox config file description
4
5 =head1 SYNOPSIS
6
7 ~/.public-inbox/config
8
9 =head1 DESCRIPTION
10
11 The public-inbox config file is parseable by L<git-config(1)>.
12 This is a global configuration file for mapping/discovering
13 all public-inboxes used by a particular user.
14
15 =head1 CONFIGURATION FILE
16
17 =head2 EXAMPLE
18
19         [publicinbox "test"]
20                 mainrepo = /home/user/path/to/test.git
21                 ; multiple addresses are supported
22                 address = test@example.com
23                 ; address = alternate@example.com
24                 url = http://example.com/test
25                 newsgroup = inbox.test
26
27 =head2 VARIABLES
28
29 =over 8
30
31 =item publicinbox.<name>.address
32
33 The email address of the public-inbox.  May be specified
34 more than once for merging multiple mailing lists (or migrating
35 to new addresses).  This must be specified at least once,
36 the first value will be considered the primary address for
37 informational purposes.
38
39 Default: none, required
40
41 =item publicinbox.<name>.mainrepo
42
43 The absolute path to the directory which hosts the
44 public-inbox.  This must be specified once.
45
46 Default: none, required
47
48 =item publicinbox.<name>.url
49
50 The primary URL for hosting the HTTP/HTTPS archives.
51 Additional HTTP/HTTPS URLs may be specified via
52 C<$GIT_DIR/cloneurl> as documented in L<gitweb(1)>
53
54 Default: none, optional
55
56 =item publicinbox.<name>.newsgroup
57
58 The NNTP group name for use with L<public-inbox-nntpd(8)>.  This
59 may be any newsgroup name with hierarchies delimited by '.'.
60 For example, the newsgroup for L<mailto:meta@public-inbox.org>
61 is: C<inbox.comp.mail.public-inbox.meta>
62
63 Omitting this for the given inbox will prevent the group from
64 being read by L<public-inbox-nntpd(1)>
65
66 Default: none, optional
67
68 =item publicinbox.<name>.watch
69
70 A location for L<public-inbox-watch(1)> to watch.  Currently,
71 only C<maildir:> paths are supported:
72
73         [publicinbox "test"]
74                 watch = maildir:/path/to/maildirs/.INBOX.test/
75
76 Default: none; only for L<public-inbox-watch(1)> users
77
78 =item publicinbox.<name>.watchheader
79
80         [publicinbox "test"]
81                 watchheader = List-Id:<test.example.com>
82
83 If specified, L<public-inbox-watch(1)> will only process mail matching
84 the given header.  Multiple values are not currently supported.
85
86 Default: none; only for L<public-inbox-watch(1)> users
87
88 =item publicinbox.<name>.listid
89
90 The L<rfc2919|https://tools.ietf.org/html/rfc2919> header without
91 angle brackets for L<public-inbox-mda(1)> deliveries and
92 L<public-inbox-watch(1)>.
93
94 For public-inbox-watch users, this is a shortcut for specifying
95 C<publicinbox.$NAME.watchheader=List-Id:<foo.example.com>>
96
97 For public-inbox-mda users, this may be used to avoid recipient
98 matching via C<ORIGINAL_RECIPIENT> environment variable.
99
100 This may be specified multiple times for merging multiple mailing
101 lists into a single public-inbox, only one C<List-Id> header
102 needs to match.
103
104 Default: none
105
106 =item publicinbox.<name>.nntpmirror
107
108 This may be the full NNTP URL of an independently-run mirror.
109 For example, the https://public-inbox.org/meta/ inbox is
110 mirrored by Gmane at
111 C<nntp://news.gmane.org/gmane.mail.public-inbox.general>
112
113 Default: none
114
115 =item publicinbox.<name>.indexlevel
116
117 The indexing level for L<public-inbox-index(1)>
118
119 C<basic> only requires L<DBD::SQLite(3pm)> and provides all
120 NNTP functionality along with thread-awareness in the WWW
121 interface.
122
123 C<medium> requires L<Search::Xapian(3pm)> to provide full-text
124 term search functionality in the WWW UI.
125
126 C<full> also includes positional information used by Xapian to
127 allow for searching for phrases using quoted text.
128 (e.g. C<"looking for a complete sentence">)
129
130 Default: C<full>
131
132 =item publicinbox.<name>.httpbackendmax
133
134 If a digit, the maximum number of parallel
135 L<git-http-backend(1)> processes to allow for cloning this
136 particular inbox.
137
138 If an alphanumeric value starting with a lowercase alphabetic
139 character is specified, the inbox will use a L</NAMED LIMITER>
140 which can be shared by multiple inboxes.
141
142 Default: 32 (using a default limiter shared by all inboxes)
143
144 =item publicinbox.<name>.coderepo
145
146 The nickname of a "coderepo" section associated with the inbox.
147 May be specified more than once for M:N mapping of code repos to
148 inboxes.  If enabled, diff hunk headers in patch emails will
149 link to the line numbers of blobs.
150
151 Default: none
152
153 =item publicinbox.<name>.replyto
154
155 May be used to control how reply instructions in the PSGI
156 interface are displayed.
157
158 ":none=dead inbox" may be specified to denote an inactive list
159 ("dead inbox" may be replaced with another phrase).
160
161 A list of comma-delimited email addresses may be specified.
162 This can be useful for dedicated inboxes for bot emails, but
163 discussion happens on a seperate mailing list/inbox.
164
165 Mirrors of existing centralized mailing lists may use ":list"
166 here to redirect mail only to the configured inbox address.
167 The use of ":list" is discouraged for new mailing lists, as it
168 leads to centralization.
169
170 Default: :all
171
172 =item publicinbox.css
173
174 The local path name of a CSS file for the PSGI web interface.
175 May contain the attributes "media", "title" and "href" which match
176 the associated attributes of the HTML <style> tag.
177 "href" may be specified to point to the URL of an remote CSS file
178 and the path may be "/dev/null" or any empty file.
179 Multiple files may be specified and will be included in the
180 order specified.
181
182 =item publicinboxmda.spamcheck
183
184 This may be set to C<none> to disable the use of SpamAssassin
185 L<spamc(1)> for filtering spam before it is imported into git
186 history.  Other spam filtering backends may be supported in
187 the future.
188
189 Default: spamc
190
191 =item publicinboxwatch.spamcheck
192
193 This may be set to C<spamc> to enable the use of SpamAssassin
194 L<spamc(1)> for filtering spam before it is imported into git
195 history.  Other spam filtering backends may be supported in
196 the future.
197
198 Default: none
199
200 =item publicinboxwatch.watchspam
201
202 This may be set to C<spamc> to enable the use of SpamAssassin
203 L<spamc(1)> for filtering spam before it is imported into git
204 history.  Other spam filtering backends may be supported in
205 the future.  This requires L<public-inbox-watch(1)>, but affects
206 all configured public-inboxes in PI_CONFIG.
207
208 Default: none
209
210 =item publicinbox.nntpserver
211
212 Set this to point to the address of the L<public-inbox-nntpd(1)>
213 instance.  This is used to advertise the existence of the NNTP
214 presnce in the L<PublicInbox::WWW> HTML interface.
215
216 Multiple values are allowed for servers with multiple
217 addresses or mirrors.
218
219 Default: none
220
221 =item publicinbox.<name>.feedmax
222
223 The size of an Atom feed for the inbox.  If specified more than
224 once, only the last value is used.  Invalid values (<= 0) will
225 be treated as the default value.
226
227 Default: 25
228
229 =item publicinbox.<name>.hide
230
231 A comma-delimited list of listings to hide the inbox from.
232
233 Valid values are currently C<www> and C<manifest>.
234
235 Default: none
236
237 =item coderepo.<nick>.dir
238
239 The path to a git repository for "publicinbox.<name>.coderepo"
240
241 =item coderepo.<nick>.cgitUrl
242
243 The URL of the cgit instance associated with the coderepo.
244
245 Default: none
246
247 =item publicinbox.cgitrc
248
249 A path to a L<cgitrc(5)> file.  "repo.url" directives in the cgitrc
250 will be mapped to the nickname of a coderepo (without trailing slash),
251 and "repo.path" directives map to "coderepo.<nick>.dir".
252 Use of this directive allows admins of existing cgit installations
253 to skip declaring coderepo sections and map inboxes directly to
254 code repositories known to cgit.
255
256 Macro expansion (e.g. C<$HTTP_HOST>) is not yet supported.
257
258 =item publicinbox.cgitbin
259
260 A path to the C<cgit.cgi> executable.  The L<PublicInbox::WWW>
261 interface can spawn cgit as a fallback if the publicinbox.cgitrc
262 directive is configured.
263
264 Default: /var/www/htdocs/cgit/cgit.cgi or /usr/lib/cgit/cgit.cgi
265
266 =item publicinbox.cgitdata
267
268 A path to the data directory used by cgit for storing static files.
269 Typically guessed based the location of C<cgit.cgi> (from
270 C<publicinbox.cgitbin>, but may be overridden.
271
272 Default: basename of C<publicinbox.cgitbin>, /var/www/htdocs/cgit/
273 or /usr/share/cgit/
274
275 =item publicinbox.mailEditor
276
277 See L<public-inbox-edit(1)>
278
279 =item publicinbox.wwwlisting
280
281 Enable a HTML listing style when the root path of the URL '/' is accessed.
282 Valid values are:
283
284 =over 8
285
286 =item * all
287 - Show all inboxes
288
289 =item * 404
290 - Return a 404 page.  This is useful to allow customization with
291 L<Plack::App::Cascade(3pm)>
292
293 =item * match=domain
294 - Only show inboxes with URLs which belong to the domain of the HTTP request
295
296 =for TODO comment
297
298 support showing cgit listing
299
300 =back
301
302 Default: C<404>
303
304 =item publicinbox.grokmanifest
305
306 Controls the generation of a grokmirror-compatible gzipped JSON file
307 at the top-level of the PSGI interface.  You generally do not need to
308 change this from the default.
309
310 Valid values are:
311
312 =over 8
313
314 =item * match=domain
315 - Only include inboxes with URLs which belong to the domain of
316 the HTTP request.  This is compatible with virtual hosting where
317 several domains come from the same host.
318
319 =item * all
320 - All inboxes are present in C<manifest.js.gz>, regardless of domain.
321 Only use this if you're serving HTTP requests in a domain-agnostic manner.
322
323 =item * 404
324 - C<manifest.js.gz> will only contain an empty JSON array.
325 This does NOT affect C<$INBOX_URL/manifest.js.gz>, which will
326 always contain all git repos used by the inbox at C<$INBOX_URL>
327
328 =back
329
330 Default: C<match=domain>
331
332 =back
333
334 =head2 NAMED LIMITER (PSGI)
335
336 Named limiters are useful for preventing large inboxes from
337 monopolizing (or overloading) the server.  Since serving git
338 clones (via L<git-http-backend(1)> can be memory-intensive for
339 large inboxes, it makes sense to put large inboxes on a named
340 limiter with a low max value; while smaller inboxes can use
341 the default limiter.
342
343 C<RLIMIT_*> keys may be set to enforce resource limits for
344 a particular limiter.
345
346 Default named-limiters are prefixed with "-".  Currently,
347 the "-cgit" named limiter is reserved for instances spawning
348 cgit via C<publicinbox.cgitrc>
349
350 =over 8
351
352 =item publicinboxlimiter.<name>.max
353
354 The maximum number of parallel processes for the given limiter.
355
356 =item publicinboxlimiter.<name>.rlimitCore
357
358 =item publicinboxlimiter.<name>.rlimitCPU
359
360 =item publicinboxlimiter.<name>.rlimitData
361
362 The maximum core size, CPU time, or data size processes run with the
363 given limiter will use.  This may be comma-separated to distinguish
364 soft and hard limits.  The word "INFINITY" is accepted as the
365 RLIM_INFINITY constant (if supported by your OS).
366
367 See L<setrlimit(2)> for more info on the behavior of RLIMIT_CORE,
368 RLIMIT_CPU, and RLIMIT_DATA for you operating system.
369
370 =back
371
372 =head3 EXAMPLE WITH NAMED LIMITERS
373
374         ; big inboxes which require lots of memory to clone:
375         [publicinbox "big1"]
376                 mainrepo = /path/to/big1
377                 address = big1@example.com
378                 httpbackendmax = big
379         [publicinbox "big2"]
380                 mainrepo = /path/to/big2
381                 address = big2@example.com
382                 httpbackendmax = big
383
384         ; tiny inboxes which are easily cloned:
385         [publicinbox "tiny1"]
386                 mainrepo = /path/to/tiny1
387                 address = tiny1@example.com
388         [publicinbox "tiny2"]
389                 mainrepo = /path/to/tiny2
390                 address = tiny2@example.com
391
392         [publicinboxlimiter "big"]
393                 max = 4
394
395 In the above example, the "big1" and "big2" are limited to four
396 parallel L<git-http-backend(1)> processes between them.
397
398 However, "tiny1" and "tiny2" will share the default limiter
399 which means there can be 32 L<git-http-backend(1)> processes
400 between them.
401
402 =head1 ENVIRONMENT
403
404 =over 8
405
406 =item PI_CONFIG
407
408 Used to override the default "~/.public-inbox/config" value.
409
410 =back
411
412 =head1 CONTACT
413
414 Feedback welcome via plain-text mail to L<mailto:meta@public-inbox.org>
415
416 The mail archives are hosted at L<https://public-inbox.org/meta/>
417 and L<http://hjrcffqmbrq6wope.onion/meta/>
418
419 =head1 COPYRIGHT
420
421 Copyright 2016-2019 all contributors L<mailto:meta@public-inbox.org>
422
423 License: AGPL-3.0+ L<https://www.gnu.org/licenses/agpl-3.0.txt>
424
425 =head1 SEE ALSO
426
427 L<git(1)>, L<git-config(1)>, L<public-inbox-daemon(8)>,
428 L<public-inbox-mda(1)>, L<public-inbox-watch(1)>,
429 L<grokmirror|https://git.kernel.org/pub/scm/utils/grokmirror/grokmirror.git>