public-inbox (server-side) installation
---------------------------------------

This is for folks who want to setup their own public-inbox instance.
Clients should use normal git-clone/git-fetch, IMAP or NNTP clients
if they want to import mail into their personal inboxes.

As of 2021, public-inbox is packaged by several OS distributions,
listed in alphabetical order: Debian, GNU Guix, NixOS, and Void Linux.

public-inbox is developed on Debian GNU/Linux systems and will
never depend on packages outside of the "main" component of
the "stable" distribution, currently Debian 10.x ("buster"),
but older versions of Debian remain supported.

Most packages are available in other GNU/Linux distributions
and FreeBSD.  CentOS 7.x users will likely want newer git and
Xapian packages for better performance and v2 inbox support:
https://public-inbox.org/meta/20210421151308.yz5hzkgm75klunpe@nitro.local/

TODO: this still needs to be documented better,
also see the scripts/ and sa_config/ directories in the source tree

Requirements
------------

public-inbox requires a number of other packages to access its full
functionality.  The core tools are, of course:

* Git (1.8.0+, 2.6+ for writing v2 inboxes)
* Perl 5.10.1+
* DBD::SQLite (needed for IMAP, NNTP, message threading, and v2 inboxes)

To accept incoming mail into a public inbox, you'll likely want:

* MTA - postfix is recommended (for public-inbox-mda)
* SpamAssassin (spamc/spamd)   (for public-inbox-watch/public-inbox-mda)

Beyond that, there is one non-standard Perl package required:

* URI                              deb: liburi-perl
                                   pkg: p5-URI
                                   rpm: perl-URI
                                   (for HTML/Atom generation)

Plack and Date::Parse are optional as of public-inbox v1.3.0,
but required for older releases:

* Plack                            deb: libplack-perl
                                   pkg: p5-Plack
                                   rpm: perl-Plack, perl-Plack-Test,
                                   (for HTML/Atom generation)

- Date::Parse                      deb: libtimedate-perl
                                   pkg: p5-TimeDate
                                   rpm: perl-TimeDate
                                   (for broken, mostly historical emails)

Where "deb" indicates package names for Debian-derived distributions,
"pkg" is for the FreeBSD package (maybe other common BSDs, too), and
"rpm" is for RPM-based distributions (only known to work on Fedora).

Numerous optional modules are likely to be useful as well:

- DBD::SQLite                      deb: libdbd-sqlite3-perl
                                   pkg: p5-DBD-SQLite
                                   rpm: perl-DBD-SQLite
                                   (for v2, IMAP, NNTP, or gzipped mboxes)

- Search::Xapian or Xapian(.pm)    deb: libsearch-xapian-perl
                                   pkg: p5-Search-Xapian OR p5-Xapian
                                   rpm: perl-Search-Xapian
                                   (HTTP and IMAP search)

- Inline::C                        deb: libinline-c-perl
                                   pkg: pkg-Inline-C
                                   rpm: perl-Inline (or perl-Inline-C)
                                   (speeds up process spawning on Linux,
                                    see public-inbox-daemon(8))

- Email::Address::XS               deb: libemail-address-xs-perl
                                   pkg: pkg-Email-Address-XS
                                   (correct parsing of tricky email
                                    addresses, phrases and comments,
                                    required for IMAP)

- Parse::RecDescent                deb: libparse-recdescent-perl
                                   pkg: p5-Parse-RecDescent
                                   rpm: perl-ParseRecDescent
                                   (optional, for public-inbox-imapd(1))

- Mail::IMAPClient                 deb: libmail-imapclient-perl
                                   pkg: p5-Mail-IMAPClient
                                   rpm: perl-Mail-IMAPClient
                                   (optional for lei and public-inbox-watch)

- BSD::Resource                    deb: libbsd-resource-perl
                                   pkg: p5-BSD-Resource
                                   rpm: perl-BSD-Resource
                                   (optional, for PSGI limiters
                                    see public-inbox-config(5))

- Plack::Middleware::ReverseProxy  deb: libplack-middleware-reverseproxy-perl
                                   pkg: p5-Plack-Middleware-ReverseProxy
                                   rpm: perl-Plack-Middleware-ReverseProxy
                                   (ensures redirects are correct when running
                                    behind nginx or Varnish)

* highlight                        deb: libhighlight-perl
                                   (for syntax highlighting with coderepo)

* xapian-compact (tool)            deb: xapian-tools
                                   pkg: xapian-core
                                   rpm: xapian-core
                                   (optional, for public-inbox-compact(1))

* curl (tool)                      deb, pkg, rpm: curl
                                   (for HTTP(S) externals with curl)

- Linux::Inotify2                  deb: liblinux-inotify2-perl
                                   rpm: perl-Linux-Inotify2
                                   (for lei, public-inbox-watch and -imapd
                                    on Linux)

- IO::KQueue                       pkg: p5-IO-KQueue
                                   (for lei, public-inbox-watch and -imapd
                                    on *BSDs)

- Net::Server                      deb: libnet-server-perl
                                   pkg: pkg-Net-Server
                                   rpm: perl-Net-Server
                                   (for HTTP/IMAP/NNTP background daemons,
                                    not needed as systemd services or
                                    foreground servers)

The following module is typically pulled in by dependencies listed
above, so there is no need to explicitly install them:

- DBI                              deb: libdbi-perl
                                   pkg: p5-DBI
                                   rpm: perl-DBI
                                   (pulled in by DBD::SQLite)

Uncommonly needed modules (see HACKING for development-only modules):

- Socket6                          deb: libsocket6-perl
                                   pkg: p5-Socket6
                                   rpm: perl-Socket6
                                   (pulled in by SpamAssassin and Net::Server,
                                    only necessary if using IPv6 with
                                    Plack::Middleware::AccessLog or similar
                                    on Perl <= 5.12)

- Crypt::CBC                       deb: libcrypt-cbc-perl
                                   pkg: p5-Crypt-CBC
                                   (for PublicInbox::Unsubscribe (rarely used))

standard MakeMaker installation (Perl)
--------------------------------------

To use MakeMaker, you need to ensure ExtUtils::MakeMaker is available.
This is typically installed with Perl, but RPM-based systems will likely
need to install the `perl-ExtUtils-MakeMaker' package.

Once the dependencies are installed, you should be able to build and
install the system (into /usr/local) with:

        perl Makefile.PL
        make
        make test    # see HACKING for faster tests for hackers
        make install # root permissions may be needed

symlink-install (public-inbox.git and 1.7.0+)
---------------------------------------------

For users who lack permissions and/or wish to minimize their
installation footprint, the "symlink-install" target is available in
public-inbox.git.  The following installs symlinks to $HOME/bin
pointing to the source tree:

	perl Makefile.PL
	make symlink-install prefix=$HOME

Other installation notes
------------------------

Debian 8.x (jessie) users, use Debian 8.5 or later if using Xapian:
        https://bugs.debian.org/808610

public-inbox-* commands will never store unregeneratable data in
Xapian nor any other search database we might use; Xapian
corruption will not destroy critical data.  Note: `lei' DOES store
unregeneratable data in Xapian and SQLite.

See the public-inbox-overview(7) man page for the next steps once
the installation is complete.

The following required packages are part of the Perl standard
library.  Debian-based distros put them in "libperl5.$MINOR" or
"perl-modules-5.$MINOR"; and FreeBSD puts them in "perl5".
RPM-based distros split them out into separate packages:

* Digest::SHA                      rpm: perl-Digest-SHA
* Data::Dumper                     rpm: perl-Data-Dumper
* Encode                           rpm: perl-Encode
* IO::Compress                     rpm: perl-IO-Compress
* Storable                         rpm: perl-Storable
* Text::ParseWords                 rpm: perl-Text-Parsewords

Copyright
---------

Copyright 2013-2021 all contributors <meta@public-inbox.org>
License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
