1,108
edits
Technician (talk | contribs) |
Technician (talk | contribs) mNo edit summary |
||
(44 intermediate revisions by the same user not shown) | |||
Line 28: | Line 28: | ||
bsdutils \ | bsdutils \ | ||
certbot \ | certbot \ | ||
composer \ | |||
curl \ | curl \ | ||
dnsutils \ | dnsutils \ | ||
Line 33: | Line 34: | ||
git \ | git \ | ||
imagemagick \ | imagemagick \ | ||
iotop \ | |||
ldap-utils \ | |||
mg \ | mg \ | ||
moreutils \ | moreutils \ | ||
Line 90: | Line 93: | ||
# Debian | # Debian | ||
echo deb http://deb.debian.org/debian $(lsb_release -sc)-backports main > /etc/apt/sources.list.d/backports.list | # May not be necessary; see if there's a commented out line in /etc/apt/sources.list that you can activate. | ||
echo deb http://deb.debian.org/debian $(lsb_release -sc)-backports main contrib non-free > /etc/apt/sources.list.d/backports.list | |||
# Ubuntu | # Ubuntu | ||
echo deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc)-backports main universe > /etc/apt/sources.list.d/backports.list | echo deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc)-backports main universe > /etc/apt/sources.list.d/backports.list | ||
PHP | Usually you want up-to-date versions of Apache2, Nginx, and PHP. Ondřej provides them: | ||
# Debian | |||
for repo in apache2 nginx-mainline php | |||
do | |||
curl https://packages.sury.org/$repo/apt.gpg > /etc/apt/trusted.gpg.d/sury-$repo.gpg | |||
echo "deb https://packages.sury.org/$repo/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/sury-$repo.list | |||
done | |||
# Ubuntu | |||
add-apt-repository ppa:ondrej/apache2 | |||
add-apt-repository ppa:ondrej/nginx | |||
add-apt-repository ppa:ondrej/php | |||
It may be necessary to increase the priority of some repositories if you encounter errors about dependencies that can't be fulfilled, due to apt-get thinking it has to prioritize older versions of some packages. This was last observed while trying to install {{C|nginx-extras}}, due to some library dependencies having the "epoch" part of the version number set in the regular Debian repository, but not set in the Sury repository. The solution is to create a file in {{C|/etc/apt/preferences.d}} such as: | |||
Package: * | |||
Pin: origin packages.sury.org | |||
Pin-Priority: 700 | |||
Elasticsearch, if you want CirrusSearch for MediaWiki: | |||
curl https://artifacts.elastic.co/GPG-KEY-elasticsearch | gpg --dearmor -o /etc/apt/trusted.gpg.d/elasticsearch.gpg | |||
# As of January 2024, CirrusSearch only supports Elasticsearch 7.x | |||
echo 'deb https://artifacts.elastic.co/packages/7.x/apt stable main' > /etc/apt/sources.list.d/elastic.list | |||
echo | |||
=== Create vmail user === | === Create vmail user === | ||
Line 116: | Line 134: | ||
Now we can install all the software used for the various FeministWiki services: | Now we can install all the software used for the various FeministWiki services: | ||
apt-get install apache2 \ | apt-get install | ||
apache2 \ | |||
dovecot-core \ | |||
dovecot-imapd \ | |||
dovecot-ldap \ | |||
dovecot-pop3d \ | |||
ejabberd \ | |||
elasticsearch \ | |||
fail2ban \ | |||
inspircd \ | |||
mariadb-server \ | |||
nginx-extras \ | |||
opendkim \ | |||
postfix \ | |||
postfix-ldap \ | |||
slapd | |||
If any installation asks you for a password, remember that most passwords are found in {{C|/root/pwd}}. | If any installation asks you for a password, remember that most passwords are found in {{C|/root/pwd}}. | ||
Line 135: | Line 155: | ||
Example for installing ejabberd from backports instead: | Example for installing ejabberd from backports instead: | ||
apt-get install ejabberd/$(lsb_release -sc)-backports # e.g. ejabberd/ | apt-get install ejabberd/$(lsb_release -sc)-backports # e.g. ejabberd/bookworm-backports | ||
=== Make sure Postfix can connect to OpenDKIM === | |||
mkdir -p /var/spool/postfix/opendkim | |||
chown opendkim:opendkim /var/spool/postfix/opendkim | |||
adduser postfix opendkim | |||
=== Install PHP and modules === | === Install PHP and modules === | ||
Line 146: | Line 172: | ||
php${php_version}-apcu \ | php${php_version}-apcu \ | ||
php${php_version}-bcmath \ | php${php_version}-bcmath \ | ||
php${php_version}-bz2 \ | |||
php${php_version}-cli \ | php${php_version}-cli \ | ||
php${php_version}-curl \ | php${php_version}-curl \ | ||
Line 160: | Line 187: | ||
php${php_version}-xml \ | php${php_version}-xml \ | ||
php${php_version}-zip | php${php_version}-zip | ||
We also want {{C|php-luasandbox}}, which may not have a PHP version attached to the package name, in which case you'll have to make sure it supports the PHP version currently in use. If not, you can use the standalone Lua binary instead by setting {{C|$wgScribuntoDefaultEngine {{=}} 'luastandalone';}} in MediaWiki's {{C|LocalSettings.php}} configuration file. | |||
# See if this works first: | |||
apt-get install php${php_version}-luasandbox | |||
# Otherwise... | |||
apt-get install php-luasandbox | |||
# Check the package contents to see which PHP versions are supported | |||
dpkg -L php-luasandbox | |||
=== Copy over certificates === | === Copy over certificates === | ||
Line 165: | Line 202: | ||
Copy over the certs from the old server: | Copy over the certs from the old server: | ||
# Run on old server | |||
rsync -avz /etc/feministwiki/certs feministwiki.dev:/etc/feministwiki/certs | |||
The {{C|/etc/ | The {{C|/etc/feministwiki/certs}} directory and its contents should be owned by the group {{C|ssl-cert}}. Make sure this is the case on the new server after running the command above, since the group ID might be different on the new server. If the group doesn't exist at all, just create it. | ||
Further, files in that directory which contain the private key ({{C|privkey.pem}} and {{C|bundle.pem}}) should only be readable by group members. That is, their permission mode should be 640, displayed as {{C|-rw-r-----}} in the output of {{C|ls -l}}. Make sure this really the case. | Further, files in that directory which contain the private key ({{C|privkey.pem}} and {{C|bundle.pem}}) should only be readable by group members. That is, their permission mode should be 640, displayed as {{C|-rw-r-----}} in the output of {{C|ls -l}}. Make sure this really the case. | ||
Line 173: | Line 211: | ||
Then, to allow certain services to read those files containing the private key, add them to the {{C|ssl-cert}} group: | Then, to allow certain services to read those files containing the private key, add them to the {{C|ssl-cert}} group: | ||
# Run on new server | |||
adduser ejabberd ssl-cert | adduser ejabberd ssl-cert | ||
adduser irc ssl-cert | adduser irc ssl-cert | ||
Also copy over the certificates stored directly in {{C|/etc/letsencrypt}}: | |||
# Run on old server | |||
rsync -avz /etc/letsencrypt/{archive,live} feministwiki.dev:/etc/letsencrypt | |||
=== Put config files in place === | === Put config files in place === | ||
Line 183: | Line 227: | ||
* Don't forget to revert the redactions of sensitive information. Search files for {{C|[REDACTED]}}. | * Don't forget to revert the redactions of sensitive information. Search files for {{C|[REDACTED]}}. | ||
* After copying | * After copying {{C|/etc/aliases}}, run {{C|newaliases}} to create the alias database file. | ||
* | * After copying Postfix configuration, run {{C|postmap /etc/postfix/sender-access}} and {{C|postalias /etc/postfix/virtual-aliases}}. | ||
* Make sure the executable bit is set on all {{C|cron}} scripts, {{C|/etc/rc.local}}, and scripts in {{C|/etc/letsencrypt/renewal-hooks}}. | |||
* | |||
=== Apache modules | === Apache modules and configuration === | ||
Enable PHP FPM: | Enable PHP FPM and other Apache modules: | ||
a2enmod proxy_fcgi | a2enmod expires headers proxy_fcgi rewrite | ||
a2enconf php${php_version}-fpm | a2enconf php${php_version}-fpm | ||
=== OpenLDAP configuration database === | |||
First of all, check if there are important changes in the base configuration of slapd. For this, we can copy the old configuration into some directory on the new server and run a recursive diff: | |||
# Run on old server | |||
rsync -az /etc/ldap/slapd.d/ feministwiki.dev:/tmp/slapd.d | |||
# Run on new server | |||
diff -ru --color=always /tmp/slapd.d /etc/ldap/slapd.d | less -R | |||
There are going to be a number of changes that are expected. Namely: | |||
# CRCs, UIDs, timestamps, and other such auto-generated fields | |||
# FeministWiki-specific things that only exists in the old configuration | |||
If these are the '''only''' differences you can see, then it should be safety to completely override the config on the new server with the old one, using the instructions in the following section. | |||
Otherwise, skip to the section after that and recreate the FeministWiki-specific configuration from scratch. | |||
=== | ==== Complete copying of old configuration ==== | ||
''Note: This is an '''alternative''' method to that described in the '''next''' section. See above for which one to choose.'' | |||
Stop the LDAP server and delete the configuration database '''on the new server (careful!)''': | Stop the LDAP server and delete the configuration database '''on the new server (careful!)''': | ||
Line 212: | Line 269: | ||
Then copy over the configuration database, by running the following commands from the old server: | Then copy over the configuration database, by running the following commands from the old server: | ||
# Run on old server | |||
slapcat -n 0 | ssh feministwiki.dev 'sudo -u openldap slapadd -n 0 -F /etc/ldap/slapd.d' | slapcat -n 0 | ssh feministwiki.dev 'sudo -u openldap slapadd -n 0 -F /etc/ldap/slapd.d' | ||
==== Recreation of FeministWiki configuration ==== | |||
''Note: This is an '''alternative''' method to that described in the '''previous''' section. See above for which one to choose.'' | |||
First run {{C|dpkg-reconfigure slapd}} to fill in some basic information such as the domain name and admin password. You can reuse the old admin password found in {{C|/root/pwd/ldap}}. | |||
Then, running the following sequence of commands, taken from [[FeministWiki:LDAP Schema]], should do the rest: | |||
# Create fwMember object class | |||
ldapadd -Y external -H ldapi:// <<EOF | |||
dn: cn=feministwiki,cn=schema,cn=config | |||
objectClass: olcSchemaConfig | |||
cn: feministwiki | |||
olcAttributeTypes: {0}( 1.3.6.1.4.1.42.2.27.99.1.1 | |||
NAME 'fwRecoveryMail' | |||
DESC 'FeministWiki password recovery mail' | |||
EQUALITY caseIgnoreMatch | |||
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) | |||
olcObjectClasses: {1}( 1.3.6.1.4.1.42.2.27.99.2.1 | |||
NAME 'fwMember' | |||
DESC 'FeministWiki member' | |||
SUP inetOrgPerson | |||
STRUCTURAL | |||
MAY ( fwRecoveryMail ) ) | |||
EOF | |||
# Set attribute permissions | |||
ldapmodify -Y external -H ldapi:// <<EOF | |||
dn: olcDatabase={1}mdb,cn=config | |||
changetype: modify | |||
add: olcAccess | |||
olcAccess: {2}to attrs=sn,mail by self write | |||
olcAccess: {3}to attrs=fwRecoveryMail by self write by dn.exact="cn=readonly,dc=feministwiki,dc=org" search | |||
olcAccess: {4}to attrs=manager by self read | |||
EOF | |||
# Enable the ppolicy dynamic module | |||
ldapmodify -Y external -H ldapi:// <<EOF | |||
dn: cn=module{0},cn=config | |||
changetype: modify | |||
add: olcModuleLoad | |||
olcModuleLoad: ppolicy | |||
EOF | |||
# Add the ppolicy overlay with olcPPolicyHashCleartext set to TRUE | |||
ldapadd -Y external -H ldapi:// <<EOF | |||
dn: olcOverlay=ppolicy,olcDatabase={1}mdb,cn=config | |||
objectClass: olcPPolicyConfig | |||
olcOverlay: ppolicy | |||
olcPPolicyHashCleartext: TRUE | |||
EOF | |||
# Set the default password policy | |||
# The policy object referenced here doesn't exist yet, | |||
# but will exist once we copy over the main database. | |||
ldapmodify -Y external -H ldapi:// <<EOF | |||
dn: olcOverlay={0}ppolicy,olcDatabase={1}mdb,cn=config | |||
changetype: modify | |||
add: olcPPolicyDefault | |||
olcPPolicyDefault: cn=default,ou=pwdPolicies,dc=feministwiki,dc=org | |||
EOF | |||
# Load the lastbind module | |||
ldapmodify -Y external -H ldapi:// <<EOF | |||
dn: cn=module{0},cn=config | |||
changetype: modify | |||
add: olcModuleLoad | |||
olcModuleLoad: lastbind | |||
EOF | |||
# Enable the lastbind overlay | |||
ldapadd -Y external -H ldapi:// <<EOF | |||
dn: olcOverlay=lastbind,olcDatabase={1}mdb,cn=config | |||
objectClass: olcLastBindConfig | |||
olcOverlay: lastbind | |||
olcLastBindPrecision: 60 | |||
EOF | |||
==== Breaking changes in OpenLDAP ==== | ==== Breaking changes in OpenLDAP ==== | ||
Line 257: | Line 393: | ||
=== LDAP database === | === LDAP database === | ||
Make sure slapd is not running and delete the existing database '''on the new server (careful!)''': | |||
# Run on new server! | |||
systemctl stop slapd | |||
rm /var/lib/ldap/data.mdb | rm /var/lib/ldap/data.mdb | ||
Then copy over the database by running the following command from the old server: | Then copy over the database by running the following command from the old server: | ||
slapcat -n 1 | ssh feministwiki.dev 'sudo -u openldap slapadd -n 1' | # Run on old server | ||
slapcat -n 1 | zstd | ssh feministwiki.dev 'zstd -d | sudo -u openldap slapadd -n 1' | |||
Start slapd again in the new server afterwards: | |||
# Run on new server | |||
systemctl start slapd | |||
=== Contents of /var/www === | === Contents of /var/www === | ||
Line 271: | Line 413: | ||
This is very simple but takes a lot of time to finish. '''Run it from the old server:''' | This is very simple but takes a lot of time to finish. '''Run it from the old server:''' | ||
rsync - | rsync -azP --delete /var/www/ feministwiki.dev:/var/www | ||
Note that the trailing slash in {{C|/var/www/}} is important; if not provided, it will copy the directory to {{C|/var/www/www}} on the new server. | Note that the trailing slash in {{C|/var/www/}} is important; if not provided, it will copy the directory to {{C|/var/www/www}} on the new server. | ||
There's actually a systemd service found in {{C|/var/www/fw/wiki}} that you'll want to enable on the new server: | |||
systemctl enable /var/www/fw/wiki/fw-wiki-job-runner.service | |||
No need to actually start it yet. | |||
=== SQL databases === | === SQL databases === | ||
Line 279: | Line 427: | ||
Run the following command from the old server: | Run the following command from the old server: | ||
mariadb-dump -u root -p"$(cat /root/pwd/mariadb)" \ | |||
--add-drop-database \ | --add-drop-database \ | ||
--databases | --databases feministblogs \ | ||
feministfiles \ | feministfiles \ | ||
feministforum \ | feministforum \ | ||
Line 292: | Line 440: | ||
feministwiki_pt \ | feministwiki_pt \ | ||
fff \ | fff \ | ||
| | | zstd | ssh feministwiki.dev 'zstd -d | /root/bin/sql' | ||
You can use the {{C|show databases;}} command in the SQL console to make sure that the list of databases is complete. Unfortunately they have to be listed manually, because using the {{C|--all-databases}} option includes system databases that we don't want to copy. | You can use the {{C|show databases;}} command in the SQL console to make sure that the list of databases is complete. Unfortunately they have to be listed manually, because using the {{C|--all-databases}} option includes system databases that we don't want to copy. | ||
Line 303: | Line 451: | ||
Note that the trailing slash in {{C|/home/vmail/}} is important. | Note that the trailing slash in {{C|/home/vmail/}} is important. | ||
=== Elasticsearch === | |||
Temporarily stop Elasticsearch on the old server and copy over the data: | |||
systemctl stop elasticsearch | |||
rsync -az --delete /var/lib/elasticsearch/ feministwiki.dev:/var/lib/elasticsearch | |||
systemctl start elasticsearch | |||
=== Mailman data === | === Mailman data === | ||
Line 322: | Line 478: | ||
/root/bin/sql << EOF | /root/bin/sql << EOF | ||
create user | create user 'feministblogs'@localhost identified by '$(cat ~/pwd/mariadb-feministblogs)'; | ||
create user feministfiles@localhost identified by '$(cat ~/pwd/ | create user 'feministfiles'@localhost identified by '$(cat ~/pwd/mariadb-feministfiles)'; | ||
create user feministforum@localhost identified by '$(cat ~/pwd/ | create user 'feministforum'@localhost identified by '$(cat ~/pwd/mariadb-feministforum)'; | ||
create user feministmail@localhost identified by '$(cat ~/pwd/ | create user 'feministmail'@localhost identified by '$(cat ~/pwd/mariadb-feministmail)'; | ||
create user feministwiki@localhost identified by '$(cat ~/pwd/ | create user 'feministwiki'@localhost identified by '$(cat ~/pwd/mariadb-feministwiki)'; | ||
create user fff@localhost identified by '$(cat ~/pwd/ | create user 'fff'@localhost identified by '$(cat ~/pwd/mariadb-fff)'; | ||
EOF | EOF | ||
Line 333: | Line 489: | ||
/root/bin/sql << EOF | /root/bin/sql << EOF | ||
grant all on | grant all on feministblogs.* to feministblogs@localhost; | ||
grant all on feministfiles.* to feministfiles@localhost; | grant all on feministfiles.* to feministfiles@localhost; | ||
grant all on feministforum.* to feministforum@localhost; | grant all on feministforum.* to feministforum@localhost; | ||
Line 383: | Line 539: | ||
systemctl stop dovecot | systemctl stop dovecot | ||
systemctl stop ejabberd | systemctl stop ejabberd | ||
systemctl stop elasticsearch | |||
systemctl stop fw-wiki-job-runner | |||
systemctl stop inspircd | systemctl stop inspircd | ||
systemctl stop | systemctl stop nginx | ||
systemctl stop opendkim | |||
systemctl stop postfix | systemctl stop postfix | ||
systemctl stop slapd | systemctl stop slapd | ||
Note that we leave MariaDB running, since it needs to be live for data transfer. | |||
== Finishing up == | == Finishing up == | ||
Line 396: | Line 557: | ||
Stop all the services that interface with users and/or are responsible for modifying live data: | Stop all the services that interface with users and/or are responsible for modifying live data: | ||
for port in 25 80 443 465 587 993 995 5222 5223 5269 5270 5443 6697 7777 | |||
do ufw delete allow proto tcp to 0.0.0.0/0 port $port | |||
done | |||
systemctl stop apache2 | systemctl stop apache2 | ||
systemctl stop dovecot | systemctl stop dovecot | ||
systemctl stop ejabberd | systemctl stop ejabberd | ||
systemctl stop elasticsearch | |||
systemctl stop fw-wiki-job-runner | |||
systemctl stop inspircd | systemctl stop inspircd | ||
systemctl stop | systemctl stop nginx | ||
systemctl stop opendkim | |||
systemctl stop postfix | systemctl stop postfix | ||
systemctl stop slapd | systemctl stop slapd | ||
As with the old server, we leave MariaDB running since it will be needed for data transfer. | |||
=== Copy over the live data one more time === | === Copy over the live data one more time === | ||
Line 414: | Line 578: | ||
'''Simply repeat the whole section ''Copying over live data''.''' | '''Simply repeat the whole section ''Copying over live data''.''' | ||
The techniques and commands described above in the section ''Copying over live data'' are ''idempotent'', meaning you can simply repeat them and they will make sure that the new copy of the live data is fresh and doesn't leave any outdated data on the new server. For instance, the {{C|--delete}} argument to the {{C|rsync}} command and the {{C|--add-drop-database}} argument to the {{C| | The techniques and commands described above in the section ''Copying over live data'' are ''idempotent'', meaning you can simply repeat them and they will make sure that the new copy of the live data is fresh and doesn't leave any outdated data on the new server. For instance, the {{C|--delete}} argument to the {{C|rsync}} command and the {{C|--add-drop-database}} argument to the {{C|mariadb-dump}} command help to make sure of this. | ||
So just repeat the steps from that section exactly one more time. | So just repeat the steps from that section exactly one more time. |