<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.hackersanddesigners.nl//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fincato</id>
	<title>Hackers &amp; Designers - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.hackersanddesigners.nl//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fincato"/>
	<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Special:Contributions/Fincato"/>
	<updated>2026-05-01T18:42:01Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Hdsc2024-open-program&amp;diff=31400</id>
		<title>Hdsc2024-open-program</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Hdsc2024-open-program&amp;diff=31400"/>
		<updated>2024-06-27T15:34:45Z</updated>

		<summary type="html">&lt;p&gt;Fincato: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;HelloHello&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Hdsc2024-open-program&amp;diff=31395</id>
		<title>Hdsc2024-open-program</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Hdsc2024-open-program&amp;diff=31395"/>
		<updated>2024-06-27T15:26:10Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Created page with &amp;quot;Hello&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=PrePostPrint_NL_Meetup_2&amp;diff=30502</id>
		<title>PrePostPrint NL Meetup 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=PrePostPrint_NL_Meetup_2&amp;diff=30502"/>
		<updated>2024-03-04T10:36:20Z</updated>

		<summary type="html">&lt;p&gt;Fincato: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|Name=PrePostPrint NL Meetup 2&lt;br /&gt;
|Location=tbc&lt;br /&gt;
|Date=2024/05/17&lt;br /&gt;
|Time=11:00-17:00&lt;br /&gt;
|Type=Meetup&lt;br /&gt;
|Web=No&lt;br /&gt;
|Print=No&lt;br /&gt;
}}&lt;br /&gt;
[[File:ppp.png]]&lt;br /&gt;
&lt;br /&gt;
=== Save the date for the next PrePostPrint NL group! ===&lt;br /&gt;
&lt;br /&gt;
PPP is a community of practices around experimental publications made with free software (https://prepostprint.org).&lt;br /&gt;
&lt;br /&gt;
The PPP NL group is imagined as a local satellite of the wider PPP community. While free/libre open source practices seem to be more widely discussed in the context of France and Belgium, we are missing spaces for exchange and converse in the local context of The Netherlands.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re curious to explore Free/Libre and Open Source Software (F/LOSS) to make publications and layouts with, or have already worked with these tools and are looking for ways to exchange with others, please join us on 16 February 2024 at the H&amp;amp;D studio!&lt;br /&gt;
&lt;br /&gt;
 _,.-&#039;~&#039;-.,__,.-&#039;~&#039;-.,__,.-&#039;~&#039;-.,__,.-&#039;~&#039;-.,__,.&lt;br /&gt;
 &lt;br /&gt;
        [https://signal.group/#CjQKILLW4ogkgaFBJgKnpeKesAcvSVixMEgKpR_Kgdd4MEUWEhD4LsrXPbakq8jJLJbxF1om Join the PPP NL signal group]&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 _,.-&#039;~&#039;-.,__,.-&#039;~&#039;-.,__,.-&#039;~&#039;-.,__,.-&#039;~&#039;-.,__,.&lt;br /&gt;
&lt;br /&gt;
===Schedule===&lt;br /&gt;
&lt;br /&gt;
[tbc]&lt;br /&gt;
&lt;br /&gt;
===Pad=== &lt;br /&gt;
&lt;br /&gt;
https://etherpad.hackersanddesigners.nl/p/ppp-nl&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Fake_it!_HDSA_Video_Documentation&amp;diff=30206</id>
		<title>Fake it! HDSA Video Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Fake_it!_HDSA_Video_Documentation&amp;diff=30206"/>
		<updated>2024-01-29T16:20:50Z</updated>

		<summary type="html">&lt;p&gt;Fincato: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[File:Jamesvideogame.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
[[Juliette Lizotte]] documented the process of the [https://hackersanddesigners.nl/s/Summer_Academy_2018 Summer Academy 2018].  &lt;br /&gt;
&lt;br /&gt;
Find the daily video reports here: &lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|IFXIj7cK0TQ}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;htmltag tagname=&amp;quot;iframe&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;300&amp;quot; scrolling=&amp;quot;no&amp;quot; frameborder=&amp;quot;no&amp;quot; allow=&amp;quot;autoplay&amp;quot; src=&amp;quot;https://www.youtube.com/embed/IFXIj7cK0TQ?si=80L-Dm1rTdtz_53_&amp;quot;&amp;gt;&amp;lt;/htmltag&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|LcdqU4og2sg}}&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|fr7kRhhTtSg}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|ioW9RkHc6mc}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|yPpaRLFztAc}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|TYN2XZMem8E}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|zpq0cFM7vSk}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|jSMZU4spk7g}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|5aD-H7Pqg9s}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|YANEHZd-MbQ}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|uVqCS7wPUh4}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Publishing]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Fake_it!_HDSA_Video_Documentation&amp;diff=30205</id>
		<title>Fake it! HDSA Video Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Fake_it!_HDSA_Video_Documentation&amp;diff=30205"/>
		<updated>2024-01-29T16:18:53Z</updated>

		<summary type="html">&lt;p&gt;Fincato: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[File:Jamesvideogame.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
[[Juliette Lizotte]] documented the process of the [https://hackersanddesigners.nl/s/Summer_Academy_2018 Summer Academy 2018]. &lt;br /&gt;
&lt;br /&gt;
Find the daily video reports here: &lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|IFXIj7cK0TQ}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;htmltag tagname=&amp;quot;iframe&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;300&amp;quot; scrolling=&amp;quot;no&amp;quot; frameborder=&amp;quot;no&amp;quot; allow=&amp;quot;autoplay&amp;quot; src=&amp;quot;https://www.youtube.com/embed/IFXIj7cK0TQ?si=80L-Dm1rTdtz_53_&amp;quot;&amp;gt;&amp;lt;/htmltag&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|LcdqU4og2sg}}&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|fr7kRhhTtSg}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|ioW9RkHc6mc}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|yPpaRLFztAc}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|TYN2XZMem8E}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|zpq0cFM7vSk}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|jSMZU4spk7g}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|5aD-H7Pqg9s}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|YANEHZd-MbQ}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|uVqCS7wPUh4}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Publishing]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Fake_it!_HDSA_Video_Documentation&amp;diff=30204</id>
		<title>Fake it! HDSA Video Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Fake_it!_HDSA_Video_Documentation&amp;diff=30204"/>
		<updated>2024-01-29T16:12:21Z</updated>

		<summary type="html">&lt;p&gt;Fincato: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[File:Jamesvideogame.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
[[Juliette Lizotte]] documented the process of the [https://hackersanddesigners.nl/s/Summer_Academy_2018 Summer Academy 2018]. &lt;br /&gt;
&lt;br /&gt;
Find the daily video reports here: &lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|IFXIj7cK0TQ}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;htmltag tagname=&amp;quot;iframe&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;300&amp;quot; scrolling=&amp;quot;no&amp;quot; frameborder=&amp;quot;no&amp;quot; allow=&amp;quot;autoplay&amp;quot; src=&amp;quot;https://www.youtube.com/embed/IFXIj7cK0TQ?si=80L-Dm1rTdtz_53_&amp;quot;&amp;gt;&amp;lt;/htmltag&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|LcdqU4og2sg}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|fr7kRhhTtSg}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|ioW9RkHc6mc}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|yPpaRLFztAc}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|TYN2XZMem8E}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|zpq0cFM7vSk}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|jSMZU4spk7g}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|5aD-H7Pqg9s}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|YANEHZd-MbQ}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|uVqCS7wPUh4}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Publishing]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Test-deployment&amp;diff=29083</id>
		<title>Test-deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Test-deployment&amp;diff=29083"/>
		<updated>2023-10-04T09:41:40Z</updated>

		<summary type="html">&lt;p&gt;Fincato: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;HelloHello&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Test-deployment&amp;diff=29082</id>
		<title>Test-deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Test-deployment&amp;diff=29082"/>
		<updated>2023-10-04T09:41:11Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Created page with &amp;quot;Hello&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Server_Maintenance&amp;diff=28655</id>
		<title>Server Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Server_Maintenance&amp;diff=28655"/>
		<updated>2023-04-24T11:47:40Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Add notes on disk space usage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;H&amp;amp;D&#039;s VPS usually run on GNU/Linux Debian distribution.&lt;br /&gt;
&lt;br /&gt;
Updating the system once a week (or every two weeks) is kinda good. It&#039;s good to cross-check the [https://lists.debian.org/debian-lts-announce/ Debian mailing-list] (debian-lts-announce@lists.debian.org) beforehand to see if anything major needs a security update or particular care.&lt;br /&gt;
&lt;br /&gt;
To upgrade the system, your unix user needs to be in the &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; group. Following the basic process:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt update&amp;lt;/code&amp;gt; , upgrade local db packages&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt list --upgradable&amp;lt;/code&amp;gt; , show upgradable packages&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt upgrade&amp;lt;/code&amp;gt; , upgrade packages&lt;br /&gt;
&lt;br /&gt;
To list all installed packages, run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt list --installed&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disk space ==&lt;br /&gt;
As of 2023-04-24, the main sources of disk space usage are:&lt;br /&gt;
&lt;br /&gt;
* Chatty Pub&lt;br /&gt;
* Nextcloud&lt;br /&gt;
* Etherpad&lt;br /&gt;
* System logs&lt;br /&gt;
&lt;br /&gt;
=== Chatty Pub ===&lt;br /&gt;
Currently we are copying the whole Zulip files folder from the VPS where Zulip runs, to the VPS where Chatty Pub runs. The files folder amount to around 4.6 GB. &lt;br /&gt;
&lt;br /&gt;
It would be useful to allocate some time to the project again and look up if Zulip in the meanwhile extended their APIs to allow to fetch files, and eventually if this solves the problem we ran into 2 years ago when trying to do that.&lt;br /&gt;
&lt;br /&gt;
Another alternative option would be to update the codebase of Chatty Pub to detect which files needs to be copied over, instead of mirroring the whole files folder. This though seems harder than the first option.&lt;br /&gt;
&lt;br /&gt;
=== Nextcloud ===&lt;br /&gt;
We need to outline and agree on a set of rules on which files and especially how long do they live on Nextcloud. For instance:&lt;br /&gt;
&lt;br /&gt;
* are we using NC for long-term access storage? &lt;br /&gt;
* can NC be used for temporarily accessing files online and at some later point remove them (eventually with an archive option)? &lt;br /&gt;
&lt;br /&gt;
if we want to use NC for long-term storage (for eg replacing Google Drive, Dropbox, etc), then it would be wiser to setup another VPS for it, and use that disk space primarily for NC and other sharing / archive purposes.&lt;br /&gt;
&lt;br /&gt;
=== Etherpad ===&lt;br /&gt;
The Etherpad database in MySQL is around 1.3 GB. This is mostly due to how Etherpad uses MySQL (it dumps each pad&#039;s JSON entry as-is into a MysSQL column, and probably this does not allow MySQL to optimise disk space...).&lt;br /&gt;
&lt;br /&gt;
A possible idea on how to work around this constant growing size are, is to setup an archive system. For instance:&lt;br /&gt;
&lt;br /&gt;
* each pad &amp;quot;lives&amp;quot; for ~ 1 year, after which it is exported as HTML and removed from the MySQL database; see [https://git.vvvvvvaria.org/varia/etherpump etherpump]&lt;br /&gt;
** this also means that the pad&#039;s welcome text will display the 1 year duration as a reminder, and will share a link to where the archived pad will be found&lt;br /&gt;
** we also have to deal with the &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;__NOINDEX__&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; magic word and the private / public implication of this: if the pad is private, should it be archive after 1 year or not?&lt;br /&gt;
&lt;br /&gt;
=== MySQL ===&lt;br /&gt;
Handy command to check the size of each database:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
mysql db, check disk size:&lt;br /&gt;
    SELECT table_schema &amp;quot;database name&amp;quot;, sum( data_length + index_length ) / 1024 / 1024 &amp;quot;database size in MB&amp;quot;, sum( data_free )/ 1024 / 1024 &amp;quot;free space in MB&amp;quot; FROM information_schema.TABLES GROUP BY table_schema; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;You can also do:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
ls -lh /var/lib/mysql&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== System Logs ===&lt;br /&gt;
We set the system logs to be pruned (or deleted) every 6 day and growing for a maximum of 300 MB:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
journalctl --vacuum-time=6d --vacuum-size=300M&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;[https://unix.stackexchange.com/a/194058 See ref].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nginx&#039;&#039;&#039; logs were also growing up to 68 MB. Not as big as the 800 MB of the system journal, but still much more than the few KB of other programs. You can check and change the logrotate rules for Nginx, for instance, by doing:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
vi /etc/logrotate.d/nginx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Change &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; with any other available log file. [https://stackoverflow.com/a/72109330 See here] for more.{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Zulip_Maintenance&amp;diff=28654</id>
		<title>Zulip Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Zulip_Maintenance&amp;diff=28654"/>
		<updated>2023-04-07T20:28:29Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Add debug notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some rough notes on running Zulip:&lt;br /&gt;
&lt;br /&gt;
* it requires to run on its own VPS, eg it does not like if you setup other web services (with Nginx) on the same machine&lt;br /&gt;
* it needs something slightly more than a basic small VPS, as it runs Python and needs enough CPU and disk space to run decently&lt;br /&gt;
* in my experience (maybe due to having left-overs of other web services setup on the same machine, see first point), after each upgrade the HTTPS certificate would break&lt;br /&gt;
&lt;br /&gt;
Given this, the installation instruction are quite clear https://zulip.readthedocs.io/en/stable/production/install.html.&lt;br /&gt;
&lt;br /&gt;
=== Upgrading ===&lt;br /&gt;
Refer to the [https://zulip.readthedocs.io/en/stable/production/upgrade-or-modify.html#upgrading-to-a-release official docs]. We&#039;re not running Zulip inside Docker or patching Zulip, so the default instructions can be followed as-is.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
* SSH-login to the VPS&lt;br /&gt;
* download the latest version of Zulip: &amp;lt;code&amp;gt;curl -fLO &amp;lt;nowiki&amp;gt;https://download.zulip.com/server/zulip-server-latest.tar.gz&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* run this command: &amp;lt;code&amp;gt;sudo /home/zulip/deployments/current/scripts/upgrade-zulip zulip-server-latest.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* wait for the upgrade to take place and note if any errors is being reported during the process; during this time Zulip will be offline for a few minutes only (hopefully)&lt;br /&gt;
* as I&#039;m not sure if the HTTPS problem still happens after a Zulip upgrade, but I remove any left-over of Nginx from the system except Zulip&#039;s own files, I&#039;ll upgrade this entry after the next upgrade!&lt;br /&gt;
&lt;br /&gt;
Please check [https://zulip.readthedocs.io/en/stable/production/install.html#troubleshooting this Troubleshooting section] in case of problems (how to look up logs, debug, etc).&lt;br /&gt;
&lt;br /&gt;
=== Startup ===&lt;br /&gt;
In the case the VPS is being shut down and booted up again, Zulip might have some problems. At last, we figured Zulip&#039;s Nginx was clashing with a leftover instance of Apache — both instructed to restart on startup time and both trying to connect to port 80 (Nginx lost).&lt;br /&gt;
&lt;br /&gt;
To debug this, first check what&#039;s Zulip status:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
supervisorctl status&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Then try to restart Django / and or &amp;quot;everything&amp;quot;:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
supervisorctl restart zulip-django&lt;br /&gt;
&lt;br /&gt;
supervisorctl restart all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;In case nothing is still working, check Nginx status:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
systemctl status nginx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;If you get something like below, it could be Apache2 is still lingering around:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
dev.hackersanddesigners.nl nginx[3214]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)&lt;br /&gt;
dev.hackersanddesigners.nl nginx[3214]: nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Check what&#039;s running on port 80 and stop it:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
netstat -plant | grep 80&lt;br /&gt;
&lt;br /&gt;
systemctl stop apache2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Start back Nginx and Zulip should be running fine afterwards:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
systemctl start nginx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Systemd_setup&amp;diff=28605</id>
		<title>Systemd setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Systemd_setup&amp;diff=28605"/>
		<updated>2023-03-02T14:43:05Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Init&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Whether that&#039;s good or bad, we&#039;re using &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; to manage &amp;quot;services&amp;quot;, eg. running a website / web-app through some standard commands.&lt;br /&gt;
&lt;br /&gt;
What this allows is to:&lt;br /&gt;
&lt;br /&gt;
* run a specific program,&lt;br /&gt;
* check its status, &lt;br /&gt;
* restart it at will, &lt;br /&gt;
* tell systemd to start it automatically if we reboot the server, &lt;br /&gt;
* tell systemd to restart it automatically if the program crashes for some reasons, &lt;br /&gt;
* etc&lt;br /&gt;
&lt;br /&gt;
=== List services ===&lt;br /&gt;
You can run this command to list all services managed by systemd:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl list-units --type=service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;This shows everything, and not only the services added by a specific user. As of now (as far as I know, which is little), we&#039;re not creating services under a specific user but under root (?), so there might be way to better filter out this list.&lt;br /&gt;
&lt;br /&gt;
=== Add a service ===&lt;br /&gt;
To add a new service, follow these steps:&lt;br /&gt;
&lt;br /&gt;
* create a new file under &amp;lt;code&amp;gt;/etc/system/systemd&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;sudo touch /etc/system/systemd/&amp;lt;service-name&amp;gt;.service&amp;lt;/code&amp;gt; &lt;br /&gt;
* add the following as a starting point:&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=&amp;lt;service-name&amp;gt;&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=1&lt;br /&gt;
User=&amp;lt;user you want the web-app to run under&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WorkingDirectory=&amp;lt;path/to/web-app/&amp;gt;&lt;br /&gt;
ExecStart=&amp;lt;command to use to run the web-app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;This is a very simplified example, please lookup for more detailed references in case you have something more complex.&lt;br /&gt;
&lt;br /&gt;
As you can see in the service example above, we&#039;re telling systemd:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;: what&#039;s the name of the service&lt;br /&gt;
* &amp;lt;code&amp;gt;After&amp;lt;/code&amp;gt;: when systemd should start the program (eg after the OS network is up and running)&lt;br /&gt;
* &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Restart&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;User&amp;lt;/code&amp;gt;: hopefully, self-explanatory&lt;br /&gt;
* &amp;lt;code&amp;gt;WorkingDirectory&amp;lt;/code&amp;gt;: tells systemd we want to run our ExecStart command from a specific directory&lt;br /&gt;
* &amp;lt;code&amp;gt;WantedBy&amp;lt;/code&amp;gt;: I still don&#039;t understand what&#039;s this exactly, it seems necessary to let systemd know you want this service available&lt;br /&gt;
{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
After you created a new service file (or after you updated an existing one), you want to run this command to &amp;quot;refresh&amp;quot; systemd, so that it can see your new service:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl daemon-reload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Afterwards:&lt;br /&gt;
&lt;br /&gt;
* enable the service (to make it start at system boot / reboot): &amp;lt;code&amp;gt;sudo systemctl enable &amp;lt;service-name&amp;gt;.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* start the service: &amp;lt;code&amp;gt;sudo systemctl start &amp;lt;service-name&amp;gt;.service&amp;lt;/code&amp;gt;&lt;br /&gt;
* check its status: &amp;lt;code&amp;gt;sudo systemctl status &amp;lt;service-name&amp;gt;.service&amp;lt;/code&amp;gt;&lt;br /&gt;
* restart it (in case you modified something in the web-app for instance): &amp;lt;code&amp;gt;sudo systemctl restart &amp;lt;service-name&amp;gt;.service&amp;lt;/code&amp;gt;&lt;br /&gt;
* stop it: &amp;lt;code&amp;gt;sudo systemctl stop &amp;lt;service-name&amp;gt;.service&amp;lt;/code&amp;gt;&lt;br /&gt;
* disable the service: &amp;lt;code&amp;gt;sudo systemctl disable &amp;lt;service-name&amp;gt;.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Debugging ===&lt;br /&gt;
While running &amp;lt;code&amp;gt;sudo systemctl status &amp;lt;service-name&amp;gt;.service&amp;lt;/code&amp;gt; gives you an idea if the service is running fine or not, you don&#039;t get much more than that. Depending on your web-app setup (for instance), you might have setup a logging system. &lt;br /&gt;
&lt;br /&gt;
In that case, you can also use the &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt; to access it, by doing:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
sudo journalctl -e -u &amp;lt;service-name&amp;gt;.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt;: stands for &amp;quot;end&amp;quot;, and it shows you the end of the logging file, eg the latest entries in the log&lt;br /&gt;
* &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt;: stands for &amp;quot;unit&amp;quot; (I believe), and lets you filter out which logs to display, by setting the service name you want to inspect&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Systemd_setup&amp;diff=28604</id>
		<title>Systemd setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Systemd_setup&amp;diff=28604"/>
		<updated>2023-03-02T14:02:16Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Created page with &amp;quot;{{Article |MainNavigation=No }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Nginx_config_file&amp;diff=28603</id>
		<title>Nginx config file</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Nginx_config_file&amp;diff=28603"/>
		<updated>2023-03-02T14:01:41Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Change Category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We use Nginx as HTTP and proxy server. Though each new website might have its own needs, two general pattern are:&lt;br /&gt;
&lt;br /&gt;
* static content&lt;br /&gt;
* dynamic content served through a proxy reverse port&lt;br /&gt;
&lt;br /&gt;
=== Workflow ===&lt;br /&gt;
&lt;br /&gt;
* create a new folder under &amp;lt;code&amp;gt;/var/www&amp;lt;/code&amp;gt; and put your website code in there&lt;br /&gt;
* create a new file under &amp;lt;code&amp;gt;/etc/nginx/sites-available&amp;lt;/code&amp;gt; and name it after the website name (or something meaningful), then copy one of the two config setup below as a starting point and customize it based on the needs of your website&lt;br /&gt;
* create a symlink to &amp;lt;code&amp;gt;/etc/nginx/sites-enabled&amp;lt;/code&amp;gt; by doing:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ln -s /etc/nginx/sites-available/&amp;lt;new-website-config&amp;gt; /etc/nginx/sites-enabled/&amp;lt;new-website-config&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* check if there&#039;s any nginx config problem with &amp;lt;code&amp;gt;sudo nginx -t&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At this point you should have a basic setup working. Except we did not create a secure connection certificate for your website. So far we&#039;ve been relying on the &amp;lt;code&amp;gt;certbot&amp;lt;/code&amp;gt; program, which comes by using [https://letsencrypt.org Let&#039;s Encrypt]. So run the following commands:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo certbot&amp;lt;/code&amp;gt;, and you should get a list of all available domain names coming from the nginx config files — including the one you just created&lt;br /&gt;
* find the domain name of your new website and type its number&lt;br /&gt;
* usually we tell Certbot to force redirect any HTTP connection to HTTPS, you can decide this on a per-basis project in case it&#039;s not a good idea&lt;br /&gt;
* Certbot will update your website nginx config file with some more settings for using HTTPS&lt;br /&gt;
* test the website by visiting it!&lt;br /&gt;
&lt;br /&gt;
=== Static Content ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
&lt;br /&gt;
  root /var/www/&amp;lt;website-dir&amp;gt;;&lt;br /&gt;
  index index.html;&lt;br /&gt;
  &lt;br /&gt;
  server_name &amp;lt;website-url&amp;gt;;&lt;br /&gt;
  error_page  404  /&amp;lt;custom-404&amp;gt;.html;&lt;br /&gt;
  &lt;br /&gt;
  location / {&lt;br /&gt;
    try_files $uri $uri/ =404;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // add route to specific subpage&lt;br /&gt;
  location /&amp;lt;subpage&amp;gt; {&lt;br /&gt;
  	try_files $uri $uri/ =404;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // display page as list of files&lt;br /&gt;
  location /&amp;lt;files-share&amp;gt; {&lt;br /&gt;
  	try_files $uri $uri/ =404;&lt;br /&gt;
  	autoindex on;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Content served through a Proxy Reverse port ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	server_name &amp;lt;website&amp;gt;.com ;&lt;br /&gt;
&lt;br /&gt;
	root /var/www/&amp;lt;website&amp;gt;;&lt;br /&gt;
	access_log /var/log/nginx/&amp;lt;website&amp;gt;.access.log;&lt;br /&gt;
	error_log /var/log/nginx/&amp;lt;website&amp;gt;.error.log;&lt;br /&gt;
&lt;br /&gt;
  location / {&lt;br /&gt;
    proxy_pass         http://127.0.0.1:&amp;lt;port&amp;gt;;&lt;br /&gt;
    proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
    // example of proxy-headers for a Python application&lt;br /&gt;
    proxy_set_header   Host $http_host;&lt;br /&gt;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
    proxy_set_header   X-Forwarded-Proto $scheme;&lt;br /&gt;
    proxy_set_header   Upgrade $http_upgrade;&lt;br /&gt;
    proxy_redirect off;&lt;br /&gt;
    proxy_buffering off;&lt;br /&gt;
&lt;br /&gt;
    proxy_set_header   X-Real-IP $remote_addr;&lt;br /&gt;
    proxy_set_header   X-Forwarded-Host $server_name;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // example of resource caching&lt;br /&gt;
  location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf)$ {&lt;br /&gt;
    expires max;&lt;br /&gt;
    add_header Cache-Control &amp;quot;public, no-transform&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nginx config settings ===&lt;br /&gt;
Some common settings to add in &amp;lt;code&amp;gt;/etc/nginx/nginx.conf&amp;lt;/code&amp;gt;  to help speed up the server and add support for several resource types:&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_min_length 500;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
gzip_buffers 4 32k;&lt;br /&gt;
gzip_types&lt;br /&gt;
  application/atom+xml&lt;br /&gt;
  application/geo+json&lt;br /&gt;
  application/javascript&lt;br /&gt;
  application/x-javascript&lt;br /&gt;
  application/json&lt;br /&gt;
  application/ld+json&lt;br /&gt;
  application/manifest+json&lt;br /&gt;
  application/rdf+xml&lt;br /&gt;
  application/rss+xml&lt;br /&gt;
  application/xhtml+xml&lt;br /&gt;
  application/xml&lt;br /&gt;
  font/eot&lt;br /&gt;
  font/otf&lt;br /&gt;
  font/ttf&lt;br /&gt;
  image/svg+xml&lt;br /&gt;
  text/css&lt;br /&gt;
  text/javascript&lt;br /&gt;
  text/js&lt;br /&gt;
  text/plain&lt;br /&gt;
  text/xml;&lt;br /&gt;
gzip_disable &amp;quot;MSIE [1-6]\.&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Category:Infrastructure]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28602</id>
		<title>MediaWiki Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28602"/>
		<updated>2023-03-02T12:44:22Z</updated>

		<summary type="html">&lt;p&gt;Fincato: add clean up instructions.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
Upgrading MediaWiki, as it is in general installing it and using it (eg their APIs), is quite annoying. It definitely could be simplified in the process by writing like a Python script (well commented), but so far as I&#039;d used not to upgrade this software so often, it&#039;s all manual labour.&lt;br /&gt;
&lt;br /&gt;
The process can be divided in three steps:&lt;br /&gt;
&lt;br /&gt;
* backup the MySQL db and other parts  of the system (extensions, images, etc)&lt;br /&gt;
* download the newest version of the software, unpacking it, and prepare it&lt;br /&gt;
* replace current MediaWiki version with newly prepared version&lt;br /&gt;
&lt;br /&gt;
General, official, [[mediawikiwiki:Manual:Upgrading|reference document]] for upgrading the wiki software.&lt;br /&gt;
&lt;br /&gt;
=== Backup ===&lt;br /&gt;
Before starting the backup process (SQL dump), clear any &amp;quot;pending jobs&amp;quot; from the db:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Use &amp;lt;code&amp;gt;runJobs.php&amp;lt;/code&amp;gt; to run all [https://www.mediawiki.org/wiki/Manual:RunJobs.php pending jobs] and clear the queue before performing the upgrade.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then backup the MySQL database:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mysqldump --user=&amp;lt;wikidb_user&amp;gt; --password=&amp;lt;wikidb_userpassword&amp;gt; &amp;lt;wiki_db_name&amp;gt; &amp;gt; mw-backup-&amp;lt;yyyy-mm-dd&amp;gt;.sql&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;You can find the database&#039;s user, password and name under the Database settings in the &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file part of the MediaWiki folder.&lt;br /&gt;
&lt;br /&gt;
The official guide suggests to make also a backup of the image folder, the plugins, the skins, &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; etc, go ahead and do that. In this regard, it could be easier to make a backup copy of the entire MediaWiki directory under &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt;:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cp -r /var/wwww/mediawiki /var/www/mediawiki-bk-&amp;lt;yyyy-mm-dd&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;&amp;lt;yyyy-mm-dd&amp;gt;&amp;lt;/code&amp;gt; stands for current date in the form of, for instance, &amp;lt;code&amp;gt;2023-03-02&amp;lt;/code&amp;gt;. See [https://en.m.wikipedia.org/wiki/ISO_8601 ISO 8601].&lt;br /&gt;
&lt;br /&gt;
More info on [[mediawikiwiki:Manual:Backing_up_a_wiki|how to back up]] a MediaWiki installation. As well as [[mediawikiwiki:Manual:Restoring_a_wiki_from_backup|how to restore]] a MediaWiki from a backup.&lt;br /&gt;
&lt;br /&gt;
=== Download newest MediaWiki ===&lt;br /&gt;
I tend to keep zip / tarballs / installation files in my home folder, and then move to &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt; accordingly. Therefore:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt;&lt;br /&gt;
* fetch newest MediaWiki version, eg: &amp;lt;code&amp;gt;wget &amp;lt;nowiki&amp;gt;https://releases.wikimedia.org/mediawiki/1.39/mediawiki-1.39.2.tar.gz&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (refer to the [[mediawikiwiki:Manual:Upgrading#Command_line|official docs]] for the correct URL)&lt;br /&gt;
* unpack compressed file to a folder of the same name (eg &amp;lt;code&amp;gt;mediawiki-1.39.2&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;tar -xvzf mediawiki-1.39.2.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* delete compress file: &amp;lt;code&amp;gt;rm mediawiki-1.39.2.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Upgrade Mediawiki ===&lt;br /&gt;
Now we have:&lt;br /&gt;
&lt;br /&gt;
* a backup copy of the current MediaWiki at &amp;lt;code&amp;gt;/var/www/mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* the newer MediaWiki version at &amp;lt;code&amp;gt;~/mediawiki-&amp;lt;version.number&amp;gt;&amp;lt;/code&amp;gt;, for example  &amp;lt;code&amp;gt;~/mediawiki-1.39.2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let&#039;s first move &amp;lt;code&amp;gt;mediawiki-1.39.2&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/var/www:&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cp -r mediawiki-1.39.2 /var/www/.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;(This operation could be replaced by &amp;lt;code&amp;gt;sudo mv&amp;lt;/code&amp;gt; instead, up to you and to your level of comfort in dealing with unix and MediaWiki)&lt;br /&gt;
&lt;br /&gt;
Then we want to copy some of the files in &amp;lt;code&amp;gt;/var/www/mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/var/www/mediawiki-1.39.2&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* let&#039;s move to &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;cd /var/www&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* let&#039;s copy the image folder: &amp;lt;code&amp;gt;sudo cp -r mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/images mediawiki-1.39.2/.&amp;lt;/code&amp;gt;&lt;br /&gt;
** file and folder settings must be re-set afterwards, run: &lt;br /&gt;
*** &amp;lt;code&amp;gt;find ./mediawiki-1.39.2/images -type d -exec chmod 755 {} \;&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;chgrp -R www-data mediawiki-1.39.2/images&amp;lt;/code&amp;gt;&lt;br /&gt;
* let&#039;s copy the extensions folder: &amp;lt;code&amp;gt;sudo cp -r mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/extensions mediawiki-1.39.2/.&amp;lt;/code&amp;gt;&lt;br /&gt;
** To be fair: while this should work, it might break things.Generally speaking, extensions should be kept up-to-date or they might not work with a newer version of MediaWiki. You can see a list of installed extensions by visiting [[Special:Version|this page]] under the section &#039;&#039;Installed extensions&#039;&#039; and manually download each extension to the &amp;lt;code&amp;gt;extensions&amp;lt;/code&amp;gt; folder&lt;br /&gt;
** I would like to tell you you can simply run a command with PHP&#039;s Composer, but it breaks each time I use it (maybe in combination with how MediaWiki works), and it seems a better choice not to fix it... but you can if you want!&lt;br /&gt;
* let&#039;s copy the settings file: &amp;lt;code&amp;gt;sudo cp mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/LocalSettings.php mediawiki-1.39.2/.&amp;lt;/code&amp;gt;&lt;br /&gt;
* let&#039;s copy the custom image logo (inside the assets folder): &amp;lt;code&amp;gt;sudo cp -r mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/resources/assets mediawiki-1.39.2/resources/.&amp;lt;/code&amp;gt;&lt;br /&gt;
* let&#039;s copy the skins folder: &amp;lt;code&amp;gt;sudo cp -r mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/skins mediawiki-1.39.2/.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Refer to [[mediawikiwiki:Manual:Upgrading#Other_files|this official doc page]] for more.&lt;br /&gt;
&lt;br /&gt;
After this, we can run the upgrade command:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cd mediawiki-1.39.2&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;php maintenance/update.php&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Refer to the [[mediawikiwiki:Manual:Upgrading#Command_line_2|official docs section]] for any eventual problem. Usually this has been working flawlessly.&lt;br /&gt;
&lt;br /&gt;
=== Replace current MediaWiki with newer MediaWiki ===&lt;br /&gt;
We have an upgraded version of the MediaWiki software at &amp;lt;code&amp;gt;/var/www/mediawiki-1.39.2&amp;lt;/code&amp;gt;, and we want to use it instead of the current one at &amp;lt;code&amp;gt;/var/www/mediawiki&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* move the current version elsewhere: &amp;lt;code&amp;gt;sudo mv mediawiki ~/.&amp;lt;/code&amp;gt;&lt;br /&gt;
* rename newest version to default name: &amp;lt;code&amp;gt;sudo mv mediawiki-1.39.2 mediawiki&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
After this, visit [https://wiki.hackersanddesigners.nl wiki.hackersanddesigners.nl] and check if things are working!&lt;br /&gt;
&lt;br /&gt;
=== Clean up ===&lt;br /&gt;
When all it&#039;s good, remove the following directories:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo rm -rf /var/www/mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo rm -rf ~/mediawiki-1.39.2&amp;lt;/code&amp;gt; (only if you made a copy (&amp;lt;code&amp;gt;cp -r&amp;lt;/code&amp;gt;) of the directory from &amp;lt;code&amp;gt;~/.&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt;, instead of moving it (&amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt;))&lt;br /&gt;
&lt;br /&gt;
=== Debugging ===&lt;br /&gt;
No specific techniques, besides:&lt;br /&gt;
&lt;br /&gt;
* reading the printed error messages on the wiki website&lt;br /&gt;
* check the Nginx logs by checking:&lt;br /&gt;
** access log: &amp;lt;code&amp;gt;/var/log/nginx/mediawiki.access.log&amp;lt;/code&amp;gt;&lt;br /&gt;
** error log: &amp;lt;code&amp;gt;/var/log/nginx/mediawiki.error.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28601</id>
		<title>MediaWiki Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28601"/>
		<updated>2023-03-02T12:05:54Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Add debugging&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
Upgrading MediaWiki, as it is in general installing it and using it (eg their APIs), is quite annoying. It definitely could be simplified in the process by writing like a Python script (well commented), but so far as I&#039;d used not to upgrade this software so often, it&#039;s all manual labour.&lt;br /&gt;
&lt;br /&gt;
The process can be divided in three steps:&lt;br /&gt;
&lt;br /&gt;
* backup the MySQL db and other parts  of the system&lt;br /&gt;
* download the newest version of the software, unpacking it, move it to &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt;&lt;br /&gt;
* make backup copy of current MediaWiki folder in &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt; and copy to the newer version all plugins from current / previous version&lt;br /&gt;
&lt;br /&gt;
General, official, [[mediawikiwiki:Manual:Upgrading|reference document]] for upgrading the wiki software.&lt;br /&gt;
&lt;br /&gt;
=== Backup ===&lt;br /&gt;
Before starting the backup process (SQL dump), clear any &amp;quot;pending jobs&amp;quot; from the db:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Use &amp;lt;code&amp;gt;runJobs.php&amp;lt;/code&amp;gt; to run all [https://www.mediawiki.org/wiki/Manual:RunJobs.php pending jobs] and clear the queue before performing the upgrade.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then backup the MySQL database:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mysqldump --user=&amp;lt;wikidb_user&amp;gt; --password=&amp;lt;wikidb_userpassword&amp;gt; &amp;lt;wiki_db_name&amp;gt; &amp;gt; mw-backup-&amp;lt;yyyy-mm-dd&amp;gt;.sql&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;You can find the database&#039;s user, password and name under the Database settings in the &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file part of the MediaWiki folder.&lt;br /&gt;
&lt;br /&gt;
The official guide suggests to make also a backup of the image folder, the plugins, the skins, &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; etc, go ahead and do that. In this regard, it could be easier to make a backup copy of the entire MediaWiki directory under &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt;:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cp -r /var/wwww/mediawiki /var/www/mediawiki-bk-&amp;lt;yyyy-mm-dd&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;&amp;lt;yyyy-mm-dd&amp;gt;&amp;lt;/code&amp;gt; stands for current date in the form of, for instance, &amp;lt;code&amp;gt;2023-03-02&amp;lt;/code&amp;gt;. See [https://en.m.wikipedia.org/wiki/ISO_8601 ISO 8601].&lt;br /&gt;
&lt;br /&gt;
More info on [[mediawikiwiki:Manual:Backing_up_a_wiki|how to back up]] a MediaWiki installation. As well as [[mediawikiwiki:Manual:Restoring_a_wiki_from_backup|how to restore]] a MediaWiki from a backup.&lt;br /&gt;
&lt;br /&gt;
=== Download newest MediaWiki ===&lt;br /&gt;
I tend to keep zip / tarballs / installation files in my home folder, and then move to &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt; accordingly. Therefore:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt;&lt;br /&gt;
* fetch newest MediaWiki version, eg: &amp;lt;code&amp;gt;wget &amp;lt;nowiki&amp;gt;https://releases.wikimedia.org/mediawiki/1.39/mediawiki-1.39.2.tar.gz&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (refer to the [[mediawikiwiki:Manual:Upgrading#Command_line|official docs]] for the correct URL)&lt;br /&gt;
* unpack compressed file to a folder of the same name (eg &amp;lt;code&amp;gt;mediawiki-1.39.2&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;tar -xvzf mediawiki-1.39.2.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* delete compress file: &amp;lt;code&amp;gt;rm mediawiki-1.39.2.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Upgrade Mediawiki ===&lt;br /&gt;
Now we have:&lt;br /&gt;
&lt;br /&gt;
* a backup copy of the current MediaWiki at &amp;lt;code&amp;gt;/var/www/mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* the newer MediaWiki version at &amp;lt;code&amp;gt;~/mediawiki-&amp;lt;version.number&amp;gt;&amp;lt;/code&amp;gt;, for example  &amp;lt;code&amp;gt;~/mediawiki-1.39.2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let&#039;s first move &amp;lt;code&amp;gt;mediawiki-1.39.2&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/var/www:&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cp -r mediawiki-1.39.2 /var/www/.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Then we want to copy some of the files in &amp;lt;code&amp;gt;/var/www/mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/var/www/mediawiki-1.39.2&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* let&#039;s move to &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;cd /var/www&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* let&#039;s copy the image folder: &amp;lt;code&amp;gt;sudo cp -r mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/images mediawiki-1.39.2/.&amp;lt;/code&amp;gt;&lt;br /&gt;
** file and folder settings must be re-set afterwards, run: &lt;br /&gt;
*** &amp;lt;code&amp;gt;find ./mediawiki-1.39.2/images -type d -exec chmod 755 {} \;&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;chgrp -R www-data mediawiki-1.39.2/images&amp;lt;/code&amp;gt;&lt;br /&gt;
* let&#039;s copy the extensions folder: &amp;lt;code&amp;gt;sudo cp -r mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/extensions mediawiki-1.39.2/.&amp;lt;/code&amp;gt;&lt;br /&gt;
** To be fair: while this should work, it might break things.Generally speaking, extensions should be kept up-to-date or they might not work with a newer version of MediaWiki. You can see a list of installed extensions by visiting [[Special:Version|this page]] under the section &#039;&#039;Installed extensions&#039;&#039; and manually download each extension to the &amp;lt;code&amp;gt;extensions&amp;lt;/code&amp;gt; folder&lt;br /&gt;
** I would like to tell you you can simply run a command with PHP&#039;s Composer, but it breaks each time I use it (maybe in combination with how MediaWiki works), and it seems a better choice not to fix it... but you can if you want!&lt;br /&gt;
* let&#039;s copy the settings file: &amp;lt;code&amp;gt;sudo cp mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/LocalSettings.php mediawiki-1.39.2/.&amp;lt;/code&amp;gt;&lt;br /&gt;
* let&#039;s copy the custom image logo (inside the assets folder): &amp;lt;code&amp;gt;sudo cp -r mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/resources/assets mediawiki-1.39.2/resources/.&amp;lt;/code&amp;gt;&lt;br /&gt;
* let&#039;s copy the skins folder: &amp;lt;code&amp;gt;sudo cp -r mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/skins mediawiki-1.39.2/.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Refer to [[mediawikiwiki:Manual:Upgrading#Other_files|this official doc page]] for more.&lt;br /&gt;
&lt;br /&gt;
After this, we can run the upgrade command:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cd mediawiki-1.39.2&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;php maintenance/update.php&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Refer to the [[mediawikiwiki:Manual:Upgrading#Command_line_2|official docs section]] for any eventual problem. Usually this has been working flawlessly.&lt;br /&gt;
&lt;br /&gt;
=== Replace current MediaWiki with newer MediaWiki ===&lt;br /&gt;
We have an upgraded version of the MediaWiki software at &amp;lt;code&amp;gt;/var/www/mediawiki-1.39.2&amp;lt;/code&amp;gt;, and we want to use it instead of the current one at &amp;lt;code&amp;gt;/var/www/mediawiki&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* move the current version elsewhere: &amp;lt;code&amp;gt;sudo mv mediawiki ~/.&amp;lt;/code&amp;gt;&lt;br /&gt;
* rename newest version to default name: &amp;lt;code&amp;gt;sudo mv mediawiki-1.39.2 mediawiki&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
After this, visit [https://wiki.hackersanddesigners.nl wiki.hackersanddesigners.nl] and check if things are working!&lt;br /&gt;
&lt;br /&gt;
=== Debugging ===&lt;br /&gt;
No specific techniques, besides:&lt;br /&gt;
&lt;br /&gt;
* reading the printed error messages on the wiki website&lt;br /&gt;
* check the Nginx logs by checking:&lt;br /&gt;
** access log: &amp;lt;code&amp;gt;/var/log/nginx/mediawiki.access.log&amp;lt;/code&amp;gt;&lt;br /&gt;
** error log: &amp;lt;code&amp;gt;/var/log/nginx/mediawiki.error.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28600</id>
		<title>MediaWiki Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28600"/>
		<updated>2023-03-02T12:00:29Z</updated>

		<summary type="html">&lt;p&gt;Fincato: fix blockquote&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
Upgrading MediaWiki, as it is in general installing it and using it (eg their APIs), is quite annoying. It definitely could be simplified in the process by writing like a Python script (well commented), but so far as I&#039;d used not to upgrade this software so often, it&#039;s all manual labour.&lt;br /&gt;
&lt;br /&gt;
The process can be divided in three steps:&lt;br /&gt;
&lt;br /&gt;
* backup the MySQL db and other parts  of the system&lt;br /&gt;
* download the newest version of the software, unpacking it, move it to &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt;&lt;br /&gt;
* make backup copy of current MediaWiki folder in &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt; and copy to the newer version all plugins from current / previous version&lt;br /&gt;
&lt;br /&gt;
General, official, [[mediawikiwiki:Manual:Upgrading|reference document]] for upgrading the wiki software.&lt;br /&gt;
&lt;br /&gt;
=== Backup ===&lt;br /&gt;
Before starting the backup process (SQL dump), clear any &amp;quot;pending jobs&amp;quot; from the db:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Use &amp;lt;code&amp;gt;runJobs.php&amp;lt;/code&amp;gt; to run all [https://www.mediawiki.org/wiki/Manual:RunJobs.php pending jobs] and clear the queue before performing the upgrade.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then backup the MySQL database:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mysqldump --user=&amp;lt;wikidb_user&amp;gt; --password=&amp;lt;wikidb_userpassword&amp;gt; &amp;lt;wiki_db_name&amp;gt; &amp;gt; mw-backup-&amp;lt;yyyy-mm-dd&amp;gt;.sql&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;You can find the database&#039;s user, password and name under the Database settings in the &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file part of the MediaWiki folder.&lt;br /&gt;
&lt;br /&gt;
The official guide suggests to make also a backup of the image folder, the plugins, the skins, &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; etc, go ahead and do that. In this regard, it could be easier to make a backup copy of the entire MediaWiki directory under &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt;:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cp -r /var/wwww/mediawiki /var/www/mediawiki-bk-&amp;lt;yyyy-mm-dd&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;&amp;lt;yyyy-mm-dd&amp;gt;&amp;lt;/code&amp;gt; stands for current date in the form of, for instance, &amp;lt;code&amp;gt;2023-03-02&amp;lt;/code&amp;gt;. See [https://en.m.wikipedia.org/wiki/ISO_8601 ISO 8601].&lt;br /&gt;
&lt;br /&gt;
More info on [[mediawikiwiki:Manual:Backing_up_a_wiki|how to back up]] a MediaWiki installation. As well as [[mediawikiwiki:Manual:Restoring_a_wiki_from_backup|how to restore]] a MediaWiki from a backup.&lt;br /&gt;
&lt;br /&gt;
=== Download newest MediaWiki ===&lt;br /&gt;
I tend to keep zip / tarballs / installation files in my home folder, and then move to &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt; accordingly. Therefore:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt;&lt;br /&gt;
* fetch newest MediaWiki version, eg: &amp;lt;code&amp;gt;wget &amp;lt;nowiki&amp;gt;https://releases.wikimedia.org/mediawiki/1.39/mediawiki-1.39.2.tar.gz&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (refer to the [[mediawikiwiki:Manual:Upgrading#Command_line|official docs]] for the correct URL)&lt;br /&gt;
* unpack compressed file to a folder of the same name (eg &amp;lt;code&amp;gt;mediawiki-1.39.2&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;tar -xvzf mediawiki-1.39.2.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* delete compress file: &amp;lt;code&amp;gt;rm mediawiki-1.39.2.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Upgrade Mediawiki ===&lt;br /&gt;
Now we have:&lt;br /&gt;
&lt;br /&gt;
* a backup copy of the current MediaWiki at &amp;lt;code&amp;gt;/var/www/mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* the newer MediaWiki version at &amp;lt;code&amp;gt;~/mediawiki-&amp;lt;version.number&amp;gt;&amp;lt;/code&amp;gt;, for example  &amp;lt;code&amp;gt;~/mediawiki-1.39.2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let&#039;s first move &amp;lt;code&amp;gt;mediawiki-1.39.2&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/var/www:&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cp -r mediawiki-1.39.2 /var/www/.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Then we want to copy some of the files in &amp;lt;code&amp;gt;/var/www/mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/var/www/mediawiki-1.39.2&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* let&#039;s move to &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;cd /var/www&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* let&#039;s copy the image folder: &amp;lt;code&amp;gt;sudo cp -r mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/images mediawiki-1.39.2/.&amp;lt;/code&amp;gt;&lt;br /&gt;
** file and folder settings must be re-set afterwards, run: &lt;br /&gt;
*** &amp;lt;code&amp;gt;find ./mediawiki-1.39.2/images -type d -exec chmod 755 {} \;&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;chgrp -R www-data mediawiki-1.39.2/images&amp;lt;/code&amp;gt;&lt;br /&gt;
* let&#039;s copy the extensions folder: &amp;lt;code&amp;gt;sudo cp -r mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/extensions mediawiki-1.39.2/.&amp;lt;/code&amp;gt;&lt;br /&gt;
** To be fair: while this should work, it might break things.Generally speaking, extensions should be kept up-to-date or they might not work with a newer version of MediaWiki. You can see a list of installed extensions by visiting [[Special:Version|this page]] under the section &#039;&#039;Installed extensions&#039;&#039; and manually download each extension to the &amp;lt;code&amp;gt;extensions&amp;lt;/code&amp;gt; folder&lt;br /&gt;
** I would like to tell you you can simply run a command with PHP&#039;s Composer, but it breaks each time I use it (maybe in combination with how MediaWiki works), and it seems a better choice not to fix it... but you can if you want!&lt;br /&gt;
* let&#039;s copy the settings file: &amp;lt;code&amp;gt;sudo cp mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/LocalSettings.php mediawiki-1.39.2/.&amp;lt;/code&amp;gt;&lt;br /&gt;
* let&#039;s copy the custom image logo (inside the assets folder): &amp;lt;code&amp;gt;sudo cp -r mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/resources/assets mediawiki-1.39.2/resources/.&amp;lt;/code&amp;gt;&lt;br /&gt;
* let&#039;s copy the skins folder: &amp;lt;code&amp;gt;sudo cp -r mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/skins mediawiki-1.39.2/.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Refer to [[mediawikiwiki:Manual:Upgrading#Other_files|this official doc page]] for more.&lt;br /&gt;
&lt;br /&gt;
After this, we can run the upgrade command:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cd mediawiki-1.39.2&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;php maintenance/update.php&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Refer to the [[mediawikiwiki:Manual:Upgrading#Command_line_2|official docs section]] for any eventual problem. Usually this has been working flawlessly.&lt;br /&gt;
&lt;br /&gt;
=== Replace current MediaWiki with newer MediaWiki ===&lt;br /&gt;
We have an upgraded version of the MediaWiki software at &amp;lt;code&amp;gt;/var/www/mediawiki-1.39.2&amp;lt;/code&amp;gt;, and we want to use it instead of the current one at &amp;lt;code&amp;gt;/var/www/mediawiki&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* move the current version elsewhere: &amp;lt;code&amp;gt;sudo mv mediawiki ~/.&amp;lt;/code&amp;gt;&lt;br /&gt;
* rename newest version to default name: &amp;lt;code&amp;gt;sudo mv mediawiki-1.39.2 mediawiki&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
After this, visit [https://wiki.hackersanddesigners.nl wiki.hackersanddesigners.nl] and check if things are working!&lt;br /&gt;
&lt;br /&gt;
=== Debugging ===&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28599</id>
		<title>MediaWiki Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28599"/>
		<updated>2023-03-02T11:58:19Z</updated>

		<summary type="html">&lt;p&gt;Fincato: init&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
Upgrading MediaWiki, as it is in general installing it and using it (eg their APIs), is quite annoying. It definitely could be simplified in the process by writing like a Python script (well commented), but so far as I&#039;d used not to upgrade this software so often, it&#039;s all manual labour.&lt;br /&gt;
&lt;br /&gt;
The process can be divided in three steps:&lt;br /&gt;
&lt;br /&gt;
* backup the MySQL db and other parts  of the system&lt;br /&gt;
* download the newest version of the software, unpacking it, move it to &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt;&lt;br /&gt;
* make backup copy of current MediaWiki folder in &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt; and copy to the newer version all plugins from current / previous version&lt;br /&gt;
&lt;br /&gt;
General, official, [[mediawikiwiki:Manual:Upgrading|reference document]] for upgrading the wiki software.&lt;br /&gt;
&lt;br /&gt;
=== Backup ===&lt;br /&gt;
Before starting the backup process (SQL dump), clear any &amp;quot;pending jobs&amp;quot; from the db:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Use &amp;lt;code&amp;gt;runJobs.php&amp;lt;/code&amp;gt; to run all [https://www.mediawiki.org/wiki/Manual:RunJobs.php pending jobs] and clear the queue before performing the upgrade.Then backup the MySQL database:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mysqldump --user=&amp;lt;wikidb_user&amp;gt; --password=&amp;lt;wikidb_userpassword&amp;gt; &amp;lt;wiki_db_name&amp;gt; &amp;gt; mw-backup-&amp;lt;yyyy-mm-dd&amp;gt;.sql&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;You can find the database&#039;s user, password and name under the Database settings in the &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file part of the MediaWiki folder.&lt;br /&gt;
&lt;br /&gt;
The official guide suggests to make also a backup of the image folder, the plugins, the skins, &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; etc, go ahead and do that. In this regard, it could be easier to make a backup copy of the entire MediaWiki directory under &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt;:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cp -r /var/wwww/mediawiki /var/www/mediawiki-bk-&amp;lt;yyyy-mm-dd&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;&amp;lt;yyyy-mm-dd&amp;gt;&amp;lt;/code&amp;gt; stands for current date in the form of, for instance, &amp;lt;code&amp;gt;2023-03-02&amp;lt;/code&amp;gt;. See [https://en.m.wikipedia.org/wiki/ISO_8601 ISO 8601].&lt;br /&gt;
&lt;br /&gt;
More info on [[mediawikiwiki:Manual:Backing_up_a_wiki|how to back up]] a MediaWiki installation. As well as [[mediawikiwiki:Manual:Restoring_a_wiki_from_backup|how to restore]] a MediaWiki from a backup.&lt;br /&gt;
&lt;br /&gt;
=== Download newest MediaWiki ===&lt;br /&gt;
I tend to keep zip / tarballs / installation files in my home folder, and then move to &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt; accordingly. Therefore:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt;&lt;br /&gt;
* fetch newest MediaWiki version, eg: &amp;lt;code&amp;gt;wget &amp;lt;nowiki&amp;gt;https://releases.wikimedia.org/mediawiki/1.39/mediawiki-1.39.2.tar.gz&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (refer to the [[mediawikiwiki:Manual:Upgrading#Command_line|official docs]] for the correct URL)&lt;br /&gt;
* unpack compressed file to a folder of the same name (eg &amp;lt;code&amp;gt;mediawiki-1.39.2&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;tar -xvzf mediawiki-1.39.2.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* delete compress file: &amp;lt;code&amp;gt;rm mediawiki-1.39.2.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Upgrade Mediawiki ===&lt;br /&gt;
Now we have:&lt;br /&gt;
&lt;br /&gt;
* a backup copy of the current MediaWiki at &amp;lt;code&amp;gt;/var/www/mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* the newer MediaWiki version at &amp;lt;code&amp;gt;~/mediawiki-&amp;lt;version.number&amp;gt;&amp;lt;/code&amp;gt;, for example  &amp;lt;code&amp;gt;~/mediawiki-1.39.2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let&#039;s first move &amp;lt;code&amp;gt;mediawiki-1.39.2&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/var/www:&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cp -r mediawiki-1.39.2 /var/www/.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Then we want to copy some of the files in &amp;lt;code&amp;gt;/var/www/mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/var/www/mediawiki-1.39.2&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* let&#039;s move to &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;cd /var/www&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* let&#039;s copy the image folder: &amp;lt;code&amp;gt;sudo cp -r mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/images mediawiki-1.39.2/.&amp;lt;/code&amp;gt;&lt;br /&gt;
** file and folder settings must be re-set afterwards, run: &lt;br /&gt;
*** &amp;lt;code&amp;gt;find ./mediawiki-1.39.2/images -type d -exec chmod 755 {} \;&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;chgrp -R www-data mediawiki-1.39.2/images&amp;lt;/code&amp;gt;&lt;br /&gt;
* let&#039;s copy the extensions folder: &amp;lt;code&amp;gt;sudo cp -r mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/extensions mediawiki-1.39.2/.&amp;lt;/code&amp;gt;&lt;br /&gt;
** To be fair: while this should work, it might break things.Generally speaking, extensions should be kept up-to-date or they might not work with a newer version of MediaWiki. You can see a list of installed extensions by visiting [[Special:Version|this page]] under the section &#039;&#039;Installed extensions&#039;&#039; and manually download each extension to the &amp;lt;code&amp;gt;extensions&amp;lt;/code&amp;gt; folder&lt;br /&gt;
** I would like to tell you you can simply run a command with PHP&#039;s Composer, but it breaks each time I use it (maybe in combination with how MediaWiki works), and it seems a better choice not to fix it... but you can if you want!&lt;br /&gt;
* let&#039;s copy the settings file: &amp;lt;code&amp;gt;sudo cp mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/LocalSettings.php mediawiki-1.39.2/.&amp;lt;/code&amp;gt;&lt;br /&gt;
* let&#039;s copy the custom image logo (inside the assets folder): &amp;lt;code&amp;gt;sudo cp -r mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/resources/assets mediawiki-1.39.2/resources/.&amp;lt;/code&amp;gt;&lt;br /&gt;
* let&#039;s copy the skins folder: &amp;lt;code&amp;gt;sudo cp -r mediawiki-&amp;lt;yyyy-mm-dd&amp;gt;/skins mediawiki-1.39.2/.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Refer to [[mediawikiwiki:Manual:Upgrading#Other_files|this official doc page]] for more.&lt;br /&gt;
&lt;br /&gt;
After this, we can run the upgrade command:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cd mediawiki-1.39.2&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;php maintenance/update.php&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Refer to the [[mediawikiwiki:Manual:Upgrading#Command_line_2|official docs section]] for any eventual problem. Usually this has been working flawlessly.&lt;br /&gt;
&lt;br /&gt;
=== Replace current MediaWiki with newer MediaWiki ===&lt;br /&gt;
We have an upgraded version of the MediaWiki software at &amp;lt;code&amp;gt;/var/www/mediawiki-1.39.2&amp;lt;/code&amp;gt;, and we want to use it instead of the current one at &amp;lt;code&amp;gt;/var/www/mediawiki&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* move the current version elsewhere: &amp;lt;code&amp;gt;sudo mv mediawiki ~/.&amp;lt;/code&amp;gt;&lt;br /&gt;
* rename newest version to default name: &amp;lt;code&amp;gt;sudo mv mediawiki-1.39.2 mediawiki&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
After this, visit [https://wiki.hackersanddesigners.nl wiki.hackersanddesigners.nl] and check if things are working!&lt;br /&gt;
&lt;br /&gt;
=== Debugging ===&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28598</id>
		<title>MediaWiki Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28598"/>
		<updated>2023-03-02T10:53:49Z</updated>

		<summary type="html">&lt;p&gt;Fincato: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
Upgrading MediaWiki, as it is in general installing it and using it (eg their APIs), is quite annoying. It definitely could be simplified in the process by writing like a Python script (well commented), but so far as I&#039;d used not to upgrade this software so often, it&#039;s all manual labour.&lt;br /&gt;
&lt;br /&gt;
The process can be divided in three steps:&lt;br /&gt;
&lt;br /&gt;
* backup the MySQL db and other parts  of the system&lt;br /&gt;
* download the newest version of the software, unpacking it, move it to &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt;&lt;br /&gt;
* make backup copy of current MediaWiki folder in &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt; and copy to the newer version all plugins from current / previous version&lt;br /&gt;
&lt;br /&gt;
General, official, [[mediawikiwiki:Manual:Upgrading|reference document]] for upgrading the wiki software.&lt;br /&gt;
&lt;br /&gt;
=== Backup ===&lt;br /&gt;
Before starting the backup process (SQL dump), clear any &amp;quot;pending jobs&amp;quot; from the db:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Use &amp;lt;code&amp;gt;runJobs.php&amp;lt;/code&amp;gt; to run all [https://www.mediawiki.org/wiki/Manual:RunJobs.php pending jobs] and clear the queue before performing the upgrade.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28597</id>
		<title>MediaWiki Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28597"/>
		<updated>2023-03-02T10:53:25Z</updated>

		<summary type="html">&lt;p&gt;Fincato: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
Upgrading MediaWiki, as it is in general installing it and using it (eg their APIs), is quite annoying. It definitely could be simplified in the process by writing like a Python script (well commented), but so far as I&#039;d used not to upgrade this software so often, it&#039;s all manual labour.&lt;br /&gt;
&lt;br /&gt;
The process can be divided in three steps:&lt;br /&gt;
&lt;br /&gt;
* backup the MySQL db and other parts  of the system&lt;br /&gt;
* download the newest version of the software, unpacking it, move it to &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt;&lt;br /&gt;
* make backup copy of current MediaWiki folder in &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt; and copy to the newer version all plugins from current / previous version&lt;br /&gt;
&lt;br /&gt;
General, official, [[mediawikiwiki:Manual:Upgrading|reference document]] for upgrading the wiki software.&lt;br /&gt;
&lt;br /&gt;
=== Backup ===&lt;br /&gt;
Before starting the backup process (SQL dump), clear any &amp;quot;pending jobs&amp;quot; from the db:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Use runJobs.php to run all [https://www.mediawiki.org/wiki/Manual:RunJobs.php pending jobs] and clear the queue before performing the upgrade.&lt;br /&gt;
&amp;lt;/blockquote&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28596</id>
		<title>MediaWiki Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28596"/>
		<updated>2023-03-02T10:52:41Z</updated>

		<summary type="html">&lt;p&gt;Fincato: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Upgrading MediaWiki, as it is in general installing it and using it (eg their APIs), is quite annoying. It definitely could be simplified in the process by writing like a Python script (well commented), but so far as I&#039;d used not to upgrade this software so often, it&#039;s all manual labour.&lt;br /&gt;
&lt;br /&gt;
The process can be divided in three steps:&lt;br /&gt;
&lt;br /&gt;
* backup the MySQL db and other parts  of the system&lt;br /&gt;
* download the newest version of the software, unpacking it, move it to &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt;&lt;br /&gt;
* make backup copy of current MediaWiki folder in &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt; and copy to the newer version all plugins from current / previous version&lt;br /&gt;
&lt;br /&gt;
General, official, [[mediawikiwiki:Manual:Upgrading|reference document]] for upgrading the wiki software.&lt;br /&gt;
&lt;br /&gt;
=== Backup ===&lt;br /&gt;
Before starting the backup process (SQL dump), clear any &amp;quot;pending jobs&amp;quot; from the db:&lt;br /&gt;
&lt;br /&gt;
{{Blockquote&lt;br /&gt;
|text=Use runJobs.php to run all [https://www.mediawiki.org/wiki/Manual:RunJobs.php pending jobs] and clear the queue before performing the upgrade.&lt;br /&gt;
|source=https://www.mediawiki.org/wiki/Manual:Upgrading#Clear_pending_jobs&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28595</id>
		<title>MediaWiki Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28595"/>
		<updated>2023-03-02T10:48:38Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Init&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Upgrading MediaWiki, as it is in general installing it and using it (eg their APIs), is quite annoying. It definitely could be simplified in the process by writing like a Python script (well commented), but so far as I&#039;d used not to upgrade this software so often, it&#039;s all manual labour.&lt;br /&gt;
&lt;br /&gt;
The process can be divided in three steps:&lt;br /&gt;
&lt;br /&gt;
* backup the MySQL db and other parts  of the system&lt;br /&gt;
* download the newest version of the software, unpacking it, move it to &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt;&lt;br /&gt;
* make backup copy of current MediaWiki folder in &amp;lt;code&amp;gt;/var/www/&amp;lt;/code&amp;gt; and copy to the newer version all plugins from current / previous version&lt;br /&gt;
&lt;br /&gt;
General, official, [[mediawikiwiki:Manual:Upgrading|reference document]] for upgrading the wiki software.&lt;br /&gt;
&lt;br /&gt;
=== Backup ===&lt;br /&gt;
Before starting the backup process (SQL dump), clear any &amp;quot;pending jobs&amp;quot; from the db:&lt;br /&gt;
&lt;br /&gt;
{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28594</id>
		<title>MediaWiki Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=MediaWiki_Maintenance&amp;diff=28594"/>
		<updated>2023-03-02T10:39:02Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Created page with &amp;quot;{{Article |MainNavigation=No }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Zulip_Maintenance&amp;diff=28593</id>
		<title>Zulip Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Zulip_Maintenance&amp;diff=28593"/>
		<updated>2023-03-02T10:28:44Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Init&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some rough notes on running Zulip:&lt;br /&gt;
&lt;br /&gt;
* it requires to run on its own VPS, eg it does not like if you setup other web services (with Nginx) on the same machine&lt;br /&gt;
* it needs something slightly more than a basic small VPS, as it runs Python and needs enough CPU and disk space to run decently&lt;br /&gt;
* in my experience (maybe due to having left-overs of other web services setup on the same machine, see first point), after each upgrade the HTTPS certificate would break&lt;br /&gt;
&lt;br /&gt;
Given this, the installation instruction are quite clear https://zulip.readthedocs.io/en/stable/production/install.html.&lt;br /&gt;
&lt;br /&gt;
=== Upgrading ===&lt;br /&gt;
Refer to the [https://zulip.readthedocs.io/en/stable/production/upgrade-or-modify.html#upgrading-to-a-release official docs]. We&#039;re not running Zulip inside Docker or patching Zulip, so the default instructions can be followed as-is.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
* SSH-login to the VPS&lt;br /&gt;
* download the latest version of Zulip: &amp;lt;code&amp;gt;curl -fLO &amp;lt;nowiki&amp;gt;https://download.zulip.com/server/zulip-server-latest.tar.gz&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* run this command: &amp;lt;code&amp;gt;sudo /home/zulip/deployments/current/scripts/upgrade-zulip zulip-server-latest.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* wait for the upgrade to take place and note if any errors is being reported during the process; during this time Zulip will be offline for a few minutes only (hopefully)&lt;br /&gt;
* as I&#039;m not sure if the HTTPS problem still happens after a Zulip upgrade, but I remove any left-over of Nginx from the system except Zulip&#039;s own files, I&#039;ll upgrade this entry after the next upgrade!&lt;br /&gt;
&lt;br /&gt;
Please check [https://zulip.readthedocs.io/en/stable/production/install.html#troubleshooting this Troubleshooting section] in case of problems (how to look up logs, debug, etc).{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Zulip_Maintenance&amp;diff=28592</id>
		<title>Zulip Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Zulip_Maintenance&amp;diff=28592"/>
		<updated>2023-03-02T10:11:01Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Created page with &amp;quot;{{Article |MainNavigation=No }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Nginx_config_file&amp;diff=28591</id>
		<title>Nginx config file</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Nginx_config_file&amp;diff=28591"/>
		<updated>2023-03-02T09:52:16Z</updated>

		<summary type="html">&lt;p&gt;Fincato: add category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We use Nginx as HTTP and proxy server. Though each new website might have its own needs, two general pattern are:&lt;br /&gt;
&lt;br /&gt;
* static content&lt;br /&gt;
* dynamic content served through a proxy reverse port&lt;br /&gt;
&lt;br /&gt;
=== Workflow ===&lt;br /&gt;
&lt;br /&gt;
* create a new folder under &amp;lt;code&amp;gt;/var/www&amp;lt;/code&amp;gt; and put your website code in there&lt;br /&gt;
* create a new file under &amp;lt;code&amp;gt;/etc/nginx/sites-available&amp;lt;/code&amp;gt; and name it after the website name (or something meaningful), then copy one of the two config setup below as a starting point and customize it based on the needs of your website&lt;br /&gt;
* create a symlink to &amp;lt;code&amp;gt;/etc/nginx/sites-enabled&amp;lt;/code&amp;gt; by doing:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ln -s /etc/nginx/sites-available/&amp;lt;new-website-config&amp;gt; /etc/nginx/sites-enabled/&amp;lt;new-website-config&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* check if there&#039;s any nginx config problem with &amp;lt;code&amp;gt;sudo nginx -t&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At this point you should have a basic setup working. Except we did not create a secure connection certificate for your website. So far we&#039;ve been relying on the &amp;lt;code&amp;gt;certbot&amp;lt;/code&amp;gt; program, which comes by using [https://letsencrypt.org Let&#039;s Encrypt]. So run the following commands:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo certbot&amp;lt;/code&amp;gt;, and you should get a list of all available domain names coming from the nginx config files — including the one you just created&lt;br /&gt;
* find the domain name of your new website and type its number&lt;br /&gt;
* usually we tell Certbot to force redirect any HTTP connection to HTTPS, you can decide this on a per-basis project in case it&#039;s not a good idea&lt;br /&gt;
* Certbot will update your website nginx config file with some more settings for using HTTPS&lt;br /&gt;
* test the website by visiting it!&lt;br /&gt;
&lt;br /&gt;
=== Static Content ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
&lt;br /&gt;
  root /var/www/&amp;lt;website-dir&amp;gt;;&lt;br /&gt;
  index index.html;&lt;br /&gt;
  &lt;br /&gt;
  server_name &amp;lt;website-url&amp;gt;;&lt;br /&gt;
  error_page  404  /&amp;lt;custom-404&amp;gt;.html;&lt;br /&gt;
  &lt;br /&gt;
  location / {&lt;br /&gt;
    try_files $uri $uri/ =404;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // add route to specific subpage&lt;br /&gt;
  location /&amp;lt;subpage&amp;gt; {&lt;br /&gt;
  	try_files $uri $uri/ =404;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // display page as list of files&lt;br /&gt;
  location /&amp;lt;files-share&amp;gt; {&lt;br /&gt;
  	try_files $uri $uri/ =404;&lt;br /&gt;
  	autoindex on;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Content served through a Proxy Reverse port ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	server_name &amp;lt;website&amp;gt;.com ;&lt;br /&gt;
&lt;br /&gt;
	root /var/www/&amp;lt;website&amp;gt;;&lt;br /&gt;
	access_log /var/log/nginx/&amp;lt;website&amp;gt;.access.log;&lt;br /&gt;
	error_log /var/log/nginx/&amp;lt;website&amp;gt;.error.log;&lt;br /&gt;
&lt;br /&gt;
  location / {&lt;br /&gt;
    proxy_pass         http://127.0.0.1:&amp;lt;port&amp;gt;;&lt;br /&gt;
    proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
    // example of proxy-headers for a Python application&lt;br /&gt;
    proxy_set_header   Host $http_host;&lt;br /&gt;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
    proxy_set_header   X-Forwarded-Proto $scheme;&lt;br /&gt;
    proxy_set_header   Upgrade $http_upgrade;&lt;br /&gt;
    proxy_redirect off;&lt;br /&gt;
    proxy_buffering off;&lt;br /&gt;
&lt;br /&gt;
    proxy_set_header   X-Real-IP $remote_addr;&lt;br /&gt;
    proxy_set_header   X-Forwarded-Host $server_name;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // example of resource caching&lt;br /&gt;
  location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf)$ {&lt;br /&gt;
    expires max;&lt;br /&gt;
    add_header Cache-Control &amp;quot;public, no-transform&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nginx config settings ===&lt;br /&gt;
Some common settings to add in &amp;lt;code&amp;gt;/etc/nginx/nginx.conf&amp;lt;/code&amp;gt;  to help speed up the server and add support for several resource types:&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_min_length 500;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
gzip_buffers 4 32k;&lt;br /&gt;
gzip_types&lt;br /&gt;
  application/atom+xml&lt;br /&gt;
  application/geo+json&lt;br /&gt;
  application/javascript&lt;br /&gt;
  application/x-javascript&lt;br /&gt;
  application/json&lt;br /&gt;
  application/ld+json&lt;br /&gt;
  application/manifest+json&lt;br /&gt;
  application/rdf+xml&lt;br /&gt;
  application/rss+xml&lt;br /&gt;
  application/xhtml+xml&lt;br /&gt;
  application/xml&lt;br /&gt;
  font/eot&lt;br /&gt;
  font/otf&lt;br /&gt;
  font/ttf&lt;br /&gt;
  image/svg+xml&lt;br /&gt;
  text/css&lt;br /&gt;
  text/javascript&lt;br /&gt;
  text/js&lt;br /&gt;
  text/plain&lt;br /&gt;
  text/xml;&lt;br /&gt;
gzip_disable &amp;quot;MSIE [1-6]\.&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Nginx_config_file&amp;diff=28590</id>
		<title>Nginx config file</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Nginx_config_file&amp;diff=28590"/>
		<updated>2023-03-02T09:50:38Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Add workflow section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We use Nginx as HTTP and proxy server. Though each new website might have its own needs, two general pattern are:&lt;br /&gt;
&lt;br /&gt;
* static content&lt;br /&gt;
* dynamic content served through a proxy reverse port&lt;br /&gt;
&lt;br /&gt;
=== Workflow ===&lt;br /&gt;
&lt;br /&gt;
* create a new folder under &amp;lt;code&amp;gt;/var/www&amp;lt;/code&amp;gt; and put your website code in there&lt;br /&gt;
* create a new file under &amp;lt;code&amp;gt;/etc/nginx/sites-available&amp;lt;/code&amp;gt; and name it after the website name (or something meaningful), then copy one of the two config setup below as a starting point and customize it based on the needs of your website&lt;br /&gt;
* create a symlink to &amp;lt;code&amp;gt;/etc/nginx/sites-enabled&amp;lt;/code&amp;gt; by doing:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ln -s /etc/nginx/sites-available/&amp;lt;new-website-config&amp;gt; /etc/nginx/sites-enabled/&amp;lt;new-website-config&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* check if there&#039;s any nginx config problem with &amp;lt;code&amp;gt;sudo nginx -t&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At this point you should have a basic setup working. Except we did not create a secure connection certificate for your website. So far we&#039;ve been relying on the &amp;lt;code&amp;gt;certbot&amp;lt;/code&amp;gt; program, which comes by using [https://letsencrypt.org Let&#039;s Encrypt]. So run the following commands:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo certbot&amp;lt;/code&amp;gt;, and you should get a list of all available domain names coming from the nginx config files — including the one you just created&lt;br /&gt;
* find the domain name of your new website and type its number&lt;br /&gt;
* usually we tell Certbot to force redirect any HTTP connection to HTTPS, you can decide this on a per-basis project in case it&#039;s not a good idea&lt;br /&gt;
* Certbot will update your website nginx config file with some more settings for using HTTPS&lt;br /&gt;
* test the website by visiting it!&lt;br /&gt;
&lt;br /&gt;
=== Static Content ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
&lt;br /&gt;
  root /var/www/&amp;lt;website-dir&amp;gt;;&lt;br /&gt;
  index index.html;&lt;br /&gt;
  &lt;br /&gt;
  server_name &amp;lt;website-url&amp;gt;;&lt;br /&gt;
  error_page  404  /&amp;lt;custom-404&amp;gt;.html;&lt;br /&gt;
  &lt;br /&gt;
  location / {&lt;br /&gt;
    try_files $uri $uri/ =404;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // add route to specific subpage&lt;br /&gt;
  location /&amp;lt;subpage&amp;gt; {&lt;br /&gt;
  	try_files $uri $uri/ =404;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // display page as list of files&lt;br /&gt;
  location /&amp;lt;files-share&amp;gt; {&lt;br /&gt;
  	try_files $uri $uri/ =404;&lt;br /&gt;
  	autoindex on;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Content served through a Proxy Reverse port ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	server_name &amp;lt;website&amp;gt;.com ;&lt;br /&gt;
&lt;br /&gt;
	root /var/www/&amp;lt;website&amp;gt;;&lt;br /&gt;
	access_log /var/log/nginx/&amp;lt;website&amp;gt;.access.log;&lt;br /&gt;
	error_log /var/log/nginx/&amp;lt;website&amp;gt;.error.log;&lt;br /&gt;
&lt;br /&gt;
  location / {&lt;br /&gt;
    proxy_pass         http://127.0.0.1:&amp;lt;port&amp;gt;;&lt;br /&gt;
    proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
    // example of proxy-headers for a Python application&lt;br /&gt;
    proxy_set_header   Host $http_host;&lt;br /&gt;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
    proxy_set_header   X-Forwarded-Proto $scheme;&lt;br /&gt;
    proxy_set_header   Upgrade $http_upgrade;&lt;br /&gt;
    proxy_redirect off;&lt;br /&gt;
    proxy_buffering off;&lt;br /&gt;
&lt;br /&gt;
    proxy_set_header   X-Real-IP $remote_addr;&lt;br /&gt;
    proxy_set_header   X-Forwarded-Host $server_name;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // example of resource caching&lt;br /&gt;
  location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf)$ {&lt;br /&gt;
    expires max;&lt;br /&gt;
    add_header Cache-Control &amp;quot;public, no-transform&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nginx config settings ===&lt;br /&gt;
Some common settings to add in &amp;lt;code&amp;gt;/etc/nginx/nginx.conf&amp;lt;/code&amp;gt;  to help speed up the server and add support for several resource types:&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_min_length 500;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
gzip_buffers 4 32k;&lt;br /&gt;
gzip_types&lt;br /&gt;
  application/atom+xml&lt;br /&gt;
  application/geo+json&lt;br /&gt;
  application/javascript&lt;br /&gt;
  application/x-javascript&lt;br /&gt;
  application/json&lt;br /&gt;
  application/ld+json&lt;br /&gt;
  application/manifest+json&lt;br /&gt;
  application/rdf+xml&lt;br /&gt;
  application/rss+xml&lt;br /&gt;
  application/xhtml+xml&lt;br /&gt;
  application/xml&lt;br /&gt;
  font/eot&lt;br /&gt;
  font/otf&lt;br /&gt;
  font/ttf&lt;br /&gt;
  image/svg+xml&lt;br /&gt;
  text/css&lt;br /&gt;
  text/javascript&lt;br /&gt;
  text/js&lt;br /&gt;
  text/plain&lt;br /&gt;
  text/xml;&lt;br /&gt;
gzip_disable &amp;quot;MSIE [1-6]\.&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Nginx_config_file&amp;diff=28589</id>
		<title>Nginx config file</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Nginx_config_file&amp;diff=28589"/>
		<updated>2023-03-02T09:38:23Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Init&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We use Nginx as HTTP and proxy server. Though each new website might have its own needs, two general pattern are:&lt;br /&gt;
&lt;br /&gt;
* static content&lt;br /&gt;
* dynamic content served through a proxy reverse port&lt;br /&gt;
&lt;br /&gt;
=== Static Content ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
&lt;br /&gt;
  root /var/www/&amp;lt;website-dir&amp;gt;;&lt;br /&gt;
  index index.html;&lt;br /&gt;
  &lt;br /&gt;
  server_name &amp;lt;website-url&amp;gt;;&lt;br /&gt;
  error_page  404  /&amp;lt;custom-404&amp;gt;.html;&lt;br /&gt;
  &lt;br /&gt;
  location / {&lt;br /&gt;
    try_files $uri $uri/ =404;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // add route to specific subpage&lt;br /&gt;
  location /&amp;lt;subpage&amp;gt; {&lt;br /&gt;
  	try_files $uri $uri/ =404;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // display page as list of files&lt;br /&gt;
  location /&amp;lt;files-share&amp;gt; {&lt;br /&gt;
  	try_files $uri $uri/ =404;&lt;br /&gt;
  	autoindex on;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Content served through a Proxy Reverse port ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	server_name &amp;lt;website&amp;gt;.com ;&lt;br /&gt;
&lt;br /&gt;
	root /var/www/&amp;lt;website&amp;gt;;&lt;br /&gt;
	access_log /var/log/nginx/&amp;lt;website&amp;gt;.access.log;&lt;br /&gt;
	error_log /var/log/nginx/&amp;lt;website&amp;gt;.error.log;&lt;br /&gt;
&lt;br /&gt;
  location / {&lt;br /&gt;
    proxy_pass         http://127.0.0.1:&amp;lt;port&amp;gt;;&lt;br /&gt;
    proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
    // example of proxy-headers for a Python application&lt;br /&gt;
    proxy_set_header   Host $http_host;&lt;br /&gt;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
    proxy_set_header   X-Forwarded-Proto $scheme;&lt;br /&gt;
    proxy_set_header   Upgrade $http_upgrade;&lt;br /&gt;
    proxy_redirect off;&lt;br /&gt;
    proxy_buffering off;&lt;br /&gt;
&lt;br /&gt;
    proxy_set_header   X-Real-IP $remote_addr;&lt;br /&gt;
    proxy_set_header   X-Forwarded-Host $server_name;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // example of resource caching&lt;br /&gt;
  location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf)$ {&lt;br /&gt;
    expires max;&lt;br /&gt;
    add_header Cache-Control &amp;quot;public, no-transform&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nginx config settings ===&lt;br /&gt;
Some common settings to add in &amp;lt;code&amp;gt;/etc/nginx/nginx.conf&amp;lt;/code&amp;gt;  to help speed up the server and add support for several resource types:&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_min_length 500;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
gzip_buffers 4 32k;&lt;br /&gt;
gzip_types&lt;br /&gt;
  application/atom+xml&lt;br /&gt;
  application/geo+json&lt;br /&gt;
  application/javascript&lt;br /&gt;
  application/x-javascript&lt;br /&gt;
  application/json&lt;br /&gt;
  application/ld+json&lt;br /&gt;
  application/manifest+json&lt;br /&gt;
  application/rdf+xml&lt;br /&gt;
  application/rss+xml&lt;br /&gt;
  application/xhtml+xml&lt;br /&gt;
  application/xml&lt;br /&gt;
  font/eot&lt;br /&gt;
  font/otf&lt;br /&gt;
  font/ttf&lt;br /&gt;
  image/svg+xml&lt;br /&gt;
  text/css&lt;br /&gt;
  text/javascript&lt;br /&gt;
  text/js&lt;br /&gt;
  text/plain&lt;br /&gt;
  text/xml;&lt;br /&gt;
gzip_disable &amp;quot;MSIE [1-6]\.&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Nginx_config_file&amp;diff=28588</id>
		<title>Nginx config file</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Nginx_config_file&amp;diff=28588"/>
		<updated>2023-03-02T09:21:08Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Created page with &amp;quot;{{Article |MainNavigation=No }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Category:Infrastructure&amp;diff=28587</id>
		<title>Category:Infrastructure</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Category:Infrastructure&amp;diff=28587"/>
		<updated>2023-02-17T12:36:00Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Created page with &amp;quot;{{Special:WhatLinksHere/Category:Infrastructure}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Special:WhatLinksHere/Category:Infrastructure}}&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Category:Maintenance&amp;diff=28586</id>
		<title>Category:Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Category:Maintenance&amp;diff=28586"/>
		<updated>2023-02-17T12:35:35Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Created page with &amp;quot;{{Special:WhatLinksHere/Category:Maintenance}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Special:WhatLinksHere/Category:Maintenance}}&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Mlmmj_mailing-list_setup&amp;diff=28585</id>
		<title>Mlmmj mailing-list setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Mlmmj_mailing-list_setup&amp;diff=28585"/>
		<updated>2023-02-17T12:33:30Z</updated>

		<summary type="html">&lt;p&gt;Fincato: update disclaimer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a reference guide to setup the [http://mlmmj.org/ mlmm] mailing list software on a Debian machine.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This guide is still a draft version for now, put together by transcribing my log notes and using memory; the mailing list setup is 95% going to work, but there are other details I cannot swear upon (yet). I plan to reproduce the whole process on another VPS soon and double check the steps I reported here&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
UPDATE: after writing this guide around 1 year ago, I still did not setup mlmmj on a new VPS, so please use this and the [http://mlmmj.org/docs/readme-postfix/ official installation notes] from mlmmj (and as usual with Linux, pray the computer gods).&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A basic email server using &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt;; see &#039;&#039;Postfix Setup&#039;&#039; for more&lt;br /&gt;
* MX and A records of your list domain name correctly setup in your DNS settings&amp;lt;span id=&amp;quot;installation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; is a CLI program written in &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;: fast, tiny and to the point. It can be “extended” by writing bash script or such when necessary (eg for batch subscription or unsubscription). List configuration is done by using text files, it’s all pretty unix-y. OK cool.&lt;br /&gt;
&lt;br /&gt;
Check and upgrade Debian system:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get update &amp;amp;amp;&amp;amp;amp; apt-get upgrade&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then install &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get install mlmmj&amp;lt;/pre&amp;gt;&lt;br /&gt;
This creates a &amp;lt;code&amp;gt;spool&amp;lt;/code&amp;gt; directory for it under &amp;lt;code&amp;gt;/var/spool/mlmmj&amp;lt;/code&amp;gt;. Under &amp;lt;code&amp;gt;/var/spool&amp;lt;/code&amp;gt; you usually find also the &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt; directory, in Debian systems.&lt;br /&gt;
&lt;br /&gt;
As per &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; [http://mlmmj.org/docs/readme-postfix/ recommendation], let’s make a &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; system user:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo adduser mlmmj --system --home /var/spool/mlmmj --disabled-password --disabled-login&amp;lt;/pre&amp;gt;&lt;br /&gt;
We set the following options:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--system&amp;lt;/code&amp;gt;, we create it as a system user as it has no password and no login, because this user acts an automatic process&lt;br /&gt;
* &amp;lt;code&amp;gt;--home &amp;amp;lt;path&amp;amp;gt;&amp;lt;/code&amp;gt;, we set the user’s home directory to mlmmj’s spool directory, instead of the usual &amp;lt;code&amp;gt;home/mlmmj&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--disabled-password&amp;lt;/code&amp;gt;, no password&lt;br /&gt;
* &amp;lt;code&amp;gt;--disabled-login&amp;lt;/code&amp;gt;, no login&lt;br /&gt;
&lt;br /&gt;
The above settings are also done to set the least amount of privilegies to the mlmmj user.&lt;br /&gt;
&lt;br /&gt;
Let’s set the spool directory to be owned by &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo chown -R mlmmj /var/spool/mlmmj/&amp;lt;/pre&amp;gt;&lt;br /&gt;
And finally we make a new &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; entry:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo vi /etc/systemd/system/mlmmj.service&amp;lt;/pre&amp;gt;&lt;br /&gt;
with the following config, taken from https://github.com/tchapi/mlmmj-service-wrapper/blob/master/mlmmj.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[Unit]&lt;br /&gt;
Description=This script provides a simple wrapper for mlmmj run as a daemon&lt;br /&gt;
After=syslog.target network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
User=root&lt;br /&gt;
Type=forking&lt;br /&gt;
ExecStart=/usr/bin/mlmmj-maintd -d /var/spool/mlmmj&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&amp;lt;/pre&amp;gt;&lt;br /&gt;
Let’s start the service:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo systemctl start mlmmj&amp;lt;/pre&amp;gt;&lt;br /&gt;
Before testing out our new setup, we need to make some adjustments to &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;/etc/postfix/main.cf&amp;lt;/code&amp;gt;, make sure to have configured a &#039;&#039;recipient delimiter&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;recipient_delimiter = +&amp;lt;/pre&amp;gt;&lt;br /&gt;
And that our &#039;&#039;transport maps&#039;&#039; are the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;virtual_alias_maps = hash:/etc/postfix/virtual&lt;br /&gt;
transport_maps = hash:/etc/postfix/transport&lt;br /&gt;
mlmmj_destination_recipient_limit = 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
In &amp;lt;code&amp;gt;/etc/postfix/virtual&amp;lt;/code&amp;gt; we set the following line for each list we want to use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;test@lists.hackersanddesigners.nl    lists.hackersanddesigners.nl--test@localhost.mlmmj&lt;br /&gt;
news@lists.hackersanddesigners.nl    lists.hackersanddesigners.nl--news@localhost.mlmmj&amp;lt;/pre&amp;gt;&lt;br /&gt;
where: - &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;news&amp;lt;/code&amp;gt; is replaced with the name of the list - &amp;lt;code&amp;gt;lists.hackersanddesigners.nl&amp;lt;/code&amp;gt; with the domain name we want to use (and setup earlier in our DNS). - &amp;lt;code&amp;gt;localhost.mlmmj&amp;lt;/code&amp;gt; is a dummy domain used by &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; to connect this virtual alias to mlmmj transports&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;flower@lists.acidgreen.nl    lists.acidgreen.nl--flower@localhost.mlmmj&amp;lt;/pre&amp;gt;&lt;br /&gt;
We do the same in &amp;lt;code&amp;gt;/etc/postfix/transport&amp;lt;/code&amp;gt;, by adding the following line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;lists.hackersanddesigners.nl--test@localhost.mlmmj        mlmmj:test&amp;lt;/pre&amp;gt;&lt;br /&gt;
and replacing:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;lists.hackersanddesigners.nl&amp;lt;/code&amp;gt; to the domain we want to use&lt;br /&gt;
* &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; to the list name&lt;br /&gt;
&lt;br /&gt;
After, let’s compile these two files to a format that &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt; likes more, and reload &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo postmap virtual&lt;br /&gt;
sudo postmap transport&lt;br /&gt;
sudo postfix reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
Lastly, let’s add a config line to the end of &amp;lt;code&amp;gt;/etc/postfix/master.cf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# mlmmj mailing lists&lt;br /&gt;
mlmmj   unix  -       n       n       -       -       pipe&lt;br /&gt;
  flags=DORhu user=mlmmj argv=/usr/bin/mlmmj-receive -F -L /var/spool/mlmmj/$nexthop&amp;lt;/pre&amp;gt;&lt;br /&gt;
this tells &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt; to process incoming emails with a script command (&amp;lt;code&amp;gt;mlmmj-receive&amp;lt;/code&amp;gt;) ran by the &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; user, and to use certain flags (other settings useful for &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
The script will send incoming emails to the &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; spool directory (&amp;lt;code&amp;gt;/var/spool/mlmmj&amp;lt;/code&amp;gt;) in order to process them: if the email (sender) is trying to post to the list, and has access to it, the message is posted and being sent to every other address in that list; if the email asks to unsubscribe its sender, &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; will do that, etc.&lt;br /&gt;
&lt;br /&gt;
We can now create a test list and see if all works!&lt;br /&gt;
== Commands ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;make-a-list&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Make a list ===&lt;br /&gt;
&lt;br /&gt;
TODO: I think that because we setup a &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; process for &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt;, then &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; asks us to run it not with &amp;lt;code&amp;gt;mlmmj-&amp;amp;lt;command&amp;amp;gt;&amp;lt;/code&amp;gt; but with &amp;lt;code&amp;gt;/usr/bin/mlmmj-&amp;amp;lt;command&amp;amp;gt;&amp;lt;/code&amp;gt;. Get a grip on why it’s like this…&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /usr/bin/mlmmj-make-ml -c mlmmj -L &amp;amp;lt;list-name&amp;amp;gt; -a&amp;lt;/pre&amp;gt;&lt;br /&gt;
we create a new list using the &amp;lt;code&amp;gt;mlmmj-make-ml&amp;lt;/code&amp;gt; command, and use:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;, to set the user who will &#039;&#039;own&#039;&#039; the new list directory under &amp;lt;code&amp;gt;/var/spool/mlmmj&amp;lt;/code&amp;gt; (eg &amp;lt;code&amp;gt;/var/spool/mlmmj/test-list&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-L&amp;lt;/code&amp;gt;, to set the list name&lt;br /&gt;
&lt;br /&gt;
get list of subscribers:&lt;br /&gt;
=== List subscribers ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /usr/bin/mlmmj-list -L &amp;amp;lt;list-name&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Subscribe and unsubscribe from and to a list ===&lt;br /&gt;
&lt;br /&gt;
To subscribe, send an email to &amp;lt;code&amp;gt;&amp;amp;lt;list-name&amp;amp;gt;+subscribe@lists.hackersanddesigners.nl&amp;lt;/code&amp;gt;. To unsubscribe, send an email to &amp;lt;code&amp;gt;&amp;amp;lt;list-name&amp;amp;gt;+unsubscribe@lists.hackersanddesigners.nl&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Category:Infrastructure]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Mailing-list_Maintenance&amp;diff=28584</id>
		<title>Mailing-list Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Mailing-list_Maintenance&amp;diff=28584"/>
		<updated>2023-02-17T12:29:25Z</updated>

		<summary type="html">&lt;p&gt;Fincato: add link to mlmmj setup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The mailing-list runs through a software called [http://mlmmj.org mlmmj] (Mailing List Management Made Joyful). It&#039;s a small C program that works on text files, ultra unix (or Linux?) in the approach.&lt;br /&gt;
&lt;br /&gt;
There&#039;s no real maintenance that so far has been needed in the functioning of the software, except sometimes debugging a new post not being published to the list (that was the case of re-opening a VPS port rather than the software itself).&lt;br /&gt;
&lt;br /&gt;
See how to setup [[Mlmmj mailing-list setup|mlmmj from scratch]].&lt;br /&gt;
&lt;br /&gt;
== Adding or removing email does not work ==&lt;br /&gt;
Usually adding and removing a new email to the list should happen by simply sending... an email to the list. Sometimes, probably due to moving the list of subscribers to this new setup (the shell script to bulk-import the email address might have added extra &amp;quot;invisible&amp;quot; characters to each email?), this automatic operation does not work.&lt;br /&gt;
&lt;br /&gt;
A first operation should be to run the following command:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
ADDRESS=$1&lt;br /&gt;
LIST=$2&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;removing $ADDRESS from $LIST list&amp;quot;&lt;br /&gt;
sudo /usr/bin/mlmmj-unsub -L /var/spool/mlmmj/$LIST -a $ADDRESS&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;checking if address has actually been fully removed...&amp;quot;&lt;br /&gt;
sudo rg &amp;quot;$ADDRESS&amp;quot; /var/spool/mlmmj/$LIST/subscribers.d/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;(replace &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; if you don&#039;t have it installed)&lt;br /&gt;
&lt;br /&gt;
What the above does is to remove the given address from the given list and then grep through all the files inside the subscribers folder to check if it&#039;s still there. Optimally it should not! &lt;br /&gt;
&lt;br /&gt;
If it does still, you need to:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/var/spool/mlmmj/&amp;lt;LIST&amp;gt;/subscribers.d/&amp;lt;/code&amp;gt;&lt;br /&gt;
* open the correct file (files inside this folder are organized one per each letter of the alphabet) based on the first letter of the email address you need to remove&lt;br /&gt;
* remove the line of the email address and save the file&lt;br /&gt;
&lt;br /&gt;
Yes it&#039;s a bit of a manual labor. The mistake has already been done. It would be handy to write a new script (maybe not in bash but in Python) to re-import all the email addresses without these possible extra invisible characters (which once I tried to remove and somehow managed —I thought).{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
For posterity, this is the shell script to bulk-import a list of address from a text file, that was found on the mlmmj mailing-list:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
INPUT=$1&lt;br /&gt;
LIST=$2&lt;br /&gt;
&lt;br /&gt;
if [[ $# -lt 2 ]] ; then&lt;br /&gt;
    echo &amp;quot;✕ Not enough arguments supplied: please pass INPUT (path/to/file-with-list-of-addresses) and LIST (eg /var/spool/mlmmj/&amp;lt;list&amp;gt;)&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
while IFS= read -r ADDR; do&lt;br /&gt;
    sudo /usr/bin/mlmmj-sub -L $LIST -f -q -s -a $ADDR&lt;br /&gt;
    printf &#039;imported: %s\n&#039; &amp;quot;$ADDR&amp;quot;&lt;br /&gt;
done &amp;lt; $INPUT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Mlmmj_mailing-list_setup&amp;diff=28583</id>
		<title>Mlmmj mailing-list setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Mlmmj_mailing-list_setup&amp;diff=28583"/>
		<updated>2023-02-17T12:28:32Z</updated>

		<summary type="html">&lt;p&gt;Fincato: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a reference guide to setup the [http://mlmmj.org/ mlmm] mailing list software on a Debian machine.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This guide is still a draft version for now, put together by transcribing my log notes and using memory; the mailing list setup is 95% going to work, but there are other details I cannot swear upon (yet). I plan to reproduce the whole process on another VPS soon and double check the steps I reported here&#039;&#039;.&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A basic email server using &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt;; see &#039;&#039;Postfix Setup&#039;&#039; for more&lt;br /&gt;
* MX and A records of your list domain name correctly setup in your DNS settings&amp;lt;span id=&amp;quot;installation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; is a CLI program written in &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;: fast, tiny and to the point. It can be “extended” by writing bash script or such when necessary (eg for batch subscription or unsubscription). List configuration is done by using text files, it’s all pretty unix-y. OK cool.&lt;br /&gt;
&lt;br /&gt;
Check and upgrade Debian system:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get update &amp;amp;amp;&amp;amp;amp; apt-get upgrade&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then install &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get install mlmmj&amp;lt;/pre&amp;gt;&lt;br /&gt;
This creates a &amp;lt;code&amp;gt;spool&amp;lt;/code&amp;gt; directory for it under &amp;lt;code&amp;gt;/var/spool/mlmmj&amp;lt;/code&amp;gt;. Under &amp;lt;code&amp;gt;/var/spool&amp;lt;/code&amp;gt; you usually find also the &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt; directory, in Debian systems.&lt;br /&gt;
&lt;br /&gt;
As per &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; [http://mlmmj.org/docs/readme-postfix/ recommendation], let’s make a &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; system user:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo adduser mlmmj --system --home /var/spool/mlmmj --disabled-password --disabled-login&amp;lt;/pre&amp;gt;&lt;br /&gt;
We set the following options:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--system&amp;lt;/code&amp;gt;, we create it as a system user as it has no password and no login, because this user acts an automatic process&lt;br /&gt;
* &amp;lt;code&amp;gt;--home &amp;amp;lt;path&amp;amp;gt;&amp;lt;/code&amp;gt;, we set the user’s home directory to mlmmj’s spool directory, instead of the usual &amp;lt;code&amp;gt;home/mlmmj&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--disabled-password&amp;lt;/code&amp;gt;, no password&lt;br /&gt;
* &amp;lt;code&amp;gt;--disabled-login&amp;lt;/code&amp;gt;, no login&lt;br /&gt;
&lt;br /&gt;
The above settings are also done to set the least amount of privilegies to the mlmmj user.&lt;br /&gt;
&lt;br /&gt;
Let’s set the spool directory to be owned by &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo chown -R mlmmj /var/spool/mlmmj/&amp;lt;/pre&amp;gt;&lt;br /&gt;
And finally we make a new &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; entry:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo vi /etc/systemd/system/mlmmj.service&amp;lt;/pre&amp;gt;&lt;br /&gt;
with the following config, taken from https://github.com/tchapi/mlmmj-service-wrapper/blob/master/mlmmj.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[Unit]&lt;br /&gt;
Description=This script provides a simple wrapper for mlmmj run as a daemon&lt;br /&gt;
After=syslog.target network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
User=root&lt;br /&gt;
Type=forking&lt;br /&gt;
ExecStart=/usr/bin/mlmmj-maintd -d /var/spool/mlmmj&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&amp;lt;/pre&amp;gt;&lt;br /&gt;
Let’s start the service:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo systemctl start mlmmj&amp;lt;/pre&amp;gt;&lt;br /&gt;
Before testing out our new setup, we need to make some adjustments to &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;/etc/postfix/main.cf&amp;lt;/code&amp;gt;, make sure to have configured a &#039;&#039;recipient delimiter&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;recipient_delimiter = +&amp;lt;/pre&amp;gt;&lt;br /&gt;
And that our &#039;&#039;transport maps&#039;&#039; are the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;virtual_alias_maps = hash:/etc/postfix/virtual&lt;br /&gt;
transport_maps = hash:/etc/postfix/transport&lt;br /&gt;
mlmmj_destination_recipient_limit = 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
In &amp;lt;code&amp;gt;/etc/postfix/virtual&amp;lt;/code&amp;gt; we set the following line for each list we want to use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;test@lists.hackersanddesigners.nl    lists.hackersanddesigners.nl--test@localhost.mlmmj&lt;br /&gt;
news@lists.hackersanddesigners.nl    lists.hackersanddesigners.nl--news@localhost.mlmmj&amp;lt;/pre&amp;gt;&lt;br /&gt;
where: - &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;news&amp;lt;/code&amp;gt; is replaced with the name of the list - &amp;lt;code&amp;gt;lists.hackersanddesigners.nl&amp;lt;/code&amp;gt; with the domain name we want to use (and setup earlier in our DNS). - &amp;lt;code&amp;gt;localhost.mlmmj&amp;lt;/code&amp;gt; is a dummy domain used by &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; to connect this virtual alias to mlmmj transports&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;flower@lists.acidgreen.nl    lists.acidgreen.nl--flower@localhost.mlmmj&amp;lt;/pre&amp;gt;&lt;br /&gt;
We do the same in &amp;lt;code&amp;gt;/etc/postfix/transport&amp;lt;/code&amp;gt;, by adding the following line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;lists.hackersanddesigners.nl--test@localhost.mlmmj        mlmmj:test&amp;lt;/pre&amp;gt;&lt;br /&gt;
and replacing:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;lists.hackersanddesigners.nl&amp;lt;/code&amp;gt; to the domain we want to use&lt;br /&gt;
* &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; to the list name&lt;br /&gt;
&lt;br /&gt;
After, let’s compile these two files to a format that &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt; likes more, and reload &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo postmap virtual&lt;br /&gt;
sudo postmap transport&lt;br /&gt;
sudo postfix reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
Lastly, let’s add a config line to the end of &amp;lt;code&amp;gt;/etc/postfix/master.cf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# mlmmj mailing lists&lt;br /&gt;
mlmmj   unix  -       n       n       -       -       pipe&lt;br /&gt;
  flags=DORhu user=mlmmj argv=/usr/bin/mlmmj-receive -F -L /var/spool/mlmmj/$nexthop&amp;lt;/pre&amp;gt;&lt;br /&gt;
this tells &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt; to process incoming emails with a script command (&amp;lt;code&amp;gt;mlmmj-receive&amp;lt;/code&amp;gt;) ran by the &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; user, and to use certain flags (other settings useful for &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
The script will send incoming emails to the &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; spool directory (&amp;lt;code&amp;gt;/var/spool/mlmmj&amp;lt;/code&amp;gt;) in order to process them: if the email (sender) is trying to post to the list, and has access to it, the message is posted and being sent to every other address in that list; if the email asks to unsubscribe its sender, &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; will do that, etc.&lt;br /&gt;
&lt;br /&gt;
We can now create a test list and see if all works!&lt;br /&gt;
== Commands ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;make-a-list&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Make a list ===&lt;br /&gt;
&lt;br /&gt;
TODO: I think that because we setup a &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; process for &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt;, then &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; asks us to run it not with &amp;lt;code&amp;gt;mlmmj-&amp;amp;lt;command&amp;amp;gt;&amp;lt;/code&amp;gt; but with &amp;lt;code&amp;gt;/usr/bin/mlmmj-&amp;amp;lt;command&amp;amp;gt;&amp;lt;/code&amp;gt;. Get a grip on why it’s like this…&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /usr/bin/mlmmj-make-ml -c mlmmj -L &amp;amp;lt;list-name&amp;amp;gt; -a&amp;lt;/pre&amp;gt;&lt;br /&gt;
we create a new list using the &amp;lt;code&amp;gt;mlmmj-make-ml&amp;lt;/code&amp;gt; command, and use:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;, to set the user who will &#039;&#039;own&#039;&#039; the new list directory under &amp;lt;code&amp;gt;/var/spool/mlmmj&amp;lt;/code&amp;gt; (eg &amp;lt;code&amp;gt;/var/spool/mlmmj/test-list&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-L&amp;lt;/code&amp;gt;, to set the list name&lt;br /&gt;
&lt;br /&gt;
get list of subscribers:&lt;br /&gt;
=== List subscribers ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /usr/bin/mlmmj-list -L &amp;amp;lt;list-name&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Subscribe and unsubscribe from and to a list ===&lt;br /&gt;
&lt;br /&gt;
To subscribe, send an email to &amp;lt;code&amp;gt;&amp;amp;lt;list-name&amp;amp;gt;+subscribe@lists.hackersanddesigners.nl&amp;lt;/code&amp;gt;. To unsubscribe, send an email to &amp;lt;code&amp;gt;&amp;amp;lt;list-name&amp;amp;gt;+unsubscribe@lists.hackersanddesigners.nl&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Category:Infrastructure]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Mlmmj_mailing-list_setup&amp;diff=28582</id>
		<title>Mlmmj mailing-list setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Mlmmj_mailing-list_setup&amp;diff=28582"/>
		<updated>2023-02-17T12:27:55Z</updated>

		<summary type="html">&lt;p&gt;Fincato: fix spacing maybe&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a reference guide to setup the [http://mlmmj.org/ mlmm] mailing list software on a Debian machine.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This guide is still a draft version for now, put together by transcribing my log notes and using memory; the mailing list setup is 95% going to work, but there are other details I cannot swear upon (yet). I plan to reproduce the whole process on another VPS soon and double check the steps I reported here&#039;&#039;.&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A basic email server using &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt;; see &#039;&#039;Postfix Setup&#039;&#039; for more&lt;br /&gt;
* MX and A records of your list domain name correctly setup in your DNS settings&amp;lt;span id=&amp;quot;installation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; is a CLI program written in &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;: fast, tiny and to the point. It can be “extended” by writing bash script or such when necessary (eg for batch subscription or unsubscription). List configuration is done by using text files, it’s all pretty unix-y. OK cool.&lt;br /&gt;
&lt;br /&gt;
Check and upgrade Debian system:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get update &amp;amp;amp;&amp;amp;amp; apt-get upgrade&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then install &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get install mlmmj&amp;lt;/pre&amp;gt;&lt;br /&gt;
This creates a &amp;lt;code&amp;gt;spool&amp;lt;/code&amp;gt; directory for it under &amp;lt;code&amp;gt;/var/spool/mlmmj&amp;lt;/code&amp;gt;. Under &amp;lt;code&amp;gt;/var/spool&amp;lt;/code&amp;gt; you usually find also the &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt; directory, in Debian systems.&lt;br /&gt;
&lt;br /&gt;
As per &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; [http://mlmmj.org/docs/readme-postfix/ recommendation], let’s make a &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; system user:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo adduser mlmmj --system --home /var/spool/mlmmj --disabled-password --disabled-login&amp;lt;/pre&amp;gt;&lt;br /&gt;
We set the following options:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--system&amp;lt;/code&amp;gt;, we create it as a system user as it has no password and no login, because this user acts an automatic process&lt;br /&gt;
* &amp;lt;code&amp;gt;--home &amp;amp;lt;path&amp;amp;gt;&amp;lt;/code&amp;gt;, we set the user’s home directory to mlmmj’s spool directory, instead of the usual &amp;lt;code&amp;gt;home/mlmmj&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--disabled-password&amp;lt;/code&amp;gt;, no password&lt;br /&gt;
* &amp;lt;code&amp;gt;--disabled-login&amp;lt;/code&amp;gt;, no login&lt;br /&gt;
&lt;br /&gt;
The above settings are also done to set the least amount of privilegies to the mlmmj user.&lt;br /&gt;
&lt;br /&gt;
Let’s set the spool directory to be owned by &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo chown -R mlmmj /var/spool/mlmmj/&amp;lt;/pre&amp;gt;&lt;br /&gt;
And finally we make a new &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; entry:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo vi /etc/systemd/system/mlmmj.service&amp;lt;/pre&amp;gt;&lt;br /&gt;
with the following config, taken from https://github.com/tchapi/mlmmj-service-wrapper/blob/master/mlmmj.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[Unit]&lt;br /&gt;
Description=This script provides a simple wrapper for mlmmj run as a daemon&lt;br /&gt;
After=syslog.target network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
User=root&lt;br /&gt;
Type=forking&lt;br /&gt;
ExecStart=/usr/bin/mlmmj-maintd -d /var/spool/mlmmj&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&amp;lt;/pre&amp;gt;&lt;br /&gt;
Let’s start the service:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo systemctl start mlmmj&amp;lt;/pre&amp;gt;&lt;br /&gt;
Before testing out our new setup, we need to make some adjustments to &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;/etc/postfix/main.cf&amp;lt;/code&amp;gt;, make sure to have configured a &#039;&#039;recipient delimiter&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;recipient_delimiter = +&amp;lt;/pre&amp;gt;&lt;br /&gt;
And that our &#039;&#039;transport maps&#039;&#039; are the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;virtual_alias_maps = hash:/etc/postfix/virtual&lt;br /&gt;
transport_maps = hash:/etc/postfix/transport&lt;br /&gt;
mlmmj_destination_recipient_limit = 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
In &amp;lt;code&amp;gt;/etc/postfix/virtual&amp;lt;/code&amp;gt; we set the following line for each list we want to use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;test@lists.hackersanddesigners.nl    lists.hackersanddesigners.nl--test@localhost.mlmmj&lt;br /&gt;
news@lists.hackersanddesigners.nl    lists.hackersanddesigners.nl--news@localhost.mlmmj&amp;lt;/pre&amp;gt;&lt;br /&gt;
where: - &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;news&amp;lt;/code&amp;gt; is replaced with the name of the list - &amp;lt;code&amp;gt;lists.hackersanddesigners.nl&amp;lt;/code&amp;gt; with the domain name we want to use (and setup earlier in our DNS). - &amp;lt;code&amp;gt;localhost.mlmmj&amp;lt;/code&amp;gt; is a dummy domain used by &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; to connect this virtual alias to mlmmj transports&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;flower@lists.acidgreen.nl    lists.acidgreen.nl--flower@localhost.mlmmj&amp;lt;/pre&amp;gt;&lt;br /&gt;
We do the same in &amp;lt;code&amp;gt;/etc/postfix/transport&amp;lt;/code&amp;gt;, by adding the following line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;lists.hackersanddesigners.nl--test@localhost.mlmmj        mlmmj:test&amp;lt;/pre&amp;gt;&lt;br /&gt;
and replacing:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;lists.hackersanddesigners.nl&amp;lt;/code&amp;gt; to the domain we want to use&lt;br /&gt;
* &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; to the list name&lt;br /&gt;
&lt;br /&gt;
After, let’s compile these two files to a format that &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt; likes more, and reload &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo postmap virtual&lt;br /&gt;
sudo postmap transport&lt;br /&gt;
sudo postfix reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
Lastly, let’s add a config line to the end of &amp;lt;code&amp;gt;/etc/postfix/master.cf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# mlmmj mailing lists&lt;br /&gt;
mlmmj   unix  -       n       n       -       -       pipe&lt;br /&gt;
  flags=DORhu user=mlmmj argv=/usr/bin/mlmmj-receive -F -L /var/spool/mlmmj/$nexthop&amp;lt;/pre&amp;gt;&lt;br /&gt;
this tells &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt; to process incoming emails with a script command (&amp;lt;code&amp;gt;mlmmj-receive&amp;lt;/code&amp;gt;) ran by the &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; user, and to use certain flags (other settings useful for &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
The script will send incoming emails to the &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; spool directory (&amp;lt;code&amp;gt;/var/spool/mlmmj&amp;lt;/code&amp;gt;) in order to process them: if the email (sender) is trying to post to the list, and has access to it, the message is posted and being sent to every other address in that list; if the email asks to unsubscribe its sender, &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; will do that, etc.&lt;br /&gt;
&lt;br /&gt;
We can now create a test list and see if all works!&lt;br /&gt;
== Commands ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;make-a-list&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Make a list ===&lt;br /&gt;
&lt;br /&gt;
TODO: I think that because we setup a &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; process for &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt;, then &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; asks us to run it not with &amp;lt;code&amp;gt;mlmmj-&amp;amp;lt;command&amp;amp;gt;&amp;lt;/code&amp;gt; but with &amp;lt;code&amp;gt;/usr/bin/mlmmj-&amp;amp;lt;command&amp;amp;gt;&amp;lt;/code&amp;gt;. Get a grip on why it’s like this…&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /usr/bin/mlmmj-make-ml -c mlmmj -L &amp;amp;lt;list-name&amp;amp;gt; -a&amp;lt;/pre&amp;gt;&lt;br /&gt;
we create a new list using the &amp;lt;code&amp;gt;mlmmj-make-ml&amp;lt;/code&amp;gt; command, and use:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;, to set the user who will &#039;&#039;own&#039;&#039; the new list directory under &amp;lt;code&amp;gt;/var/spool/mlmmj&amp;lt;/code&amp;gt; (eg &amp;lt;code&amp;gt;/var/spool/mlmmj/test-list&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-L&amp;lt;/code&amp;gt;, to set the list name&lt;br /&gt;
&lt;br /&gt;
get list of subscribers:&lt;br /&gt;
=== List subscribers ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /usr/bin/mlmmj-list -L &amp;amp;lt;list-name&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Subscribe and unsubscribe from and to a list ===&lt;br /&gt;
&lt;br /&gt;
To subscribe, send an email to &amp;lt;code&amp;gt;&amp;amp;lt;list-name&amp;amp;gt;+subscribe@lists.hackersanddesigners.nl&amp;lt;/code&amp;gt;. To unsubscribe, send an email to &amp;lt;code&amp;gt;&amp;amp;lt;list-name&amp;amp;gt;+unsubscribe@lists.hackersanddesigners.nl&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Mlmmj_mailing-list_setup&amp;diff=28581</id>
		<title>Mlmmj mailing-list setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Mlmmj_mailing-list_setup&amp;diff=28581"/>
		<updated>2023-02-17T12:26:36Z</updated>

		<summary type="html">&lt;p&gt;Fincato: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
This is a reference guide to setup the [http://mlmmj.org/ mlmm] mailing list software on a Debian machine.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This guide is still a draft version for now, put together by transcribing my log notes and using memory; the mailing list setup is 95% going to work, but there are other details I cannot swear upon (yet). I plan to reproduce the whole process on another VPS soon and double check the steps I reported here&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;prerequisites&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A basic email server using &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt;; see &#039;&#039;Postfix Setup&#039;&#039; for more&lt;br /&gt;
* MX and A records of your list domain name correctly setup in your DNS settings&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;installation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; is a CLI program written in &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;: fast, tiny and to the point. It can be “extended” by writing bash script or such when necessary (eg for batch subscription or unsubscription). List configuration is done by using text files, it’s all pretty unix-y. OK cool.&lt;br /&gt;
&lt;br /&gt;
Check and upgrade Debian system:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get update &amp;amp;amp;&amp;amp;amp; apt-get upgrade&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then install &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get install mlmmj&amp;lt;/pre&amp;gt;&lt;br /&gt;
This creates a &amp;lt;code&amp;gt;spool&amp;lt;/code&amp;gt; directory for it under &amp;lt;code&amp;gt;/var/spool/mlmmj&amp;lt;/code&amp;gt;. Under &amp;lt;code&amp;gt;/var/spool&amp;lt;/code&amp;gt; you usually find also the &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt; directory, in Debian systems.&lt;br /&gt;
&lt;br /&gt;
As per &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; [http://mlmmj.org/docs/readme-postfix/ recommendation], let’s make a &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; system user:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo adduser mlmmj --system --home /var/spool/mlmmj --disabled-password --disabled-login&amp;lt;/pre&amp;gt;&lt;br /&gt;
We set the following options:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--system&amp;lt;/code&amp;gt;, we create it as a system user as it has no password and no login, because this user acts an automatic process&lt;br /&gt;
* &amp;lt;code&amp;gt;--home &amp;amp;lt;path&amp;amp;gt;&amp;lt;/code&amp;gt;, we set the user’s home directory to mlmmj’s spool directory, instead of the usual &amp;lt;code&amp;gt;home/mlmmj&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--disabled-password&amp;lt;/code&amp;gt;, no password&lt;br /&gt;
* &amp;lt;code&amp;gt;--disabled-login&amp;lt;/code&amp;gt;, no login&lt;br /&gt;
&lt;br /&gt;
The above settings are also done to set the least amount of privilegies to the mlmmj user.&lt;br /&gt;
&lt;br /&gt;
Let’s set the spool directory to be owned by &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo chown -R mlmmj /var/spool/mlmmj/&amp;lt;/pre&amp;gt;&lt;br /&gt;
And finally we make a new &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; entry:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo vi /etc/systemd/system/mlmmj.service&amp;lt;/pre&amp;gt;&lt;br /&gt;
with the following config, taken from https://github.com/tchapi/mlmmj-service-wrapper/blob/master/mlmmj.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[Unit]&lt;br /&gt;
Description=This script provides a simple wrapper for mlmmj run as a daemon&lt;br /&gt;
After=syslog.target network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
User=root&lt;br /&gt;
Type=forking&lt;br /&gt;
ExecStart=/usr/bin/mlmmj-maintd -d /var/spool/mlmmj&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&amp;lt;/pre&amp;gt;&lt;br /&gt;
Let’s start the service:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo systemctl start mlmmj&amp;lt;/pre&amp;gt;&lt;br /&gt;
Before testing out our new setup, we need to make some adjustments to &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;/etc/postfix/main.cf&amp;lt;/code&amp;gt;, make sure to have configured a &#039;&#039;recipient delimiter&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;recipient_delimiter = +&amp;lt;/pre&amp;gt;&lt;br /&gt;
And that our &#039;&#039;transport maps&#039;&#039; are the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;virtual_alias_maps = hash:/etc/postfix/virtual&lt;br /&gt;
transport_maps = hash:/etc/postfix/transport&lt;br /&gt;
mlmmj_destination_recipient_limit = 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
In &amp;lt;code&amp;gt;/etc/postfix/virtual&amp;lt;/code&amp;gt; we set the following line for each list we want to use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;test@lists.hackersanddesigners.nl    lists.hackersanddesigners.nl--test@localhost.mlmmj&lt;br /&gt;
news@lists.hackersanddesigners.nl    lists.hackersanddesigners.nl--news@localhost.mlmmj&amp;lt;/pre&amp;gt;&lt;br /&gt;
where: - &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;news&amp;lt;/code&amp;gt; is replaced with the name of the list - &amp;lt;code&amp;gt;lists.hackersanddesigners.nl&amp;lt;/code&amp;gt; with the domain name we want to use (and setup earlier in our DNS). - &amp;lt;code&amp;gt;localhost.mlmmj&amp;lt;/code&amp;gt; is a dummy domain used by &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; to connect this virtual alias to mlmmj transports&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;flower@lists.acidgreen.nl    lists.acidgreen.nl--flower@localhost.mlmmj&amp;lt;/pre&amp;gt;&lt;br /&gt;
We do the same in &amp;lt;code&amp;gt;/etc/postfix/transport&amp;lt;/code&amp;gt;, by adding the following line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;lists.hackersanddesigners.nl--test@localhost.mlmmj        mlmmj:test&amp;lt;/pre&amp;gt;&lt;br /&gt;
and replacing:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;lists.hackersanddesigners.nl&amp;lt;/code&amp;gt; to the domain we want to use&lt;br /&gt;
* &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; to the list name&lt;br /&gt;
&lt;br /&gt;
After, let’s compile these two files to a format that &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt; likes more, and reload &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo postmap virtual&lt;br /&gt;
sudo postmap transport&lt;br /&gt;
sudo postfix reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
Lastly, let’s add a config line to the end of &amp;lt;code&amp;gt;/etc/postfix/master.cf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# mlmmj mailing lists&lt;br /&gt;
mlmmj   unix  -       n       n       -       -       pipe&lt;br /&gt;
  flags=DORhu user=mlmmj argv=/usr/bin/mlmmj-receive -F -L /var/spool/mlmmj/$nexthop&amp;lt;/pre&amp;gt;&lt;br /&gt;
this tells &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt; to process incoming emails with a script command (&amp;lt;code&amp;gt;mlmmj-receive&amp;lt;/code&amp;gt;) ran by the &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; user, and to use certain flags (other settings useful for &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
The script will send incoming emails to the &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; spool directory (&amp;lt;code&amp;gt;/var/spool/mlmmj&amp;lt;/code&amp;gt;) in order to process them: if the email (sender) is trying to post to the list, and has access to it, the message is posted and being sent to every other address in that list; if the email asks to unsubscribe its sender, &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; will do that, etc.&lt;br /&gt;
&lt;br /&gt;
We can now create a test list and see if all works!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;commands&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;make-a-list&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Make a list ===&lt;br /&gt;
&lt;br /&gt;
TODO: I think that because we setup a &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; process for &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt;, then &amp;lt;code&amp;gt;mlmmj&amp;lt;/code&amp;gt; asks us to run it not with &amp;lt;code&amp;gt;mlmmj-&amp;amp;lt;command&amp;amp;gt;&amp;lt;/code&amp;gt; but with &amp;lt;code&amp;gt;/usr/bin/mlmmj-&amp;amp;lt;command&amp;amp;gt;&amp;lt;/code&amp;gt;. Get a grip on why it’s like this…&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /usr/bin/mlmmj-make-ml -c mlmmj -L &amp;amp;lt;list-name&amp;amp;gt; -a&amp;lt;/pre&amp;gt;&lt;br /&gt;
we create a new list using the &amp;lt;code&amp;gt;mlmmj-make-ml&amp;lt;/code&amp;gt; command, and use:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;, to set the user who will &#039;&#039;own&#039;&#039; the new list directory under &amp;lt;code&amp;gt;/var/spool/mlmmj&amp;lt;/code&amp;gt; (eg &amp;lt;code&amp;gt;/var/spool/mlmmj/test-list&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-L&amp;lt;/code&amp;gt;, to set the list name&lt;br /&gt;
&lt;br /&gt;
get list of subscribers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;list-subscribers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== List subscribers ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /usr/bin/mlmmj-list -L &amp;amp;lt;list-name&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;subscribe-and-unsubscribe-from-and-to-a-list&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Subscribe and unsubscribe from and to a list ===&lt;br /&gt;
&lt;br /&gt;
To subscribe, send an email to &amp;lt;code&amp;gt;&amp;amp;lt;list-name&amp;amp;gt;+subscribe@lists.hackersanddesigners.nl&amp;lt;/code&amp;gt;. To unsubscribe, send an email to &amp;lt;code&amp;gt;&amp;amp;lt;list-name&amp;amp;gt;+unsubscribe@lists.hackersanddesigners.nl&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Mlmmj_mailing-list_setup&amp;diff=28580</id>
		<title>Mlmmj mailing-list setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Mlmmj_mailing-list_setup&amp;diff=28580"/>
		<updated>2023-02-17T12:25:39Z</updated>

		<summary type="html">&lt;p&gt;Fincato: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;*-smart&amp;lt;/code&amp;gt; outputs better typography (eg straight quotes to curly quotes, etc)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;convert-.docx-to-.md-without-column-widthpagination&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== convert .docx to .md without column-width/pagination ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;pandoc -s input.docx -t markdown-smart -o output.md --wrap=none&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;convert-all-.docx-files-in-current-folder&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== convert all .docx files in current folder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;find . -name &amp;amp;quot;*.docx&amp;amp;quot; -exec pandoc -s {} -t markdown-smart -o {}.md --wrap=none \;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;convert-markdown-to-mediawiki-to-clipboard&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== convert markdown to mediawiki to clipboard ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;pandoc -s file.txt -t mediawiki | pbcopy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;convert-all-doc-files-in-current-folder-to-docx&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== convert all doc files in current folder to docx ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;textutil -convert docx *.doc&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Mlmmj_mailing-list_setup&amp;diff=28579</id>
		<title>Mlmmj mailing-list setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Mlmmj_mailing-list_setup&amp;diff=28579"/>
		<updated>2023-02-17T12:25:24Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Created page with &amp;quot;{{Article |MainNavigation=No }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Mailing-list_Maintenance&amp;diff=28578</id>
		<title>Mailing-list Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Mailing-list_Maintenance&amp;diff=28578"/>
		<updated>2023-02-17T12:22:47Z</updated>

		<summary type="html">&lt;p&gt;Fincato: init&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The mailing-list runs through a software called [http://mlmmj.org mlmmj] (Mailing List Management Made Joyful). It&#039;s a small C program that works on text files, ultra unix (or Linux?) in the approach.&lt;br /&gt;
&lt;br /&gt;
There&#039;s no real maintenance that so far has been needed in the functioning of the software, except sometimes debugging a new post not being published to the list (that was the case of re-opening a VPS port rather than the software itself).&lt;br /&gt;
&lt;br /&gt;
== Adding or removing email does not work ==&lt;br /&gt;
Usually adding and removing a new email to the list should happen by simply sending... an email to the list. Sometimes, probably due to moving the list of subscribers to this new setup (the shell script to bulk-import the email address might have added extra &amp;quot;invisible&amp;quot; characters to each email?), this automatic operation does not work.&lt;br /&gt;
&lt;br /&gt;
A first operation should be to run the following command:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
ADDRESS=$1&lt;br /&gt;
LIST=$2&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;removing $ADDRESS from $LIST list&amp;quot;&lt;br /&gt;
sudo /usr/bin/mlmmj-unsub -L /var/spool/mlmmj/$LIST -a $ADDRESS&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;checking if address has actually been fully removed...&amp;quot;&lt;br /&gt;
sudo rg &amp;quot;$ADDRESS&amp;quot; /var/spool/mlmmj/$LIST/subscribers.d/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;(replace &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; if you don&#039;t have it installed)&lt;br /&gt;
&lt;br /&gt;
What the above does is to remove the given address from the given list and then grep through all the files inside the subscribers folder to check if it&#039;s still there. Optimally it should not! &lt;br /&gt;
&lt;br /&gt;
If it does still, you need to:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/var/spool/mlmmj/&amp;lt;LIST&amp;gt;/subscribers.d/&amp;lt;/code&amp;gt;&lt;br /&gt;
* open the correct file (files inside this folder are organized one per each letter of the alphabet) based on the first letter of the email address you need to remove&lt;br /&gt;
* remove the line of the email address and save the file&lt;br /&gt;
&lt;br /&gt;
Yes it&#039;s a bit of a manual labor. The mistake has already been done. It would be handy to write a new script (maybe not in bash but in Python) to re-import all the email addresses without these possible extra invisible characters (which once I tried to remove and somehow managed —I thought).{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
For posterity, this is the shell script to bulk-import a list of address from a text file, that was found on the mlmmj mailing-list:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
INPUT=$1&lt;br /&gt;
LIST=$2&lt;br /&gt;
&lt;br /&gt;
if [[ $# -lt 2 ]] ; then&lt;br /&gt;
    echo &amp;quot;✕ Not enough arguments supplied: please pass INPUT (path/to/file-with-list-of-addresses) and LIST (eg /var/spool/mlmmj/&amp;lt;list&amp;gt;)&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
while IFS= read -r ADDR; do&lt;br /&gt;
    sudo /usr/bin/mlmmj-sub -L $LIST -f -q -s -a $ADDR&lt;br /&gt;
    printf &#039;imported: %s\n&#039; &amp;quot;$ADDR&amp;quot;&lt;br /&gt;
done &amp;lt; $INPUT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Mailing-list_Maintenance&amp;diff=28577</id>
		<title>Mailing-list Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Mailing-list_Maintenance&amp;diff=28577"/>
		<updated>2023-02-17T11:33:15Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Created page with &amp;quot;{{Article |MainNavigation=No }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Etherpad_Maintenance&amp;diff=28576</id>
		<title>Etherpad Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Etherpad_Maintenance&amp;diff=28576"/>
		<updated>2023-02-17T11:31:42Z</updated>

		<summary type="html">&lt;p&gt;Fincato: /* Setup references */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== List of all public pads ==&lt;br /&gt;
You can find an index of all &amp;quot;public&amp;quot; pads at this URL: https://padlist.hackersanddesigners.nl/.&lt;br /&gt;
&lt;br /&gt;
The software running this webpage is available at https://github.com/hackersanddesigners/ether-index.&lt;br /&gt;
&lt;br /&gt;
By public pad, it&#039;s meant any pad containing a certain keyword. In our case this is &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;__NOINDEX__&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Delete single pad ==&lt;br /&gt;
Construct a &amp;lt;code&amp;gt;URL&amp;lt;/code&amp;gt; in the form of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://etherpad.hackersanddesigners.nl/api/1/deletePad?apikey=&amp;lt;/nowiki&amp;gt;&amp;lt;API-KEY&amp;gt;&amp;amp;padID=&amp;lt;pad-uri&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;API-KEY&amp;gt;&amp;lt;/code&amp;gt; can be found in the root folder of the installed etherpad-lite repo&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;pad-uri&amp;gt;&amp;lt;/code&amp;gt; is the URI of the pad we want to delete, that is the pad&#039;s name. For instance for the URL &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://etherpad.hackersanddesigners.nl/p/test-pad&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; the URI is &amp;lt;code&amp;gt;test-pad&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Setup references ==&lt;br /&gt;
* https://github.com/ether/etherpad-lite&lt;br /&gt;
&lt;br /&gt;
* https://github.com/ether/etherpad-lite/wiki/How-to-use-Etherpad-Lite-with-MySQL&lt;br /&gt;
* https://github.com/ether/etherpad-lite/wiki/Optimizing-Etherpad&lt;br /&gt;
* https://github.com/ether/etherpad-lite/wiki/Converting-from-InnoDB-to-MyISAM&lt;br /&gt;
&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Etherpad_Maintenance&amp;diff=28575</id>
		<title>Etherpad Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Etherpad_Maintenance&amp;diff=28575"/>
		<updated>2023-02-17T11:31:29Z</updated>

		<summary type="html">&lt;p&gt;Fincato: add refs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== List of all public pads ==&lt;br /&gt;
You can find an index of all &amp;quot;public&amp;quot; pads at this URL: https://padlist.hackersanddesigners.nl/.&lt;br /&gt;
&lt;br /&gt;
The software running this webpage is available at https://github.com/hackersanddesigners/ether-index.&lt;br /&gt;
&lt;br /&gt;
By public pad, it&#039;s meant any pad containing a certain keyword. In our case this is &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;__NOINDEX__&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Delete single pad ==&lt;br /&gt;
Construct a &amp;lt;code&amp;gt;URL&amp;lt;/code&amp;gt; in the form of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://etherpad.hackersanddesigners.nl/api/1/deletePad?apikey=&amp;lt;/nowiki&amp;gt;&amp;lt;API-KEY&amp;gt;&amp;amp;padID=&amp;lt;pad-uri&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;API-KEY&amp;gt;&amp;lt;/code&amp;gt; can be found in the root folder of the installed etherpad-lite repo&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;pad-uri&amp;gt;&amp;lt;/code&amp;gt; is the URI of the pad we want to delete, that is the pad&#039;s name. For instance for the URL &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://etherpad.hackersanddesigners.nl/p/test-pad&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; the URI is &amp;lt;code&amp;gt;test-pad&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Setup references ==&lt;br /&gt;
{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* https://github.com/ether/etherpad-lite&lt;br /&gt;
&lt;br /&gt;
* https://github.com/ether/etherpad-lite/wiki/How-to-use-Etherpad-Lite-with-MySQL&lt;br /&gt;
* https://github.com/ether/etherpad-lite/wiki/Optimizing-Etherpad&lt;br /&gt;
* https://github.com/ether/etherpad-lite/wiki/Converting-from-InnoDB-to-MyISAM&lt;br /&gt;
&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Etherpad_Maintenance&amp;diff=28574</id>
		<title>Etherpad Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Etherpad_Maintenance&amp;diff=28574"/>
		<updated>2023-02-17T11:12:01Z</updated>

		<summary type="html">&lt;p&gt;Fincato: add padlist&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== List of all public pads ==&lt;br /&gt;
You can find an index of all &amp;quot;public&amp;quot; pads at this URL: https://padlist.hackersanddesigners.nl/.&lt;br /&gt;
&lt;br /&gt;
The software running this webpage is available at https://github.com/hackersanddesigners/ether-index.&lt;br /&gt;
&lt;br /&gt;
By public pad, it&#039;s meant any pad containing a certain keyword. In our case this is &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;__NOINDEX__&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Delete single pad ==&lt;br /&gt;
Construct a &amp;lt;code&amp;gt;URL&amp;lt;/code&amp;gt; in the form of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://etherpad.hackersanddesigners.nl/api/1/deletePad?apikey=&amp;lt;/nowiki&amp;gt;&amp;lt;API-KEY&amp;gt;&amp;amp;padID=&amp;lt;pad-uri&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;API-KEY&amp;gt;&amp;lt;/code&amp;gt; can be found in the root folder of the installed etherpad-lite repo&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;pad-uri&amp;gt;&amp;lt;/code&amp;gt; is the URI of the pad we want to delete, that is the pad&#039;s name. For instance for the URL &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://etherpad.hackersanddesigners.nl/p/test-pad&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; the URI is &amp;lt;code&amp;gt;test-pad&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Etherpad_Maintenance&amp;diff=28573</id>
		<title>Etherpad Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Etherpad_Maintenance&amp;diff=28573"/>
		<updated>2023-02-17T10:49:54Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Created page with &amp;quot;{{Article |MainNavigation=No }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Server_Maintenance&amp;diff=28572</id>
		<title>Server Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Server_Maintenance&amp;diff=28572"/>
		<updated>2023-02-17T10:46:15Z</updated>

		<summary type="html">&lt;p&gt;Fincato: add list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;H&amp;amp;D&#039;s VPS usually run on GNU/Linux Debian distribution.&lt;br /&gt;
&lt;br /&gt;
Updating the system once a week (or every two weeks) is kinda good. It&#039;s good to cross-check the [https://lists.debian.org/debian-lts-announce/ Debian mailing-list] (debian-lts-announce@lists.debian.org) beforehand to see if anything major needs a security update or particular care.&lt;br /&gt;
&lt;br /&gt;
To upgrade the system, your unix user needs to be in the &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; group. Following the basic process:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt update&amp;lt;/code&amp;gt; , upgrade local db packages&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt list --upgradable&amp;lt;/code&amp;gt; , show upgradable packages&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt upgrade&amp;lt;/code&amp;gt; , upgrade packages&lt;br /&gt;
&lt;br /&gt;
To list all installed packages, run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt list --installed&amp;lt;/code&amp;gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Server_Maintenance&amp;diff=28571</id>
		<title>Server Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Server_Maintenance&amp;diff=28571"/>
		<updated>2023-02-17T10:43:35Z</updated>

		<summary type="html">&lt;p&gt;Fincato: add category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;H&amp;amp;D&#039;s VPS usually run on GNU/Linux Debian distribution.&lt;br /&gt;
&lt;br /&gt;
Updating the system once a week (or every two weeks) is kinda good. It&#039;s good to cross-check the [https://lists.debian.org/debian-lts-announce/ Debian mailing-list] (debian-lts-announce@lists.debian.org) beforehand to see if anything major needs a security update or particular care.&lt;br /&gt;
&lt;br /&gt;
To upgrade the system, your unix user needs to be in the &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; group. Following the basic process:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;sudo apt update&amp;lt;/code&amp;gt; , upgrade local db packages&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;sudo apt list --upgradable&amp;lt;/code&amp;gt; , show upgradable packages&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;sudo apt upgrade&amp;lt;/code&amp;gt; , upgrade packages&lt;br /&gt;
&lt;br /&gt;
To list all installed packages, run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt list --installed&amp;lt;/code&amp;gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Maintenance]]&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Server_Maintenance&amp;diff=28570</id>
		<title>Server Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Server_Maintenance&amp;diff=28570"/>
		<updated>2023-02-17T10:42:52Z</updated>

		<summary type="html">&lt;p&gt;Fincato: init&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;H&amp;amp;D&#039;s VPS usually run on GNU/Linux Debian distribution.&lt;br /&gt;
&lt;br /&gt;
Updating the system once a week (or every two weeks) is kinda good. It&#039;s good to cross-check the [https://lists.debian.org/debian-lts-announce/ Debian mailing-list] (debian-lts-announce@lists.debian.org) beforehand to see if anything major needs a security update or particular care.&lt;br /&gt;
&lt;br /&gt;
To upgrade the system, your unix user needs to be in the &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; group. Following the basic process:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;sudo apt update&amp;lt;/code&amp;gt; , upgrade local db packages&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;sudo apt list --upgradable&amp;lt;/code&amp;gt; , show upgradable packages&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;sudo apt upgrade&amp;lt;/code&amp;gt; , upgrade packages&lt;br /&gt;
&lt;br /&gt;
To list all installed packages, run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt list --installed&amp;lt;/code&amp;gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Server_Maintenance&amp;diff=28569</id>
		<title>Server Maintenance</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Server_Maintenance&amp;diff=28569"/>
		<updated>2023-02-17T10:34:41Z</updated>

		<summary type="html">&lt;p&gt;Fincato: Created page with &amp;quot;{{Article |MainNavigation=No }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Article&lt;br /&gt;
|MainNavigation=No&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Test_Wiki_Article&amp;diff=28568</id>
		<title>Test Wiki Article</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Test_Wiki_Article&amp;diff=28568"/>
		<updated>2023-02-15T16:39:22Z</updated>

		<summary type="html">&lt;p&gt;Fincato: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Screenshot 2022-08-10 at 19.32.42.png|thumb]]&lt;br /&gt;
We start off with an intro.&lt;br /&gt;
&lt;br /&gt;
https://hackersanddesigners.nl/s/Tools/p/Chattypub&lt;br /&gt;
&lt;br /&gt;
https://cosmo.hackersanddesigners.nl/&lt;br /&gt;
&lt;br /&gt;
== The problem of scale in Anarchism ==&lt;br /&gt;
&lt;br /&gt;
This paper should be regarded as a continuation of the discussion started in [1] on the problem of scale in Anarchism and the Cybernetic Communism proposal, and as part of a longer forthcoming series of contributions aimed at developing and illustrating different aspects, some more abstract and theoretical and others more concrete, of the Cybernetic Communism idea.&lt;br /&gt;
&lt;br /&gt;
=== From small to large scale anarchism ===&lt;br /&gt;
&lt;br /&gt;
As already discussed in [1], small scale anarchism is a well established system consisting of communes, self-managed workers cooperatives, mutual aid networks, local food production and distribution, shared maker and hacker spaces, organized according to what in the time of the Span- ish Civil War was referred to as libertarian collectivism and libertarian syndicalist socialism.&lt;br /&gt;
&lt;br /&gt;
=== Contra Tiqqun ===&lt;br /&gt;
&lt;br /&gt;
In 2001 the French anarchist collective Tiqqun published a programmatic text called “The Cybernetic Hypothesis”, later published in English translation by Semiotext(e), and just republished in the same series in 2020. In essence, the cybernetic hypothesis is summarized by the statement that “what today is called neoliberalism is best understood as cybernetic capitalism”.&lt;br /&gt;
&lt;br /&gt;
== Networks and complex systems ==&lt;br /&gt;
&lt;br /&gt;
A complex adaptive system (CAS) is “a system in which large networks of com- ponents with no central control and simple rules of operation give rise to complex collective behavior, sophisticated information processing, and adaptation via learning or evolution” [51]. CASes are most concretely realized as biological and ecological systems, but their study is also applied towards social systems. In this paper, we are motivated by the discovery of topological phases in abstract configuration spaces in biological and ecological systems as in [39, 70], interpreting them not just as re- sults not specific to biological or ecological contexts, but speculating more wildly that these results about CASes, and thus containing insights also applicable towards the understanding of society.&lt;br /&gt;
&lt;br /&gt;
=== Mutualistic networks in biological systems ===&lt;br /&gt;
&lt;br /&gt;
As a general caveat, invok- ing nature as a justification for the functioning and aspirations of human society is fraught with dangerous pitfalls, from the social Darwinist appropriations and mis- interpretations of the theory of evolution and natural selection, aimed at justifying and promoting cut-throat capitalist competition as an imitation of a Tennysonian “Nature red in tooth and claw”, to the attempts of the promoters of the capitalist market system to pass off the functioning of markets as some kind of natural law, rather than as a human construct stemming from specific ideological positions.&lt;br /&gt;
&lt;br /&gt;
=== Scale phenomena in complex network ===&lt;br /&gt;
&lt;br /&gt;
The investigation of mutualistic networks in natural ecosystems also reveals interesting properties from the point of view of scale.HelloHello&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Test_Wiki_Article&amp;diff=28567</id>
		<title>Test Wiki Article</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Test_Wiki_Article&amp;diff=28567"/>
		<updated>2023-02-15T16:35:33Z</updated>

		<summary type="html">&lt;p&gt;Fincato: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Screenshot 2022-08-10 at 19.32.42.png|thumb]]&lt;br /&gt;
We start off with an intro.&lt;br /&gt;
&lt;br /&gt;
https://hackersanddesigners.nl/s/Tools/p/Chattypub&lt;br /&gt;
&lt;br /&gt;
https://cosmo.hackersanddesigners.nl/&lt;br /&gt;
&lt;br /&gt;
== The problem of scale in Anarchism ==&lt;br /&gt;
&lt;br /&gt;
This paper should be regarded as a continuation of the discussion started in [1] on the problem of scale in Anarchism and the Cybernetic Communism proposal, and as part of a longer forthcoming series of contributions aimed at developing and illustrating different aspects, some more abstract and theoretical and others more concrete, of the Cybernetic Communism idea.&lt;br /&gt;
&lt;br /&gt;
=== From small to large scale anarchism ===&lt;br /&gt;
&lt;br /&gt;
As already discussed in [1], small scale anarchism is a well established system consisting of communes, self-managed workers cooperatives, mutual aid networks, local food production and distribution, shared maker and hacker spaces, organized according to what in the time of the Span- ish Civil War was referred to as libertarian collectivism and libertarian syndicalist socialism.&lt;br /&gt;
&lt;br /&gt;
=== Contra Tiqqun ===&lt;br /&gt;
&lt;br /&gt;
In 2001 the French anarchist collective Tiqqun published a programmatic text called “The Cybernetic Hypothesis”, later published in English translation by Semiotext(e), and just republished in the same series in 2020. In essence, the cybernetic hypothesis is summarized by the statement that “what today is called neoliberalism is best understood as cybernetic capitalism”.&lt;br /&gt;
&lt;br /&gt;
== Networks and complex systems ==&lt;br /&gt;
&lt;br /&gt;
A complex adaptive system (CAS) is “a system in which large networks of com- ponents with no central control and simple rules of operation give rise to complex collective behavior, sophisticated information processing, and adaptation via learning or evolution” [51]. CASes are most concretely realized as biological and ecological systems, but their study is also applied towards social systems. In this paper, we are motivated by the discovery of topological phases in abstract configuration spaces in biological and ecological systems as in [39, 70], interpreting them not just as re- sults not specific to biological or ecological contexts, but speculating more wildly that these results about CASes, and thus containing insights also applicable towards the understanding of society.&lt;br /&gt;
&lt;br /&gt;
=== Mutualistic networks in biological systems ===&lt;br /&gt;
&lt;br /&gt;
As a general caveat, invok- ing nature as a justification for the functioning and aspirations of human society is fraught with dangerous pitfalls, from the social Darwinist appropriations and mis- interpretations of the theory of evolution and natural selection, aimed at justifying and promoting cut-throat capitalist competition as an imitation of a Tennysonian “Nature red in tooth and claw”, to the attempts of the promoters of the capitalist market system to pass off the functioning of markets as some kind of natural law, rather than as a human construct stemming from specific ideological positions.&lt;br /&gt;
&lt;br /&gt;
=== Scale phenomena in complex network ===&lt;br /&gt;
&lt;br /&gt;
The investigation of mutualistic networks in natural ecosystems also reveals interesting properties from the point of view of scale.Hello&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackersanddesigners.nl//index.php?title=Hackers_and_Designers:Sandbox&amp;diff=28566</id>
		<title>Hackers and Designers:Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackersanddesigners.nl//index.php?title=Hackers_and_Designers:Sandbox&amp;diff=28566"/>
		<updated>2023-02-15T13:49:05Z</updated>

		<summary type="html">&lt;p&gt;Fincato: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;HelloHello&lt;/div&gt;</summary>
		<author><name>Fincato</name></author>
	</entry>
</feed>