Provided by: snac2_2.45-1build3_amd64 bug

NAME

       snac — snac administration

DESCRIPTION

       The snac daemon processes messages from other servers in the Fediverse using the ActivityPub protocol.

       This is the admin manual. For user operation, see snac(1).  For file and data formats, see snac(5).

   Special cares about your snac you must know beforehand
       snac  makes  heavy use of hard links and link reference counts for its work, so don't even think of using
       it on a filesystem that doesn't support this feature. Most UNIX-like operating systems (Linux, the  BSDs,
       the  old  DEC  Ultrix  machine  in your grandfather basement, probably MacOS) support hard links on their
       native filesystems. Don't do fancy things like moving the subdirectories to different filesystems.  Also,
       if  you  move  your snac installation to another server, do it with a tool that respect hard link counts.
       Remember: snac is a very UNIXy program that loves hard links.

   Building and Installation
       A C compiler must be installed in the system, as well  as  the  development  headers  and  libraries  for
       OpenSSL (or compatible) and curl. To build snac, run

             make

       And, after that, run as root

             make install

   Data storage Initialization
       Once  snac  is properly installed on the system, designate a directory where the server and user data are
       to be stored. This directory must not exist yet.  snac must always be run as  a  regular  user;  you  can
       create one for it or use your own. To initialize the data storage, execute

             snac init $HOME/snac-data

       A  small  set  of questions will be asked regarding the installation, specially the host name it will run
       under, the local network address and port snac will listen to, the  optional  path  prefix  and  possibly
       other things.

       You can launch the snac process by running

             snac httpd $HOME/snac-data

       Use a web browser to connect to the specified address and port. You should see a greeting page.

       Log  messages  are  sent  to  the standard error stream. By default, only relevant information is written
       there. You can increase the debugging level by editing the 'dbglevel' field in the server.json file or by
       setting a numeric value between 0 and 3 to the DEBUG environment variable, see below.

       If you operate a Linux systemd-enabled  system,  OpenBSD  or  FreeBSD,  there  are  startup  scripts  and
       configuration  data  in the examples directory.  For other operating systems, please read the appropriate
       documentation on how to install a daemon as a non-root service.

   Upgrading to a new version
       Sometimes, the data storage disk layout changes between versions. If there is such a  change,  snac  will
       refuse to run and require an upgrade. Do this by running

             snac upgrade $HOME/snac-data

       Take  special  care  to  execute  this  upgrade  operation without any snac processes serving on the same
       folder. You can break everything. I know this because Tyler knows this.

   Server Setup
       An http server with TLS and proxying support must already be installed and configured.  snac  runs  as  a
       daemon  and listens on a TCP/IP socket, preferrably on a local interface. It can serve the full domain or
       only a directory. The http server must be configured to route to the snac socket all related traffic  and
       also the webfinger standard address. The Host header must be propagated.  See the examples below.

   Adding Users
       Users must be created from the command line.  You can do it by running

             snac adduser $HOME/snac-data

       All  needed  data  will  be prompted for. There is no artificial limit on the number of users that can be
       created.

   Customization
       The server.json configuration file allows some behaviour tuning:

       host        The host name.

       prefix      The URL path prefix.

       address     The listen network address.

       port        The listen network port.

       dbglevel    The debug level. An integer value, being 0 the less verbose (the default).

       layout      The disk storage layout version. Never touch this.

       queue_retry_max
                   Messages sent out are stored in a queue. If the posting of a messages fails, it's re-enqueued
                   for later. This integer configures the maximum count of times the sending will be retried.

       queue_retry_minutes
                   The number of minutes to wait before the failed posting of a message is retried. This is  not
                   linear, but multipled by the number of retries already done.

       max_timeline_entries
                   This is the maximum timeline entries shown in the web interface.

       timeline_purge_days
                   Entries  in  the  timeline  older that this number of days are purged.  If you don't want any
                   timeline purging and enjoy your data drives fill up  with  old  crap  and  finally  burst  in
                   flames, you can disable purging by setting this to 0.

       local_purge_days
                   Same as before, but for the user-generated entries in the local timeline.

       cssurls     This  is a list of URLs to CSS files that will be inserted, in this order, in the HTML before
                   the user CSS. Use these files to configure the global site layout.

       disable_cache
                   If set to true, timeline caching is not done. This is only  useful  for  debugging  purposes;
                   don't enable it unless you know what do you want, as it makes everything slower.

       disable_openbsd_security
                   If  running  under  OpenBSD,  snac makes use of the enhanced security functions unveil(2) and
                   pledge(2).  Setting this to true disables their usage. These functions limit severely what an
                   intruder can do in case of a security vulnerability, so only enable this option if  something
                   is very broken.

       num_threads
                   By  setting  this  value,  you  can  specify  the  exact number of threads snac will use when
                   processing connections. Values lesser than 4 will be ignored.

       disable_email_notifications
                   By setting this to true, no email notification will be sent for any user.

       disable_inbox_collection
                   By setting this to true, no inbox collection is done. Inbox collection helps being discovered
                   from remote instances, but also increases network traffic.

       http_headers
                   If you need to add more HTTP response headers for whatever reason, you can fill  this  object
                   with the required header/value pairs.

       show_instance_timeline
                   If this is set to true, the instance base URL will show a timeline with the latest user posts
                   instead of the default greeting static page. If other information fields are set (see below),
                   they are also shown.

       admin_email
                   The email address of the instance administrator (optional).

       admin_account
                   The user name of the instance administrator (optional).

       short_description
                   A textual short description about the instance (optional).

       fastcgi     If  set to true, snac will use the FastCGI interface to communicate with the upper level http
                   server, that must be configured accordingly.

       disable_history
                   If set to true, history monthly snapshots are not served nor their links shown.

       shared_inboxes
                   This boolean value selects if shared inboxes are announced or not.  Enabling  shared  inboxes
                   helps (somewhat) in optimizing incoming traffic for instances with a large number of users.

       You must restart the server to make effective these changes.

       If  a  file named greeting.html is present in the server base directory, it will be returned whenever the
       base URL of the server is requested. Fill it with whatever information about the  instance  you  want  to
       supply  to  people  visiting  the  server, like sign up requirements, site policies and such. The special
       %userlist% mark in the file will cause the list of users in this instance to be inserted.

       Users can change a bit of information about themselves from the web interface. See snac(1)  for  details.
       Further,  every user can have a private CSS file in their static/style.css that will be served instead of
       the server-wide one.  It's not modifiable from the web interface to avoid users  shooting  themselves  in
       the foot by destroying everything.

   Old Data Purging
       From  version  2.06, there is no longer a need to add a special cron job for purging old data, as this is
       managed internally.

   ActivityPub Support
       These are the following activities and objects that snac supports:

       Follow      Complete support, on input and output.

       Undo        For Follow objects, on input and output.

       Create      For Note, Question and Page objects, on input and output.

       Accept      For Follow objects, on input and output.

       Like        For Note objects, on input and output.

       Announce    For Note objects, on input and output.

       Update      For Person, Note and Question objects, on input and output.

       Delete      Supported for Note and Tomsbtone objects on input, and for Note objects on output.

       The rest of activities and objects are dropped on input.

       There is partial support for OrderedCollection objects in the /outbox (with the last 20  entries  of  the
       local  timeline  shown).  No  pagination is supported. Intentionally, the /followers and /following paths
       return empty lists.

   Migrating from Mastodon
       User migration from different Fediverse instances is  a  pain  in  the  ass  that  has  been  implemented
       everywhere as a kludgy afterthought. There is not much that can be done, other than importing the list of
       people you follow to your new snac account.

       To  do  this,  download  the user's list of accounts being followed (in CSV format) from the Mastodon web
       interface and execute this:

             awk -F, 'NR > 1 { print $1 }' /path/to/following_accounts.csv | \
             xargs -n 1 snac follow $SNAC_BASEDIR $SNAC_USER

   Instance blocking
       Full instances can be blocked. This operation must be done from the command-line tool. See snac(1).

   Other Considerations
       snac stores all the messages it receives as JSON  files,  which  are  usually  bloated  and  filled  with
       redundant information. Using a filesystem with file compression enabled (like btrfs or zfs) will probably
       be a good choice to store the snac data storage into.

ENVIRONMENT

       DEBUG   Overrides  the  debugging  level  from the server 'dbglevel' configuration variable. Set it to an
               integer value. The higher, the deeper in meaningless verbiage you'll find yourself into.

EXAMPLES

       You want to install the snac Fediverse daemon in the host example.com, that is correctly configured  with
       a valid TLS certificate and running the nginx httpd server.  The service will be installed under the fedi
       location. Two users, walter and jessie, will be hosted in the system.  Their Fediverse presence addresses
       will  be  https://example.com/fedi/walter  and https://example.com/fedi/jesse, respectively. They will be
       known in the Fediverse as @walter@example.com and @jesse@example.com. The snac daemon  will  run  as  the
       user  snacusr  in  the system and listen to the localhost:8001 network socket. All data will be stored in
       the /home/snacusr/fedidata directory.

       Log into the system as snacusr and execute:

             snac init /home/snacusr/fedidata

       Answer "example.com" to the host name question, "/fedi" to the path prefix question, "localhost"  to  the
       address and "8001" to the port.

       Create the users

             snac adduser /home/snacusr/fedidata walter
             snac adduser /home/snacusr/fedidata jesse

       Answer the questions with reasonable values.

       Execute the server:

             snac httpd /home/snacusr/fedidata

       Edit the nginx configuration and add the following snippet to the example.com server section:

             # nginx configuration example

             # main web access point
             location /fedi {
                 proxy_pass http://localhost:8001;
                 proxy_set_header Host $http_host;
             }
             # webfinger
             location /.well-known/webfinger {
                 proxy_pass http://localhost:8001;
                 proxy_set_header Host $http_host;
             }
             # Mastodon API (entry points)
             location /api/v1/ {
                 proxy_pass http://localhost:8001;
                 proxy_set_header Host $http_host;
             }
             location /api/v2/ {
                 proxy_pass http://localhost:8001;
                 proxy_set_header Host $http_host;
             }
             # Mastodon API (OAuth support)
             location /oauth {
                 proxy_pass http://localhost:8001;
                 proxy_set_header Host $http_host;
             }
             # optional
             location /.well-known/nodeinfo {
                 proxy_pass http://localhost:8001;
                 proxy_set_header Host $http_host;
             }

       Restart  the nginx daemon and connect to https://example.com/fedi/walter.  The empty, default screen will
       be shown. Enter the admin section with the credentials  defined  for  this  user.  Search  people,  start
       following  them,  engage  in  arid  discussions  and generally enjoy the frustrating experience of Social
       Media.

       This is an example of a similar configuration for the Apache2 web server:

             # apache2 configuration example

             ProxyPreserveHost On

             # Main web access point
             <Location /social>
                 ProxyPass http://127.0.0.1:8001/social
             </Location>

             # WebFinger
             <Location /.well-known/webfinger>
                 ProxyPass http://127.0.0.1:8001/.well-known/webfinger
             </Location>

             # NodeInfo (optional)
             <Location /.well-known/nodeinfo>
                 ProxyPass http://127.0.0.1:8001/.well-known/nodeinfo
             </Location>

             # Mastodon API (entry points)
             <Location /api/v1/>
                 ProxyPass http://127.0.0.1:8001/api/v1/
             </Location>

             <Location /api/v2/>
                 ProxyPass http://127.0.0.1:8001/api/v2/
             </Location>

             # Mastodon API (OAuth support)
             <Location /oauth>
                 ProxyPass http://127.0.0.1:8001/oauth
             </Location>

       Since version 2.43, snac supports communicating from / to the front end http  server  using  the  FastCGI
       protocol.  There  is  no  special  advantage  in  using  this,  only  that some servers allow for simpler
       configuration.  For  example,  in  the  case  of  nginx,  you  can  replace  the  two  'proxy_pass'   and
       'proxy_set_header' lines in the example above with just

             fastcgi_pass localhost:8001;

       The only thing to change on snac size is to the set 'fastcgi' value to true in server.json.

       Further,  using  the  FastCGI interface allows a much simpler configuration under OpenBSD's native httpd,
       given that it's natively implemented there and you no longer need to  configure  the  complicated  relayd
       server. This is an example:

             # OpenBSD httpd configuration example

             # other server configuration
             [...]

             location "/fedi*" {
                 fastcgi socket tcp "127.0.0.1" 8001
             }

             location "/.well-known/webfinger" {
                 fastcgi socket tcp "127.0.0.1" 8001
             }

             location "/oauth/*" {
                 fastcgi socket tcp "127.0.0.1" 8001
             }

             location "/api/v1/*" {
                 fastcgi socket tcp "127.0.0.1" 8001
             }

             location "/api/v2/*" {
                 fastcgi socket tcp "127.0.0.1" 8001
             }

             location "/.well-known/nodeinfo" {
                 fastcgi socket tcp "127.0.0.1" 8001
             }

SEE ALSO

       snac(1), snac(5)

AUTHORS

       grunfink @grunfink@comam.es: https://comam.es/snac/grunfink

LICENSE

       See the LICENSE file for details.

CAVEATS

       JSON files are fragile when modified by hand. Take care.

Debian                                             $Mdocdate$                                            SNAC(8)