<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://klaverstyn.com.au/david/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=David</id>
	<title>KlavoWiki - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://klaverstyn.com.au/david/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=David"/>
	<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=Special:Contributions/David"/>
	<updated>2026-06-04T17:03:51Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=TeslaMate_Custom&amp;diff=2724</id>
		<title>TeslaMate Custom</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=TeslaMate_Custom&amp;diff=2724"/>
		<updated>2026-05-31T10:13:05Z</updated>

		<summary type="html">&lt;p&gt;David: Created page with &amp;quot;This is built on top of the TeslaMate install instructions.  I have modified the Drives data to include categories Personal, Work, and Other.  = Build = Build the docker image. &amp;lt;pre&amp;gt; cd /opt/teslamate&amp;lt;/pre&amp;gt; First time pull. &amp;lt;pre&amp;gt;git pull https://git.klaverstyn.com.au/david/teslamate.git&amp;lt;/pre&amp;gt; Rebuilding as repo already know. &amp;lt;pre&amp;gt;git pull&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;docker build --network=host -t teslamate:local .&amp;lt;/pre&amp;gt;  Only required if there has been changes to Grafana dashboards....&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is built on top of the [[TeslaMate]] install instructions.  I have modified the Drives data to include categories Personal, Work, and Other.&lt;br /&gt;
&lt;br /&gt;
= Build =&lt;br /&gt;
Build the docker image.&lt;br /&gt;
&amp;lt;pre&amp;gt; cd /opt/teslamate&amp;lt;/pre&amp;gt;&lt;br /&gt;
First time pull.&lt;br /&gt;
&amp;lt;pre&amp;gt;git pull https://git.klaverstyn.com.au/david/teslamate.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
Rebuilding as repo already know.&lt;br /&gt;
&amp;lt;pre&amp;gt;git pull&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;docker build --network=host -t teslamate:local .&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only required if there has been changes to Grafana dashboards.  If unsure no harm.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /opt/teslamate/grafana&lt;br /&gt;
docker build -t teslamate-grafana:local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure docker-compose.yml is updated for local repo.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  teslamate:&lt;br /&gt;
    image: teslamate:local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : Docker]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=btop&amp;diff=2723</id>
		<title>btop</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=btop&amp;diff=2723"/>
		<updated>2026-05-23T23:54:02Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;btop++ : Resource monitor that shows usage and stats for processor, memory, disks, network and processes&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= X86_64 =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /opt&lt;br /&gt;
wget https://github.com/aristocratos/btop/releases/download/v1.4.7/btop-x86_64-unknown-linux-musl.tar.gz&lt;br /&gt;
tar -xvf btop-x86_64-unknown-linux-musl.tar.gz&lt;br /&gt;
cd btop&lt;br /&gt;
make install&lt;br /&gt;
cd ..&lt;br /&gt;
rm -f btop-x86_64-linux-musl.tbz&lt;br /&gt;
cd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
btop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= rPi =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /opt&lt;br /&gt;
wget https://github.com/aristocratos/btop/releases/download/v1.4.3/btop-aarch64-linux-musl.tbz&lt;br /&gt;
tar -xvjf btop-aarch64-linux-musl.tbz&lt;br /&gt;
cd btop&lt;br /&gt;
make install&lt;br /&gt;
cd ..&lt;br /&gt;
rm -f btop-aarch64-linux-musl.tbz&lt;br /&gt;
cd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
btop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Links : [https://github.com/aristocratos/btop/releases GitHub]&lt;br /&gt;
[[Category : Linux ]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=btop&amp;diff=2722</id>
		<title>btop</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=btop&amp;diff=2722"/>
		<updated>2026-05-23T23:53:05Z</updated>

		<summary type="html">&lt;p&gt;David: /* X86_64 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;btop++ : Resource monitor that shows usage and stats for processor, memory, disks, network and processes&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= X86_64 =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /opt&lt;br /&gt;
wget https://github.com/aristocratos/btop/releases/download/v1.4.7/btop-x86_64-unknown-linux-musl.tar.gz&lt;br /&gt;
tar -xvjf btop-x86_64-unknown-linux-musl.tar.gz&lt;br /&gt;
cd btop&lt;br /&gt;
make install&lt;br /&gt;
cd ..&lt;br /&gt;
rm -f btop-x86_64-linux-musl.tbz&lt;br /&gt;
cd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
btop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= rPi =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /opt&lt;br /&gt;
wget https://github.com/aristocratos/btop/releases/download/v1.4.3/btop-aarch64-linux-musl.tbz&lt;br /&gt;
tar -xvjf btop-aarch64-linux-musl.tbz&lt;br /&gt;
cd btop&lt;br /&gt;
make install&lt;br /&gt;
cd ..&lt;br /&gt;
rm -f btop-aarch64-linux-musl.tbz&lt;br /&gt;
cd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
btop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Links : [https://github.com/aristocratos/btop/releases GitHub]&lt;br /&gt;
[[Category : Linux ]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=btop&amp;diff=2721</id>
		<title>btop</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=btop&amp;diff=2721"/>
		<updated>2026-05-23T23:52:29Z</updated>

		<summary type="html">&lt;p&gt;David: /* X86_64 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;btop++ : Resource monitor that shows usage and stats for processor, memory, disks, network and processes&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= X86_64 =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /opt&lt;br /&gt;
wget https://github.com/aristocratos/btop/releases/download/v1.4.7/btop-x86_64-unknown-linux-musl.tar.gz&lt;br /&gt;
tar -xvjf btop-x86_64-linux-musl.tbz&lt;br /&gt;
cd btop&lt;br /&gt;
make install&lt;br /&gt;
cd ..&lt;br /&gt;
rm -f btop-x86_64-linux-musl.tbz&lt;br /&gt;
cd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
btop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= rPi =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /opt&lt;br /&gt;
wget https://github.com/aristocratos/btop/releases/download/v1.4.3/btop-aarch64-linux-musl.tbz&lt;br /&gt;
tar -xvjf btop-aarch64-linux-musl.tbz&lt;br /&gt;
cd btop&lt;br /&gt;
make install&lt;br /&gt;
cd ..&lt;br /&gt;
rm -f btop-aarch64-linux-musl.tbz&lt;br /&gt;
cd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
btop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Links : [https://github.com/aristocratos/btop/releases GitHub]&lt;br /&gt;
[[Category : Linux ]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=btop&amp;diff=2720</id>
		<title>btop</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=btop&amp;diff=2720"/>
		<updated>2026-05-23T23:50:45Z</updated>

		<summary type="html">&lt;p&gt;David: /* X86_64 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;btop++ : Resource monitor that shows usage and stats for processor, memory, disks, network and processes&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= X86_64 =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /opt&lt;br /&gt;
wget https://github.com/aristocratos/btop/releases/download/v1.4.7/btop-x86_64-linux-musl.tbz&lt;br /&gt;
tar -xvjf btop-x86_64-linux-musl.tbz&lt;br /&gt;
cd btop&lt;br /&gt;
make install&lt;br /&gt;
cd ..&lt;br /&gt;
rm -f btop-x86_64-linux-musl.tbz&lt;br /&gt;
cd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
btop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= rPi =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /opt&lt;br /&gt;
wget https://github.com/aristocratos/btop/releases/download/v1.4.3/btop-aarch64-linux-musl.tbz&lt;br /&gt;
tar -xvjf btop-aarch64-linux-musl.tbz&lt;br /&gt;
cd btop&lt;br /&gt;
make install&lt;br /&gt;
cd ..&lt;br /&gt;
rm -f btop-aarch64-linux-musl.tbz&lt;br /&gt;
cd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
btop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Links : [https://github.com/aristocratos/btop/releases GitHub]&lt;br /&gt;
[[Category : Linux ]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2719</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2719"/>
		<updated>2026-05-09T05:04:36Z</updated>

		<summary type="html">&lt;p&gt;David: /* Access /custom/ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /mxa/ =&lt;br /&gt;
== enable /mxa/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/mxa.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /mxa/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/mxa.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /mxa/ {&lt;br /&gt;
    alias /var/www/mxa/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Allow static assets for iredadmin custom&lt;br /&gt;
    location /mxa/assets/ {&lt;br /&gt;
        expires 30d;&lt;br /&gt;
        access_log off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Block direct access to both app and vendor folders&lt;br /&gt;
    # Using specific prefix locations is safer and more reliable than regex when using alias&lt;br /&gt;
    location ^~ /mxa/app/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
    location ^~ /mxa/vendor/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/mxa/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
location = /mxa {&lt;br /&gt;
    return 301 $scheme://$http_host/mxa/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/hsts.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove the existing line and add:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add_header X-Frame-Options &amp;quot;SAMEORIGIN&amp;quot;;&lt;br /&gt;
add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot;;&lt;br /&gt;
add_header Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains; preload&amp;quot; always;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/mxa/&lt;br /&gt;
wget -qO- https://klaverstyn.com.au/david/downloads/mxa-26.5.7-1.tar.gz | tar -xzC /var/www/mxa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Move config file ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /etc/mxa&lt;br /&gt;
cd /var/www/mxa/&lt;br /&gt;
mv config.php /etc/mxa/config.php&lt;br /&gt;
chown root:www-data /etc/mxa/config.php&lt;br /&gt;
chmod 640 /etc/mxa/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== qrcode support ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Download the portable executable&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --quiet&lt;br /&gt;
php -r &amp;quot;unlink(&#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use the local file to install the library&lt;br /&gt;
php composer.phar require chillerlan/php-qrcode&lt;br /&gt;
&lt;br /&gt;
# (Optional) Delete the tool when finished&lt;br /&gt;
rm composer.phar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/mxa&lt;br /&gt;
chmod -R 750 /var/www/mxa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /mxa/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/mxa/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2718</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2718"/>
		<updated>2026-05-09T04:56:38Z</updated>

		<summary type="html">&lt;p&gt;David: /* Download */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /mxa/ =&lt;br /&gt;
== enable /mxa/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/mxa.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /mxa/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/mxa.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /mxa/ {&lt;br /&gt;
    alias /var/www/mxa/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Allow static assets for iredadmin custom&lt;br /&gt;
    location /mxa/assets/ {&lt;br /&gt;
        expires 30d;&lt;br /&gt;
        access_log off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Block direct access to both app and vendor folders&lt;br /&gt;
    # Using specific prefix locations is safer and more reliable than regex when using alias&lt;br /&gt;
    location ^~ /mxa/app/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
    location ^~ /mxa/vendor/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/mxa/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
location = /mxa {&lt;br /&gt;
    return 301 $scheme://$http_host/mxa/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/hsts.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove the existing line and add:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add_header X-Frame-Options &amp;quot;SAMEORIGIN&amp;quot;;&lt;br /&gt;
add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot;;&lt;br /&gt;
add_header Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains; preload&amp;quot; always;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/mxa/&lt;br /&gt;
wget -qO- https://klaverstyn.com.au/david/downloads/mxa-26.5.7-1.tar.gz | tar -xzC /var/www/mxa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Move config file ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /etc/mxa&lt;br /&gt;
cd /var/www/mxa/&lt;br /&gt;
mv config.php /etc/mxa/config.php&lt;br /&gt;
chown root:www-data /etc/mxa/config.php&lt;br /&gt;
chmod 640 /etc/mxa/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== qrcode support ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Download the portable executable&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --quiet&lt;br /&gt;
php -r &amp;quot;unlink(&#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use the local file to install the library&lt;br /&gt;
php composer.phar require chillerlan/php-qrcode&lt;br /&gt;
&lt;br /&gt;
# (Optional) Delete the tool when finished&lt;br /&gt;
rm composer.phar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/mxa&lt;br /&gt;
chmod -R 750 /var/www/mxa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/mxa/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2717</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2717"/>
		<updated>2026-05-09T04:55:11Z</updated>

		<summary type="html">&lt;p&gt;David: /* allow favicon.ico */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /mxa/ =&lt;br /&gt;
== enable /mxa/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/mxa.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /mxa/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/mxa.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /mxa/ {&lt;br /&gt;
    alias /var/www/mxa/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Allow static assets for iredadmin custom&lt;br /&gt;
    location /mxa/assets/ {&lt;br /&gt;
        expires 30d;&lt;br /&gt;
        access_log off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Block direct access to both app and vendor folders&lt;br /&gt;
    # Using specific prefix locations is safer and more reliable than regex when using alias&lt;br /&gt;
    location ^~ /mxa/app/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
    location ^~ /mxa/vendor/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/mxa/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
location = /mxa {&lt;br /&gt;
    return 301 $scheme://$http_host/mxa/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/hsts.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove the existing line and add:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add_header X-Frame-Options &amp;quot;SAMEORIGIN&amp;quot;;&lt;br /&gt;
add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot;;&lt;br /&gt;
add_header Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains; preload&amp;quot; always;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/mxa/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-7.tar.gz | tar -xzC /var/www/mxa&lt;br /&gt;
wget -qO /var/www/mxa/favicon.ico https://www.iredmail.org/favicon.ico&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Move config file ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /etc/mxa&lt;br /&gt;
cd /var/www/mxa/&lt;br /&gt;
mv config.php /etc/mxa/config.php&lt;br /&gt;
chown root:www-data /etc/mxa/config.php&lt;br /&gt;
chmod 640 /etc/mxa/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== qrcode support ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Download the portable executable&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --quiet&lt;br /&gt;
php -r &amp;quot;unlink(&#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use the local file to install the library&lt;br /&gt;
php composer.phar require chillerlan/php-qrcode&lt;br /&gt;
&lt;br /&gt;
# (Optional) Delete the tool when finished&lt;br /&gt;
rm composer.phar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/mxa&lt;br /&gt;
chmod -R 750 /var/www/mxa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/mxa/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2716</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2716"/>
		<updated>2026-05-04T03:28:55Z</updated>

		<summary type="html">&lt;p&gt;David: /* add /mxa/ location */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /mxa/ =&lt;br /&gt;
== enable /mxa/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/mxa.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /mxa/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/mxa.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /mxa/ {&lt;br /&gt;
    alias /var/www/mxa/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Allow static assets for iredadmin custom&lt;br /&gt;
    location /mxa/assets/ {&lt;br /&gt;
        expires 30d;&lt;br /&gt;
        access_log off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Block direct access to both app and vendor folders&lt;br /&gt;
    # Using specific prefix locations is safer and more reliable than regex when using alias&lt;br /&gt;
    location ^~ /mxa/app/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
    location ^~ /mxa/vendor/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/mxa/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
location = /mxa {&lt;br /&gt;
    return 301 $scheme://$http_host/mxa/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/hsts.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove the existing line and add:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add_header X-Frame-Options &amp;quot;SAMEORIGIN&amp;quot;;&lt;br /&gt;
add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot;;&lt;br /&gt;
add_header Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains; preload&amp;quot; always;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== allow favicon.ico ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/misc.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Replace&lt;br /&gt;
&amp;lt;pre&amp;gt;location = /favicon.ico { access_log off; log_not_found off; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
With&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
    alias /var/www/mxa/favicon.ico;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    log_not_found off;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/mxa/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-7.tar.gz | tar -xzC /var/www/mxa&lt;br /&gt;
wget -qO /var/www/mxa/favicon.ico https://www.iredmail.org/favicon.ico&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Move config file ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /etc/mxa&lt;br /&gt;
cd /var/www/mxa/&lt;br /&gt;
mv config.php /etc/mxa/config.php&lt;br /&gt;
chown root:www-data /etc/mxa/config.php&lt;br /&gt;
chmod 640 /etc/mxa/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== qrcode support ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Download the portable executable&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --quiet&lt;br /&gt;
php -r &amp;quot;unlink(&#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use the local file to install the library&lt;br /&gt;
php composer.phar require chillerlan/php-qrcode&lt;br /&gt;
&lt;br /&gt;
# (Optional) Delete the tool when finished&lt;br /&gt;
rm composer.phar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/mxa&lt;br /&gt;
chmod -R 750 /var/www/mxa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/mxa/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2715</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2715"/>
		<updated>2026-05-04T03:14:39Z</updated>

		<summary type="html">&lt;p&gt;David: /* nginx /custom/ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /mxa/ =&lt;br /&gt;
== enable /mxa/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/mxa.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /mxa/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/mxa.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /mxa/ {&lt;br /&gt;
    alias /var/www/mxa/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Allow static assets for iredadmin custom&lt;br /&gt;
    location /mxa/assets/ {&lt;br /&gt;
        expires 30d;&lt;br /&gt;
        access_log off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Block direct access to both app and vendor folders&lt;br /&gt;
    # Using specific prefix locations is safer and more reliable than regex when using alias&lt;br /&gt;
    location ^~ /mxa/app/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
    location ^~ /mxa/vendor/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/mxa/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/hsts.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove the existing line and add:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add_header X-Frame-Options &amp;quot;SAMEORIGIN&amp;quot;;&lt;br /&gt;
add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot;;&lt;br /&gt;
add_header Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains; preload&amp;quot; always;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== allow favicon.ico ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/misc.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Replace&lt;br /&gt;
&amp;lt;pre&amp;gt;location = /favicon.ico { access_log off; log_not_found off; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
With&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
    alias /var/www/mxa/favicon.ico;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    log_not_found off;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/mxa/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-7.tar.gz | tar -xzC /var/www/mxa&lt;br /&gt;
wget -qO /var/www/mxa/favicon.ico https://www.iredmail.org/favicon.ico&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Move config file ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /etc/mxa&lt;br /&gt;
cd /var/www/mxa/&lt;br /&gt;
mv config.php /etc/mxa/config.php&lt;br /&gt;
chown root:www-data /etc/mxa/config.php&lt;br /&gt;
chmod 640 /etc/mxa/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== qrcode support ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Download the portable executable&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --quiet&lt;br /&gt;
php -r &amp;quot;unlink(&#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use the local file to install the library&lt;br /&gt;
php composer.phar require chillerlan/php-qrcode&lt;br /&gt;
&lt;br /&gt;
# (Optional) Delete the tool when finished&lt;br /&gt;
rm composer.phar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/mxa&lt;br /&gt;
chmod -R 750 /var/www/mxa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/mxa/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2714</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2714"/>
		<updated>2026-05-04T03:13:52Z</updated>

		<summary type="html">&lt;p&gt;David: David moved page iRedAdmin Custom to MX Admin without leaving a redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /custom/ =&lt;br /&gt;
== enable /custom/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/mxa.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /custom/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/mxa.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /mxa/ {&lt;br /&gt;
    alias /var/www/mxa/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Allow static assets for iredadmin custom&lt;br /&gt;
    location /mxa/assets/ {&lt;br /&gt;
        expires 30d;&lt;br /&gt;
        access_log off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Block direct access to both app and vendor folders&lt;br /&gt;
    # Using specific prefix locations is safer and more reliable than regex when using alias&lt;br /&gt;
    location ^~ /mxa/app/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
    location ^~ /mxa/vendor/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/mxa/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/hsts.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove the existing line and add:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add_header X-Frame-Options &amp;quot;SAMEORIGIN&amp;quot;;&lt;br /&gt;
add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot;;&lt;br /&gt;
add_header Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains; preload&amp;quot; always;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== allow favicon.ico ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/misc.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Replace&lt;br /&gt;
&amp;lt;pre&amp;gt;location = /favicon.ico { access_log off; log_not_found off; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
With&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
    alias /var/www/mxa/favicon.ico;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    log_not_found off;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/mxa/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-7.tar.gz | tar -xzC /var/www/mxa&lt;br /&gt;
wget -qO /var/www/mxa/favicon.ico https://www.iredmail.org/favicon.ico&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Move config file ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /etc/mxa&lt;br /&gt;
cd /var/www/mxa/&lt;br /&gt;
mv config.php /etc/mxa/config.php&lt;br /&gt;
chown root:www-data /etc/mxa/config.php&lt;br /&gt;
chmod 640 /etc/mxa/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== qrcode support ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Download the portable executable&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --quiet&lt;br /&gt;
php -r &amp;quot;unlink(&#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use the local file to install the library&lt;br /&gt;
php composer.phar require chillerlan/php-qrcode&lt;br /&gt;
&lt;br /&gt;
# (Optional) Delete the tool when finished&lt;br /&gt;
rm composer.phar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/mxa&lt;br /&gt;
chmod -R 750 /var/www/mxa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/mxa/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2713</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2713"/>
		<updated>2026-05-04T00:26:47Z</updated>

		<summary type="html">&lt;p&gt;David: /* nginx /custom/ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /custom/ =&lt;br /&gt;
== enable /custom/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/mxa.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /custom/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/mxa.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /mxa/ {&lt;br /&gt;
    alias /var/www/mxa/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Allow static assets for iredadmin custom&lt;br /&gt;
    location /mxa/assets/ {&lt;br /&gt;
        expires 30d;&lt;br /&gt;
        access_log off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Block direct access to both app and vendor folders&lt;br /&gt;
    # Using specific prefix locations is safer and more reliable than regex when using alias&lt;br /&gt;
    location ^~ /mxa/app/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
    location ^~ /mxa/vendor/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/mxa/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/hsts.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove the existing line and add:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add_header X-Frame-Options &amp;quot;SAMEORIGIN&amp;quot;;&lt;br /&gt;
add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot;;&lt;br /&gt;
add_header Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains; preload&amp;quot; always;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== allow favicon.ico ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/misc.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Replace&lt;br /&gt;
&amp;lt;pre&amp;gt;location = /favicon.ico { access_log off; log_not_found off; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
With&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
    alias /var/www/mxa/favicon.ico;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    log_not_found off;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/mxa/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-7.tar.gz | tar -xzC /var/www/mxa&lt;br /&gt;
wget -qO /var/www/mxa/favicon.ico https://www.iredmail.org/favicon.ico&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Move config file ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /etc/mxa&lt;br /&gt;
cd /var/www/mxa/&lt;br /&gt;
mv config.php /etc/mxa/config.php&lt;br /&gt;
chown root:www-data /etc/mxa/config.php&lt;br /&gt;
chmod 640 /etc/mxa/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== qrcode support ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Download the portable executable&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --quiet&lt;br /&gt;
php -r &amp;quot;unlink(&#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use the local file to install the library&lt;br /&gt;
php composer.phar require chillerlan/php-qrcode&lt;br /&gt;
&lt;br /&gt;
# (Optional) Delete the tool when finished&lt;br /&gt;
rm composer.phar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/mxa&lt;br /&gt;
chmod -R 750 /var/www/mxa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/mxa/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2712</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2712"/>
		<updated>2026-05-03T23:56:21Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /custom/ =&lt;br /&gt;
== enable /custom/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/mxa.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /custom/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/mxa.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /mxa/ {&lt;br /&gt;
    alias /var/www/mxa/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Allow static assets for iredadmin custom&lt;br /&gt;
    location /mxa/assets/ {&lt;br /&gt;
        expires 30d;&lt;br /&gt;
        access_log off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Block direct access to both app and vendor folders&lt;br /&gt;
    # Using specific prefix locations is safer and more reliable than regex when using alias&lt;br /&gt;
    location ^~ /mxa/app/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
    location ^~ /mxa/vendor/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/mxa/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== allow favicon.ico ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/misc.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Replace&lt;br /&gt;
&amp;lt;pre&amp;gt;location = /favicon.ico { access_log off; log_not_found off; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
With&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
    alias /var/www/mxa/favicon.ico;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    log_not_found off;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/mxa/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-7.tar.gz | tar -xzC /var/www/mxa&lt;br /&gt;
wget -qO /var/www/mxa/favicon.ico https://www.iredmail.org/favicon.ico&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Move config file ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /etc/mxa&lt;br /&gt;
cd /var/www/mxa/&lt;br /&gt;
mv config.php /etc/mxa/config.php&lt;br /&gt;
chown root:www-data /etc/mxa/config.php&lt;br /&gt;
chmod 640 /etc/mxa/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== qrcode support ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Download the portable executable&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --quiet&lt;br /&gt;
php -r &amp;quot;unlink(&#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use the local file to install the library&lt;br /&gt;
php composer.phar require chillerlan/php-qrcode&lt;br /&gt;
&lt;br /&gt;
# (Optional) Delete the tool when finished&lt;br /&gt;
rm composer.phar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/mxa&lt;br /&gt;
chmod -R 750 /var/www/mxa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/mxa/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2711</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2711"/>
		<updated>2026-05-02T08:30:02Z</updated>

		<summary type="html">&lt;p&gt;David: /* add /custom/ location */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /custom/ =&lt;br /&gt;
== enable /custom/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/iredadmin-custom.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /custom/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/iredadmin-custom.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /iredadmin/custom/ {&lt;br /&gt;
    alias /var/www/iredadmin-custom/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Allow static assets for iredadmin custom&lt;br /&gt;
    location /iredadmin/custom/assets/ {&lt;br /&gt;
        expires 30d;&lt;br /&gt;
        access_log off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Block direct access to both app and vendor folders&lt;br /&gt;
    # Using specific prefix locations is safer and more reliable than regex when using alias&lt;br /&gt;
    location ^~ /iredadmin/custom/app/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
    location ^~ /iredadmin/custom/vendor/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/iredadmin/custom/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== allow favicon.ico ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/misc.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Replace&lt;br /&gt;
&amp;lt;pre&amp;gt;location = /favicon.ico { access_log off; log_not_found off; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
With&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
    alias /var/www/iredadmin-custom/favicon.ico;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    log_not_found off;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/iredadmin-custom/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-7.tar.gz | tar -xzC /var/www/iredadmin-custom&lt;br /&gt;
wget -qO /var/www/iredadmin-custom/favicon.ico https://www.iredmail.org/favicon.ico&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Move config file ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /etc/iredadmin&lt;br /&gt;
cd /var/www/iredadmin-custom/&lt;br /&gt;
mv config.php /etc/iredadmin/config.php&lt;br /&gt;
chown root:www-data /etc/iredadmin/config.php&lt;br /&gt;
chmod 640 /etc/iredadmin/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== qrcode support ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Download the portable executable&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --quiet&lt;br /&gt;
php -r &amp;quot;unlink(&#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use the local file to install the library&lt;br /&gt;
php composer.phar require chillerlan/php-qrcode&lt;br /&gt;
&lt;br /&gt;
# (Optional) Delete the tool when finished&lt;br /&gt;
rm composer.phar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/iredadmin-custom&lt;br /&gt;
chmod -R 750 /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/iredadmin/custom/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2710</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2710"/>
		<updated>2026-05-02T08:29:24Z</updated>

		<summary type="html">&lt;p&gt;David: /* add /custom/ location */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /custom/ =&lt;br /&gt;
== enable /custom/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/iredadmin-custom.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /custom/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/iredadmin-custom.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /iredadmin/custom/ {&lt;br /&gt;
    alias /var/www/iredadmin-custom/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Allow static assets for iredadmin custom&lt;br /&gt;
    location /iredadmin/custom/assets/ {&lt;br /&gt;
        expires 30d;&lt;br /&gt;
        access_log off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Block direct access to both app and vendor folders&lt;br /&gt;
    # Using specific prefix locations is safer and more reliable than regex when using alias&lt;br /&gt;
    location ^~ /iredadmin/custom/app/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
    location ^~ /iredadmin/custom/vendor/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/iredadmin/custom/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        # Match your PHP-FPM configuration (socket or port)&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== allow favicon.ico ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/misc.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Replace&lt;br /&gt;
&amp;lt;pre&amp;gt;location = /favicon.ico { access_log off; log_not_found off; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
With&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
    alias /var/www/iredadmin-custom/favicon.ico;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    log_not_found off;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/iredadmin-custom/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-7.tar.gz | tar -xzC /var/www/iredadmin-custom&lt;br /&gt;
wget -qO /var/www/iredadmin-custom/favicon.ico https://www.iredmail.org/favicon.ico&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Move config file ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /etc/iredadmin&lt;br /&gt;
cd /var/www/iredadmin-custom/&lt;br /&gt;
mv config.php /etc/iredadmin/config.php&lt;br /&gt;
chown root:www-data /etc/iredadmin/config.php&lt;br /&gt;
chmod 640 /etc/iredadmin/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== qrcode support ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Download the portable executable&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --quiet&lt;br /&gt;
php -r &amp;quot;unlink(&#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use the local file to install the library&lt;br /&gt;
php composer.phar require chillerlan/php-qrcode&lt;br /&gt;
&lt;br /&gt;
# (Optional) Delete the tool when finished&lt;br /&gt;
rm composer.phar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/iredadmin-custom&lt;br /&gt;
chmod -R 750 /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/iredadmin/custom/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2709</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2709"/>
		<updated>2026-05-02T08:04:26Z</updated>

		<summary type="html">&lt;p&gt;David: /* add /custom/ location */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /custom/ =&lt;br /&gt;
== enable /custom/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/iredadmin-custom.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /custom/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/iredadmin-custom.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location /iredadmin/custom/ {&lt;br /&gt;
    alias /var/www/iredadmin-custom/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Allow static assets for iredadmin custom&lt;br /&gt;
    location /iredadmin/custom/assets/ {&lt;br /&gt;
        expires 30d;&lt;br /&gt;
        access_log off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Block access to both app and vendor folders using regex&lt;br /&gt;
    location ~ ^/iredadmin/custom/(app|vendor)/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
        return 404;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/iredadmin/custom/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
location = /iredadmin/custom {&lt;br /&gt;
    return 301 /iredadmin/custom/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== allow favicon.ico ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/misc.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Replace&lt;br /&gt;
&amp;lt;pre&amp;gt;location = /favicon.ico { access_log off; log_not_found off; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
With&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
    alias /var/www/iredadmin-custom/favicon.ico;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    log_not_found off;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/iredadmin-custom/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-7.tar.gz | tar -xzC /var/www/iredadmin-custom&lt;br /&gt;
wget -qO /var/www/iredadmin-custom/favicon.ico https://www.iredmail.org/favicon.ico&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Move config file ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /etc/iredadmin&lt;br /&gt;
cd /var/www/iredadmin-custom/&lt;br /&gt;
mv config.php /etc/iredadmin/config.php&lt;br /&gt;
chown root:www-data /etc/iredadmin/config.php&lt;br /&gt;
chmod 640 /etc/iredadmin/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== qrcode support ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Download the portable executable&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --quiet&lt;br /&gt;
php -r &amp;quot;unlink(&#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use the local file to install the library&lt;br /&gt;
php composer.phar require chillerlan/php-qrcode&lt;br /&gt;
&lt;br /&gt;
# (Optional) Delete the tool when finished&lt;br /&gt;
rm composer.phar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/iredadmin-custom&lt;br /&gt;
chmod -R 750 /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/iredadmin/custom/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2708</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2708"/>
		<updated>2026-05-02T07:50:37Z</updated>

		<summary type="html">&lt;p&gt;David: /* nginx web files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /custom/ =&lt;br /&gt;
== enable /custom/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/iredadmin-custom.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /custom/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/iredadmin-custom.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /iredadmin/custom/ {&lt;br /&gt;
    alias /var/www/iredadmin-custom/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Block direct access to the app/ directory&lt;br /&gt;
    location ^~ /iredadmin/custom/app/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
        return 404;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/iredadmin/custom/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
location = /iredadmin/custom {&lt;br /&gt;
    return 301 /iredadmin/custom/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== allow favicon.ico ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/misc.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Replace&lt;br /&gt;
&amp;lt;pre&amp;gt;location = /favicon.ico { access_log off; log_not_found off; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
With&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
    alias /var/www/iredadmin-custom/favicon.ico;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    log_not_found off;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/iredadmin-custom/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-7.tar.gz | tar -xzC /var/www/iredadmin-custom&lt;br /&gt;
wget -qO /var/www/iredadmin-custom/favicon.ico https://www.iredmail.org/favicon.ico&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Move config file ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /etc/iredadmin&lt;br /&gt;
cd /var/www/iredadmin-custom/&lt;br /&gt;
mv config.php /etc/iredadmin/config.php&lt;br /&gt;
chown root:www-data /etc/iredadmin/config.php&lt;br /&gt;
chmod 640 /etc/iredadmin/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== qrcode support ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Download the portable executable&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --quiet&lt;br /&gt;
php -r &amp;quot;unlink(&#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use the local file to install the library&lt;br /&gt;
php composer.phar require chillerlan/php-qrcode&lt;br /&gt;
&lt;br /&gt;
# (Optional) Delete the tool when finished&lt;br /&gt;
rm composer.phar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/iredadmin-custom&lt;br /&gt;
chmod -R 750 /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/iredadmin/custom/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2707</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2707"/>
		<updated>2026-05-02T07:49:37Z</updated>

		<summary type="html">&lt;p&gt;David: /* nginx web files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /custom/ =&lt;br /&gt;
== enable /custom/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/iredadmin-custom.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /custom/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/iredadmin-custom.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /iredadmin/custom/ {&lt;br /&gt;
    alias /var/www/iredadmin-custom/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Block direct access to the app/ directory&lt;br /&gt;
    location ^~ /iredadmin/custom/app/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
        return 404;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/iredadmin/custom/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
location = /iredadmin/custom {&lt;br /&gt;
    return 301 /iredadmin/custom/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== allow favicon.ico ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/misc.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Replace&lt;br /&gt;
&amp;lt;pre&amp;gt;location = /favicon.ico { access_log off; log_not_found off; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
With&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
    alias /var/www/iredadmin-custom/favicon.ico;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    log_not_found off;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/iredadmin-custom/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-7.tar.gz | tar -xzC /var/www/iredadmin-custom&lt;br /&gt;
wget -qO /var/www/iredadmin-custom/favicon.ico https://www.iredmail.org/favicon.ico&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== qrcode support ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /var/www/iredadmin-custom/&lt;br /&gt;
&lt;br /&gt;
# Download the portable executable&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --quiet&lt;br /&gt;
php -r &amp;quot;unlink(&#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use the local file to install the library&lt;br /&gt;
php composer.phar require chillerlan/php-qrcode&lt;br /&gt;
&lt;br /&gt;
# (Optional) Delete the tool when finished&lt;br /&gt;
rm composer.phar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Move config file ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /etc/iredadmin&lt;br /&gt;
cd /var/www/iredadmin-custom/&lt;br /&gt;
mv config.php /etc/iredadmin/config.php&lt;br /&gt;
chown root:www-data /etc/iredadmin/config.php&lt;br /&gt;
chmod 640 /etc/iredadmin/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/iredadmin-custom&lt;br /&gt;
chmod -R 750 /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/iredadmin/custom/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=forgejo_git&amp;diff=2706</id>
		<title>forgejo git</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=forgejo_git&amp;diff=2706"/>
		<updated>2026-05-02T01:35:49Z</updated>

		<summary type="html">&lt;p&gt;David: Created page with &amp;quot;= docker = &amp;lt;pre&amp;gt;   mygit:     image: codeberg.org/forgejo/forgejo:14     container_name: forgejo     restart: always     environment:       - USER_UID=1000       - USER_GID=1000     networks:       - forgejo     volumes:       - ./git/data:/data       - /etc/localtime:/etc/localtime:ro     ports:       - &amp;quot;3003:3000&amp;quot;       - &amp;quot;2222:22&amp;quot; &amp;lt;/pre&amp;gt;  = nginx = &amp;lt;pre&amp;gt; server {     listen 192.168.1.1:80;     listen [fe80::4c9a:23d2:1f45:6a12]:80;      server_name git.klaverstyn.com....&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= docker =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  mygit:&lt;br /&gt;
    image: codeberg.org/forgejo/forgejo:14&lt;br /&gt;
    container_name: forgejo&lt;br /&gt;
    restart: always&lt;br /&gt;
    environment:&lt;br /&gt;
      - USER_UID=1000&lt;br /&gt;
      - USER_GID=1000&lt;br /&gt;
    networks:&lt;br /&gt;
      - forgejo&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./git/data:/data&lt;br /&gt;
      - /etc/localtime:/etc/localtime:ro&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;3003:3000&amp;quot;&lt;br /&gt;
      - &amp;quot;2222:22&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 192.168.1.1:80;&lt;br /&gt;
    listen [fe80::4c9a:23d2:1f45:6a12]:80;&lt;br /&gt;
&lt;br /&gt;
    server_name git.klaverstyn.com.au;&lt;br /&gt;
&lt;br /&gt;
    return 301 https://git.klaverstyn.com.au$request_uri;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/access_git.log;&lt;br /&gt;
    error_log /var/log/nginx/error_git.log;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 192.168.1.1:443 ssl;&lt;br /&gt;
    listen [fe80::4c9a:23d2:1f45:6a12]:443 ssl;&lt;br /&gt;
    http2 on;&lt;br /&gt;
&lt;br /&gt;
    server_name git.klaverstyn.com.au;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/access_git.log;&lt;br /&gt;
    error_log /var/log/nginx/error_git.log;&lt;br /&gt;
&lt;br /&gt;
    ssl_certificate       /etc/letsencrypt/live/git.klaverstyn.com.au/fullchain.pem;&lt;br /&gt;
    ssl_certificate_key   /etc/letsencrypt/live/git.klaverstyn.com.au/privkey.pem;&lt;br /&gt;
&lt;br /&gt;
    include snippets/stub-status.conf;&lt;br /&gt;
&lt;br /&gt;
    # Forgejo/Gitea specific security headers (simplified CSP to prevent breaking the UI)&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains; preload&amp;quot; always;&lt;br /&gt;
    add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot; always;&lt;br /&gt;
    add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot; always;&lt;br /&gt;
    add_header X-Frame-Options &amp;quot;SAMEORIGIN&amp;quot; always;&lt;br /&gt;
    add_header Referrer-Policy &amp;quot;strict-origin-when-cross-origin&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    # Git requires more than just GET/POST (e.g., PUT, PATCH, DELETE for API and Web UI)&lt;br /&gt;
    # I have removed your method restriction to ensure full Git functionality.&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        proxy_pass           http://localhost:3003;&lt;br /&gt;
        proxy_http_version    1.1;&lt;br /&gt;
        proxy_set_header      Host $host;&lt;br /&gt;
        proxy_set_header      X-Real-IP $remote_addr;&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      X-Forwarded-Host $host;&lt;br /&gt;
        proxy_set_header      X-Forwarded-Server $host;&lt;br /&gt;
&lt;br /&gt;
        # Support for large file uploads (important for Git pushes)&lt;br /&gt;
        client_max_body_size  512M;&lt;br /&gt;
&lt;br /&gt;
        proxy_set_header      Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header      Connection &amp;quot;Upgrade&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[ Category : nginx ]] [[ Category : docker ]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=2fauth&amp;diff=2705</id>
		<title>2fauth</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=2fauth&amp;diff=2705"/>
		<updated>2026-05-02T01:31:36Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= docker =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  2fauth:&lt;br /&gt;
    image: 2fauth/2fauth&lt;br /&gt;
    container_name: 2fauth&lt;br /&gt;
    restart: unless-stopped&lt;br /&gt;
    user: 1000:1000&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./2fauth:/2fauth&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8001:8000/tcp&lt;br /&gt;
    environment:&lt;br /&gt;
      - APP_NAME=2FAuth&lt;br /&gt;
      - APP_ENV=production&lt;br /&gt;
      - APP_TIMEZONE=Australia/Brisbane&lt;br /&gt;
      - APP_DEBUG=false&lt;br /&gt;
      - SITE_OWNER=david@klaverstyn.com.au&lt;br /&gt;
      - APP_KEY=createyourappkey&lt;br /&gt;
      - APP_URL=https://2fa.klaverstyn.com.au&lt;br /&gt;
      - ASSET_URL=https://2fa.klaverstyn.com.au&lt;br /&gt;
      - IS_DEMO_APP=false&lt;br /&gt;
      - LOG_CHANNEL=daily&lt;br /&gt;
      - LOG_LEVEL=notice&lt;br /&gt;
      - DB_DATABASE=&amp;quot;/2fauth/database.sqlite&amp;quot;&lt;br /&gt;
      - CACHE_DRIVER=redis&lt;br /&gt;
      - SESSION_DRIVER=redis&lt;br /&gt;
      - MAIL_MAILER=smtp&lt;br /&gt;
      - MAIL_HOST=mail.mailadmin.au&lt;br /&gt;
      - MAIL_PORT=25&lt;br /&gt;
      - MAIL_USERNAME=null&lt;br /&gt;
      - MAIL_PASSWORD=null&lt;br /&gt;
      - MAIL_ENCRYPTION=null&lt;br /&gt;
      - MAIL_FROM_NAME=null&lt;br /&gt;
      - MAIL_FROM_ADDRESS=no-reply@klaverstyn.com.au&lt;br /&gt;
      - MAIL_VERIFY_SSL_PEER=true&lt;br /&gt;
      - THROTTLE_API=60&lt;br /&gt;
      - LOGIN_THROTTLE=5&lt;br /&gt;
      - AUTHENTICATION_GUARD=web-guard&lt;br /&gt;
      - AUTHENTICATION_LOG_RETENTION=365&lt;br /&gt;
      #- PROXY_LOGOUT_URL=null&lt;br /&gt;
      - WEBAUTHN_NAME=2FAuth&lt;br /&gt;
      - WEBAUTHN_ID=2fa.klaverstyn.com.au&lt;br /&gt;
      - WEBAUTHN_USER_VERIFICATION=preferred&lt;br /&gt;
      - TRUSTED_PROXIES=web-docker.klaverstyn.com.au&lt;br /&gt;
      #- PROXY_FOR_OUTGOING_REQUESTS=null&lt;br /&gt;
      - CONTENT_SECURITY_POLICY=true&lt;br /&gt;
      # Leave the following configuration vars as is.&lt;br /&gt;
      # Unless you like to tinker and know what you&#039;re doing.&lt;br /&gt;
      - BROADCAST_DRIVER=log&lt;br /&gt;
      - QUEUE_DRIVER=sync&lt;br /&gt;
      - SESSION_LIFETIME=120&lt;br /&gt;
      - REDIS_HOST=librenms_redis&lt;br /&gt;
      - REDIS_PASSWORD=null&lt;br /&gt;
      - REDIS_PORT=6379&lt;br /&gt;
      - REDIS_DB=1&lt;br /&gt;
      - PUSHER_APP_ID=&lt;br /&gt;
      - PUSHER_APP_KEY=&lt;br /&gt;
      - PUSHER_APP_SECRET=&lt;br /&gt;
      - PUSHER_APP_CLUSTER=ap1&lt;br /&gt;
      - VITE_PUSHER_APP_KEY=&lt;br /&gt;
      - VITE_PUSHER_APP_CLUSTER=ap1&lt;br /&gt;
      - MIX_ENV=local&lt;br /&gt;
      - PHP_MEMORY_LIMIT=256M&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# This map ensures the &#039;Connection&#039; header is correctly set for WebSockets,&lt;br /&gt;
# though it&#039;s not strictly necessary for 2FAuth unless you enable WebSocket features.&lt;br /&gt;
# Place this in your http {} block or a common include file (e.g., /etc/nginx/nginx.conf)&lt;br /&gt;
map $http_upgrade $connection_upgrade {&lt;br /&gt;
    default upgrade;&lt;br /&gt;
    &#039;&#039;      close;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 192.168.1.1:80;&lt;br /&gt;
    listen [fe80::4c9a:23d2:1f45:6a12]:80;&lt;br /&gt;
&lt;br /&gt;
    server_name 2fa.klaverstyn.com.au;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/access_2fa.log;&lt;br /&gt;
    error_log /var/log/nginx/error_2fa.log;&lt;br /&gt;
    return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 192.168.1.1:443 ssl;&lt;br /&gt;
    listen [fe80::4c9a:23d2:1f45:6a12]:443 ssl;&lt;br /&gt;
    http2 on;&lt;br /&gt;
&lt;br /&gt;
    server_name 2fa.klaverstyn.com.au;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/access_2fa.log;&lt;br /&gt;
    error_log /var/log/nginx/error_2fa.log;&lt;br /&gt;
&lt;br /&gt;
    ssl_certificate       /etc/letsencrypt/live/2fa.klaverstyn.com.au/fullchain.pem;&lt;br /&gt;
    ssl_certificate_key   /etc/letsencrypt/live/2fa.klaverstyn.com.au/privkey.pem;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    client_body_timeout 10s;&lt;br /&gt;
    client_header_timeout 10s;&lt;br /&gt;
    keepalive_timeout 15s;&lt;br /&gt;
    send_timeout 10s;&lt;br /&gt;
    proxy_connect_timeout 30s;&lt;br /&gt;
    proxy_read_timeout 60s;&lt;br /&gt;
&lt;br /&gt;
    server_tokens off;&lt;br /&gt;
    client_max_body_size 50M;&lt;br /&gt;
&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot; always;&lt;br /&gt;
    add_header X-Frame-Options &amp;quot;DENY&amp;quot; always;&lt;br /&gt;
    add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot; always;&lt;br /&gt;
    add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot; always;&lt;br /&gt;
    add_header Referrer-Policy &amp;quot;no-referrer-when-downgrade&amp;quot; always;&lt;br /&gt;
    add_header Permissions-Policy &amp;quot;geolocation=(), camera=(), microphone=()&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    if ($http_user_agent ~* (HTTrack|wget|curl|nikto|sqlmap)) {&lt;br /&gt;
        return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # === Main 2FAuth Proxy Pass Configuration (without external auth) ===&lt;br /&gt;
    location / {&lt;br /&gt;
        # IMPORTANT: Replace 10.13.13.242:8001 with the actual internal IP/hostname and port of your 2fauth container.&lt;br /&gt;
        proxy_pass http://localhost:8001;&lt;br /&gt;
&lt;br /&gt;
        # Standard proxy headers&lt;br /&gt;
        proxy_set_header Host $host;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&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;
&lt;br /&gt;
        # WebSocket proxying (leave as is if unsure, harmless)&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection $connection_upgrade;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[ Category : nginx ]] [[ Category : docker ]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=2fauth&amp;diff=2704</id>
		<title>2fauth</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=2fauth&amp;diff=2704"/>
		<updated>2026-05-02T01:27:40Z</updated>

		<summary type="html">&lt;p&gt;David: Created page with &amp;quot;= docker = &amp;lt;pre&amp;gt;   2fauth:     image: 2fauth/2fauth     container_name: 2fauth     restart: unless-stopped     user: 1000:1000     volumes:       - ./2fauth:/2fauth     ports:       - 8001:8000/tcp     environment:       - APP_NAME=2FAuth       - APP_ENV=production       - APP_TIMEZONE=Australia/Brisbane       - APP_DEBUG=false       - SITE_OWNER=david@klaverstyn.com.au       - APP_KEY=createyourappkey       - APP_URL=https://2fa.klaverstyn.com.au       - ASSET_URL=https...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= docker =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  2fauth:&lt;br /&gt;
    image: 2fauth/2fauth&lt;br /&gt;
    container_name: 2fauth&lt;br /&gt;
    restart: unless-stopped&lt;br /&gt;
    user: 1000:1000&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./2fauth:/2fauth&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8001:8000/tcp&lt;br /&gt;
    environment:&lt;br /&gt;
      - APP_NAME=2FAuth&lt;br /&gt;
      - APP_ENV=production&lt;br /&gt;
      - APP_TIMEZONE=Australia/Brisbane&lt;br /&gt;
      - APP_DEBUG=false&lt;br /&gt;
      - SITE_OWNER=david@klaverstyn.com.au&lt;br /&gt;
      - APP_KEY=createyourappkey&lt;br /&gt;
      - APP_URL=https://2fa.klaverstyn.com.au&lt;br /&gt;
      - ASSET_URL=https://2fa.klaverstyn.com.au&lt;br /&gt;
      - IS_DEMO_APP=false&lt;br /&gt;
      - LOG_CHANNEL=daily&lt;br /&gt;
      - LOG_LEVEL=notice&lt;br /&gt;
      - DB_DATABASE=&amp;quot;/2fauth/database.sqlite&amp;quot;&lt;br /&gt;
      - CACHE_DRIVER=redis&lt;br /&gt;
      - SESSION_DRIVER=redis&lt;br /&gt;
      - MAIL_MAILER=smtp&lt;br /&gt;
      - MAIL_HOST=mail.mailadmin.au&lt;br /&gt;
      - MAIL_PORT=25&lt;br /&gt;
      - MAIL_USERNAME=null&lt;br /&gt;
      - MAIL_PASSWORD=null&lt;br /&gt;
      - MAIL_ENCRYPTION=null&lt;br /&gt;
      - MAIL_FROM_NAME=null&lt;br /&gt;
      - MAIL_FROM_ADDRESS=no-reply@klaverstyn.com.au&lt;br /&gt;
      - MAIL_VERIFY_SSL_PEER=true&lt;br /&gt;
      - THROTTLE_API=60&lt;br /&gt;
      - LOGIN_THROTTLE=5&lt;br /&gt;
      - AUTHENTICATION_GUARD=web-guard&lt;br /&gt;
      - AUTHENTICATION_LOG_RETENTION=365&lt;br /&gt;
      #- PROXY_LOGOUT_URL=null&lt;br /&gt;
      - WEBAUTHN_NAME=2FAuth&lt;br /&gt;
      - WEBAUTHN_ID=2fa.klaverstyn.com.au&lt;br /&gt;
      - WEBAUTHN_USER_VERIFICATION=preferred&lt;br /&gt;
      - TRUSTED_PROXIES=web-docker.klaverstyn.com.au&lt;br /&gt;
      #- PROXY_FOR_OUTGOING_REQUESTS=null&lt;br /&gt;
      - CONTENT_SECURITY_POLICY=true&lt;br /&gt;
      # Leave the following configuration vars as is.&lt;br /&gt;
      # Unless you like to tinker and know what you&#039;re doing.&lt;br /&gt;
      - BROADCAST_DRIVER=log&lt;br /&gt;
      - QUEUE_DRIVER=sync&lt;br /&gt;
      - SESSION_LIFETIME=120&lt;br /&gt;
      - REDIS_HOST=librenms_redis&lt;br /&gt;
      - REDIS_PASSWORD=null&lt;br /&gt;
      - REDIS_PORT=6379&lt;br /&gt;
      - REDIS_DB=1&lt;br /&gt;
      - PUSHER_APP_ID=&lt;br /&gt;
      - PUSHER_APP_KEY=&lt;br /&gt;
      - PUSHER_APP_SECRET=&lt;br /&gt;
      - PUSHER_APP_CLUSTER=ap1&lt;br /&gt;
      - VITE_PUSHER_APP_KEY=&lt;br /&gt;
      - VITE_PUSHER_APP_CLUSTER=ap1&lt;br /&gt;
      - MIX_ENV=local&lt;br /&gt;
      - PHP_MEMORY_LIMIT=256M&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 192.168.1.1:80;&lt;br /&gt;
    listen [fe80::4c9a:23d2:1f45:6a12]:80;&lt;br /&gt;
    server_name git.klaverstyn.com.au;&lt;br /&gt;
&lt;br /&gt;
    return 301 https://git.klaverstyn.com.au$request_uri;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/access_git.log;&lt;br /&gt;
    error_log /var/log/nginx/error_git.log;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 192.168.1.1:443 ssl;&lt;br /&gt;
    listen [fe80::4c9a:23d2:1f45:6a12]:443 ssl;&lt;br /&gt;
    http2 on;&lt;br /&gt;
&lt;br /&gt;
    server_name git.klaverstyn.com.au;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/access_git.log;&lt;br /&gt;
    error_log /var/log/nginx/error_git.log;&lt;br /&gt;
&lt;br /&gt;
    ssl_certificate       /etc/letsencrypt/live/git.klaverstyn.com.au/fullchain.pem;&lt;br /&gt;
    ssl_certificate_key   /etc/letsencrypt/live/git.klaverstyn.com.au/privkey.pem;&lt;br /&gt;
&lt;br /&gt;
    include snippets/stub-status.conf;&lt;br /&gt;
&lt;br /&gt;
    # Forgejo/Gitea specific security headers (simplified CSP to prevent breaking the UI)&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains; preload&amp;quot; always;&lt;br /&gt;
    add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot; always;&lt;br /&gt;
    add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot; always;&lt;br /&gt;
    add_header X-Frame-Options &amp;quot;SAMEORIGIN&amp;quot; always;&lt;br /&gt;
    add_header Referrer-Policy &amp;quot;strict-origin-when-cross-origin&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    # Git requires more than just GET/POST (e.g., PUT, PATCH, DELETE for API and Web UI)&lt;br /&gt;
    # I have removed your method restriction to ensure full Git functionality.&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        proxy_pass           http://localhost:3003;&lt;br /&gt;
        proxy_http_version    1.1;&lt;br /&gt;
        proxy_set_header      Host $host;&lt;br /&gt;
        proxy_set_header      X-Real-IP $remote_addr;&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      X-Forwarded-Host $host;&lt;br /&gt;
        proxy_set_header      X-Forwarded-Server $host;&lt;br /&gt;
&lt;br /&gt;
        # Support for large file uploads (important for Git pushes)&lt;br /&gt;
        client_max_body_size  512M;&lt;br /&gt;
&lt;br /&gt;
        proxy_set_header      Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header      Connection &amp;quot;Upgrade&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[ Category : nginx ]] [[ Category : docker ]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=corentinth_it-tools&amp;diff=2703</id>
		<title>corentinth it-tools</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=corentinth_it-tools&amp;diff=2703"/>
		<updated>2026-05-02T01:04:42Z</updated>

		<summary type="html">&lt;p&gt;David: Created page with &amp;quot;= docker = &amp;lt;pre&amp;gt;   corentinth:     image: ghcr.io/corentinth/it-tools:latest     container_name: it-tools     hostname: it-tools     restart: unless-stopped     ports:       - 8090:80 &amp;lt;/pre&amp;gt;  = nginx = &amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/pwpush&amp;lt;/pre&amp;gt;  &amp;lt;pre&amp;gt; server {     listen 192.168.1.1:80;     listen [fe80::4c9a:23d2:1f45:6a12]:80;      server_name pwpush.klaverstyn.com.au;      return 301 https://pwpush.klaverstyn.com.au;      access_log /var/log/nginx/access_pwpush.l...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= docker =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  corentinth:&lt;br /&gt;
    image: ghcr.io/corentinth/it-tools:latest&lt;br /&gt;
    container_name: it-tools&lt;br /&gt;
    hostname: it-tools&lt;br /&gt;
    restart: unless-stopped&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8090:80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx =&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/pwpush&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 192.168.1.1:80;&lt;br /&gt;
    listen [fe80::4c9a:23d2:1f45:6a12]:80;&lt;br /&gt;
&lt;br /&gt;
    server_name pwpush.klaverstyn.com.au;&lt;br /&gt;
&lt;br /&gt;
    return 301 https://pwpush.klaverstyn.com.au;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/access_pwpush.log;&lt;br /&gt;
    error_log /var/log/nginx/error_pwpush.log;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 192.168.1.1:443 ssl;&lt;br /&gt;
    listen [fe80::4c9a:23d2:1f45:6a12]:443 ssl;&lt;br /&gt;
    http2 on;&lt;br /&gt;
&lt;br /&gt;
    server_name pwpush.klaverstyn.com.au;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/access_pwpush.log;&lt;br /&gt;
    error_log /var/log/nginx/error_pwpush.log;&lt;br /&gt;
&lt;br /&gt;
    ssl_certificate         /etc/letsencrypt/live/pwpush.klaverstyn.com.au/fullchain.pem;&lt;br /&gt;
    ssl_certificate_key     /etc/letsencrypt/live/pwpush.klaverstyn.com.au/privkey.pem;&lt;br /&gt;
&lt;br /&gt;
    add_header Content-Security-Policy &amp;quot;default-src &#039;self&#039;; script-src &#039;self&#039; &#039;unsafe-inline&#039; &#039;unsafe-eval&#039; blob:; connect-src &#039;self&#039; blob:; img-src &#039;self&#039; data: https://tile.openstreetmap.org; style-src &#039;self&#039; &#039;unsafe-inline&#039;; font-src &#039;self&#039;; frame-ancestors &#039;self&#039;; form-action &#039;self&#039;; worker-src &#039;self&#039; blob:;&amp;quot;;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains; preload&amp;quot; always;&lt;br /&gt;
    add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot; always;&lt;br /&gt;
    add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot; always;&lt;br /&gt;
    add_header X-Frame-Options &amp;quot;SAMEORIGIN&amp;quot; always;&lt;br /&gt;
    add_header Referrer-Policy &amp;quot;strict-origin-when-cross-origin&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    if ($request_method !~ ^(GET|POST|HEAD)$ ) {&lt;br /&gt;
        return 444;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        proxy_pass             http://localhost:5100;&lt;br /&gt;
        proxy_http_version     1.1;&lt;br /&gt;
        proxy_set_header       Host             $host;&lt;br /&gt;
        proxy_set_header       X-Real-IP        $remote_addr;&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;
&lt;br /&gt;
        # Dynamic Upgrade Handling&lt;br /&gt;
        proxy_set_header       Upgrade          $http_upgrade;&lt;br /&gt;
        proxy_set_header       Connection       $connection_upgrade;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size   100M;&lt;br /&gt;
&lt;br /&gt;
        # Timeouts and Buffering for File Uploads&lt;br /&gt;
        proxy_read_timeout     300s;&lt;br /&gt;
        proxy_send_timeout     300s;&lt;br /&gt;
        client_body_buffer_size 128k;&lt;br /&gt;
        proxy_max_temp_file_size 0;&lt;br /&gt;
        proxy_connect_timeout  300s;&lt;br /&gt;
        proxy_buffering        off;&lt;br /&gt;
        proxy_request_buffering off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : nginx]] [[Category : docker]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2702</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2702"/>
		<updated>2026-04-30T00:49:56Z</updated>

		<summary type="html">&lt;p&gt;David: /* Move config file */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /custom/ =&lt;br /&gt;
== enable /custom/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/iredadmin-custom.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /custom/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/iredadmin-custom.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /iredadmin/custom/ {&lt;br /&gt;
    alias /var/www/iredadmin-custom/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Block direct access to the app/ directory&lt;br /&gt;
    location ^~ /iredadmin/custom/app/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
        return 404;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/iredadmin/custom/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
location = /iredadmin/custom {&lt;br /&gt;
    return 301 /iredadmin/custom/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== allow favicon.ico ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/misc.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Replace&lt;br /&gt;
&amp;lt;pre&amp;gt;location = /favicon.ico { access_log off; log_not_found off; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
With&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
    alias /var/www/iredadmin-custom/favicon.ico;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    log_not_found off;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/iredadmin-custom/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-7.tar.gz | tar -xzC /var/www/iredadmin-custom&lt;br /&gt;
wget -qO /var/www/iredadmin-custom/favicon.ico https://www.iredmail.org/favicon.ico&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Move config file ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /etc/iredadmin&lt;br /&gt;
cd /var/www/iredadmin-custom/&lt;br /&gt;
mv config.php /etc/iredadmin/config.php&lt;br /&gt;
chown root:www-data /etc/iredadmin/config.php&lt;br /&gt;
chmod 640 /etc/iredadmin/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/iredadmin-custom&lt;br /&gt;
chmod -R 750 /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/iredadmin/custom/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2701</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2701"/>
		<updated>2026-04-30T00:41:00Z</updated>

		<summary type="html">&lt;p&gt;David: /* Download */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /custom/ =&lt;br /&gt;
== enable /custom/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/iredadmin-custom.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /custom/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/iredadmin-custom.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /iredadmin/custom/ {&lt;br /&gt;
    alias /var/www/iredadmin-custom/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Block direct access to the app/ directory&lt;br /&gt;
    location ^~ /iredadmin/custom/app/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
        return 404;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/iredadmin/custom/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
location = /iredadmin/custom {&lt;br /&gt;
    return 301 /iredadmin/custom/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== allow favicon.ico ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/misc.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Replace&lt;br /&gt;
&amp;lt;pre&amp;gt;location = /favicon.ico { access_log off; log_not_found off; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
With&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
    alias /var/www/iredadmin-custom/favicon.ico;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    log_not_found off;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/iredadmin-custom/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-7.tar.gz | tar -xzC /var/www/iredadmin-custom&lt;br /&gt;
wget -qO /var/www/iredadmin-custom/favicon.ico https://www.iredmail.org/favicon.ico&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Move config file ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /etc/iredadmin&lt;br /&gt;
mv config.php /etc/iredadmin/config.php&lt;br /&gt;
chown root:www-data /etc/iredadmin/config.php&lt;br /&gt;
chmod 640 /etc/iredadmin/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/iredadmin-custom&lt;br /&gt;
chmod -R 750 /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/iredadmin/custom/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2700</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2700"/>
		<updated>2026-04-30T00:36:06Z</updated>

		<summary type="html">&lt;p&gt;David: /* nginx web files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /custom/ =&lt;br /&gt;
== enable /custom/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/iredadmin-custom.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /custom/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/iredadmin-custom.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /iredadmin/custom/ {&lt;br /&gt;
    alias /var/www/iredadmin-custom/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Block direct access to the app/ directory&lt;br /&gt;
    location ^~ /iredadmin/custom/app/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
        return 404;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/iredadmin/custom/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
location = /iredadmin/custom {&lt;br /&gt;
    return 301 /iredadmin/custom/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== allow favicon.ico ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/misc.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Replace&lt;br /&gt;
&amp;lt;pre&amp;gt;location = /favicon.ico { access_log off; log_not_found off; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
With&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
    alias /var/www/iredadmin-custom/favicon.ico;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    log_not_found off;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/iredadmin-custom/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-7.tar.gz | tar -xzC /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Move config file ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /etc/iredadmin&lt;br /&gt;
mv config.php /etc/iredadmin/config.php&lt;br /&gt;
chown root:www-data /etc/iredadmin/config.php&lt;br /&gt;
chmod 640 /etc/iredadmin/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/iredadmin-custom&lt;br /&gt;
chmod -R 750 /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/iredadmin/custom/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2699</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2699"/>
		<updated>2026-04-29T04:23:26Z</updated>

		<summary type="html">&lt;p&gt;David: /* add /custom/ location */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /custom/ =&lt;br /&gt;
== enable /custom/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/iredadmin-custom.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /custom/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/iredadmin-custom.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /iredadmin/custom/ {&lt;br /&gt;
    alias /var/www/iredadmin-custom/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Block direct access to the app/ directory&lt;br /&gt;
    location ^~ /iredadmin/custom/app/ {&lt;br /&gt;
        deny all;&lt;br /&gt;
        return 404;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # Only allow index.php to execute as PHP&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        if ($fastcgi_script_name !~ &amp;quot;^/iredadmin/custom/index\.php$&amp;quot;) {&lt;br /&gt;
            return 404;&lt;br /&gt;
        }&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
location = /iredadmin/custom {&lt;br /&gt;
    return 301 /iredadmin/custom/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== allow favicon.ico ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/misc.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Replace&lt;br /&gt;
&amp;lt;pre&amp;gt;location = /favicon.ico { access_log off; log_not_found off; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
With&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
    alias /var/www/iredadmin-custom/favicon.ico;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    log_not_found off;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/iredadmin-custom/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-7.tar.gz | tar -xzC /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/iredadmin-custom&lt;br /&gt;
find /var/www/iredadmin-custom -type d -exec chmod 755 {} +&lt;br /&gt;
find /var/www/iredadmin-custom -type f -exec chmod 644 {} +&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/iredadmin/custom/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2698</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2698"/>
		<updated>2026-04-28T09:11:49Z</updated>

		<summary type="html">&lt;p&gt;David: /* Download */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /custom/ =&lt;br /&gt;
== enable /custom/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/iredadmin-custom.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /custom/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/iredadmin-custom.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /iredadmin/custom/ {&lt;br /&gt;
    alias /var/www/iredadmin-custom/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Ensure we handle the PHP files correctly within this specific alias&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Redirect browser requests without the trailing slash to the version with it&lt;br /&gt;
location = /iredadmin/custom {&lt;br /&gt;
    return 301 /iredadmin/custom/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== allow favicon.ico ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/misc.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Replace&lt;br /&gt;
&amp;lt;pre&amp;gt;location = /favicon.ico { access_log off; log_not_found off; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
With&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
    alias /var/www/iredadmin-custom/favicon.ico;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    log_not_found off;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/iredadmin-custom/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-7.tar.gz | tar -xzC /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/iredadmin-custom&lt;br /&gt;
find /var/www/iredadmin-custom -type d -exec chmod 755 {} +&lt;br /&gt;
find /var/www/iredadmin-custom -type f -exec chmod 644 {} +&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/iredadmin/custom/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2697</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2697"/>
		<updated>2026-04-28T08:00:01Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nginx /custom/ =&lt;br /&gt;
== enable /custom/ location ==&lt;br /&gt;
To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/iredadmin-custom.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== add /custom/ location ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/iredadmin-custom.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /iredadmin/custom/ {&lt;br /&gt;
    alias /var/www/iredadmin-custom/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Ensure we handle the PHP files correctly within this specific alias&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Redirect browser requests without the trailing slash to the version with it&lt;br /&gt;
location = /iredadmin/custom {&lt;br /&gt;
    return 301 /iredadmin/custom/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== allow favicon.ico ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/misc.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Replace&lt;br /&gt;
&amp;lt;pre&amp;gt;location = /favicon.ico { access_log off; log_not_found off; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
With&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location = /favicon.ico {&lt;br /&gt;
    alias /var/www/iredadmin-custom/favicon.ico;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    log_not_found off;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx web files =&lt;br /&gt;
== Download ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/iredadmin-custom/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-3.tar.gz | tar -xzC /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Permissions ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/iredadmin-custom&lt;br /&gt;
find /var/www/iredadmin-custom -type d -exec chmod 755 {} +&lt;br /&gt;
find /var/www/iredadmin-custom -type f -exec chmod 644 {} +&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test and Restart nginx ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Access /custom/ =&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/iredadmin/custom/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2696</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2696"/>
		<updated>2026-04-28T04:51:35Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/iredadmin-custom.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/iredadmin-custom.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /iredadmin/custom/ {&lt;br /&gt;
    alias /var/www/iredadmin-custom/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Ensure we handle the PHP files correctly within this specific alias&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Redirect browser requests without the trailing slash to the version with it&lt;br /&gt;
location = /iredadmin/custom {&lt;br /&gt;
    return 301 /iredadmin/custom/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/iredadmin-custom/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-3.tar.gz | tar -xzC /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/iredadmin-custom&lt;br /&gt;
find /var/www/iredadmin-custom -type d -exec chmod 755 {} +&lt;br /&gt;
find /var/www/iredadmin-custom -type f -exec chmod 644 {} +&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;https://mail.myserver.com/iredadmin/custom/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2695</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2695"/>
		<updated>2026-04-28T04:09:28Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/iredadmin-custom.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/iredadmin-custom.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /iredadmin/custom/ {&lt;br /&gt;
    alias /var/www/iredadmin-custom/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Ensure we handle the PHP files correctly within this specific alias&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Redirect browser requests without the trailing slash to the version with it&lt;br /&gt;
location = /iredadmin/custom {&lt;br /&gt;
    return 301 /iredadmin/custom/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/iredadmin-custom/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-3.tar.gz | tar -xzC /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/iredadmin-custom&lt;br /&gt;
find /var/www/iredadmin-custom -type d -exec chmod 755 {} +&lt;br /&gt;
find /var/www/iredadmin-custom -type f -exec chmod 644 {} +&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2694</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2694"/>
		<updated>2026-04-28T03:53:57Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/iredadmin-custom.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/iredadmin-custom.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /iredadmin/custom/ {&lt;br /&gt;
    alias /var/www/iredadmin-custom/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Ensure we handle the PHP files correctly within this specific alias&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Redirect browser requests without the trailing slash to the version with it&lt;br /&gt;
location = /iredadmin/custom {&lt;br /&gt;
    return 301 /iredadmin/custom/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/iredadmin-custom/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-3.tar.gz | tar -xzC /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown -R www-data:www-data /var/www/iredadmin-custom&lt;br /&gt;
chmod -R 644 /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2693</id>
		<title>MX Admin</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MX_Admin&amp;diff=2693"/>
		<updated>2026-04-28T03:43:40Z</updated>

		<summary type="html">&lt;p&gt;David: Created page with &amp;quot;To install my iRedMail Custom Administration Pages &amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt; Add the following line before any other includes. &amp;lt;pre&amp;gt;    include /etc/nginx/templates/iredadmin-custom.tmpl;&amp;lt;/pre&amp;gt;  &amp;lt;pre&amp;gt;vi /etc/nginx/templates/iredadmin-custom.tmpl&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt; location ^~ /iredadmin/custom/ {     alias /var/www/iredadmin-custom/;     index index.php;      # Ensure we handle the PHP files correctly within this specific alias     location ~...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To install my iRedMail Custom Administration Pages&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/00-default-ssl.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following line before any other includes.&lt;br /&gt;
&amp;lt;pre&amp;gt;    include /etc/nginx/templates/iredadmin-custom.tmpl;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/templates/iredadmin-custom.tmpl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
location ^~ /iredadmin/custom/ {&lt;br /&gt;
    alias /var/www/iredadmin-custom/;&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    # Ensure we handle the PHP files correctly within this specific alias&lt;br /&gt;
    location ~ \.php$ {&lt;br /&gt;
        include snippets/fastcgi-php.conf;&lt;br /&gt;
        fastcgi_param SCRIPT_FILENAME $request_filename;&lt;br /&gt;
        fastcgi_pass 127.0.0.1:9999;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Redirect browser requests without the trailing slash to the version with it&lt;br /&gt;
location = /iredadmin/custom {&lt;br /&gt;
    return 301 /iredadmin/custom/;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/www/iredadmin-custom/&lt;br /&gt;
wget -qO- http://klaverstyn.com.au/david/downloads/iRedAdmin-custom-26.4.28-3.tar.gz | tar -xzC /var/www/iredadmin-custom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nginx -t&lt;br /&gt;
systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=iRedMail_Migration&amp;diff=2692</id>
		<title>iRedMail Migration</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=iRedMail_Migration&amp;diff=2692"/>
		<updated>2026-04-25T01:49:12Z</updated>

		<summary type="html">&lt;p&gt;David: /* DKIM Config */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To migrate a iRedMail server from one host to another, these are the steps that I completed.&lt;br /&gt;
&lt;br /&gt;
Install iRedMail onto a fresh server as you would normally complete an install.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= vmail1 dkim backup =&lt;br /&gt;
On Source. Copy the files from source to destination.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rsync -azvh /var/vmail/vmail1/ root@192.168.1.25:/var/vmail/vmail1/&lt;br /&gt;
rsync -azvh /var/lib/dkim/ root@192.168.1.25:/var/lib/dkim/&lt;br /&gt;
rsync -azvh /var/vmail/backup/ root@192.168.1.25:/var/vmail/backup/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Export SQL =&lt;br /&gt;
On Source&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mariadb-dump amavisd &amp;gt; amavisd.sql&lt;br /&gt;
mariadb-dump iredadmin &amp;gt; iredadmin.sql&lt;br /&gt;
mariadb-dump iredapd &amp;gt; iredapd.sql&lt;br /&gt;
mariadb-dump roundcubemail &amp;gt; roundcubemail.sql&lt;br /&gt;
mariadb-dump sogo &amp;gt; sogo.sql&lt;br /&gt;
mariadb-dump vmail &amp;gt; vmail.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp *sql root@192.168.1.25:/tmp/&lt;br /&gt;
rm *sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Import SQL =&lt;br /&gt;
On Destination&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mariadb amavisd &amp;lt; /tmp/amavisd.sql&lt;br /&gt;
mariadb iredadmin &amp;lt; /tmp/iredadmin.sql&lt;br /&gt;
mariadb iredapd &amp;lt; /tmp/iredapd.sql&lt;br /&gt;
mariadb roundcubemail &amp;lt; /tmp/roundcubemail.sql&lt;br /&gt;
mariadb sogo &amp;lt; /tmp/sogo.sql&lt;br /&gt;
mariadb vmail &amp;lt; /tmp/vmail.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;rm .tmp/*sql&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DKIM Config =&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/amavis/conf.d/50-user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Add dkim_key here.&lt;br /&gt;
dkim_key(&#039;domainname.com&#039;, &#039;dkim&#039;, &#039;/var/lib/dkim/domainname.com.pem&#039;);&lt;br /&gt;
dkim_key(&#039;another.com&#039;, &#039;dkim&#039;, &#039;/var/lib/dkim/another.pem&#039;);&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;domainname.com&amp;quot; =&amp;gt; ( d=&amp;gt; &amp;quot;domainname.com&amp;quot;, a =&amp;gt; &#039;rsa-sha256&#039;, ttl =&amp;gt; 10*24*3600 ),&lt;br /&gt;
    &amp;quot;another.com&amp;quot; =&amp;gt; ( d=&amp;gt; &amp;quot;another.com&amp;quot;, a =&amp;gt; &#039;rsa-sha256&#039;, ttl =&amp;gt; 10*24*3600 ),&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart amavis.service&lt;br /&gt;
amavisd showkeys&lt;br /&gt;
amavisd testkeys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= sogo =&lt;br /&gt;
Restore Sogo configuration.  Extract Sogo backup files to folder.&lt;br /&gt;
&amp;lt;pre&amp;gt; for user in $(ls /tmp/sogo_restore/17/); do sogo-tool restore -f ALL /tmp/sogo_restore/17/ &amp;quot;$user&amp;quot;; done&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Allow SNMP =&lt;br /&gt;
This is specifically for me.&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nftables.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # snmp&lt;br /&gt;
        udp dport 161 accept&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=iRedMail_Installation_with_MariaDB&amp;diff=2691</id>
		<title>iRedMail Installation with MariaDB</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=iRedMail_Installation_with_MariaDB&amp;diff=2691"/>
		<updated>2026-04-17T10:44:12Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following instructions were performed on Debian 13&amp;lt;br&amp;gt;&lt;br /&gt;
iRedMail provides self-hosting email with SOGo providing Exchange Active Sync operations.&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.iredmail.org/install.iredmail.on.debian.ubuntu.html Official Installation Documentation]&lt;br /&gt;
= Installation =&lt;br /&gt;
Install Debain barebones.  Do not install any additional packages.&amp;lt;br&amp;gt;&lt;br /&gt;
Make sure that hostname and hostname -f commands return the correct names.&lt;br /&gt;
== Hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/hosts&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.25                              mail.myserver.com       mail&lt;br /&gt;
df7e:0e05:068a:8141:20a5:1806:d881:ec17   mail.myserver.com       mail&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Install ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
wget https://github.com/iredmail/iRedMail/archive/refs/tags/1.8.0.tar.gz&lt;br /&gt;
tar xvf 1.8.0.tar.gz&lt;br /&gt;
rm 1.8.0.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd iRedMail-1.8.0&lt;br /&gt;
bash ./iRedMail.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Post Installation Information ==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Mailboxes&lt;br /&gt;
|/var/vmail/vmail1/&lt;br /&gt;
|-&lt;br /&gt;
|Sensitive Info&lt;br /&gt;
|/usr/src/iRedMail-1.8.0/config&lt;br /&gt;
|-&lt;br /&gt;
|Post installation information&lt;br /&gt;
|/opt/iRedMail-1.8.0/iRedMail.tips&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
URL&#039;s&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Roundcube webmail&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;https://mail.myserver.com/mail/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|SOGo Groupware&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;https://mail.myserver.com/SOGo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Web admin panel&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;https://mail.myserver.com/iredadmin/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Done =&lt;br /&gt;
That is it for the install.  Now the configuration is the difficult part if you need any special customisation otherwise the iRedAdmin will suffice.&lt;br /&gt;
&lt;br /&gt;
Refer to [[:Category:iRedMail]] for specific configuration tasks.&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=iRedMail_Migration&amp;diff=2690</id>
		<title>iRedMail Migration</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=iRedMail_Migration&amp;diff=2690"/>
		<updated>2026-04-17T10:28:19Z</updated>

		<summary type="html">&lt;p&gt;David: Created page with &amp;quot;To migrate a iRedMail server from one host to another, these are the steps that I completed.  Install iRedMail onto a fresh server as you would normally complete an install.   = vmail1 dkim backup = On Source. Copy the files from source to destination. &amp;lt;pre&amp;gt; rsync -azvh /var/vmail/vmail1/ root@192.168.1.25:/var/vmail/vmail1/ rsync -azvh /var/lib/dkim/ root@192.168.1.25:/var/lib/dkim/ rsync -azvh /var/vmail/backup/ root@192.168.1.25:/var/vmail/backup/ &amp;lt;/pre&amp;gt;  = Export SQL...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To migrate a iRedMail server from one host to another, these are the steps that I completed.&lt;br /&gt;
&lt;br /&gt;
Install iRedMail onto a fresh server as you would normally complete an install.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= vmail1 dkim backup =&lt;br /&gt;
On Source. Copy the files from source to destination.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rsync -azvh /var/vmail/vmail1/ root@192.168.1.25:/var/vmail/vmail1/&lt;br /&gt;
rsync -azvh /var/lib/dkim/ root@192.168.1.25:/var/lib/dkim/&lt;br /&gt;
rsync -azvh /var/vmail/backup/ root@192.168.1.25:/var/vmail/backup/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Export SQL =&lt;br /&gt;
On Source&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mariadb-dump amavisd &amp;gt; amavisd.sql&lt;br /&gt;
mariadb-dump iredadmin &amp;gt; iredadmin.sql&lt;br /&gt;
mariadb-dump iredapd &amp;gt; iredapd.sql&lt;br /&gt;
mariadb-dump roundcubemail &amp;gt; roundcubemail.sql&lt;br /&gt;
mariadb-dump sogo &amp;gt; sogo.sql&lt;br /&gt;
mariadb-dump vmail &amp;gt; vmail.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp *sql root@192.168.1.25:/tmp/&lt;br /&gt;
rm *sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Import SQL =&lt;br /&gt;
On Destination&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mariadb amavisd &amp;lt; /tmp/amavisd.sql&lt;br /&gt;
mariadb iredadmin &amp;lt; /tmp/iredadmin.sql&lt;br /&gt;
mariadb iredapd &amp;lt; /tmp/iredapd.sql&lt;br /&gt;
mariadb roundcubemail &amp;lt; /tmp/roundcubemail.sql&lt;br /&gt;
mariadb sogo &amp;lt; /tmp/sogo.sql&lt;br /&gt;
mariadb vmail &amp;lt; /tmp/vmail.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;rm .tmp/*sql&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DKIM Config =&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/amavis/conf.d/50-user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Add dkim_key here.&lt;br /&gt;
dkim_key(&#039;domainname.com&#039;, &#039;dkim&#039;, &#039;/var/lib/dkim/domainname.com.pem&#039;);&lt;br /&gt;
dkim_key(&#039;another.com&#039;, &#039;dkim&#039;, &#039;/var/lib/dkim/another.pem&#039;);&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;domainname.com&amp;quot; =&amp;gt; ( d=&amp;gt; &amp;quot;domainname.com&amp;quot;, a =&amp;gt; &#039;rsa-sha256&#039;, ttl =&amp;gt; 10*24*3600 ),&lt;br /&gt;
    &amp;quot;another.com&amp;quot; =&amp;gt; ( d=&amp;gt; &amp;quot;another.com&amp;quot;, a =&amp;gt; &#039;rsa-sha256&#039;, ttl =&amp;gt; 10*24*3600 ),&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart amavis.service&lt;br /&gt;
amavisd showkeys&lt;br /&gt;
amavisd testkeys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Allow SNMP =&lt;br /&gt;
This is specifically for me.&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nftables.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # snmp&lt;br /&gt;
        udp dport 161 accept&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : iRedMail]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=GeoIP&amp;diff=2689</id>
		<title>GeoIP</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=GeoIP&amp;diff=2689"/>
		<updated>2026-04-08T00:30:59Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This configuration is to on enable GeoIP and only allow certain countries to access a specific web site.  This works with IPv4 and IPv6 addresses.&lt;br /&gt;
&lt;br /&gt;
= Install Debian Applications =&lt;br /&gt;
&amp;lt;pre&amp;gt;apt install libnginx-mod-http-geoip2 libmaxminddb0 libmaxminddb-dev mmdb-bin&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Go to https://www.maxmind.com, create a free account.&lt;br /&gt;
Under Account, Manage license keys. Generate a new license key.&lt;br /&gt;
&lt;br /&gt;
== Config GeoIP ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/GeoIP.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AccountID 1234567&lt;br /&gt;
LicenseKey rt09gu45gp;c4rovcj4rt0goi.....&lt;br /&gt;
&lt;br /&gt;
EditionIDs GeoLite2-Country GeoLite2-City&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Configure nginx =&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/nginx.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # Load the GeoIP2 database&lt;br /&gt;
        geoip2 /var/lib/GeoIP/GeoLite2-Country.mmdb {&lt;br /&gt;
            auto_reload 5m;&lt;br /&gt;
            $geoip2_data_country_code country iso_code;&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
       # Define the whitelist&lt;br /&gt;
       map $geoip2_data_country_code $allowed_country {&lt;br /&gt;
           default no;&lt;br /&gt;
           AU yes;&lt;br /&gt;
           NZ yes;&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure Web Site =&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/sitename&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 192.168.1.1:443 ssl;&lt;br /&gt;
    http2 on;&lt;br /&gt;
&lt;br /&gt;
    server_name my.web.site;&lt;br /&gt;
&lt;br /&gt;
    # BLOCK UNAUTHORIZED COUNTRIES&lt;br /&gt;
    if ($allowed_country = no) {&lt;br /&gt;
        return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Verify = &lt;br /&gt;
&amp;lt;pre&amp;gt;geoipupdate -v&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;mmdblookup --file /var/lib/GeoIP/GeoLite2-Country.mmdb --ip 1.1.1.1 registered_country iso_code&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : nginx]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=GeoIP&amp;diff=2688</id>
		<title>GeoIP</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=GeoIP&amp;diff=2688"/>
		<updated>2026-04-08T00:30:11Z</updated>

		<summary type="html">&lt;p&gt;David: /* Verify */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This configuration is to on enable GeoIP and only allow certain countries to access a specific web site.&lt;br /&gt;
&lt;br /&gt;
= Install Debian Applications =&lt;br /&gt;
&amp;lt;pre&amp;gt;apt install libnginx-mod-http-geoip2 libmaxminddb0 libmaxminddb-dev mmdb-bin&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Go to https://www.maxmind.com, create a free account.&lt;br /&gt;
Under Account, Manage license keys. Generate a new license key.&lt;br /&gt;
&lt;br /&gt;
== Config GeoIP ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/GeoIP.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AccountID 1234567&lt;br /&gt;
LicenseKey rt09gu45gp;c4rovcj4rt0goi.....&lt;br /&gt;
&lt;br /&gt;
EditionIDs GeoLite2-Country GeoLite2-City&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Configure nginx =&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/nginx.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # Load the GeoIP2 database&lt;br /&gt;
        geoip2 /var/lib/GeoIP/GeoLite2-Country.mmdb {&lt;br /&gt;
            auto_reload 5m;&lt;br /&gt;
            $geoip2_data_country_code country iso_code;&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
       # Define the whitelist&lt;br /&gt;
       map $geoip2_data_country_code $allowed_country {&lt;br /&gt;
           default no;&lt;br /&gt;
           AU yes;&lt;br /&gt;
           NZ yes;&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure Web Site =&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/sitename&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 192.168.1.1:443 ssl;&lt;br /&gt;
    http2 on;&lt;br /&gt;
&lt;br /&gt;
    server_name my.web.site;&lt;br /&gt;
&lt;br /&gt;
    # BLOCK UNAUTHORIZED COUNTRIES&lt;br /&gt;
    if ($allowed_country = no) {&lt;br /&gt;
        return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Verify = &lt;br /&gt;
&amp;lt;pre&amp;gt;geoipupdate -v&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;mmdblookup --file /var/lib/GeoIP/GeoLite2-Country.mmdb --ip 1.1.1.1 registered_country iso_code&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : nginx]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=GeoIP&amp;diff=2687</id>
		<title>GeoIP</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=GeoIP&amp;diff=2687"/>
		<updated>2026-04-08T00:29:22Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This configuration is to on enable GeoIP and only allow certain countries to access a specific web site.&lt;br /&gt;
&lt;br /&gt;
= Install Debian Applications =&lt;br /&gt;
&amp;lt;pre&amp;gt;apt install libnginx-mod-http-geoip2 libmaxminddb0 libmaxminddb-dev mmdb-bin&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Go to https://www.maxmind.com, create a free account.&lt;br /&gt;
Under Account, Manage license keys. Generate a new license key.&lt;br /&gt;
&lt;br /&gt;
== Config GeoIP ==&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/GeoIP.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AccountID 1234567&lt;br /&gt;
LicenseKey rt09gu45gp;c4rovcj4rt0goi.....&lt;br /&gt;
&lt;br /&gt;
EditionIDs GeoLite2-Country GeoLite2-City&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Configure nginx =&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/nginx.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # Load the GeoIP2 database&lt;br /&gt;
        geoip2 /var/lib/GeoIP/GeoLite2-Country.mmdb {&lt;br /&gt;
            auto_reload 5m;&lt;br /&gt;
            $geoip2_data_country_code country iso_code;&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
       # Define the whitelist&lt;br /&gt;
       map $geoip2_data_country_code $allowed_country {&lt;br /&gt;
           default no;&lt;br /&gt;
           AU yes;&lt;br /&gt;
           NZ yes;&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure Web Site =&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/sitename&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 192.168.1.1:443 ssl;&lt;br /&gt;
    http2 on;&lt;br /&gt;
&lt;br /&gt;
    server_name my.web.site;&lt;br /&gt;
&lt;br /&gt;
    # BLOCK UNAUTHORIZED COUNTRIES&lt;br /&gt;
    if ($allowed_country = no) {&lt;br /&gt;
        return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Verify = &lt;br /&gt;
&amp;lt;pre&amp;gt;geoipupdate -v&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;mmdblookup --file /var/lib/GeoIP/GeoLite2-Country.mmdb --ip 1.1.1.1 country iso_code&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : nginx]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=GeoIP&amp;diff=2686</id>
		<title>GeoIP</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=GeoIP&amp;diff=2686"/>
		<updated>2026-04-08T00:21:17Z</updated>

		<summary type="html">&lt;p&gt;David: Created page with &amp;quot;This configuration is to on enable GeoIP and only allow certain countries to access a specific web site.  = Install Debian Applications = &amp;lt;pre&amp;gt;apt install libnginx-mod-http-geoip2 libmaxminddb0 libmaxminddb-dev mmdb-bin&amp;lt;/pre&amp;gt;  = Configure nginx = &amp;lt;pre&amp;gt;vi /etc/nginx/nginx.conf&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;         # Load the GeoIP2 database         geoip2 /var/lib/GeoIP/GeoLite2-Country.mmdb {             auto_reload 5m;             $geoip2_data_country_code country iso_code;        }...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This configuration is to on enable GeoIP and only allow certain countries to access a specific web site.&lt;br /&gt;
&lt;br /&gt;
= Install Debian Applications =&lt;br /&gt;
&amp;lt;pre&amp;gt;apt install libnginx-mod-http-geoip2 libmaxminddb0 libmaxminddb-dev mmdb-bin&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure nginx =&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/nginx.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # Load the GeoIP2 database&lt;br /&gt;
        geoip2 /var/lib/GeoIP/GeoLite2-Country.mmdb {&lt;br /&gt;
            auto_reload 5m;&lt;br /&gt;
            $geoip2_data_country_code country iso_code;&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
       # Define the whitelist&lt;br /&gt;
       map $geoip2_data_country_code $allowed_country {&lt;br /&gt;
           default no;&lt;br /&gt;
           AU yes;&lt;br /&gt;
           NZ yes;&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure Web Site =&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/nginx/sites-available/sitename&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 192.168.1.1:443 ssl;&lt;br /&gt;
    http2 on;&lt;br /&gt;
&lt;br /&gt;
    server_name my.web.site;&lt;br /&gt;
&lt;br /&gt;
    # BLOCK UNAUTHORIZED COUNTRIES&lt;br /&gt;
    if ($allowed_country = no) {&lt;br /&gt;
        return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=n8n&amp;diff=2685</id>
		<title>n8n</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=n8n&amp;diff=2685"/>
		<updated>2026-04-07T11:06:31Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Docker =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  n8n:&lt;br /&gt;
    image: n8nio/n8n:latest&lt;br /&gt;
    container_name: n8n&lt;br /&gt;
    restart: unless-stopped&lt;br /&gt;
    user: &amp;quot;1000:1000&amp;quot;&lt;br /&gt;
    ports:&lt;br /&gt;
      - 5678:5678&lt;br /&gt;
    environment:&lt;br /&gt;
      - GENERIC_TIMEZONE=Australia/Brisbane&lt;br /&gt;
      - N8N_BASIC_AUTH_ACTIVE=true&lt;br /&gt;
      - N8N_BASIC_AUTH_USER=n8nuser&lt;br /&gt;
      - N8N_BASIC_AUTH_PASSWORD=your_strong_password&lt;br /&gt;
      - NODE_ENV=production&lt;br /&gt;
      - N8N_SECURE_COOKIE=true&lt;br /&gt;
      - N8N_EDITOR_BASE_URL=https://n8n.klaverstyn.com.au/&lt;br /&gt;
      - WEBHOOK_URL=https://n8n.klaverstyn.com.au/&lt;br /&gt;
      - N8N_RUNNERS_ENABLED=true&lt;br /&gt;
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true&lt;br /&gt;
      - DB_TYPE=sqlite&lt;br /&gt;
      - DB_SQLITE_VACUUM_ON_STARTUP=true&lt;br /&gt;
      - N8N_METRICS=true&lt;br /&gt;
      - N8N_DEFAULT_BINARY_DATA_MODE=filesystem&lt;br /&gt;
      - EXECUTIONS_DATA_PRUNE=true&lt;br /&gt;
      - EXECUTIONS_DATA_MAX_AGE=168&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ~/n8n:/home/node/.n8n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= nginx =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 10.13.13.242:80;&lt;br /&gt;
    listen [2403:580a:e75f:1::242]:80;&lt;br /&gt;
&lt;br /&gt;
    server_name n8n.klaverstyn.com.au;&lt;br /&gt;
&lt;br /&gt;
    # Redirect all HTTP traffic to HTTPS&lt;br /&gt;
    return 301 https://$host$request_uri;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/access_n8n.log;&lt;br /&gt;
    error_log /var/log/nginx/error_n8n.log;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 10.13.13.242:443 ssl;&lt;br /&gt;
    listen [2403:580a:e75f:1::242]:443 ssl;&lt;br /&gt;
    http2 on;&lt;br /&gt;
&lt;br /&gt;
    server_name n8n.klaverstyn.com.au;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/access_n8n.log;&lt;br /&gt;
    error_log /var/log/nginx/error_n8n.log;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ssl_certificate         /etc/letsencrypt/live/n8n.klaverstyn.com.au/fullchain.pem;&lt;br /&gt;
    ssl_certificate_key     /etc/letsencrypt/live/n8n.klaverstyn.com.au/privkey.pem;&lt;br /&gt;
&lt;br /&gt;
    client_max_body_size 350M;&lt;br /&gt;
&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot; always;&lt;br /&gt;
    add_header X-Frame-Options &amp;quot;SAMEORIGIN&amp;quot; always;&lt;br /&gt;
    add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot; always;&lt;br /&gt;
    add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot; always;&lt;br /&gt;
    add_header Referrer-Policy &amp;quot;no-referrer-when-downgrade&amp;quot; always;&lt;br /&gt;
    add_header Permissions-Policy &amp;quot;geolocation=(), camera=(), microphone=()&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if ($http_user_agent ~* (HTTrack|wget|curl|nikto|sqlmap)) {&lt;br /&gt;
        return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        proxy_pass http://localhost:5678;&lt;br /&gt;
&lt;br /&gt;
        proxy_set_header Host $host;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&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 X-Forwarded-Ssl on;&lt;br /&gt;
&lt;br /&gt;
        proxy_redirect off;&lt;br /&gt;
&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : docker]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=n8n&amp;diff=2684</id>
		<title>n8n</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=n8n&amp;diff=2684"/>
		<updated>2026-04-07T08:18:35Z</updated>

		<summary type="html">&lt;p&gt;David: Created page with &amp;quot;&amp;lt;pre&amp;gt;   n8n:     image: n8nio/n8n:latest     container_name: n8n     restart: unless-stopped     user: &amp;quot;1000:1000&amp;quot;     ports:       - 5678:5678     environment:       - GENERIC_TIMEZONE=Australia/Brisbane       - N8N_BASIC_AUTH_ACTIVE=true       - N8N_BASIC_AUTH_USER=n8nuser       - N8N_BASIC_AUTH_PASSWORD=your_strong_password       - NODE_ENV=production       - N8N_SECURE_COOKIE=true       - N8N_EDITOR_BASE_URL=https://n8n.klaverstyn.com.au/       - WEBHOOK_URL=https://...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  n8n:&lt;br /&gt;
    image: n8nio/n8n:latest&lt;br /&gt;
    container_name: n8n&lt;br /&gt;
    restart: unless-stopped&lt;br /&gt;
    user: &amp;quot;1000:1000&amp;quot;&lt;br /&gt;
    ports:&lt;br /&gt;
      - 5678:5678&lt;br /&gt;
    environment:&lt;br /&gt;
      - GENERIC_TIMEZONE=Australia/Brisbane&lt;br /&gt;
      - N8N_BASIC_AUTH_ACTIVE=true&lt;br /&gt;
      - N8N_BASIC_AUTH_USER=n8nuser&lt;br /&gt;
      - N8N_BASIC_AUTH_PASSWORD=your_strong_password&lt;br /&gt;
      - NODE_ENV=production&lt;br /&gt;
      - N8N_SECURE_COOKIE=true&lt;br /&gt;
      - N8N_EDITOR_BASE_URL=https://n8n.klaverstyn.com.au/&lt;br /&gt;
      - WEBHOOK_URL=https://n8n.klaverstyn.com.au/&lt;br /&gt;
      - N8N_RUNNERS_ENABLED=true&lt;br /&gt;
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true&lt;br /&gt;
      - DB_TYPE=sqlite&lt;br /&gt;
      - DB_SQLITE_VACUUM_ON_STARTUP=true&lt;br /&gt;
      - N8N_METRICS=true&lt;br /&gt;
      - N8N_DEFAULT_BINARY_DATA_MODE=filesystem&lt;br /&gt;
      - EXECUTIONS_DATA_PRUNE=true&lt;br /&gt;
      - EXECUTIONS_DATA_MAX_AGE=168&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ~/n8n:/home/node/.n8n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : docker]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=NGINX_SNMP&amp;diff=2683</id>
		<title>NGINX SNMP</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=NGINX_SNMP&amp;diff=2683"/>
		<updated>2026-04-05T01:46:35Z</updated>

		<summary type="html">&lt;p&gt;David: Created page with &amp;quot;To retrieve NGINX counters from SNMP. &amp;lt;pre&amp;gt;apt install python3-pip python3-dateutil&amp;lt;/pre&amp;gt;  &amp;lt;pre&amp;gt; wget https://github.com/librenms/librenms-agent/raw/master/snmp/docker-stats.py -O /etc/snmp/docker-stats.py chmod +x /etc/snmp/docker-stats.py &amp;lt;/pre&amp;gt;  &amp;lt;pre&amp;gt;usermod -a -G docker Debian-snmp&amp;lt;/pre&amp;gt;  &amp;lt;pre&amp;gt;vi /etc/snmp/snmpd.conf&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;extend nginx /etc/snmp/nginx&amp;lt;/pre&amp;gt;  Category : Debian Category : NGINX&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To retrieve NGINX counters from SNMP.&lt;br /&gt;
&amp;lt;pre&amp;gt;apt install python3-pip python3-dateutil&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://github.com/librenms/librenms-agent/raw/master/snmp/docker-stats.py -O /etc/snmp/docker-stats.py&lt;br /&gt;
chmod +x /etc/snmp/docker-stats.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;usermod -a -G docker Debian-snmp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/snmp/snmpd.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;extend nginx /etc/snmp/nginx&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category : Debian]] [[Category : NGINX]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MediaWiki:Common.css&amp;diff=2682</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MediaWiki:Common.css&amp;diff=2682"/>
		<updated>2026-03-30T02:07:10Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MediaWiki:Common.css&amp;diff=2681</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MediaWiki:Common.css&amp;diff=2681"/>
		<updated>2026-03-30T02:06:50Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
body { background-color: red !important; }&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MediaWiki:Common.css&amp;diff=2680</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MediaWiki:Common.css&amp;diff=2680"/>
		<updated>2026-03-30T02:05:14Z</updated>

		<summary type="html">&lt;p&gt;David: Replaced content with &amp;quot;/* CSS placed here will be applied to all skins */&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MediaWiki:Common.css&amp;diff=2679</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MediaWiki:Common.css&amp;diff=2679"/>
		<updated>2026-03-30T02:04:54Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
body { background-color: red !important; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Container for the code block */&lt;br /&gt;
pre, .mw-highlight pre {&lt;br /&gt;
    position: relative !important;&lt;br /&gt;
    padding: 1.5em 1em 1em 1em !important;&lt;br /&gt;
    background-color: #f8f9fa !important;&lt;br /&gt;
    border: 1px solid #eaecf0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* TARGET ONLY the PreToClip version of the button */&lt;br /&gt;
.pretoclip-button.oo-ui-buttonElement-frameless {&lt;br /&gt;
    position: absolute !important;&lt;br /&gt;
    top: 5px !important;&lt;br /&gt;
    right: 5px !important;&lt;br /&gt;
    width: auto !important;&lt;br /&gt;
    height: auto !important;&lt;br /&gt;
    padding: 2px 8px !important;&lt;br /&gt;
    background-color: #ffffff !important;&lt;br /&gt;
    border: 1px solid #a2a9b1 !important;&lt;br /&gt;
    border-radius: 2px !important;&lt;br /&gt;
    cursor: pointer !important;&lt;br /&gt;
    z-index: 100 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide the SVG icon inside the copy button */&lt;br /&gt;
.pretoclip-button.oo-ui-buttonElement-frameless .oo-ui-iconElement-icon {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inject the blue &amp;quot;Copy&amp;quot; text */&lt;br /&gt;
.pretoclip-button.oo-ui-buttonElement-frameless::after {&lt;br /&gt;
    content: &amp;quot;Copy&amp;quot; !important;&lt;br /&gt;
    color: #3366cc !important;&lt;br /&gt;
    font-family: sans-serif !important;&lt;br /&gt;
    font-size: 13px !important;&lt;br /&gt;
    font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state for the copy button */&lt;br /&gt;
.pretoclip-button.oo-ui-buttonElement-frameless:hover {&lt;br /&gt;
    background-color: #f8f9fa !important;&lt;br /&gt;
    border-color: #3366cc !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=MediaWiki:Common.css&amp;diff=2678</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=MediaWiki:Common.css&amp;diff=2678"/>
		<updated>2026-03-30T02:03:44Z</updated>

		<summary type="html">&lt;p&gt;David: Created page with &amp;quot;/* CSS placed here will be applied to all skins */   /* Container for the code block */ pre, .mw-highlight pre {     position: relative !important;     padding: 1.5em 1em 1em 1em !important;     background-color: #f8f9fa !important;     border: 1px solid #eaecf0 !important; }  /* TARGET ONLY the PreToClip version of the button */ .pretoclip-button.oo-ui-buttonElement-frameless {     position: absolute !important;     top: 5px !important;     right: 5px !important;     wi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Container for the code block */&lt;br /&gt;
pre, .mw-highlight pre {&lt;br /&gt;
    position: relative !important;&lt;br /&gt;
    padding: 1.5em 1em 1em 1em !important;&lt;br /&gt;
    background-color: #f8f9fa !important;&lt;br /&gt;
    border: 1px solid #eaecf0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* TARGET ONLY the PreToClip version of the button */&lt;br /&gt;
.pretoclip-button.oo-ui-buttonElement-frameless {&lt;br /&gt;
    position: absolute !important;&lt;br /&gt;
    top: 5px !important;&lt;br /&gt;
    right: 5px !important;&lt;br /&gt;
    width: auto !important;&lt;br /&gt;
    height: auto !important;&lt;br /&gt;
    padding: 2px 8px !important;&lt;br /&gt;
    background-color: #ffffff !important;&lt;br /&gt;
    border: 1px solid #a2a9b1 !important;&lt;br /&gt;
    border-radius: 2px !important;&lt;br /&gt;
    cursor: pointer !important;&lt;br /&gt;
    z-index: 100 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide the SVG icon inside the copy button */&lt;br /&gt;
.pretoclip-button.oo-ui-buttonElement-frameless .oo-ui-iconElement-icon {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inject the blue &amp;quot;Copy&amp;quot; text */&lt;br /&gt;
.pretoclip-button.oo-ui-buttonElement-frameless::after {&lt;br /&gt;
    content: &amp;quot;Copy&amp;quot; !important;&lt;br /&gt;
    color: #3366cc !important;&lt;br /&gt;
    font-family: sans-serif !important;&lt;br /&gt;
    font-size: 13px !important;&lt;br /&gt;
    font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state for the copy button */&lt;br /&gt;
.pretoclip-button.oo-ui-buttonElement-frameless:hover {&lt;br /&gt;
    background-color: #f8f9fa !important;&lt;br /&gt;
    border-color: #3366cc !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=librenms&amp;diff=2672</id>
		<title>librenms</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=librenms&amp;diff=2672"/>
		<updated>2026-03-15T01:56:26Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= docker-compose.yml =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # --- LibreNMS Services (uses remote DB) ---&lt;br /&gt;
  redis:&lt;br /&gt;
    image: redis:8.6-alpine&lt;br /&gt;
    container_name: librenms_redis&lt;br /&gt;
    environment:&lt;br /&gt;
      - TZ=Australia/Brisbane&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  msmtpd:&lt;br /&gt;
    image: crazymax/msmtpd:latest&lt;br /&gt;
    container_name: librenms_msmtpd&lt;br /&gt;
    env_file:&lt;br /&gt;
      - ./librenms/msmtpd.env&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  librenms:&lt;br /&gt;
    image: librenms/librenms:latest&lt;br /&gt;
    container_name: librenms&lt;br /&gt;
    hostname: librenms&lt;br /&gt;
    cap_add:&lt;br /&gt;
      - NET_ADMIN&lt;br /&gt;
      - NET_RAW&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:8000&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - redis&lt;br /&gt;
      - msmtpd&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./librenms:/data&lt;br /&gt;
    env_file:&lt;br /&gt;
      - ./librenms/librenms.env&lt;br /&gt;
    environment:&lt;br /&gt;
      - TZ=Australia/Brisbane&lt;br /&gt;
      - PUID=${PUID}&lt;br /&gt;
      - PGID=${PGID}&lt;br /&gt;
      - DB_HOST=${MDB_SERVER}&lt;br /&gt;
      - DB_NAME=${MDB_DATABASE}&lt;br /&gt;
      - DB_USER=${MDB_USER}&lt;br /&gt;
      - DB_PASSWORD=${MDB_PWD}&lt;br /&gt;
      - DB_TIMEOUT=60&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  dispatcher:&lt;br /&gt;
    image: librenms/librenms:latest&lt;br /&gt;
    container_name: librenms_dispatcher&lt;br /&gt;
    hostname: librenms-dispatcher&lt;br /&gt;
    cap_add:&lt;br /&gt;
      - NET_ADMIN&lt;br /&gt;
      - NET_RAW&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - librenms&lt;br /&gt;
      - redis&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./librenms:/data&lt;br /&gt;
    env_file:&lt;br /&gt;
      - ./librenms/librenms.env&lt;br /&gt;
    environment:&lt;br /&gt;
      - TZ=Australia/Brisbane&lt;br /&gt;
      - PUID=${PUID}&lt;br /&gt;
      - PGID=${PGID}&lt;br /&gt;
      - DB_HOST=${MDB_SERVER}&lt;br /&gt;
      - DB_NAME=${MDB_DATABASE}&lt;br /&gt;
      - DB_USER=${MDB_USER}&lt;br /&gt;
      - DB_PASSWORD=${MDB_PWD}&lt;br /&gt;
      - DB_TIMEOUT=60&lt;br /&gt;
      - DISPATCHER_NODE_ID=dispatcher1&lt;br /&gt;
      - SIDECAR_DISPATCHER=1&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  syslogng:&lt;br /&gt;
    image: librenms/librenms:latest&lt;br /&gt;
    container_name: librenms_syslogng&lt;br /&gt;
    hostname: librenms-syslogng&lt;br /&gt;
    cap_add:&lt;br /&gt;
      - NET_ADMIN&lt;br /&gt;
      - NET_RAW&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - librenms&lt;br /&gt;
      - redis&lt;br /&gt;
    ports:&lt;br /&gt;
      - 514:514/tcp&lt;br /&gt;
      - 514:514/udp&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./librenms:/data&lt;br /&gt;
    env_file:&lt;br /&gt;
      - ./librenms/librenms.env&lt;br /&gt;
    environment:&lt;br /&gt;
      - TZ=Australia/Brisbane&lt;br /&gt;
      - PUID=${PUID}&lt;br /&gt;
      - PGID=${PGID}&lt;br /&gt;
      - DB_HOST=${MDB_SERVER}&lt;br /&gt;
      - DB_NAME=${MDB_DATABASE}&lt;br /&gt;
      - DB_USER=${MDB_USER}&lt;br /&gt;
      - DB_PASSWORD=${MDB_PWD}&lt;br /&gt;
      - DB_TIMEOUT=60&lt;br /&gt;
      - SIDECAR_SYSLOGNG=1&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  snmptrapd:&lt;br /&gt;
    image: librenms/librenms:latest&lt;br /&gt;
    container_name: librenms_snmptrapd&lt;br /&gt;
    hostname: librenms-snmptrapd&lt;br /&gt;
    cap_add:&lt;br /&gt;
      - NET_ADMIN&lt;br /&gt;
      - NET_RAW&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - librenms&lt;br /&gt;
      - redis&lt;br /&gt;
    ports:&lt;br /&gt;
      - 162:162/tcp&lt;br /&gt;
      - 162:162/udp&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./librenms:/data&lt;br /&gt;
    env_file:&lt;br /&gt;
      - ./librenms/librenms.env&lt;br /&gt;
    environment:&lt;br /&gt;
      - TZ=Australia/Brisbane&lt;br /&gt;
      - PUID=${PUID}&lt;br /&gt;
      - PGID=${PGID}&lt;br /&gt;
      - DB_HOST=${MDB_SERVER}&lt;br /&gt;
      - DB_NAME=${MDB_DATABASE}&lt;br /&gt;
      - DB_USER=${MDB_USER}&lt;br /&gt;
      - DB_PASSWORD=${MDB_PWD}&lt;br /&gt;
      - DB_TIMEOUT=60&lt;br /&gt;
      - SIDECAR_SNMPTRAPD=1&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  # --- End LibreNMS Services (uses remote DB) ---&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= .env =&lt;br /&gt;
Create a file containing sensitive passwords&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/.env&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;### LibreNMS&lt;br /&gt;
&lt;br /&gt;
PUID=1000&lt;br /&gt;
PGID=1000&lt;br /&gt;
&lt;br /&gt;
MDB_SERVER=my.servername.com&lt;br /&gt;
MDB_DATABASE=database_name&lt;br /&gt;
MDB_USER=username&lt;br /&gt;
MDB_PWD=password&lt;br /&gt;
&lt;br /&gt;
### End Librenms&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= librenms folder =&lt;br /&gt;
Make sure user and owner are 1000.&lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R 1000:1000 /root/librenms/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= commands =&lt;br /&gt;
== within container shell ==&lt;br /&gt;
&amp;lt;pre&amp;gt;docker exec -it librenms /bin/bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;lnms device:poll 12&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;lnms device:discover 12&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== from host ==&lt;br /&gt;
&lt;br /&gt;
Poll&lt;br /&gt;
&amp;lt;pre&amp;gt;docker exec -it -u librenms librenms lnms device:poll 12&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Discovery&lt;br /&gt;
&amp;lt;pre&amp;gt;docker exec -it -u librenms librenms lnms device:discover 12&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category : Debian]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=librenms&amp;diff=2671</id>
		<title>librenms</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=librenms&amp;diff=2671"/>
		<updated>2026-03-15T01:51:11Z</updated>

		<summary type="html">&lt;p&gt;David: /* docker-compose.yml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= docker-compose.yml =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # --- LibreNMS Services (uses remote DB) ---&lt;br /&gt;
  redis:&lt;br /&gt;
    image: redis:8.6-alpine&lt;br /&gt;
    container_name: librenms_redis&lt;br /&gt;
    environment:&lt;br /&gt;
      - TZ=Australia/Brisbane&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  msmtpd:&lt;br /&gt;
    image: crazymax/msmtpd:latest&lt;br /&gt;
    container_name: librenms_msmtpd&lt;br /&gt;
    env_file:&lt;br /&gt;
      - ./librenms/msmtpd.env&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  librenms:&lt;br /&gt;
    image: librenms/librenms:latest&lt;br /&gt;
    container_name: librenms&lt;br /&gt;
    hostname: librenms&lt;br /&gt;
    cap_add:&lt;br /&gt;
      - NET_ADMIN&lt;br /&gt;
      - NET_RAW&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:8000&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - redis&lt;br /&gt;
      - msmtpd&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./librenms:/data&lt;br /&gt;
    env_file:&lt;br /&gt;
      - ./librenms/librenms.env&lt;br /&gt;
    environment:&lt;br /&gt;
      - TZ=Australia/Brisbane&lt;br /&gt;
      - PUID=${PUID}&lt;br /&gt;
      - PGID=${PGID}&lt;br /&gt;
      - DB_HOST=${MDB_SERVER}&lt;br /&gt;
      - DB_NAME=${MDB_DATABASE}&lt;br /&gt;
      - DB_USER=${MDB_USER}&lt;br /&gt;
      - DB_PASSWORD=${MDB_PWD}&lt;br /&gt;
      - DB_TIMEOUT=60&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  dispatcher:&lt;br /&gt;
    image: librenms/librenms:latest&lt;br /&gt;
    container_name: librenms_dispatcher&lt;br /&gt;
    hostname: librenms-dispatcher&lt;br /&gt;
    cap_add:&lt;br /&gt;
      - NET_ADMIN&lt;br /&gt;
      - NET_RAW&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - librenms&lt;br /&gt;
      - redis&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./librenms:/data&lt;br /&gt;
    env_file:&lt;br /&gt;
      - ./librenms/librenms.env&lt;br /&gt;
    environment:&lt;br /&gt;
      - TZ=Australia/Brisbane&lt;br /&gt;
      - PUID=${PUID}&lt;br /&gt;
      - PGID=${PGID}&lt;br /&gt;
      - DB_HOST=${MDB_SERVER}&lt;br /&gt;
      - DB_NAME=${MDB_DATABASE}&lt;br /&gt;
      - DB_USER=${MDB_USER}&lt;br /&gt;
      - DB_PASSWORD=${MDB_PWD}&lt;br /&gt;
      - DB_TIMEOUT=60&lt;br /&gt;
      - DISPATCHER_NODE_ID=dispatcher1&lt;br /&gt;
      - SIDECAR_DISPATCHER=1&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  syslogng:&lt;br /&gt;
    image: librenms/librenms:latest&lt;br /&gt;
    container_name: librenms_syslogng&lt;br /&gt;
    hostname: librenms-syslogng&lt;br /&gt;
    cap_add:&lt;br /&gt;
      - NET_ADMIN&lt;br /&gt;
      - NET_RAW&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - librenms&lt;br /&gt;
      - redis&lt;br /&gt;
    ports:&lt;br /&gt;
      - 514:514/tcp&lt;br /&gt;
      - 514:514/udp&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./librenms:/data&lt;br /&gt;
    env_file:&lt;br /&gt;
      - ./librenms/librenms.env&lt;br /&gt;
    environment:&lt;br /&gt;
      - TZ=Australia/Brisbane&lt;br /&gt;
      - PUID=${PUID}&lt;br /&gt;
      - PGID=${PGID}&lt;br /&gt;
      - DB_HOST=${MDB_SERVER}&lt;br /&gt;
      - DB_NAME=${MDB_DATABASE}&lt;br /&gt;
      - DB_USER=${MDB_USER}&lt;br /&gt;
      - DB_PASSWORD=${MDB_PWD}&lt;br /&gt;
      - DB_TIMEOUT=60&lt;br /&gt;
      - SIDECAR_SYSLOGNG=1&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  snmptrapd:&lt;br /&gt;
    image: librenms/librenms:latest&lt;br /&gt;
    container_name: librenms_snmptrapd&lt;br /&gt;
    hostname: librenms-snmptrapd&lt;br /&gt;
    cap_add:&lt;br /&gt;
      - NET_ADMIN&lt;br /&gt;
      - NET_RAW&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - librenms&lt;br /&gt;
      - redis&lt;br /&gt;
    ports:&lt;br /&gt;
      - 162:162/tcp&lt;br /&gt;
      - 162:162/udp&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./librenms:/data&lt;br /&gt;
    env_file:&lt;br /&gt;
      - ./librenms/librenms.env&lt;br /&gt;
    environment:&lt;br /&gt;
      - TZ=Australia/Brisbane&lt;br /&gt;
      - PUID=${PUID}&lt;br /&gt;
      - PGID=${PGID}&lt;br /&gt;
      - DB_HOST=${MDB_SERVER}&lt;br /&gt;
      - DB_NAME=${MDB_DATABASE}&lt;br /&gt;
      - DB_USER=${MDB_USER}&lt;br /&gt;
      - DB_PASSWORD=${MDB_PWD}&lt;br /&gt;
      - DB_TIMEOUT=60&lt;br /&gt;
      - SIDECAR_SNMPTRAPD=1&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  # --- End LibreNMS Services (uses remote DB) ---&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= librenams folder =&lt;br /&gt;
Make sure user and owner are 1000.&lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R 1000:1000 /root/librenms/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= commands =&lt;br /&gt;
== within container shell ==&lt;br /&gt;
&amp;lt;pre&amp;gt;docker exec -it librenms /bin/bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;lnms device:poll 12&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;lnms device:discover 12&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== from host ==&lt;br /&gt;
&lt;br /&gt;
Poll&lt;br /&gt;
&amp;lt;pre&amp;gt;docker exec -it -u librenms librenms lnms device:poll 12&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Discovery&lt;br /&gt;
&amp;lt;pre&amp;gt;docker exec -it -u librenms librenms lnms device:discover 12&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category : Debian]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
	<entry>
		<id>https://klaverstyn.com.au/david/wiki/index.php?title=librenms&amp;diff=2670</id>
		<title>librenms</title>
		<link rel="alternate" type="text/html" href="https://klaverstyn.com.au/david/wiki/index.php?title=librenms&amp;diff=2670"/>
		<updated>2026-03-15T01:50:23Z</updated>

		<summary type="html">&lt;p&gt;David: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= docker-compose.yml =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # --- LibreNMS Services (uses remote DB) ---&lt;br /&gt;
  redis:&lt;br /&gt;
    image: redis:7.2-alpine&lt;br /&gt;
    container_name: librenms_redis&lt;br /&gt;
    environment:&lt;br /&gt;
      - TZ=Australia/Brisbane&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  msmtpd:&lt;br /&gt;
    image: crazymax/msmtpd:latest&lt;br /&gt;
    container_name: librenms_msmtpd&lt;br /&gt;
    env_file:&lt;br /&gt;
      - ./librenms/msmtpd.env&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  librenms:&lt;br /&gt;
    image: librenms/librenms:latest&lt;br /&gt;
    container_name: librenms&lt;br /&gt;
    hostname: librenms&lt;br /&gt;
    cap_add:&lt;br /&gt;
      - NET_ADMIN&lt;br /&gt;
      - NET_RAW&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:8000&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - redis&lt;br /&gt;
      - msmtpd&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./librenms:/data&lt;br /&gt;
    env_file:&lt;br /&gt;
      - ./librenms/librenms.env&lt;br /&gt;
    environment:&lt;br /&gt;
      - TZ=Australia/Brisbane&lt;br /&gt;
      - PUID=${PUID}&lt;br /&gt;
      - PGID=${PGID}&lt;br /&gt;
      - DB_HOST=${MDB_SERVER}&lt;br /&gt;
      - DB_NAME=${MDB_DATABASE}&lt;br /&gt;
      - DB_USER=${MDB_USER}&lt;br /&gt;
      - DB_PASSWORD=${MDB_PWD}&lt;br /&gt;
      - DB_TIMEOUT=60&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  dispatcher:&lt;br /&gt;
    image: librenms/librenms:latest&lt;br /&gt;
    container_name: librenms_dispatcher&lt;br /&gt;
    hostname: librenms-dispatcher&lt;br /&gt;
    cap_add:&lt;br /&gt;
      - NET_ADMIN&lt;br /&gt;
      - NET_RAW&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - librenms&lt;br /&gt;
      - redis&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./librenms:/data&lt;br /&gt;
    env_file:&lt;br /&gt;
      - ./librenms/librenms.env&lt;br /&gt;
    environment:&lt;br /&gt;
      - TZ=Australia/Brisbane&lt;br /&gt;
      - PUID=${PUID}&lt;br /&gt;
      - PGID=${PGID}&lt;br /&gt;
      - DB_HOST=${MDB_SERVER}&lt;br /&gt;
      - DB_NAME=${MDB_DATABASE}&lt;br /&gt;
      - DB_USER=${MDB_USER}&lt;br /&gt;
      - DB_PASSWORD=${MDB_PWD}&lt;br /&gt;
      - DB_TIMEOUT=60&lt;br /&gt;
      - DISPATCHER_NODE_ID=dispatcher1&lt;br /&gt;
      - SIDECAR_DISPATCHER=1&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  syslogng:&lt;br /&gt;
    image: librenms/librenms:latest&lt;br /&gt;
    container_name: librenms_syslogng&lt;br /&gt;
    hostname: librenms-syslogng&lt;br /&gt;
    cap_add:&lt;br /&gt;
      - NET_ADMIN&lt;br /&gt;
      - NET_RAW&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - librenms&lt;br /&gt;
      - redis&lt;br /&gt;
    ports:&lt;br /&gt;
      - 514:514/tcp&lt;br /&gt;
      - 514:514/udp&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./librenms:/data&lt;br /&gt;
    env_file:&lt;br /&gt;
      - ./librenms/librenms.env&lt;br /&gt;
    environment:&lt;br /&gt;
      - TZ=Australia/Brisbane&lt;br /&gt;
      - PUID=${PUID}&lt;br /&gt;
      - PGID=${PGID}&lt;br /&gt;
      - DB_HOST=${MDB_SERVER}&lt;br /&gt;
      - DB_NAME=${MDB_DATABASE}&lt;br /&gt;
      - DB_USER=${MDB_USER}&lt;br /&gt;
      - DB_PASSWORD=${MDB_PWD}&lt;br /&gt;
      - DB_TIMEOUT=60&lt;br /&gt;
      - SIDECAR_SYSLOGNG=1&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  snmptrapd:&lt;br /&gt;
    image: librenms/librenms:latest&lt;br /&gt;
    container_name: librenms_snmptrapd&lt;br /&gt;
    hostname: librenms-snmptrapd&lt;br /&gt;
    cap_add:&lt;br /&gt;
      - NET_ADMIN&lt;br /&gt;
      - NET_RAW&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - librenms&lt;br /&gt;
      - redis&lt;br /&gt;
    ports:&lt;br /&gt;
      - 162:162/tcp&lt;br /&gt;
      - 162:162/udp&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./librenms:/data&lt;br /&gt;
    env_file:&lt;br /&gt;
      - ./librenms/librenms.env&lt;br /&gt;
    environment:&lt;br /&gt;
      - TZ=Australia/Brisbane&lt;br /&gt;
      - PUID=${PUID}&lt;br /&gt;
      - PGID=${PGID}&lt;br /&gt;
      - DB_HOST=${MDB_SERVER}&lt;br /&gt;
      - DB_NAME=${MDB_DATABASE}&lt;br /&gt;
      - DB_USER=${MDB_USER}&lt;br /&gt;
      - DB_PASSWORD=${MDB_PWD}&lt;br /&gt;
      - DB_TIMEOUT=60&lt;br /&gt;
      - SIDECAR_SNMPTRAPD=1&lt;br /&gt;
    restart: always&lt;br /&gt;
&lt;br /&gt;
  # --- End LibreNMS Services (uses remote DB) ---&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= librenams folder =&lt;br /&gt;
Make sure user and owner are 1000.&lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R 1000:1000 /root/librenms/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= commands =&lt;br /&gt;
== within container shell ==&lt;br /&gt;
&amp;lt;pre&amp;gt;docker exec -it librenms /bin/bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;lnms device:poll 12&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;lnms device:discover 12&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== from host ==&lt;br /&gt;
&lt;br /&gt;
Poll&lt;br /&gt;
&amp;lt;pre&amp;gt;docker exec -it -u librenms librenms lnms device:poll 12&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Discovery&lt;br /&gt;
&amp;lt;pre&amp;gt;docker exec -it -u librenms librenms lnms device:discover 12&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category : Debian]]&lt;/div&gt;</summary>
		<author><name>David</name></author>
	</entry>
</feed>