<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Welcome on May First Admin Docs</title>
    <link>https://admin.docs.mayfirst.org/</link>
    <description>Recent content in Welcome on May First Admin Docs</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 13 Aug 2026 13:53:34 +0000</lastBuildDate>
    <atom:link href="https://admin.docs.mayfirst.org/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Cacti: Monitoring network traffic</title>
      <link>https://admin.docs.mayfirst.org/cacti/</link>
      <pubDate>Tue, 06 Jan 2026 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/cacti/</guid>
      <description>We use cacti to query our switch and record network traffic. Login to https://cacti.mayfirst.org/ (password in keyringer) to view network traffic. Use the &amp;ldquo;mayfirst&amp;rdquo; username to get a simplified view that only shows graphs. The admin user is only needed to trouble shoot or change graphs.&#xA;Some things to keep in mind:&#xA;The upstream graph shows all traffic in and typically hovers around 100Mbit/second All other graphs include internal traffic (which includes database queries) that are not recorded in our upstream Setup Most of the configuration is in the database - so when moving or re-installing be sure to import the database backup.</description>
    </item>
    <item>
      <title>LVM Caching</title>
      <link>https://admin.docs.mayfirst.org/lvm-caching/</link>
      <pubDate>Tue, 26 Aug 2025 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/lvm-caching/</guid>
      <description>Getting Started We use LVM caching when we have a server with both spinning disks and SSD disks and the spinning disks are experience disk i/o slow downs.&#xA;Before you can create a cache device, you have to add the following setting to /etc/lvm/lvmlocal.conf so that logical volumes can be available as physical volumes:&#xA;devices { scan_lvs = 1 } In addition, ensure that thin-provisioning-tools is installed.&#xA;The commands For example, on a server in which the spinning disks are in vg0 and the SSDs are in vg1, we can add a cache called cache001 to the logical volume weborigin002 with the following commands:</description>
    </item>
    <item>
      <title>Disk Management</title>
      <link>https://admin.docs.mayfirst.org/disk-management/</link>
      <pubDate>Wed, 22 Mar 2023 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/disk-management/</guid>
      <description>When a disk on a virtual guest starts to fill up, we have two options:&#xA;Allocate a new disk: if the disk in question is a data disk serving member data on a web server or a mail server, we generally want to allocate a new disk so our data disks don&amp;rsquo;t grow too large, making them more difficult to backup or to run disk utilities on. The web and mail servers use symlinks from the /home directory, allowing us to mount as many separate disks in the /media directory as needed.</description>
    </item>
    <item>
      <title>Overview of Monitoring and Alerting</title>
      <link>https://admin.docs.mayfirst.org/monitor/</link>
      <pubDate>Sun, 06 Dec 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/monitor/</guid>
      <description>May First uses a variety of tools that work together to provide monitoring and alerting of our systems to warn us of impending problems or immediate outages.&#xA;There are three main jobs:&#xA;Detecting problems Communicating problems to a central storage location Notifying us of the problems The heart of our system is our central elasticsearch database.&#xA;Information is sent from each individual server to elasticsearch via:&#xA;journalbeat, which sends select data from journald metricbeat, which sends server health data, filebeat, which sends selected log files, pigeon, which detects anomolies and outputs them to journald simplemonitor, which tests network connectivity and runs a command to ensure elasticsearch is properly working.</description>
    </item>
    <item>
      <title>Network Boot</title>
      <link>https://admin.docs.mayfirst.org/network-boot/</link>
      <pubDate>Thu, 06 Feb 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/network-boot/</guid>
      <description>Network Boot Sometimes we have to boot strap a server into an operating system via the network.&#xA;There are two main ways we do that:&#xA;PXE Boot PXE Boot. Almost all servers have the option to boot from a network. The cabinet with the server you want to boot must have a server configured to provide TFTP and DHCP and have the proper images. In telehouse, clr is currently setup to provide netboot services.</description>
    </item>
    <item>
      <title>Ansible: server configuration system</title>
      <link>https://admin.docs.mayfirst.org/ansible/</link>
      <pubDate>Wed, 21 Aug 2019 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/ansible/</guid>
      <description>Ansible is the server configuration automation tool we use to ensure our servers are configured in a uniform way.&#xA;Our ansible setup involves two git repositories:&#xA;seed is the name of the git repository containing our roles and most of our ansible code. It also includes the inventories/dev directory, which allows you to create a minimal set of container images that demonstrates how our ansible repo is designed to work.</description>
    </item>
    <item>
      <title>How do setup IPMI via bios on a new server</title>
      <link>https://admin.docs.mayfirst.org/ipmi/</link>
      <pubDate>Fri, 13 Mar 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/ipmi/</guid>
      <description>Ansible Configuration When you first boot the server, IPMI has to be enabled and assigned an IP address.&#xA;We use a non-routable IP address so the only way to connect to IPMI is via a machine in the colo itself.&#xA;To pick an IP for the new server, grep the host_vars directory in our inventory for ipmi_address to see the currently assigned address and pick the next incrementally from the output.</description>
    </item>
    <item>
      <title>Trouble shoot KVM guest</title>
      <link>https://admin.docs.mayfirst.org/troubleshoot-kvm-guest/</link>
      <pubDate>Sat, 13 Jul 2024 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/troubleshoot-kvm-guest/</guid>
      <description>Sometimes KVM guests fails to start. To troubleshoot, we can boot into a grml live installation.&#xA;On the host, download the small grml live install into /usr/local/share/ISOs As the kvm guest user, create a symlink: ln -s /usr/local/share/ISOs/grml64-small_YYYY.MM.iso ~/vms/${USER}/cd.iso Reboot the KVM guest and quickly enter the screen session Hit &amp;ldquo;Esc&amp;rdquo; key to get to boot menu Choose the CD/DVD option Under &amp;ldquo;Additional boot entires for grml64-small&amp;rdquo;, choose &amp;ldquo;serial console&amp;rdquo; (at the bottom) Chroot The really get at the installation, you may need to mount the directories in /mnt and use chroot to fix what is wrong.</description>
    </item>
    <item>
      <title>Get Involved</title>
      <link>https://admin.docs.mayfirst.org/get-involved/</link>
      <pubDate>Sat, 12 Dec 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/get-involved/</guid>
      <description>May First Movement Technology is a membership-based organization with a mission to: engage in building movements by advancing the strategic use and collective control of technology for local struggles, global transformation, and emancipation without borders.&#xA;Want to get involved?&#xA;May First has a Technology and Infrastructure Services team open to all members of the organization.&#xA;If you are interested in joining, please login to our discourse instance, view our invitation to participate, and join the group.</description>
    </item>
    <item>
      <title>Install Debian on a physical host machine</title>
      <link>https://admin.docs.mayfirst.org/install-debian-host/</link>
      <pubDate>Thu, 06 Feb 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/install-debian-host/</guid>
      <description>Server Installation Initial steps Add the server to the hosts.yml file and create a host_vars file. Ensure there is a console entry and then run ansible to the console server (in Telehouse it&amp;rsquo;s clr). Read the top of the IMPI page as well to get the settings right. Ensure that network boot is setup in the cabinet in which you are installing the server. Plug in monitor and keyboard Enter Bios/Setup.</description>
    </item>
    <item>
      <title>Hacking Ansible</title>
      <link>https://admin.docs.mayfirst.org/ansible-hacking/</link>
      <pubDate>Wed, 21 Aug 2019 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/ansible-hacking/</guid>
      <description>Overview Hacking on a server configuration tool is hard because you need a fleet of servers to test on.&#xA;To make it easier, our ansible repository comes with tools that allow you to create a fleet of servers residing just on your local machine using podman.&#xA;When you have completed these tasks you will end up with:&#xA;An authoritative DNS server (nsauth001.mayfirst.dev) set with all domain names in use (the dev sites use the domain: mayfirst.</description>
    </item>
    <item>
      <title>Ansible - sower helper command</title>
      <link>https://admin.docs.mayfirst.org/ansible-sower/</link>
      <pubDate>Wed, 10 Nov 2021 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/ansible-sower/</guid>
      <description>Overview Our ansible scripts and our seed inventory combine a lot of useful information about our infrastructure. The sower command is designed to easily parse the information and manipulate it.&#xA;Some details Setup To effectively use sower, you should ensure that the path to the executable is in your $PATH environment variable.&#xA;If you have access to our live inventory, then you should also set an environment variable:&#xA;SEED_LIVE_DIR=/path/to/seed/inventory/directory This environment variable is not necessary when operating in dev mode.</description>
    </item>
    <item>
      <title>Ansible - Initialize podman containers</title>
      <link>https://admin.docs.mayfirst.org/ansible-docker-initialize/</link>
      <pubDate>Wed, 21 Aug 2019 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/ansible-docker-initialize/</guid>
      <description>Overview The sower command can be used to build out a set of podman (previously docker) containers that can mimic a real network of servers, allowing us to test and develop our ansible playbook.&#xA;The container images are used for dev and learning purposes only. They should not be used to host any production services.&#xA;The script builds out container images for convenience. It builds them in non-standard ways. In particular:</description>
    </item>
    <item>
      <title>Ansible vault</title>
      <link>https://admin.docs.mayfirst.org/ansible-vault/</link>
      <pubDate>Wed, 21 Aug 2019 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/ansible-vault/</guid>
      <description>Ansible provides a mechanism for storing secrets in a dedicated and encrypted file. It&amp;rsquo;s not ideal to have to keep secrets at all, but it some cases it seems worth the risks, particularly in order to have continuous integration working.&#xA;The ansible vault file should be placed in the inventory directory, e.g.:&#xA;inventories/dev/secrets.yml To ease continuous intergration, for the dev and testing inventory, we have a secret.txt file that holds the password to unlock the secrets.</description>
    </item>
    <item>
      <title>Stress Test new hardware</title>
      <link>https://admin.docs.mayfirst.org/stress-test-new-hardware/</link>
      <pubDate>Thu, 08 Oct 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/stress-test-new-hardware/</guid>
      <description>All new hardware should be put through a stress test to detect any failing components.&#xA;Launch the tests Boot into debirf image. If stretch, install pip: apt install python-pip iperf3 lshw stress-ng and then install stressant: pip install stressant. If later, install stressant instead of pip. Start long smartctl tests on each disk: for disk in $(cat /proc/partitions | egrep -o &#39;sd[a-z]$&#39;); do smartctl -t long &amp;quot;/dev/$disk&amp;quot;; done. These will take many hours to complete.</description>
    </item>
    <item>
      <title>KVM Manager: creating and managing virtual guests</title>
      <link>https://admin.docs.mayfirst.org/kvm-manager/</link>
      <pubDate>Fri, 07 Feb 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/kvm-manager/</guid>
      <description>Overview May First uses KVM Manager to manage virtual guests on each of our physical host machines.&#xA;KVM Manager uses the qemu-kvm virtualization software.&#xA;KVM Manager is a set of simple bash scripts that help us by setting up new virtual server instances and allows us to manage each instance via systemd. The main benefits of KVM Manager are:&#xA;Use isolation: nothing runs as root on the host. All virtual servers run via systemd as a non-provileged user.</description>
    </item>
    <item>
      <title>modlock - preventing kernel modules from loading</title>
      <link>https://admin.docs.mayfirst.org/modlock/</link>
      <pubDate>Thu, 13 Aug 2026 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/modlock/</guid>
      <description>Several recent linux vulnerabilities are triggered when kernel modules (that are not needed by us) are loaded by non privileged users (see dirty frag and copy fail.&#xA;To avoid that in the future, we have installed modlock.&#xA;This program, when initially setup (with --setup), creates a list of modules currently loaded and then creates a systemd service that ensures they are loaded on startup before disabling loading of any other modules.</description>
    </item>
    <item>
      <title>Vaultwarden</title>
      <link>https://admin.docs.mayfirst.org/vaultwarden/</link>
      <pubDate>Tue, 12 May 2026 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/vaultwarden/</guid>
      <description>Vaultwarden is an alternative implentation of the Bitwarden password manager server. It works as a drop in replacement with all Bitwarden clients. It can handle a variety of types of data, it is an end to end encrypted service, with admins unable to view the passwords of users, and with the ability to create teams that can share items including TOTP MFA prompts.&#xA;Podman We chose to use podman for the deployment of Vaultwarden.</description>
    </item>
    <item>
      <title>Mail Queue Management</title>
      <link>https://admin.docs.mayfirst.org/mailq-management/</link>
      <pubDate>Tue, 23 Dec 2025 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/mailq-management/</guid>
      <description>If our email is being blocked or deferred or if we just trying to warm up new IPs, we wil need to get reporting information about our mail queues and/or move messages between queues to ensure they are delivered.&#xA;A few concepts Be sure to read up on relay servers on our postfix page and our relay servers page.&#xA;To review: We have multiple mail relay servers (name mailrelay001, mailrelay002, etc).</description>
    </item>
    <item>
      <title>Z MX server</title>
      <link>https://admin.docs.mayfirst.org/z-mx/</link>
      <pubDate>Sat, 06 Dec 2025 03:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/z-mx/</guid>
      <description>All domain name MX records should point to one of our MX server {a,b,c}.mx.mayfirst.org.&#xA;However, some membes use App River to filter viruses and spam and then configure App River to relay on to May First. This causes one major problem: Our MX servers will not be able to properly run DMARC and SPF checks because we can&amp;rsquo;t properly determine what the last hop was.&#xA;To resolve this problem we have a special MX server (z.</description>
    </item>
    <item>
      <title>Mounted home directories on shared web servers</title>
      <link>https://admin.docs.mayfirst.org/shared-web-server-mounted-home-directories/</link>
      <pubDate>Fri, 07 Nov 2025 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/shared-web-server-mounted-home-directories/</guid>
      <description>Overview All site directories on web servers are located in the /home/sites directory and named after the control panel item_id for the particular web configuration (e.g. /home/sites/123).&#xA;To avoid creating a massively huge /home/sites partition that would be infeasible to fsck, the actual block devices supporting these sites are mounted under /media/dataNNNN (where NNNN is a four digit number) and kept to a maximum of 250GB each.&#xA;Each site directory under /home/sites is bind-mounted from its corresponding /media/dataNNN directory, e.</description>
    </item>
    <item>
      <title>Mailman email list software</title>
      <link>https://admin.docs.mayfirst.org/mailman/</link>
      <pubDate>Mon, 27 Oct 2025 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/mailman/</guid>
      <description>May First runs the mailman mailing list manager.&#xA;Components Mailman3 is broken into several discrete components:&#xA;mailman - the core component that controls the sending of email, configured via /etc/mailman3/mailman.cfg. List settings are stored in a postgres database. mailman-web - the web-based companion service (written in django), configured via /etc/mailman3/mailman-web.py that consists of two django apps: postorius - the django app that allows list owners to manager their own list settings and subscribers hyperkitty - the django app that provides access to list archives if a list is configured to archive messages.</description>
    </item>
    <item>
      <title>Virus Detection</title>
      <link>https://admin.docs.mayfirst.org/virus-detection/</link>
      <pubDate>Wed, 23 Jul 2025 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/virus-detection/</guid>
      <description>We use ClamAV to detect viruses in incoming email.&#xA;ClamAV is invoked by clamsmtp so that Postfix simply sends all email through clamsmtp which then re-injects all email without viruses back into the postfix queue.&#xA;Sometimes ClamAV has a false positive - you can find them by searching the elastic search logs for:&#xA;message: &amp;#34;250 Virus Detected; Discarded Email&amp;#34; You can then search, on the specified mailfilter server, for the reason via journalctl -u clamsmtp, e.</description>
    </item>
    <item>
      <title>Bot Challenge Screen</title>
      <link>https://admin.docs.mayfirst.org/bot-challenge/</link>
      <pubDate>Sat, 12 Jul 2025 03:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/bot-challenge/</guid>
      <description>Overview When a site is being hit with bot traffic that uses a user agent string typically reserved for humans, we can route its traffic through anubis, which poses a challenge to the user in an attempt to determine if it&amp;rsquo;s a human or not.&#xA;How to turn it on Determine which web proxy is being used by the host via DNS lookup. Edit the /etc/nginx/sites-enabled/siteNNNNN.conf file (see below for details) When tested, edit the web conf in the control panel, set Cache Type to &amp;ldquo;Custom cache settings&amp;rdquo; and copy the nginx config contents to the Cache Settings field.</description>
    </item>
    <item>
      <title>Instant Message and Chat via Prosody and Movim</title>
      <link>https://admin.docs.mayfirst.org/chat/</link>
      <pubDate>Sat, 18 Jan 2025 03:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/chat/</guid>
      <description>We provide XMPP services via prosody. And we provide an XMPP client via movim.&#xA;Prosody Prosody is installed via debian. It authenticates via Cyrus SASL, which is configured to check /etc/passwd via PAM. The control panel simply uses useradd to add users to the system in order to enable their ability to login to our prosody server.&#xA;Movim Movim is installed via git.&#xA;Initial configuration After installing movim, run: php daemon.</description>
    </item>
    <item>
      <title>Scheduled Jobs in the control panel</title>
      <link>https://admin.docs.mayfirst.org/scheduled-jobs/</link>
      <pubDate>Tue, 10 Dec 2024 03:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/scheduled-jobs/</guid>
      <description>User are able to create scheduled jobs in the control panel.&#xA;These can be set to run on a given interval or &amp;ldquo;forever.&amp;rdquo;&#xA;All jobs are translated into systemd service and timer files, which are saved in the site&amp;rsquo;s /.config/systemd/user directory on the weborigin.&#xA;Users, when ssh&amp;rsquo;ed into the server, can manipulate them via systemctl provided they prefix the command with --user, e.g. systemctl --user status red-item-1234.service.&#xA;When logged in as root, you can&amp;rsquo;t do that.</description>
    </item>
    <item>
      <title>Postgres</title>
      <link>https://admin.docs.mayfirst.org/postgres/</link>
      <pubDate>Sat, 13 Jul 2024 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/postgres/</guid>
      <description>Postgres database have to be uprade as manually after a Debian upgrade.&#xA;First become the postgres user: su - postgres Next, list all clusters: pg_lsclusters See if any clusters have databases other than &amp;ldquo;postgres&amp;rdquo;, &amp;ldquo;template0&amp;rdquo;, and &amp;ldquo;template1&amp;rdquo;: psql --port NNNN --list (replace NNNN with the port number returned by the pg_lsclusters command, start clusters if necessary with: pg_ctlcluster VERSION main start) When the most recent version has no other databases other than the defaults, you can drop it and then upgrade from the version that has a database.</description>
    </item>
    <item>
      <title>Outreach: May First&#39;s internal CiviCRM database</title>
      <link>https://admin.docs.mayfirst.org/civicrm/</link>
      <pubDate>Wed, 19 Jun 2024 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/civicrm/</guid>
      <description>May First maintains our own CiviCRM installation via a standard hosting order using the address outreach.mayfirst.org.&#xA;It&amp;rsquo;s running CiviCRM Standalone.&#xA;Code base The entire site (except the public and `private&amp;rsquo; file directories) is kept in git.&#xA;The main code we maintain is in the &amp;ldquo;mayfirst&amp;rdquo; CiviCRM extension. This code provides our custom membership workflow, displays, scheduled jobs, reports and other functionality.&#xA;Tests Note: running tests in this manner is no longer working.</description>
    </item>
    <item>
      <title>Nginx Proxy Snippets</title>
      <link>https://admin.docs.mayfirst.org/nginx-proxy-snippets/</link>
      <pubDate>Mon, 06 May 2024 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/nginx-proxy-snippets/</guid>
      <description>By default, all web sites are configured to pass through our Nginx Proxy servers un-altered.&#xA;However, if a site comes under attack or is overloaded, we can add a custom nginx proxy configuration to try to cache or block some of the requests.&#xA;Big picture The first step is to determine which web proxy is being used by the site. You can dig the domain name or look it up in the DNS section of the control panel.</description>
    </item>
    <item>
      <title>Only Office</title>
      <link>https://admin.docs.mayfirst.org/onlyoffice/</link>
      <pubDate>Sun, 24 Mar 2024 03:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/onlyoffice/</guid>
      <description>Onlyoffice is a web based application providing office (Document, Spreadsheet, etc) like functionality. It is integrated into our Nextcloud installation.&#xA;We specifically install our own version of OnlyOffice provided via infrared. This repo includes a docker and docker compose file. A few important considerations:&#xA;The docker compose file includes an nginx container, but we ignore it and provide nginx via the host, which is configured via /etc/nginx/conf.d/proxy-https-to-http.conf You can control both the 0xacab and upstream git versions via ansible variables in the onlyoffice001.</description>
    </item>
    <item>
      <title>Trouble Shooting MySQL/MariaDB problems</title>
      <link>https://admin.docs.mayfirst.org/mysql-trouble-shooting/</link>
      <pubDate>Fri, 01 Mar 2024 03:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/mysql-trouble-shooting/</guid>
      <description>Errors On modern (bookworm and above) versions of MariaDB, errors are logged to journald and should be exported to elastic search. On earlier versions, look in /var/log/mysql/.&#xA;Slow Queries You can temporarily enable slow query logs (will be unset when MariaDB restarts) with:&#xA;SET GLOBAL slow_query_log = &#39;ON&#39;; SET GLOBAL long_query_time = 10; SET GLOBAL slow_query_log_file = &#39;/var/log/mysql/mariadb-slow.log&#39;; This may adversely affect performance. You can turn it off with simply:</description>
    </item>
    <item>
      <title>How to respond to alerts</title>
      <link>https://admin.docs.mayfirst.org/alert-response/</link>
      <pubDate>Fri, 23 Feb 2024 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/alert-response/</guid>
      <description>All alerts should come with a link to this page, which explains how to fix the problem.&#xA;elasticsearch health The elasticsearch_health alert happens when accessing https://log.mayfirst.org/_cat/health does not return a 200 http response code. That might mean our elasticsearch database is under heavy load, is restarting or has failed. Login to log001.mayfirst.org and check /var/log/elasticsearch/elasticsearch.log and journalctl -u elasticsearch.&#xA;missing pigeon heartbeat Every host running pigeon should send a heartbeat message once a minute.</description>
    </item>
    <item>
      <title>Red Validation</title>
      <link>https://admin.docs.mayfirst.org/red-validation/</link>
      <pubDate>Wed, 14 Feb 2024 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/red-validation/</guid>
      <description>Since we have tightened our validation rules without ensuring existing data meets the new validation rules, we have a lot of data in the control panel that will trigger a validation error when you try to edit, disable or delete it.&#xA;The following are common red validation errrors and how to fix them:&#xA;A DNS record with the same value already exists for example.org / txt. This error may have a different domain than &amp;ldquo;example.</description>
    </item>
    <item>
      <title>Domain Name Resolution</title>
      <link>https://admin.docs.mayfirst.org/dns/</link>
      <pubDate>Sat, 03 Feb 2024 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/dns/</guid>
      <description>There are many kinds of domain name servers in our network:&#xA;function: authoritative vs caching scope: public vs internal profile: origin vs copy vs static Caching servers Our caching DNS servers are also known as resolving DNS servers.&#xA;Every physical host runs unbound directly, providing DNS caching services for all hosts in our network. This service is configured to only respond to requests from IP addresses in our ansible playbook, including hosts in other locatins.</description>
    </item>
    <item>
      <title>Email Abuse and Deliverability</title>
      <link>https://admin.docs.mayfirst.org/email-abuse/</link>
      <pubDate>Thu, 28 Dec 2023 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/email-abuse/</guid>
      <description>We can access data about email complaints from several sources.&#xA;Note: if we are being blocked or deferred by a provider, reach this page and also read our mailq management page.&#xA;Our official abuse email address. Our official email for receiving abuse complaints is abuse [@] m.o.&#xA;Almost all email sent to this address is in the abuse reporting format, which means it&amp;rsquo;s not useful to read email sent to this mailbox directly.</description>
    </item>
    <item>
      <title>Convert MOSH to use ProxySQL</title>
      <link>https://admin.docs.mayfirst.org/proxysql-mosh-transition/</link>
      <pubDate>Sun, 17 Dec 2023 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/proxysql-mosh-transition/</guid>
      <description>To transition the databases from the MOSH&amp;rsquo;es to the network database servers, we first re-configure MySQL to listen on localhost port 3307 (instead of 3306).&#xA;Then we install proxysql and instruct it to proxy for the local MySQL server.&#xA;Then, we can transfer each database one at a time with minimal downtime.&#xA;The steps are:&#xA;In the puppet .pp file of the mosh add (replace $HOST with the actual name of the host): class { &amp;#34;mayfirst::m_proxysql::mosh&amp;#34;: transition =&amp;gt; true } In the Ansible Seed Inventory repository, add to the MOSH&amp;rsquo;es yaml file: proxysql_profile: proxy Ansible push to mysql00[45678] (and all proxysql databases) sower --live playbook --tags proxysql mysql00[45678].</description>
    </item>
    <item>
      <title>Setting up a new shared mail server</title>
      <link>https://admin.docs.mayfirst.org/shared-mailserver/</link>
      <pubDate>Mon, 11 Dec 2023 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/shared-mailserver/</guid>
      <description>The following steps should be taken to setup a new shared mail server:&#xA;In ansible seed repo, edit hosts.yml to copy each line with mailstore002 to your new name. Execute sower --live generate:mailstore --parent hostxxx.mayfirst.org to generate a new mailstore yaml file. Follow regular kvm guest setup steps Be sure you created the ssh key in the step above! Insert the server into the red_server table: INSERT INTO red_server SET server = &#39;mailstore00x.</description>
    </item>
    <item>
      <title>Setting up a new shared MySQL (MariaDB) server</title>
      <link>https://admin.docs.mayfirst.org/shared-mysql-server/</link>
      <pubDate>Mon, 11 Dec 2023 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/shared-mysql-server/</guid>
      <description>The following steps should be taken to setup a new shared mysql server:&#xA;In ansible seed repo, edit hosts.yml to copy each line with mailstore002 to your new name. Execute sower --live generate:mysql --parent hostxxx.mayfirst.org to generate a new mysql yaml file. Follow regular kvm guest setup steps Be sure you created the ssh key and enabled quotas in the step above! Update all weborigins to let them know about the mysql server so they can connect via proxysql: sower --live playbook --tags proxysql-build-origins-file weborigin*.</description>
    </item>
    <item>
      <title>May First Cerificate Authority</title>
      <link>https://admin.docs.mayfirst.org/mfca/</link>
      <pubDate>Sun, 19 Nov 2023 03:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/mfca/</guid>
      <description>While May First mostly depends on Lets Encrypt for our PKI infrastructure, we do operate our own certificatte authority for signing certificates in our dev and/or testing environment and for internal only connections.&#xA;The certificate authority key is saved in our ansible vault using the variable name vault_mfca_key and the signed certificate key is stored in the variable mayfirst_mfca_cert.&#xA;The certificate is saved to the directory /usr/local/share/ca-certificates/mfca.crt, which is picked up by the ca-certificates debian package and incorporated into the /etc/ssl/certs directory so all local applications will trust certificates signed by our key.</description>
    </item>
    <item>
      <title>Setting up a new shared web proxy</title>
      <link>https://admin.docs.mayfirst.org/shared-web-proxy/</link>
      <pubDate>Sat, 11 Nov 2023 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/shared-web-proxy/</guid>
      <description>Adding In ansible seed inventory repo, edit hosts.yml and add the new host in all places an existing host exists. Execute sower --live generate:weborigin --parent hostxxx.mayfirst.org to generate a new weborigin yaml file. Follow regular kvm guest setup steps Note: The next steps have to happen close together. After you run the first step, changes to any web configuration in the control panel will fail until you have completed the remaining steps.</description>
    </item>
    <item>
      <title>Setting up a new shared web server</title>
      <link>https://admin.docs.mayfirst.org/shared-web-server/</link>
      <pubDate>Sat, 11 Nov 2023 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/shared-web-server/</guid>
      <description>The following steps should be taken to setup a new web server:&#xA;In ansible seed repo, edit hosts.yml to copy each line with weboriring001 to your new name. Execute sower --live generate:weborigin --parent hostxxx.mayfirst.org to generate a new weborigin yaml file. Follow regular kvm guest setup steps Be sure you created the ssh key in the step above! Grant access to the mysql server so your weborigin server can run proxysql properly.</description>
    </item>
    <item>
      <title>Stopping Bad Bots</title>
      <link>https://admin.docs.mayfirst.org/bad-bots/</link>
      <pubDate>Mon, 06 Nov 2023 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/bad-bots/</guid>
      <description>Overview This page describes our strategy for throttling or blocking bots from accessing web sites on our servers.&#xA;Bots are programs making web site requests that are not directly driven by a human.&#xA;There is some gray area. For example, if a user posts a link on Bluesky, a Bluesky bot will lookup the web page and retrieve the name of the page and possibly an image from the page. That&amp;rsquo;s technically a bot, but it&amp;rsquo;s one responding directly to a human&amp;rsquo;s request.</description>
    </item>
    <item>
      <title>Ansible: Running ad-hoc commands</title>
      <link>https://admin.docs.mayfirst.org/ansible-adhoc/</link>
      <pubDate>Thu, 05 Oct 2023 08:24:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/ansible-adhoc/</guid>
      <description>Sometimes we want to run a single command on all of our servers. The ansible command allows us to easily do that.&#xA;Here&amp;rsquo;s a sample command:&#xA;sower --live ls &amp;#39;!noaccess&amp;#39; | xargs -P 10 -I {} bash -c &amp;#39;echo &amp;#34;--- {} ---&amp;#34; &amp;amp;&amp;amp; ssh root@{} /bin/true&amp;#39; --inventory should point to the hosts.yml file in your seed inventory repository. --one-line condenses the output to a single line making it easier to see which commands failed.</description>
    </item>
    <item>
      <title>Transfering control panel resources between hosts and partitions</title>
      <link>https://admin.docs.mayfirst.org/transfer/</link>
      <pubDate>Sat, 22 Oct 2022 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/transfer/</guid>
      <description>Overview The mf-transfer script automates the transfer of resources between servers and between partitions. It handles both copying the data and also updating the control panel resource to reflect the new location.&#xA;The command copies data from the source location to the destination location. If you are moving a resource from one partition to another on the same server, then the source and destination servers will be the same.&#xA;The command line script should be run as root from the destination server.</description>
    </item>
    <item>
      <title>Red: The May First control panel</title>
      <link>https://admin.docs.mayfirst.org/red/</link>
      <pubDate>Wed, 19 Oct 2022 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/red/</guid>
      <description>Red is the name of the May First control panel.&#xA;Debugging failed items When a control panel item is saved or deleted, one or more tasks are queued to be executed (e.g. &amp;ldquo;run red-node-update on the target server&amp;rdquo; or &amp;ldquo;rebuild the email databases&amp;rdquo; or &amp;ldquo;generate an https certificate&amp;rdquo;). The execution of the queued items happens via a timer that runs every 15 seconds, not via the web.&#xA;Sometimes a control panel item has a &amp;ldquo;soft-error&amp;rdquo; or &amp;ldquo;hard-error&amp;rdquo; or seems to be stuck in a pending state.</description>
    </item>
    <item>
      <title>User Quotas</title>
      <link>https://admin.docs.mayfirst.org/quota/</link>
      <pubDate>Wed, 19 Oct 2022 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/quota/</guid>
      <description>Our control panel restricts disk usage by resource (e.g. a user login or database).&#xA;Databases For databases, we simply use du to check database usage via a cron job and, if a database has gone over, we disable each database user with write access to that database.&#xA;Users For email and web site disk usage, we use the ext4 quota sytem to set a quota and depend on it to inform users when they have gone over.</description>
    </item>
    <item>
      <title>Email Test Suite</title>
      <link>https://admin.docs.mayfirst.org/email-test-suite/</link>
      <pubDate>Sun, 02 Oct 2022 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/email-test-suite/</guid>
      <description>Since we use round robin DNS for our client facing servers (mailcf) and we have multiple MX servers that can accept email, it is hard test each specific server to ensure it is working properly.&#xA;The May First Email Test Suite is a simple script that can iterate through our list of servers and ensure they are all working.&#xA;The test suite expects to be run from your local workstation and be given a username, password and associated email address capable of sending and receiving email via our network.</description>
    </item>
    <item>
      <title>Verify MX Domains</title>
      <link>https://admin.docs.mayfirst.org/verify-mx-domain/</link>
      <pubDate>Mon, 11 Jul 2022 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/verify-mx-domain/</guid>
      <description>The problem Any member is free to add a new domain to the DNS section of their control panel provided no other member already has a domain name record matching it (we use the public suffix domain list to figure out the difference between a root domain and a subdomain).&#xA;This policy means members could engage in sketchy behavior, like adding gmail.com as their DNS record and then adding maria@gmail.com as their own email address.</description>
    </item>
    <item>
      <title>DKIM Signing of outgoing email</title>
      <link>https://admin.docs.mayfirst.org/dkim/</link>
      <pubDate>Wed, 18 May 2022 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/dkim/</guid>
      <description>Domain Key Identified Mail (DKIM) is a method for digitally (and transparently) signing outgoing email in a way that indicates it was authentically sent by the person who claims to have sent the message.&#xA;The purpose of DKIM is to stop fraudulent email messages by preventing people from sending email claiming to be from email addresses to which they don&amp;rsquo;t in fact have access.&#xA;More specifically DKIM requires the generation of a public/private key pair for each domain name that sends email via May First.</description>
    </item>
    <item>
      <title>Filter Check</title>
      <link>https://admin.docs.mayfirst.org/filter-check/</link>
      <pubDate>Mon, 16 May 2022 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/filter-check/</guid>
      <description>filter-check notifies us if email sent via our servers is landing in the spam box of the three major providers - Google, Microsoft or Yahoo.&#xA;We have created email accounts on all three providers. filter-check iterates over all of our relay IP addresses and over all three providers to send an email from each IP address to each provider. Then, it waits a bit and tries to check for that message via IMAP.</description>
    </item>
    <item>
      <title>Authentication Milter</title>
      <link>https://admin.docs.mayfirst.org/authentication-milter/</link>
      <pubDate>Sat, 14 May 2022 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/authentication-milter/</guid>
      <description>Overview Our MX servers run a mail filter (milter) on incoming email that runs the alphabet soup of checks - DKIM, SPF, DMARC, etc.&#xA;For some checks (SPF, DKIM) it&amp;rsquo;s responsible for adding headers indicating whether the message passed those checks. For others (e.g. DMARC) it is responsible for rejecting the message if it fails to pass.&#xA;We originally used the debian packaged opendmarc and opendkim, but the upstream packages are not well maintained and we noticed some incoming email messages caused opendmarc to crash, so we have switched to authentication_milter.</description>
    </item>
    <item>
      <title>Mr. T: Querying elastic search for email related info in our logs</title>
      <link>https://admin.docs.mayfirst.org/mistert/</link>
      <pubDate>Tue, 12 Apr 2022 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/mistert/</guid>
      <description>Mr. T provides a number of email reporting features based on mail log data collected by elastic search.&#xA;See the upstream README for documentation on usage - in particular how to get a list of senders and recipients to track down potential email problems.&#xA;General review and searching mistert list and mistert stats print lists and statistics about email sent through our network. For example:&#xA;mistert --since 2h --until 1h list will print a line for every message sent between 2 hours ago and one hour ago, including who it was sent from and the message id.</description>
    </item>
    <item>
      <title>Relay mail servers configuration</title>
      <link>https://admin.docs.mayfirst.org/relay/</link>
      <pubDate>Tue, 12 Apr 2022 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/relay/</guid>
      <description>As documented on our postfix page, relay servers send email out to the world. This page provides additional information about how they are configured.&#xA;Domain Names and IP addresses Since these servers rely on dozens of IP addresses to send email in parallel, adding and removing IP addresses to the configuration files is an on-going task.&#xA;Unlike most IP addresses, special DNS records are required for our outgoing relay IPs.</description>
    </item>
    <item>
      <title>Restore from Backup</title>
      <link>https://admin.docs.mayfirst.org/backup-restore/</link>
      <pubDate>Fri, 29 Oct 2021 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/backup-restore/</guid>
      <description>To restore from the backup, always start from the server hosting the data being restored. Do not restore from the backup server.&#xA;From the source host (source_host), examined /etc/backup.d/71_backup.borg. Look for the host, port, user, and directorty values.&#xA;With this info, execute the command:&#xA;borgbackup list ssh://${source_host}-sync@${host}:${port}${directory} You should see a list of dated backup archives (archive).&#xA;Next, get a file list of the available files with:&#xA;borgbackup list ssh://${source_host}-sync@${host}:${port}${directory}::archive Next, cd into the directory you want to restore the files.</description>
    </item>
    <item>
      <title>Jitsi Meet Simultaneous Interpretation</title>
      <link>https://admin.docs.mayfirst.org/jitsimeet-simultaneous-interpretation/</link>
      <pubDate>Thu, 09 Sep 2021 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/jitsimeet-simultaneous-interpretation/</guid>
      <description>Overview Jitsi Meet has an extensive API, including one designed to work via an iframe.&#xA;In other words, you include your main Jitsi Meet web page via an iframe, and then write javascript code to control how it works.&#xA;JSI We have written a simple wrapper called JSI using the iframe API to provide a intrepretation slider.&#xA;It&amp;rsquo;s installed on the same server running Jitsi Meet and enabled via a separate nginx configuration file.</description>
    </item>
    <item>
      <title>Planning</title>
      <link>https://admin.docs.mayfirst.org/planning/</link>
      <pubDate>Tue, 08 Jun 2021 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/planning/</guid>
      <description>Overview The planning page maps out the major projects on the horizon and the rough schedule for implementation.&#xA;Purple items are items Jamie is taking the lead on.&#xA;New dues: Switch from managing dues in our Red control panel to managing them via CiviCRM and implement the new dues schedule.&#xA;Physical Servers to Ansible: Transition all physical servers from puppet to ansible and upgrade to buster in the process.&#xA;Non-red servers to Ansible: Transition all virtual servers that are not tied to the control panel to ansible and upgrade to buster (or bullseye) in the process.</description>
    </item>
    <item>
      <title>Jitsi Meet</title>
      <link>https://admin.docs.mayfirst.org/jitsimeet/</link>
      <pubDate>Mon, 03 May 2021 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/jitsimeet/</guid>
      <description>Jitsi Meet Jitsi Meet is a web-based video conferencing tool based on XMPP and HTML5 web browser video standards. (It is easily confused with with Jitsi, which is a XMPP client.)&#xA;The Jitsi Meet world has many components:&#xA;The server: The server component includes the nginx web server, prosody XMPP server, jitsi-videobridge2 (the main unique component that makes everything work), and some html and javascript glue to tie it all together.</description>
    </item>
    <item>
      <title>Jitsi Meet Jibri Server</title>
      <link>https://admin.docs.mayfirst.org/jitsimeet-jibri/</link>
      <pubDate>Mon, 03 May 2021 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/jitsimeet-jibri/</guid>
      <description>Overview The jitsimeet jibri server provides a recording and broadcasting service.&#xA;We are currently only using the recording service.&#xA;Jibri should be installed on a separate machine from the jitsimeet server because jibri can be a CPU hog. However, if you want a Jitsi Meet instance to integrate with jibri, be sure to set jitsimeet_jibri: true in the jitsimeet instance&amp;rsquo;s yaml file.&#xA;Using the jibri debian package takes care of most of the aspects of installing jibri with the exception of the /etc/jitsi/jibri/jibri.</description>
    </item>
    <item>
      <title>Jitsi Meet Jigasi Server</title>
      <link>https://admin.docs.mayfirst.org/jitsimeet-jigasi/</link>
      <pubDate>Mon, 03 May 2021 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/jitsimeet-jigasi/</guid>
      <description>Overview The jitsimeet jigasi server provides integration with a SIP gateway enabling call-in and dial-out features for Jitsi Meet and also transcription services via a variety of back ends.&#xA;We are using the transcription service via the Jitsi meet skynet API which uses the Faster Whisper LLM models, which are based on the OpenAI Whisper models, which is a general purpose speech recognition model. This LLM is run on May First infrastructure and does not leak any conversations.</description>
    </item>
    <item>
      <title>Jitsi Meet Server</title>
      <link>https://admin.docs.mayfirst.org/jitsimeet-server/</link>
      <pubDate>Mon, 03 May 2021 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/jitsimeet-server/</guid>
      <description>Overview The jitsimeet server is the normally the easiest component to install. We essentially follow the quick install instructions.&#xA;Most of the configuration changes we make are in the /etc/jitsi/meet/domain-config.js file and we make this via lineinfile changes. Our main goal with the changes from the defaults are to reduce bandwidth and CPU pressure on the clients that connect.&#xA;We also copy in the domain-interface-config.js file, but so far we are not making any modifications.</description>
    </item>
    <item>
      <title>Alerter: Send notifications to administrators via the right channels</title>
      <link>https://admin.docs.mayfirst.org/alerter/</link>
      <pubDate>Fri, 01 Jan 2021 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/alerter/</guid>
      <description>When it&amp;rsquo;s time for a monitoring tool to push an alert to an administrator, it calls the alert command with the appropriate arguments:&#xA;--team - either ptp or mayfirst, depending on which team should receive the alert.&#xA;--priority - either critical or warning depending on the severity (see the monitor page for an explanation of the difference between the two)&#xA;--body - the body of the message to send.&#xA;--subject - optionally provide a subject (only used for email alerts)</description>
    </item>
    <item>
      <title>signal-cli: command line signal client used to notify administrators</title>
      <link>https://admin.docs.mayfirst.org/signal-cli/</link>
      <pubDate>Fri, 01 Jan 2021 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/signal-cli/</guid>
      <description>signal-cli is a command line signal client used by our alerter script for sending messages to administrators when something has gone wrong.&#xA;We install the pre-packaged debian binaries.&#xA;After installation, manual setup is required for a new signal phone number.&#xA;Primary Host The phone number used by signal-cli is specified in the inventory using the signal_cli_number variable. It should be in the format: +15555555555. In the examples below we use this number as the example number.</description>
    </item>
    <item>
      <title>GitLab</title>
      <link>https://admin.docs.mayfirst.org/gitlab/</link>
      <pubDate>Thu, 17 Dec 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/gitlab/</guid>
      <description>About our GitLab configuration Our GitLab installation is designed to provide a secure, lightweight platform for hosting Git repositories and reviewing code. GitLab includes many additional capabilities—including continuous integration, package registries, container registries, wikis, and deployment tools—but most are disabled by default to keep the interface focused on source code management.&#xA;Configuration is managed entirely through Ansible using the GitLab Omnibus package for Debian.&#xA;Configuration management The Debian apt package does not directly write to the main configuration file /etc/gitlab/gitlab.</description>
    </item>
    <item>
      <title>Orientation</title>
      <link>https://admin.docs.mayfirst.org/orientation/</link>
      <pubDate>Sat, 12 Dec 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/orientation/</guid>
      <description>The May First network is composed of a lot of moving parts that work together. As the list of categories on the right demonstrate, it&amp;rsquo;s a lot to take in!&#xA;This page is designed to ease you into things by providing a big picture.&#xA;The code All of our code lives at https://code.mayfirst.org/mfmt/.&#xA;That&amp;rsquo;s great if you know what you are looking for, but for those who want a high level summary, keep reading&amp;hellip;</description>
    </item>
    <item>
      <title>Glance</title>
      <link>https://admin.docs.mayfirst.org/glance/</link>
      <pubDate>Fri, 11 Dec 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/glance/</guid>
      <description>glance is a dead simple php script that queries our elasticsearch database to see how many critical, warning and info alerts have been sent in the last 10 minutes and the last hour.&#xA;It&amp;rsquo;s publicly available via https://glance.mayfirst.org/.&#xA;The goal of the site is to provide a quick, easy to access confirmation about whether any problems we have received alerts about are resolved or still active.&#xA;Additionally, pigeon sends a heartbeat message every 10 minutes, and glance lists any servers that have not sent a heartbeat, so we can know if the reason there are not alerts is because pigeon has stopped running.</description>
    </item>
    <item>
      <title>Pigeon</title>
      <link>https://admin.docs.mayfirst.org/pigeon/</link>
      <pubDate>Sun, 06 Dec 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/pigeon/</guid>
      <description>pigeon is our anomoly detection program. pigeon runs on all servers and periodically executes checks for known problem conditions. When a problem condition is found, it simply logs to journald.&#xA;pigeon reads a yml based configuration file located at /etc/pigon.yml to know which tests should be run for a given server.&#xA;Additional tests can be added directly to pigeon as the need arises.&#xA;There pigeon alerts are picked up in three ways:</description>
    </item>
    <item>
      <title>Elasticsearch Upgrades</title>
      <link>https://admin.docs.mayfirst.org/elasticsearch-upgrade/</link>
      <pubDate>Thu, 29 Oct 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/elasticsearch-upgrade/</guid>
      <description>Elasticsearch has many different components that we use:&#xA;elasticsearch: The server database itself journalbeat, metricbeat, and filebeat: which feed information from our servers to the databsae kibana: the web interface for reviewing data These three pieces of software are all released with the same version number at the same time. Because they are so tightly integrated, it&amp;rsquo;s a good idea to upgrade all of them together.&#xA;To facilitate this process, the elasticsearch version number is included as a variable in the hosts.</description>
    </item>
    <item>
      <title>Index Lifetime Management</title>
      <link>https://admin.docs.mayfirst.org/elasticsearch-index-lifetime-management/</link>
      <pubDate>Thu, 29 Oct 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/elasticsearch-index-lifetime-management/</guid>
      <description>Index Lifetime Management (ILM) is how elasticsearch manages log rotation.&#xA;In elasticsearch, the &amp;ldquo;index&amp;rdquo; is the log, so managing its lifetime allows us to control how long we retain data.&#xA;The primary indices we are concerned with are the ones generated by journalbeat and filebeat, since they contain the most sensitive information (mainly IP addresses). However, metricbeat is important because it generates so much data - if we don&amp;rsquo;t manage the indices the partition holding the elasticsearch data will fill up.</description>
    </item>
    <item>
      <title>Nextcloud</title>
      <link>https://admin.docs.mayfirst.org/nextcloud/</link>
      <pubDate>Wed, 14 Oct 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/nextcloud/</guid>
      <description>Nextcloud is a file, calendar, contact sharing web application (and much much more).&#xA;May First administers a Nextcloud instance shared by all members - any user created in the control panel with access granted to Nextcloud can login to this shared instance. In addition, we can also can spin up instances dedicated to specific members.&#xA;System design There are six main components to a Nextcloud installation:&#xA;The database service: We use a Postgres server running on a dedicated virtual machine (psql003) The web service: We run nginx on the nextcloud KVM guest (nextcloud002).</description>
    </item>
    <item>
      <title>Backup</title>
      <link>https://admin.docs.mayfirst.org/backup/</link>
      <pubDate>Wed, 07 Oct 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/backup/</guid>
      <description>We use both backupninja, which provides a tool-agnostic framework for configuring backup jobs, and borgbackup, which performs a network backup of the data.&#xA;Via ansible, we can designate a server&amp;rsquo;s backup_profile as either a target (the backup server) or a source (any server that should specify directories to backup).&#xA;When defining sources, you can specify a list of remotes (in case you want to backup to more then one remote backup servers), and also a list of directories to include.</description>
    </item>
    <item>
      <title>Nginx</title>
      <link>https://admin.docs.mayfirst.org/nginx/</link>
      <pubDate>Mon, 06 Jul 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/nginx/</guid>
      <description>Nginx is a web server. It provides both both a front-end proxy for other nginx or apache web servers in our network and also serves as a standard web service for other services.&#xA;Web proxy You can configure a server to use an nginx proxy by adding a stanza to the server&amp;rsquo;s yml file. For example, in an ansible definition for a server called report001.mayfirst.org in which you will be launching a web service listening on port 5601 via the url: https://report.</description>
    </item>
    <item>
      <title>Longshore</title>
      <link>https://admin.docs.mayfirst.org/longshore/</link>
      <pubDate>Mon, 04 May 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/longshore/</guid>
      <description>longshore is the system used by the Progressive Technology Project to manage it&amp;rsquo;s Powerbase installations.&#xA;Using the longshore command, admins can create and manage docker containers running powerbase.&#xA;Setup The big picture is: Powerbase is civicrm, hosted and maintained by PTP, specifically configured for organizing groups.&#xA;PTP runs several physical hosts that are dedicated to the task, some are in the May First cabinet some are in other locations.&#xA;Each physical host runs at least two KVM guests:</description>
    </item>
    <item>
      <title>MariaDB</title>
      <link>https://admin.docs.mayfirst.org/mariadb/</link>
      <pubDate>Mon, 04 May 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/mariadb/</guid>
      <description>What&amp;rsquo;s in a name? MySQL is the Kleenex of databases. While it is the name of a specific database, it has also become a generic term used to refer to all databases that are compatible with the original MySQL database.&#xA;Per Debian defaults, we run MariaDB as our &amp;ldquo;MySQL&amp;rdquo; database.&#xA;And, throughout our code and documentation, we refer to MySQL the same way we refer to Web server, Email server and other generic services: as a generic service that we fulfil with MariaDB.</description>
    </item>
    <item>
      <title>ProxySQL</title>
      <link>https://admin.docs.mayfirst.org/proxysql/</link>
      <pubDate>Mon, 04 May 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/proxysql/</guid>
      <description>May First uses proxysql so databases appear to be on the localhost, while really living on dedicated database servers (origin servers).&#xA;The proxysql package is installed on web servers and any server from which a client needs to connect to a database (these servers are referred to as proxy servers).&#xA;Database clients (and client configurations) have no knowledge of where their database really lives - they simply attempt to connect via localhost.</description>
    </item>
    <item>
      <title>Openssh and authentication</title>
      <link>https://admin.docs.mayfirst.org/openssh/</link>
      <pubDate>Fri, 20 Mar 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/openssh/</guid>
      <description>Openssh is used to provide shell access to all servers.&#xA;We have several different needs for authentication:&#xA;Our server authenticates regular members We will continue providing both password-based and ssh public key based authentication.&#xA;Regular members authenticate our server Our user facing shell page will explain how all users will only ssh/sftp into one server with one domain name: shell.mayfirst.org (the server will mount all appropriate directories over sshfs).&#xA;Therefore, our members will only need to verify one fingerprint.</description>
    </item>
    <item>
      <title>SSH and Secure FTP access to web sites</title>
      <link>https://admin.docs.mayfirst.org/shell/</link>
      <pubDate>Fri, 20 Mar 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/shell/</guid>
      <description>Goals The goals of our ssh/sftp access configuration are:&#xA;Provide one address for all members to ssh into (e.g. shell.mayfirst.org) Users do not need to know which weborigin server their web sites are on, they are automatically given access to the right server when the ssh into the shell server. Ability to use ssh or sftp High level overview of how it works When a user ssh&amp;rsquo;s into shell.mayfirst.org, a ForceCommand configuration in sshd_config automatically ssh&amp;rsquo;s them into their configured origin server or logs them into the shell server while mounting their weborigin servers directories via sshfs.</description>
    </item>
    <item>
      <title>Accessing the console on virtual and physical servers</title>
      <link>https://admin.docs.mayfirst.org/console/</link>
      <pubDate>Fri, 13 Mar 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/console/</guid>
      <description>Sometimes network access to a server is not available, or you need to perform an operation before or during boot (like enter an encrypted passphrase).&#xA;During these times, it&amp;rsquo;s useful to gain access to the server&amp;rsquo;s console.&#xA;All servers, both bare metal and virtual servers, offer console access via ssh through a different server.&#xA;Virtual servers Consoles on virtual servers can be accessed via a non-privileged user on the bare metal server that provides the virtual server.</description>
    </item>
    <item>
      <title>Setting up console access (cereal and IPMI) to servers in our cabinet</title>
      <link>https://admin.docs.mayfirst.org/console-admin/</link>
      <pubDate>Fri, 13 Mar 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/console-admin/</guid>
      <description>We use the cereal package to manage console access to our physical servers with hardware serial ports and the ipmiutils package to provide serial access for those that depend on IPMI.&#xA;In both cases, the setup is automatically handled by ansible via the console variable.&#xA;Physical serial port Here&amp;rsquo;s an example of setting up a hardware serial server:&#xA;console: host: clr.mayfirst.org name: wiwa tty: /dev/ttyUSB29 id: FTDI_FT232R_USB_UART_ST161546 The host key indicates which serial console server it should be setup on.</description>
    </item>
    <item>
      <title>Bruce Banner: IP banning tool</title>
      <link>https://admin.docs.mayfirst.org/bruce/</link>
      <pubDate>Fri, 24 Jan 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/bruce/</guid>
      <description>Bruce Banner bruce banner is an IP banning tool. It queries our elasticsearch database for intrusion attempts, manages a list of IPs to ban and communicates bans to a network of remote server responsible for enforcing the ban via nftables.&#xA;See our intrusion detection page for the full picture of how it fits in with our other tools.&#xA;Topics bruce can be configured to manage different ban &amp;ldquo;topics&amp;rdquo; for different services.</description>
    </item>
    <item>
      <title>Dovecot - pop and IMAP server</title>
      <link>https://admin.docs.mayfirst.org/dovecot/</link>
      <pubDate>Fri, 24 Jan 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/dovecot/</guid>
      <description>TBD</description>
    </item>
    <item>
      <title>Intrusion Detection</title>
      <link>https://admin.docs.mayfirst.org/intrusion-detection/</link>
      <pubDate>Thu, 23 Jan 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/intrusion-detection/</guid>
      <description>Our intrusion detection system is comprised of several components that work together:&#xA;journalbeat and filebeat are programs that send logging files from every server in our network to our elasticsearch server.&#xA;elasticsearch is a central database that consumes and indexes all the logs from all our servers.&#xA;bruce specifically queries the journalbeat information in elasticsearch database for IP addresses engaging in suspicious behavior and sends them to the bruce-server to be distributed to all servers and banned via nft.</description>
    </item>
    <item>
      <title>Keyserver</title>
      <link>https://admin.docs.mayfirst.org/keyserver/</link>
      <pubDate>Fri, 17 Jan 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/keyserver/</guid>
      <description>Overview May First relies on public key infrastructure (PKI) throughout the network to ensure encrypted and authenticated communications between the public and our servers and between our servers themselves.&#xA;In most cases, we use x509 (the standard format for public key certificates used for https and many other applications of transport layer security). For example:&#xA;Members connecting via https to any of our sites, including their own web sites. Members connecting securely to our mail server to send or relay email Our internal relaying of email, e.</description>
    </item>
    <item>
      <title>Filebeat</title>
      <link>https://admin.docs.mayfirst.org/filebeat/</link>
      <pubDate>Sun, 05 Jan 2020 08:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/filebeat/</guid>
      <description>General Info Filebeat sends selected files to our elasticsearch server.&#xA;Filebeat can only send log files created by a service that already has a filebeat module. All the available modules are listed in /etc/filebeat/modules.d, with all modules disabled by default.&#xA;Filebeat can be enabled for a server via it&amp;rsquo;s yaml file, e.g.:&#xA;filebeat_enabled: true filebeat_profile: service filebeat_modules: [ &amp;quot;nginx&amp;quot; ] Setup All indexes and setup is carried out when you apply the ansible role to the elasticsearch server (see the index.</description>
    </item>
    <item>
      <title>Postfix</title>
      <link>https://admin.docs.mayfirst.org/postfix/</link>
      <pubDate>Sat, 04 Jan 2020 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/postfix/</guid>
      <description>Overview Postfix sends and delivers our email.&#xA;We have several classes of postfix servers:&#xA;MX: The mx servers accept incoming email destined for an address for which we will take responsibility, runs light validation checks, and relays the email to one of the filter servers. The MX servers are also responsible for verifying MX domains.&#xA;A domain will send email to us if it has an MX record pointing to our one of these MX servers.</description>
    </item>
    <item>
      <title>Simple Monitor</title>
      <link>https://admin.docs.mayfirst.org/simplemonitor/</link>
      <pubDate>Fri, 08 Nov 2019 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/simplemonitor/</guid>
      <description>Simlemonitor is a python daemon that monitors a set of remote services and custom commands and sends alerts whenver it detects a problem.&#xA;Simplemonitor will also send a follow up alert when the problem is resolved.&#xA;The set of services to monitor is automatically generated based on the simplemonitor variable in the hosts.yaml ansible file.&#xA;For example:&#xA;simplemonitor: # The key will be used as the label to indentify the resource that is offline in the alert.</description>
    </item>
    <item>
      <title>Metricbeat</title>
      <link>https://admin.docs.mayfirst.org/metricbeat/</link>
      <pubDate>Mon, 09 Sep 2019 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/metricbeat/</guid>
      <description>General Info Metricbeat sends selected server health data to our elasticsearch server.&#xA;All servers (by default, not a requirement) run metricbeat with the default system module enabled. All servers share a metricbeat username and password authorizing them to connect to the es server.&#xA;Index Lifetime Management Index Lifetime Management (ILM) is how elasticsearch manages log rotation and retention. It&amp;rsquo;s covered in it&amp;rsquo;s own ILM page.</description>
    </item>
    <item>
      <title>Elasticsearch setup</title>
      <link>https://admin.docs.mayfirst.org/elasticsearch/</link>
      <pubDate>Tue, 13 Aug 2019 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/elasticsearch/</guid>
      <description>Elasticsearch (es) is is a database designed to injest large amounts of data while providing an easy to use query language to search it.&#xA;It&amp;rsquo;s installed using es provided apt repos (not in Debian).&#xA;The es server(s) are dedicated to just running Elasticsearch. Other servers and services work together with Elasticsearch, including:&#xA;Journalbeat - all servers run Journalbeat, which sends journald data to the es server. Metricbeat - all servers run metricbeat, which sends server metrics data to the es server.</description>
    </item>
    <item>
      <title>Journalbeat</title>
      <link>https://admin.docs.mayfirst.org/journalbeat/</link>
      <pubDate>Tue, 13 Aug 2019 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/journalbeat/</guid>
      <description>General Info Journalbeat sends all journald logging to our elasticsearch server.&#xA;All servers (by default, not a requirement) run journalbeat so their logs can be analzed in aggregate. All servers share a journalbeat username and password authorizing them to connect to the es server.&#xA;Journalbeat doesn&amp;rsquo;t seem to work properly on /var/run/systemd/journalbeat (more testing necessary) so creating /var/log/journal seems to be required (which means more disk i/o)&#xA;To minimize information overload, we only send data on select services (ssh by default, but others can be added via the journalbeat_send ansible variable).</description>
    </item>
    <item>
      <title>Kibana: Reports and Queries of Elastic Search</title>
      <link>https://admin.docs.mayfirst.org/kibana/</link>
      <pubDate>Tue, 13 Aug 2019 13:53:34 +0000</pubDate>
      <guid>https://admin.docs.mayfirst.org/kibana/</guid>
      <description>Kibana provides a user interface for querying the es server.&#xA;kibana should be accessible via: https://report.mayfirst.org/&#xA;If you are in dev mode and you get a tls warning, be sure to import the certificate authority saved in inventory/testing/ca.&#xA;The password for kibana should eventually be placed in keyringer but for testing purposes a user with the username mayfirst and password mayfirst is created and should grant you access.&#xA;When you login for the first time:</description>
    </item>
  </channel>
</rss>
