<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.miranda-ng.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dart+Raiden</id>
	<title>Miranda NG - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.miranda-ng.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dart+Raiden"/>
	<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=Special:Contributions/Dart_Raiden"/>
	<updated>2026-10-17T00:59:43Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47772</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47772"/>
		<updated>2026-09-13T22:47:44Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Hugo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
worker_cpu_affinity auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	index index.php;&lt;br /&gt;
&lt;br /&gt;
	location = /favicon.ico {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location = /robots.txt {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location / {&lt;br /&gt;
		# actions&lt;br /&gt;
		rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		# boards + topics&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.php$ {&lt;br /&gt;
		try_files $uri =404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ^~ /Packages/ {&lt;br /&gt;
		allow 127.0.0.1;&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|webp|woff|woff2)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /\.ht {&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name wiki.miranda-ng.org;&lt;br /&gt;
	root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	index index.php;&lt;br /&gt;
&lt;br /&gt;
	location ~* (install\.php|LocalSettings\.php|/\.git) {&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ^~ /images/ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
		location ~ \.php$ {&lt;br /&gt;
			deny all;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ \.php$ {&lt;br /&gt;
		try_files $uri @404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location @404 {&lt;br /&gt;
		return 404;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
	location / {&lt;br /&gt;
		try_files $uri $uri/ @mediawiki;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location @mediawiki {&lt;br /&gt;
		rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name wiki.miranda-ng.org;&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name oauth.miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	location / {&lt;br /&gt;
		return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name oauth.miranda-ng.org;&lt;br /&gt;
	return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# case-sensitive user agent blocking&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
	~SemrushBot 0;&lt;br /&gt;
	~facebookexternalhit 0;&lt;br /&gt;
	default 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name miranda-ng.org;&lt;br /&gt;
	root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
	error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	if ($excluded_ua = &amp;quot;0&amp;quot;) {&lt;br /&gt;
		return 403;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	index index.html;&lt;br /&gt;
	autoindex off;&lt;br /&gt;
	error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
	# CloudFile: verification.php&lt;br /&gt;
	location ~* \.php$ {&lt;br /&gt;
		try_files $uri =404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
	location ~ /verification {&lt;br /&gt;
		rewrite ^/verification(.*)$ /verification.php$1 break;&lt;br /&gt;
		try_files $uri =404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /distr {&lt;br /&gt;
		# downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
		# to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
		root /var/www/miranda-ng.org;&lt;br /&gt;
		autoindex on;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /(x32|x64) {&lt;br /&gt;
		# downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
		# to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
		root /var/www/miranda-ng.org/distr;&lt;br /&gt;
		autoindex on;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# ADDONS -&amp;gt; addons&lt;br /&gt;
	location ~ /ADDONS {&lt;br /&gt;
		rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /addons/images {&lt;br /&gt;
		root /var/www/miranda-ng.org;&lt;br /&gt;
		autoindex on;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /addons/files {&lt;br /&gt;
		root /var/www/miranda-ng.org;&lt;br /&gt;
		autoindex on;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location = /favicon.ico {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location = /robots.txt {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /hotcoffee {&lt;br /&gt;
		add_header Cache-Control &amp;quot;no-cache,no-store,must-revalidate&amp;quot; always;&lt;br /&gt;
		set $lang en;&lt;br /&gt;
		if ($cookie_LANG = &#039;ru&#039;) { set $lang ru; }&lt;br /&gt;
		if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;) { set $lang ru; }&lt;br /&gt;
		if ($cookie_LANG = &#039;en&#039;) { set $lang en; }&lt;br /&gt;
		rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
		rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
		rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# redirect miranda-ng.org/p/PluginName &amp;gt; wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
	location ~ /p/ {&lt;br /&gt;
		rewrite ^/p/(.*?)/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 permanent;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
	# IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
	location / {&lt;br /&gt;
		return 301 https://$host$request_uri;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# IM Updater&lt;br /&gt;
	location /distr {&lt;br /&gt;
		# downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
		# to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
		root /var/www/miranda-ng.org;&lt;br /&gt;
		add_header Cache-Control &amp;quot;private&amp;quot; always;&lt;br /&gt;
		add_header Content-Disposition &amp;quot;attachment&amp;quot; always;&lt;br /&gt;
		autoindex on;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name www.miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
	access_log off;&lt;br /&gt;
	error_log off;&lt;br /&gt;
&lt;br /&gt;
	return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name www.miranda-ng.org;&lt;br /&gt;
	return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name addons.miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
	access_log off;&lt;br /&gt;
	error_log off;&lt;br /&gt;
&lt;br /&gt;
	return 301 https://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name addons.miranda-ng.org;&lt;br /&gt;
	return 301 https://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
runuser -u www-data -- hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build/deploy the site, simply run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To update the theme to a specific release&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo -u www-data hugo mod get github.com/Lednerb/bilberry-hugo-theme/v4@v4.15.5&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo -u www-data hugo mod tidy&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
replace v4.15.5 with the desired release. Note: New versions of the theme may require a newer version of Hugo. Check the theme&#039;s release notes/requirements before updating.&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=reject; aspf=r; sp=reject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47771</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47771"/>
		<updated>2026-09-13T22:46:23Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Hugo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
worker_cpu_affinity auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	index index.php;&lt;br /&gt;
&lt;br /&gt;
	location = /favicon.ico {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location = /robots.txt {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location / {&lt;br /&gt;
		# actions&lt;br /&gt;
		rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		# boards + topics&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.php$ {&lt;br /&gt;
		try_files $uri =404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ^~ /Packages/ {&lt;br /&gt;
		allow 127.0.0.1;&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|webp|woff|woff2)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /\.ht {&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name wiki.miranda-ng.org;&lt;br /&gt;
	root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	index index.php;&lt;br /&gt;
&lt;br /&gt;
	location ~* (install\.php|LocalSettings\.php|/\.git) {&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ^~ /images/ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
		location ~ \.php$ {&lt;br /&gt;
			deny all;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ \.php$ {&lt;br /&gt;
		try_files $uri @404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location @404 {&lt;br /&gt;
		return 404;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
	location / {&lt;br /&gt;
		try_files $uri $uri/ @mediawiki;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location @mediawiki {&lt;br /&gt;
		rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name wiki.miranda-ng.org;&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name oauth.miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	location / {&lt;br /&gt;
		return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name oauth.miranda-ng.org;&lt;br /&gt;
	return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# case-sensitive user agent blocking&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
	~SemrushBot 0;&lt;br /&gt;
	~facebookexternalhit 0;&lt;br /&gt;
	default 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name miranda-ng.org;&lt;br /&gt;
	root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
	error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	if ($excluded_ua = &amp;quot;0&amp;quot;) {&lt;br /&gt;
		return 403;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	index index.html;&lt;br /&gt;
	autoindex off;&lt;br /&gt;
	error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
	# CloudFile: verification.php&lt;br /&gt;
	location ~* \.php$ {&lt;br /&gt;
		try_files $uri =404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
	location ~ /verification {&lt;br /&gt;
		rewrite ^/verification(.*)$ /verification.php$1 break;&lt;br /&gt;
		try_files $uri =404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /distr {&lt;br /&gt;
		# downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
		# to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
		root /var/www/miranda-ng.org;&lt;br /&gt;
		autoindex on;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /(x32|x64) {&lt;br /&gt;
		# downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
		# to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
		root /var/www/miranda-ng.org/distr;&lt;br /&gt;
		autoindex on;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# ADDONS -&amp;gt; addons&lt;br /&gt;
	location ~ /ADDONS {&lt;br /&gt;
		rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /addons/images {&lt;br /&gt;
		root /var/www/miranda-ng.org;&lt;br /&gt;
		autoindex on;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /addons/files {&lt;br /&gt;
		root /var/www/miranda-ng.org;&lt;br /&gt;
		autoindex on;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location = /favicon.ico {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location = /robots.txt {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /hotcoffee {&lt;br /&gt;
		add_header Cache-Control &amp;quot;no-cache,no-store,must-revalidate&amp;quot; always;&lt;br /&gt;
		set $lang en;&lt;br /&gt;
		if ($cookie_LANG = &#039;ru&#039;) { set $lang ru; }&lt;br /&gt;
		if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;) { set $lang ru; }&lt;br /&gt;
		if ($cookie_LANG = &#039;en&#039;) { set $lang en; }&lt;br /&gt;
		rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
		rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
		rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# redirect miranda-ng.org/p/PluginName &amp;gt; wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
	location ~ /p/ {&lt;br /&gt;
		rewrite ^/p/(.*?)/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 permanent;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
	# IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
	location / {&lt;br /&gt;
		return 301 https://$host$request_uri;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# IM Updater&lt;br /&gt;
	location /distr {&lt;br /&gt;
		# downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
		# to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
		root /var/www/miranda-ng.org;&lt;br /&gt;
		add_header Cache-Control &amp;quot;private&amp;quot; always;&lt;br /&gt;
		add_header Content-Disposition &amp;quot;attachment&amp;quot; always;&lt;br /&gt;
		autoindex on;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name www.miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
	access_log off;&lt;br /&gt;
	error_log off;&lt;br /&gt;
&lt;br /&gt;
	return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name www.miranda-ng.org;&lt;br /&gt;
	return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name addons.miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
	access_log off;&lt;br /&gt;
	error_log off;&lt;br /&gt;
&lt;br /&gt;
	return 301 https://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name addons.miranda-ng.org;&lt;br /&gt;
	return 301 https://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
runuser -u www-data -- hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build/deploy the site, simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To update the theme to a specific release&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo -u www-data hugo mod get github.com/Lednerb/bilberry-hugo-theme/v4@v4.15.5&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo -u www-data hugo mod tidy&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
replace v4.15.5 with the desired release. Note: New versions of the theme may require a newer version of Hugo. Check the theme&#039;s release notes/requirements before updating.&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=reject; aspf=r; sp=reject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47770</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47770"/>
		<updated>2026-08-26T00:28:19Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Restore website backup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
worker_cpu_affinity auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	index index.php;&lt;br /&gt;
&lt;br /&gt;
	location = /favicon.ico {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location = /robots.txt {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location / {&lt;br /&gt;
		# actions&lt;br /&gt;
		rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		# boards + topics&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.php$ {&lt;br /&gt;
		try_files $uri =404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ^~ /Packages/ {&lt;br /&gt;
		allow 127.0.0.1;&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|webp|woff|woff2)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /\.ht {&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name wiki.miranda-ng.org;&lt;br /&gt;
	root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	index index.php;&lt;br /&gt;
&lt;br /&gt;
	location ~* (install\.php|LocalSettings\.php|/\.git) {&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ^~ /images/ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
		location ~ \.php$ {&lt;br /&gt;
			deny all;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ \.php$ {&lt;br /&gt;
		try_files $uri @404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location @404 {&lt;br /&gt;
		return 404;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
	location / {&lt;br /&gt;
		try_files $uri $uri/ @mediawiki;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location @mediawiki {&lt;br /&gt;
		rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name wiki.miranda-ng.org;&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name oauth.miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	location / {&lt;br /&gt;
		return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name oauth.miranda-ng.org;&lt;br /&gt;
	return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# case-sensitive user agent blocking&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
	~SemrushBot 0;&lt;br /&gt;
	~facebookexternalhit 0;&lt;br /&gt;
	default 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name miranda-ng.org;&lt;br /&gt;
	root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
	error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	if ($excluded_ua = &amp;quot;0&amp;quot;) {&lt;br /&gt;
		return 403;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	index index.html;&lt;br /&gt;
	autoindex off;&lt;br /&gt;
	error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
	# CloudFile: verification.php&lt;br /&gt;
	location ~* \.php$ {&lt;br /&gt;
		try_files $uri =404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
	location ~ /verification {&lt;br /&gt;
		rewrite ^/verification(.*)$ /verification.php$1 break;&lt;br /&gt;
		try_files $uri =404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /distr {&lt;br /&gt;
		# downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
		# to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
		root /var/www/miranda-ng.org;&lt;br /&gt;
		autoindex on;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /(x32|x64) {&lt;br /&gt;
		# downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
		# to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
		root /var/www/miranda-ng.org/distr;&lt;br /&gt;
		autoindex on;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# ADDONS -&amp;gt; addons&lt;br /&gt;
	location ~ /ADDONS {&lt;br /&gt;
		rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /addons/images {&lt;br /&gt;
		root /var/www/miranda-ng.org;&lt;br /&gt;
		autoindex on;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /addons/files {&lt;br /&gt;
		root /var/www/miranda-ng.org;&lt;br /&gt;
		autoindex on;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location = /favicon.ico {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location = /robots.txt {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /hotcoffee {&lt;br /&gt;
		add_header Cache-Control &amp;quot;no-cache,no-store,must-revalidate&amp;quot; always;&lt;br /&gt;
		set $lang en;&lt;br /&gt;
		if ($cookie_LANG = &#039;ru&#039;) { set $lang ru; }&lt;br /&gt;
		if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;) { set $lang ru; }&lt;br /&gt;
		if ($cookie_LANG = &#039;en&#039;) { set $lang en; }&lt;br /&gt;
		rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
		rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
		rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# redirect miranda-ng.org/p/PluginName &amp;gt; wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
	location ~ /p/ {&lt;br /&gt;
		rewrite ^/p/(.*?)/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 permanent;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
	# IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
	location / {&lt;br /&gt;
		return 301 https://$host$request_uri;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# IM Updater&lt;br /&gt;
	location /distr {&lt;br /&gt;
		# downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
		# to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
		root /var/www/miranda-ng.org;&lt;br /&gt;
		add_header Cache-Control &amp;quot;private&amp;quot; always;&lt;br /&gt;
		add_header Content-Disposition &amp;quot;attachment&amp;quot; always;&lt;br /&gt;
		autoindex on;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name www.miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
	access_log off;&lt;br /&gt;
	error_log off;&lt;br /&gt;
&lt;br /&gt;
	return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name www.miranda-ng.org;&lt;br /&gt;
	return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name addons.miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
	access_log off;&lt;br /&gt;
	error_log off;&lt;br /&gt;
&lt;br /&gt;
	return 301 https://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name addons.miranda-ng.org;&lt;br /&gt;
	return 301 https://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
runuser -u www-data -- hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=reject; aspf=r; sp=reject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47769</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47769"/>
		<updated>2026-08-26T00:18:57Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Restore website backup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
worker_cpu_affinity auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	index index.php;&lt;br /&gt;
&lt;br /&gt;
	location = /favicon.ico {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location = /robots.txt {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location / {&lt;br /&gt;
		# actions&lt;br /&gt;
		rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		# boards + topics&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.php$ {&lt;br /&gt;
		try_files $uri =404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ^~ /Packages/ {&lt;br /&gt;
		allow 127.0.0.1;&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|webp|woff|woff2)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /\.ht {&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name wiki.miranda-ng.org;&lt;br /&gt;
	root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	index index.php;&lt;br /&gt;
&lt;br /&gt;
	location ~* (install\.php|LocalSettings\.php|/\.git) {&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ^~ /images/ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
		location ~ \.php$ {&lt;br /&gt;
			deny all;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ \.php$ {&lt;br /&gt;
		try_files $uri @404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location @404 {&lt;br /&gt;
		return 404;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
	location / {&lt;br /&gt;
		try_files $uri $uri/ @mediawiki;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location @mediawiki {&lt;br /&gt;
		rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name wiki.miranda-ng.org;&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name oauth.miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	location / {&lt;br /&gt;
		return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name oauth.miranda-ng.org;&lt;br /&gt;
	return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org/distr;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
runuser -u www-data -- hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=reject; aspf=r; sp=reject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47768</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47768"/>
		<updated>2026-08-26T00:18:00Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Restore website backup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
worker_cpu_affinity auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	index index.php;&lt;br /&gt;
&lt;br /&gt;
	location = /favicon.ico {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location = /robots.txt {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location / {&lt;br /&gt;
		# actions&lt;br /&gt;
		rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		# boards + topics&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.php$ {&lt;br /&gt;
		try_files $uri =404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ^~ /Packages/ {&lt;br /&gt;
		allow 127.0.0.1;&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|webp|woff|woff2)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /\.ht {&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name wiki.miranda-ng.org;&lt;br /&gt;
	root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	index index.php;&lt;br /&gt;
&lt;br /&gt;
	location ~* (install\.php|LocalSettings\.php|/\.git) {&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ^~ /images/ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
		location ~ \.php$ {&lt;br /&gt;
			deny all;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ \.php$ {&lt;br /&gt;
		try_files $uri @404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location @404 {&lt;br /&gt;
		return 404;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
	location / {&lt;br /&gt;
		try_files $uri $uri/ @mediawiki;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location @mediawiki {&lt;br /&gt;
		rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name wiki.miranda-ng.org;&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org/distr;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
runuser -u www-data -- hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=reject; aspf=r; sp=reject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47767</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47767"/>
		<updated>2026-08-26T00:17:21Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Restore forum backup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
worker_cpu_affinity auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	index index.php;&lt;br /&gt;
&lt;br /&gt;
	location = /favicon.ico {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location = /robots.txt {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location / {&lt;br /&gt;
		# actions&lt;br /&gt;
		rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		# boards + topics&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.php$ {&lt;br /&gt;
		try_files $uri =404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ^~ /Packages/ {&lt;br /&gt;
		allow 127.0.0.1;&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|webp|woff|woff2)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /\.ht {&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name wiki.miranda-ng.org;&lt;br /&gt;
	root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	index index.php;&lt;br /&gt;
&lt;br /&gt;
	location ~* (install\.php|LocalSettings\.php|/\.git) {&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ^~ /images/ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
		location ~ \.php$ {&lt;br /&gt;
			deny all;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ \.php$ {&lt;br /&gt;
		try_files $uri @404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location @404 {&lt;br /&gt;
		return 404;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
	location / {&lt;br /&gt;
		try_files $uri $uri/ @mediawiki;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location @mediawiki {&lt;br /&gt;
		rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name wiki.miranda-ng.org;&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org/distr;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
runuser -u www-data -- hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=reject; aspf=r; sp=reject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47766</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47766"/>
		<updated>2026-08-26T00:13:05Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Restore wiki backup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
worker_cpu_affinity auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	index index.php;&lt;br /&gt;
&lt;br /&gt;
	location = /favicon.ico {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location = /robots.txt {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location / {&lt;br /&gt;
		# actions&lt;br /&gt;
		rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		# boards + topics&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.php$ {&lt;br /&gt;
		try_files $uri =404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /Packages {&lt;br /&gt;
		allow 127.0.0.1;&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /\.ht {&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name wiki.miranda-ng.org;&lt;br /&gt;
	root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	index index.php;&lt;br /&gt;
&lt;br /&gt;
	location ~* (install\.php|LocalSettings\.php|/\.git) {&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ^~ /images/ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
		location ~ \.php$ {&lt;br /&gt;
			deny all;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ \.php$ {&lt;br /&gt;
		try_files $uri @404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location @404 {&lt;br /&gt;
		return 404;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
	location / {&lt;br /&gt;
		try_files $uri $uri/ @mediawiki;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location @mediawiki {&lt;br /&gt;
		rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name wiki.miranda-ng.org;&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org/distr;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
runuser -u www-data -- hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=reject; aspf=r; sp=reject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47765</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47765"/>
		<updated>2026-08-26T00:05:29Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Restore wiki backup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
worker_cpu_affinity auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	index index.php;&lt;br /&gt;
&lt;br /&gt;
	location = /favicon.ico {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location = /robots.txt {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location / {&lt;br /&gt;
		# actions&lt;br /&gt;
		rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		# boards + topics&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.php$ {&lt;br /&gt;
		try_files $uri =404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /Packages {&lt;br /&gt;
		allow 127.0.0.1;&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /\.ht {&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org/distr;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
runuser -u www-data -- hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=reject; aspf=r; sp=reject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47764</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47764"/>
		<updated>2026-08-26T00:04:01Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Restore forum backup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
worker_cpu_affinity auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 443 ssl; # managed by Certbot&lt;br /&gt;
	ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
	ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
	add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
	error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
	index index.php;&lt;br /&gt;
&lt;br /&gt;
	location = /favicon.ico {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location = /robots.txt {&lt;br /&gt;
		include snippets/public.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location / {&lt;br /&gt;
		# actions&lt;br /&gt;
		rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
		# boards + topics&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
		rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.php$ {&lt;br /&gt;
		try_files $uri =404;&lt;br /&gt;
		include snippets/phpfpm.conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /Packages {&lt;br /&gt;
		allow 127.0.0.1;&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
		expires max;&lt;br /&gt;
		log_not_found off;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location ~ /\.ht {&lt;br /&gt;
		deny all;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
	listen 80;&lt;br /&gt;
	server_name forum.miranda-ng.org;&lt;br /&gt;
	return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org/distr;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
runuser -u www-data -- hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=reject; aspf=r; sp=reject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47763</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47763"/>
		<updated>2026-08-26T00:02:45Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Restore forum backup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
worker_cpu_affinity auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org/distr;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
runuser -u www-data -- hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=reject; aspf=r; sp=reject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47762</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47762"/>
		<updated>2026-08-26T00:01:03Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Nginx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
worker_cpu_affinity auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org/distr;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
runuser -u www-data -- hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=reject; aspf=r; sp=reject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47761</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47761"/>
		<updated>2026-08-25T23:53:14Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Prosody */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org/distr;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
runuser -u www-data -- hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=reject; aspf=r; sp=reject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47760</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47760"/>
		<updated>2026-08-25T23:41:55Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Postfix */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org/distr;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
runuser -u www-data -- hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=reject; aspf=r; sp=reject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47759</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47759"/>
		<updated>2026-08-25T23:38:58Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org/distr;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
runuser -u www-data -- hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl reload postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47758</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47758"/>
		<updated>2026-08-25T23:34:04Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org/distr;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        # downloads are stored outside Hugo&#039;s public directory&lt;br /&gt;
        # to prevent them from being removed/rebuilt by Hugo&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
runuser -u www-data -- hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47757</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47757"/>
		<updated>2026-08-25T23:31:01Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Hugo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
runuser -u www-data -- hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47756</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47756"/>
		<updated>2026-08-25T23:27:42Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sudo -u www-data hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
    rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
    echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;ERROR: Failed to install new site. Rolling back...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if mv &amp;quot;$OLD_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;ERROR: Rollback completed. Old site restored.&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;CRITICAL: Rollback failed!&amp;quot;&lt;br /&gt;
        echo &amp;quot;        Old site is at: $OLD_DIR&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47755</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47755"/>
		<updated>2026-08-25T23:20:47Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/run.php update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sudo -u www-data hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47754</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47754"/>
		<updated>2026-08-25T23:15:20Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org/public/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sudo -u www-data hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=Help:Howto/Update_info_when_new_version_is_released&amp;diff=47753</id>
		<title>Help:Howto/Update info when new version is released</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=Help:Howto/Update_info_when_new_version_is_released&amp;diff=47753"/>
		<updated>2026-08-24T08:01:37Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Website */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Update version numbers ==&lt;br /&gt;
Update version numbers in {{Tl|StableVersion}} (new stable build) and {{Tl|DevelopmentVersion}} (next/development version).&lt;br /&gt;
&lt;br /&gt;
== Update info about new stable release ==&lt;br /&gt;
In {{Tl|VersionInfo}} add entry for new stable. Provide its date and the rest of needed data. Use previous entries as example.&lt;br /&gt;
&lt;br /&gt;
== Update list of released stable versions ==&lt;br /&gt;
Add the new version to the list of released versions — {{Tl|StableVersionList}}. Use previous entries as example.&lt;br /&gt;
&lt;br /&gt;
== Create Changelog/&amp;lt;new_version_number&amp;gt; page ==&lt;br /&gt;
When the above described is done, you&#039;ll see &amp;quot;Development version is &amp;lt;new_version_number&amp;gt;&amp;quot; at the top of [[Changelog]] page, where &amp;lt;new_version_number&amp;gt; is a red link to not existing page. To create that page, follow the link. As its content add code from the below and save page/changes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;{{PageLang|en}}{{VersionCard}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Move new plugins to stable ==&lt;br /&gt;
Remove &amp;lt;tt&amp;gt;hide-stable=1&amp;lt;/tt&amp;gt; parameter in {{Tl|PluginInfo}} for plugins that are being released as stable. This will add &amp;quot;stable&amp;quot; download links for those plugins on [[Download]] pages and in their plugin cards on their pages.&lt;br /&gt;
&lt;br /&gt;
== Website ==&lt;br /&gt;
Update version numbers and links on all [https://miranda-ng.org/downloads/ &amp;quot;Downloads&amp;quot; pages]. Write the news.&lt;br /&gt;
&lt;br /&gt;
All website pages are located in /var/www/miranda-ng.org/htdocs/content. For example /var/www/miranda-ng.org/htdocs/content/downloads/index.ru.md is a source for https://miranda-ng.org/ru/downloads/.&lt;br /&gt;
&lt;br /&gt;
After editing, run:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
sudo build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Forum ==&lt;br /&gt;
Update banner on main page (click &amp;quot;Admin&amp;quot; then &amp;quot;Main&amp;quot; → &amp;quot;News and Newsletters&amp;quot;). Create and pin appropriate topics in &amp;quot;News&amp;quot; boards for English and Russian forums. Unpin previous topic.&lt;br /&gt;
&lt;br /&gt;
== Github ==&lt;br /&gt;
Update release notes: [https://github.com/miranda-ng/miranda-ng/releases realeases]&lt;br /&gt;
&lt;br /&gt;
== Jabber conferences ==&lt;br /&gt;
Update miranda-ng@conference.jabber.ru and miranda-ng-int@conference.jabber.ru topics.&lt;br /&gt;
&lt;br /&gt;
== Facebook group ==&lt;br /&gt;
Write news on our [https://facebook.com/miranda.newgen/ Facebook page]. This can be done by page adminis (apollo2k4 and dartaiden).&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47752</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47752"/>
		<updated>2026-08-24T07:57:28Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hugo ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo groupadd website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all website content editors to &amp;lt;tt&amp;gt;website-editors&amp;lt;/tt&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors ghazan&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dartraiden&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors tweimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo usermod -aG website-editors dracosha&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:website-editors /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 2755 /var/www/miranda-ng.org/htdocs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type d -exec chmod 2775 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org/htdocs/{content,layouts,static,themes} -type f -exec chmod 664 {} \;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown www-data:website-editors /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 664 /var/www/miranda-ng.org/htdocs/config.toml&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
SITE_DIR=&amp;quot;/var/www/miranda-ng.org/htdocs&amp;quot;&lt;br /&gt;
PUBLIC_DIR=&amp;quot;$SITE_DIR/public&amp;quot;&lt;br /&gt;
NEW_DIR=&amp;quot;$SITE_DIR/.public-new&amp;quot;&lt;br /&gt;
OLD_DIR=&amp;quot;$SITE_DIR/.public-old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Building site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd &amp;quot;$SITE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
chown www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sudo -u www-data hugo \&lt;br /&gt;
    --config &amp;quot;$SITE_DIR/config.toml&amp;quot; \&lt;br /&gt;
    --destination &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Hugo build successful.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$NEW_DIR/index.html&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: Hugo build did not produce index.html&amp;quot;&lt;br /&gt;
    rm -rf &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
chown -R www-data:www-data &amp;quot;$NEW_DIR&amp;quot;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type d -exec chmod 755 {} \;&lt;br /&gt;
find &amp;quot;$NEW_DIR&amp;quot; -type f -exec chmod 644 {} \;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Installing new site...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$PUBLIC_DIR&amp;quot; &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mv &amp;quot;$NEW_DIR&amp;quot; &amp;quot;$PUBLIC_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rm -rf &amp;quot;$OLD_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;==&amp;gt; Site successfully deployed.&amp;quot;&lt;br /&gt;
echo &amp;quot;    $PUBLIC_DIR&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /usr/local/sbin/build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo visudo -f /etc/sudoers.d/website-editors&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
%website-editors ALL=(root) NOPASSWD: /usr/local/sbin/build-site&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build site simply run&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo build-site&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47751</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47751"/>
		<updated>2026-08-13T20:29:45Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* PHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.5/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47750</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47750"/>
		<updated>2026-08-13T20:20:50Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* MariaDB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mariadb-secure-installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47749</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47749"/>
		<updated>2026-08-13T13:56:06Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install unzip zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.5-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47748</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47748"/>
		<updated>2026-08-13T12:29:45Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install zip&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.3-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47747</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47747"/>
		<updated>2026-08-13T11:44:01Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Nginx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php8.3-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47746</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47746"/>
		<updated>2026-08-13T11:42:59Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* PHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47735</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47735"/>
		<updated>2026-07-09T06:38:19Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Postfix */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
miranda-ng.org, localhost.localdomain, localhost&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=Plugin:Tox&amp;diff=47728</id>
		<title>Plugin:Tox</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=Plugin:Tox&amp;diff=47728"/>
		<updated>2026-07-03T17:31:53Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;{{PluginCard}}&lt;br /&gt;
{{TNT|Warning|&amp;lt;translate&amp;gt;&amp;lt;!--T:1--&amp;gt; Be careful! &#039;&#039;&#039;tox.im&#039;&#039;&#039;, &#039;&#039;&#039;toxme.se&#039;&#039;&#039; and &#039;&#039;&#039;libtoxcore.so&#039;&#039;&#039; domains are under control of an attacker. Do not use them. New project website is &amp;lt;tvar|tox_link&amp;gt;&#039;&#039;&#039;[https://tox.chat tox.chat]&#039;&#039;&#039;&amp;lt;/&amp;gt;&amp;lt;/translate&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
&amp;lt;tvar|tox&amp;gt;[https://tox.chat Tox]&amp;lt;/&amp;gt; protocol support for Miranda NG.&lt;br /&gt;
&lt;br /&gt;
== DHT nodes == &amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
Tox users are connected by a modified version of DHT, and bootstrap nodes are used to assist connections to the pool.&lt;br /&gt;
All DHT nodes all nodes are interconnected: when you are connected with one of them, you can connect with other users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
Starting from 0.11.0.7 version, implemented the ability to manually add DHT nodes.&lt;br /&gt;
Nodes can be added via the settings import. To do this, create a file named &amp;lt;tvar|ini_file_name&amp;gt;&amp;lt;tt&amp;gt;autoexec _ *.ini&amp;lt;/tt&amp;gt;&amp;lt;/&amp;gt; with a list of nodes in the directory where the Miranda NG executable is located.&lt;br /&gt;
&lt;br /&gt;
== Profile encryption == &amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:7--&amp;gt;&lt;br /&gt;
Starting from 0.11.3.0 version users can secure their Tox profiles with a password.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{TNT|Important|&amp;lt;translate&amp;gt;&amp;lt;!--T:8--&amp;gt; Tox password differs from Miranda&#039;s database password because Tox profile is stored outside of the database.&amp;lt;/translate&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== External links == &amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
* [&amp;lt;tvar|sources_link&amp;gt;https://github.com/TokTok/c-toxcore&amp;lt;/&amp;gt; Source code of Tox core]&lt;br /&gt;
* [&amp;lt;tvar|nodes_list_link&amp;gt;https://nodes.tox.st&amp;lt;/&amp;gt; List of DHT nodes]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{PluginGroups}}&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=Plugin:Tox&amp;diff=47720</id>
		<title>Plugin:Tox</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=Plugin:Tox&amp;diff=47720"/>
		<updated>2026-07-03T17:30:39Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;{{PluginCard}}&lt;br /&gt;
{{TNT|Warning|&amp;lt;translate&amp;gt;&amp;lt;!--T:1--&amp;gt; Be careful! &#039;&#039;&#039;tox.im&#039;&#039;&#039;, &#039;&#039;&#039;toxme.se&#039;&#039;&#039; and &#039;&#039;&#039;libtoxcore.so&#039;&#039;&#039; domains are under control of an attacker. Do not use them. New project website is &amp;lt;tvar|tox_link&amp;gt;&#039;&#039;&#039;[https://tox.chat tox.chat]&#039;&#039;&#039;&amp;lt;/&amp;gt;&amp;lt;/translate&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
&amp;lt;tvar|tox&amp;gt;[https://tox.chat Tox]&amp;lt;/&amp;gt; protocol support for Miranda NG.&lt;br /&gt;
&lt;br /&gt;
== DHT nodes == &amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
Tox users are connected by a modified version of DHT, and bootstrap nodes are used to assist connections to the pool.&lt;br /&gt;
All DHT nodes all nodes are interconnected: when you are connected with one of them, you can connect with other users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
Starting from 0.11.0.7 version, implemented the ability to manually add DHT nodes.&lt;br /&gt;
Nodes can be added via the settings import. To do this, create a file named &amp;lt;tvar|ini_file_name&amp;gt;&amp;lt;tt&amp;gt;autoexec _ *.ini&amp;lt;/tt&amp;gt;&amp;lt;/&amp;gt; with a list of nodes in the directory where the Miranda NG executable is located.&lt;br /&gt;
&lt;br /&gt;
== Profile encryption == &amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:7--&amp;gt;&lt;br /&gt;
Starting from 0.11.3.0 version users can secure their Tox profiles with a password.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{TNT|Important|&amp;lt;translate&amp;gt;&amp;lt;!--T:8--&amp;gt; Tox password differs from Miranda&#039;s database password because Tox profile is stored outside of the database.&amp;lt;/translate&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== External links == &amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
* [&amp;lt;tvar|sources_link&amp;gt;https://github.com/TokTok/c-toxcore/s&amp;lt;/&amp;gt; Source code of Tox core]&lt;br /&gt;
* [&amp;lt;tvar|nodes_list_link&amp;gt;https://nodes.tox.st/s&amp;lt;/&amp;gt; List of DHT nodes]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{PluginGroups}}&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47719</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47719"/>
		<updated>2026-06-17T23:26:10Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Basic Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	sendfile on;&lt;br /&gt;
	tcp_nopush on;&lt;br /&gt;
	types_hash_max_size 2048;&lt;br /&gt;
	server_tokens off;&lt;br /&gt;
	client_max_body_size 20m;&lt;br /&gt;
	tcp_nodelay on;&lt;br /&gt;
	keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Logging Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	log_format main&lt;br /&gt;
		&#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
		&#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
		&#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
		&#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
	access_log /var/log/nginx/access.log main;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Gzip Settings&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	gzip on;&lt;br /&gt;
	gzip_vary on;&lt;br /&gt;
	gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
	gzip_comp_level 6;&lt;br /&gt;
	gzip_min_length 1100;&lt;br /&gt;
	gzip_types&lt;br /&gt;
		# text/html is always compressed by HttpGzipModule&lt;br /&gt;
		text/css&lt;br /&gt;
		text/javascript&lt;br /&gt;
		text/xml&lt;br /&gt;
		text/plain&lt;br /&gt;
		text/x-component&lt;br /&gt;
		application/javascript&lt;br /&gt;
		application/x-javascript&lt;br /&gt;
		application/json&lt;br /&gt;
		application/xml&lt;br /&gt;
		application/rss+xml&lt;br /&gt;
		font/ttf&lt;br /&gt;
		font/otf&lt;br /&gt;
		image/svg+xml;&lt;br /&gt;
	gzip_static on;&lt;br /&gt;
&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47718</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47718"/>
		<updated>2026-06-17T22:57:38Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	include logging.conf;&lt;br /&gt;
&lt;br /&gt;
	include gzip.conf;&lt;br /&gt;
&lt;br /&gt;
	include http.conf;&lt;br /&gt;
&lt;br /&gt;
	server_names_hash_bucket_size 48;&lt;br /&gt;
&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/logging.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_format main&lt;br /&gt;
    &#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
    &#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
    &#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
    &#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/gzip.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_http_version 1.0;&lt;br /&gt;
gzip_comp_level 5;&lt;br /&gt;
gzip_min_length 1100;&lt;br /&gt;
gzip_types&lt;br /&gt;
    # text/html is always compressed by HttpGzipModule&lt;br /&gt;
    text/css&lt;br /&gt;
    text/javascript&lt;br /&gt;
    text/xml&lt;br /&gt;
    text/plain&lt;br /&gt;
    text/x-component&lt;br /&gt;
    application/javascript&lt;br /&gt;
    application/x-javascript&lt;br /&gt;
    application/json&lt;br /&gt;
    application/xml&lt;br /&gt;
    application/rss+xml&lt;br /&gt;
    font/ttf&lt;br /&gt;
    font/otf&lt;br /&gt;
    application/vnd.ms-fontobject&lt;br /&gt;
    image/svg+xml;&lt;br /&gt;
gzip_static on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/http.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
client_max_body_size 20m;&lt;br /&gt;
sendfile on;&lt;br /&gt;
tcp_nopush on;&lt;br /&gt;
tcp_nodelay on;&lt;br /&gt;
keepalive_timeout 75 20;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
    return 301 https://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 301 http://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47717</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47717"/>
		<updated>2026-06-17T22:46:36Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	include logging.conf;&lt;br /&gt;
&lt;br /&gt;
	include gzip.conf;&lt;br /&gt;
&lt;br /&gt;
	include http.conf;&lt;br /&gt;
&lt;br /&gt;
	server_names_hash_bucket_size 48;&lt;br /&gt;
&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/logging.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_format main&lt;br /&gt;
    &#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
    &#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
    &#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
    &#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/gzip.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_http_version 1.0;&lt;br /&gt;
gzip_comp_level 5;&lt;br /&gt;
gzip_min_length 1100;&lt;br /&gt;
gzip_types&lt;br /&gt;
    # text/html is always compressed by HttpGzipModule&lt;br /&gt;
    text/css&lt;br /&gt;
    text/javascript&lt;br /&gt;
    text/xml&lt;br /&gt;
    text/plain&lt;br /&gt;
    text/x-component&lt;br /&gt;
    application/javascript&lt;br /&gt;
    application/x-javascript&lt;br /&gt;
    application/json&lt;br /&gt;
    application/xml&lt;br /&gt;
    application/rss+xml&lt;br /&gt;
    font/ttf&lt;br /&gt;
    font/otf&lt;br /&gt;
    application/vnd.ms-fontobject&lt;br /&gt;
    image/svg+xml;&lt;br /&gt;
gzip_static on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/http.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
client_max_body_size 20m;&lt;br /&gt;
sendfile on;&lt;br /&gt;
tcp_nopush on;&lt;br /&gt;
tcp_nodelay on;&lt;br /&gt;
keepalive_timeout 75 20;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47716</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47716"/>
		<updated>2026-06-17T22:39:57Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	include logging.conf;&lt;br /&gt;
&lt;br /&gt;
	include gzip.conf;&lt;br /&gt;
&lt;br /&gt;
	include http.conf;&lt;br /&gt;
&lt;br /&gt;
	include ssl.params;&lt;br /&gt;
&lt;br /&gt;
	server_names_hash_bucket_size 48;&lt;br /&gt;
&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/logging.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_format main&lt;br /&gt;
    &#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
    &#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
    &#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
    &#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/gzip.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_http_version 1.0;&lt;br /&gt;
gzip_comp_level 5;&lt;br /&gt;
gzip_min_length 1100;&lt;br /&gt;
gzip_types&lt;br /&gt;
    # text/html is always compressed by HttpGzipModule&lt;br /&gt;
    text/css&lt;br /&gt;
    text/javascript&lt;br /&gt;
    text/xml&lt;br /&gt;
    text/plain&lt;br /&gt;
    text/x-component&lt;br /&gt;
    application/javascript&lt;br /&gt;
    application/x-javascript&lt;br /&gt;
    application/json&lt;br /&gt;
    application/xml&lt;br /&gt;
    application/rss+xml&lt;br /&gt;
    font/ttf&lt;br /&gt;
    font/otf&lt;br /&gt;
    application/vnd.ms-fontobject&lt;br /&gt;
    image/svg+xml;&lt;br /&gt;
gzip_static on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/http.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
client_max_body_size 20m;&lt;br /&gt;
sendfile on;&lt;br /&gt;
tcp_nopush on;&lt;br /&gt;
tcp_nodelay on;&lt;br /&gt;
keepalive_timeout 75 20;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/ssl.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ssl_ciphers &amp;quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&amp;quot;;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
ssl_session_cache shared:SSL:1m;&lt;br /&gt;
ssl_session_timeout 5m;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47715</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47715"/>
		<updated>2026-06-17T22:36:05Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	include logging.params;&lt;br /&gt;
&lt;br /&gt;
	include gzip.conf;&lt;br /&gt;
&lt;br /&gt;
	include http.params;&lt;br /&gt;
&lt;br /&gt;
	include ssl.params;&lt;br /&gt;
&lt;br /&gt;
	server_names_hash_bucket_size 48;&lt;br /&gt;
&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/logging.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_format main&lt;br /&gt;
    &#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
    &#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
    &#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
    &#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/gzip.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_http_version 1.0;&lt;br /&gt;
gzip_comp_level 5;&lt;br /&gt;
gzip_min_length 1100;&lt;br /&gt;
gzip_types&lt;br /&gt;
    # text/html is always compressed by HttpGzipModule&lt;br /&gt;
    text/css&lt;br /&gt;
    text/javascript&lt;br /&gt;
    text/xml&lt;br /&gt;
    text/plain&lt;br /&gt;
    text/x-component&lt;br /&gt;
    application/javascript&lt;br /&gt;
    application/x-javascript&lt;br /&gt;
    application/json&lt;br /&gt;
    application/xml&lt;br /&gt;
    application/rss+xml&lt;br /&gt;
    font/ttf&lt;br /&gt;
    font/otf&lt;br /&gt;
    application/vnd.ms-fontobject&lt;br /&gt;
    image/svg+xml;&lt;br /&gt;
gzip_static on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/http.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
client_max_body_size 20m;&lt;br /&gt;
client_header_timeout 1m;&lt;br /&gt;
client_body_timeout 1m;&lt;br /&gt;
send_timeout 1m;&lt;br /&gt;
&lt;br /&gt;
connection_pool_size 256;&lt;br /&gt;
client_header_buffer_size 1k;&lt;br /&gt;
large_client_header_buffers 4 2k;&lt;br /&gt;
request_pool_size 4k;&lt;br /&gt;
&lt;br /&gt;
sendfile on;&lt;br /&gt;
tcp_nopush on;&lt;br /&gt;
tcp_nodelay on;&lt;br /&gt;
&lt;br /&gt;
output_buffers 1 32k;&lt;br /&gt;
postpone_output 1460;&lt;br /&gt;
&lt;br /&gt;
keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
ignore_invalid_headers on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/ssl.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ssl_ciphers &amp;quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&amp;quot;;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
ssl_session_cache shared:SSL:1m;&lt;br /&gt;
ssl_session_timeout 5m;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47714</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47714"/>
		<updated>2026-06-17T22:28:57Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	include logging.params;&lt;br /&gt;
&lt;br /&gt;
	include gzip.params;&lt;br /&gt;
&lt;br /&gt;
	include http.params;&lt;br /&gt;
&lt;br /&gt;
	include ssl.params;&lt;br /&gt;
&lt;br /&gt;
	server_names_hash_bucket_size 48;&lt;br /&gt;
&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/logging.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_format main&lt;br /&gt;
    &#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
    &#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
    &#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
    &#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/gzip.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_http_version 1.0;&lt;br /&gt;
gzip_comp_level 8;&lt;br /&gt;
gzip_min_length 1100;&lt;br /&gt;
gzip_buffers 4 8k;&lt;br /&gt;
gzip_types&lt;br /&gt;
    # text/html is always compressed by HttpGzipModule&lt;br /&gt;
    text/css&lt;br /&gt;
    text/javascript&lt;br /&gt;
    text/xml&lt;br /&gt;
    text/plain&lt;br /&gt;
    text/x-component&lt;br /&gt;
    application/javascript&lt;br /&gt;
    application/x-javascript&lt;br /&gt;
    application/json&lt;br /&gt;
    application/xml&lt;br /&gt;
    application/rss+xml&lt;br /&gt;
    font/truetype&lt;br /&gt;
    font/opentype&lt;br /&gt;
    application/vnd.ms-fontobject&lt;br /&gt;
    image/svg+xml;&lt;br /&gt;
gzip_static on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_disable &amp;quot;msie6&amp;quot;;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/http.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
client_max_body_size 20m;&lt;br /&gt;
client_header_timeout 1m;&lt;br /&gt;
client_body_timeout 1m;&lt;br /&gt;
send_timeout 1m;&lt;br /&gt;
&lt;br /&gt;
connection_pool_size 256;&lt;br /&gt;
client_header_buffer_size 1k;&lt;br /&gt;
large_client_header_buffers 4 2k;&lt;br /&gt;
request_pool_size 4k;&lt;br /&gt;
&lt;br /&gt;
sendfile on;&lt;br /&gt;
tcp_nopush on;&lt;br /&gt;
tcp_nodelay on;&lt;br /&gt;
&lt;br /&gt;
output_buffers 1 32k;&lt;br /&gt;
postpone_output 1460;&lt;br /&gt;
&lt;br /&gt;
keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
ignore_invalid_headers on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/ssl.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ssl_ciphers &amp;quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&amp;quot;;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
ssl_session_cache shared:SSL:1m;&lt;br /&gt;
ssl_session_timeout 5m;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/snippets/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include snippets/phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include snippets/public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47713</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47713"/>
		<updated>2026-06-17T22:18:34Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	include logging.params;&lt;br /&gt;
&lt;br /&gt;
	include gzip.params;&lt;br /&gt;
&lt;br /&gt;
	include http.params;&lt;br /&gt;
&lt;br /&gt;
	include ssl.params;&lt;br /&gt;
&lt;br /&gt;
	server_names_hash_bucket_size 48;&lt;br /&gt;
&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/logging.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_format main&lt;br /&gt;
    &#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
    &#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
    &#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
    &#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/gzip.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_http_version 1.0;&lt;br /&gt;
gzip_comp_level 8;&lt;br /&gt;
gzip_min_length 1100;&lt;br /&gt;
gzip_buffers 4 8k;&lt;br /&gt;
gzip_types&lt;br /&gt;
    # text/html is always compressed by HttpGzipModule&lt;br /&gt;
    text/css&lt;br /&gt;
    text/javascript&lt;br /&gt;
    text/xml&lt;br /&gt;
    text/plain&lt;br /&gt;
    text/x-component&lt;br /&gt;
    application/javascript&lt;br /&gt;
    application/x-javascript&lt;br /&gt;
    application/json&lt;br /&gt;
    application/xml&lt;br /&gt;
    application/rss+xml&lt;br /&gt;
    font/truetype&lt;br /&gt;
    font/opentype&lt;br /&gt;
    application/vnd.ms-fontobject&lt;br /&gt;
    image/svg+xml;&lt;br /&gt;
gzip_static on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_disable &amp;quot;msie6&amp;quot;;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/http.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
client_max_body_size 20m;&lt;br /&gt;
client_header_timeout 1m;&lt;br /&gt;
client_body_timeout 1m;&lt;br /&gt;
send_timeout 1m;&lt;br /&gt;
&lt;br /&gt;
connection_pool_size 256;&lt;br /&gt;
client_header_buffer_size 1k;&lt;br /&gt;
large_client_header_buffers 4 2k;&lt;br /&gt;
request_pool_size 4k;&lt;br /&gt;
&lt;br /&gt;
sendfile on;&lt;br /&gt;
tcp_nopush on;&lt;br /&gt;
tcp_nodelay on;&lt;br /&gt;
&lt;br /&gt;
output_buffers 1 32k;&lt;br /&gt;
postpone_output 1460;&lt;br /&gt;
&lt;br /&gt;
keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
ignore_invalid_headers on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/ssl.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ssl_ciphers &amp;quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&amp;quot;;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
ssl_session_cache shared:SSL:1m;&lt;br /&gt;
ssl_session_timeout 5m;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics.conf;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47712</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47712"/>
		<updated>2026-06-17T22:16:48Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	include logging.params;&lt;br /&gt;
&lt;br /&gt;
	include gzip.params;&lt;br /&gt;
&lt;br /&gt;
	include http.params;&lt;br /&gt;
&lt;br /&gt;
	include ssl.params;&lt;br /&gt;
&lt;br /&gt;
	server_names_hash_bucket_size 48;&lt;br /&gt;
&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/logging.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_format main&lt;br /&gt;
    &#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
    &#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
    &#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
    &#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/gzip.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_http_version 1.0;&lt;br /&gt;
gzip_comp_level 8;&lt;br /&gt;
gzip_min_length 1100;&lt;br /&gt;
gzip_buffers 4 8k;&lt;br /&gt;
gzip_types&lt;br /&gt;
    # text/html is always compressed by HttpGzipModule&lt;br /&gt;
    text/css&lt;br /&gt;
    text/javascript&lt;br /&gt;
    text/xml&lt;br /&gt;
    text/plain&lt;br /&gt;
    text/x-component&lt;br /&gt;
    application/javascript&lt;br /&gt;
    application/x-javascript&lt;br /&gt;
    application/json&lt;br /&gt;
    application/xml&lt;br /&gt;
    application/rss+xml&lt;br /&gt;
    font/truetype&lt;br /&gt;
    font/opentype&lt;br /&gt;
    application/vnd.ms-fontobject&lt;br /&gt;
    image/svg+xml;&lt;br /&gt;
gzip_static on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_disable &amp;quot;msie6&amp;quot;;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/http.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
client_max_body_size 20m;&lt;br /&gt;
client_header_timeout 1m;&lt;br /&gt;
client_body_timeout 1m;&lt;br /&gt;
send_timeout 1m;&lt;br /&gt;
&lt;br /&gt;
connection_pool_size 256;&lt;br /&gt;
client_header_buffer_size 1k;&lt;br /&gt;
large_client_header_buffers 4 2k;&lt;br /&gt;
request_pool_size 4k;&lt;br /&gt;
&lt;br /&gt;
sendfile on;&lt;br /&gt;
tcp_nopush on;&lt;br /&gt;
tcp_nodelay on;&lt;br /&gt;
&lt;br /&gt;
output_buffers 1 32k;&lt;br /&gt;
postpone_output 1460;&lt;br /&gt;
&lt;br /&gt;
keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
ignore_invalid_headers on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/ssl.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ssl_ciphers &amp;quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&amp;quot;;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
ssl_session_cache shared:SSL:1m;&lt;br /&gt;
ssl_session_timeout 5m;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include phpfpm.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.conf;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.conf;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47711</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47711"/>
		<updated>2026-06-17T22:15:53Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Nginx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	include logging.params;&lt;br /&gt;
&lt;br /&gt;
	include gzip.params;&lt;br /&gt;
&lt;br /&gt;
	include http.params;&lt;br /&gt;
&lt;br /&gt;
	include ssl.params;&lt;br /&gt;
&lt;br /&gt;
	server_names_hash_bucket_size 48;&lt;br /&gt;
&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/logging.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_format main&lt;br /&gt;
    &#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
    &#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
    &#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
    &#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/gzip.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_http_version 1.0;&lt;br /&gt;
gzip_comp_level 8;&lt;br /&gt;
gzip_min_length 1100;&lt;br /&gt;
gzip_buffers 4 8k;&lt;br /&gt;
gzip_types&lt;br /&gt;
    # text/html is always compressed by HttpGzipModule&lt;br /&gt;
    text/css&lt;br /&gt;
    text/javascript&lt;br /&gt;
    text/xml&lt;br /&gt;
    text/plain&lt;br /&gt;
    text/x-component&lt;br /&gt;
    application/javascript&lt;br /&gt;
    application/x-javascript&lt;br /&gt;
    application/json&lt;br /&gt;
    application/xml&lt;br /&gt;
    application/rss+xml&lt;br /&gt;
    font/truetype&lt;br /&gt;
    font/opentype&lt;br /&gt;
    application/vnd.ms-fontobject&lt;br /&gt;
    image/svg+xml;&lt;br /&gt;
gzip_static on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_disable &amp;quot;msie6&amp;quot;;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/http.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
client_max_body_size 20m;&lt;br /&gt;
client_header_timeout 1m;&lt;br /&gt;
client_body_timeout 1m;&lt;br /&gt;
send_timeout 1m;&lt;br /&gt;
&lt;br /&gt;
connection_pool_size 256;&lt;br /&gt;
client_header_buffer_size 1k;&lt;br /&gt;
large_client_header_buffers 4 2k;&lt;br /&gt;
request_pool_size 4k;&lt;br /&gt;
&lt;br /&gt;
sendfile on;&lt;br /&gt;
tcp_nopush on;&lt;br /&gt;
tcp_nodelay on;&lt;br /&gt;
&lt;br /&gt;
output_buffers 1 32k;&lt;br /&gt;
postpone_output 1460;&lt;br /&gt;
&lt;br /&gt;
keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
ignore_invalid_headers on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/ssl.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ssl_ciphers &amp;quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&amp;quot;;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
ssl_session_cache shared:SSL:1m;&lt;br /&gt;
ssl_session_timeout 5m;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/public.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/phpfpm.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47710</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47710"/>
		<updated>2026-06-17T21:51:48Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Nginx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	include logging.params;&lt;br /&gt;
&lt;br /&gt;
	include gzip.params;&lt;br /&gt;
&lt;br /&gt;
	include http.params;&lt;br /&gt;
&lt;br /&gt;
	include ssl.params;&lt;br /&gt;
&lt;br /&gt;
	server_names_hash_bucket_size 48;&lt;br /&gt;
&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/logging.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_format main&lt;br /&gt;
    &#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
    &#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
    &#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
    &#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/gzip.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_http_version 1.0;&lt;br /&gt;
gzip_comp_level 8;&lt;br /&gt;
gzip_min_length 1100;&lt;br /&gt;
gzip_buffers 4 8k;&lt;br /&gt;
gzip_types&lt;br /&gt;
    # text/html is always compressed by HttpGzipModule&lt;br /&gt;
    text/css&lt;br /&gt;
    text/javascript&lt;br /&gt;
    text/xml&lt;br /&gt;
    text/plain&lt;br /&gt;
    text/x-component&lt;br /&gt;
    application/javascript&lt;br /&gt;
    application/x-javascript&lt;br /&gt;
    application/json&lt;br /&gt;
    application/xml&lt;br /&gt;
    application/rss+xml&lt;br /&gt;
    font/truetype&lt;br /&gt;
    font/opentype&lt;br /&gt;
    application/vnd.ms-fontobject&lt;br /&gt;
    image/svg+xml;&lt;br /&gt;
gzip_static on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_disable &amp;quot;msie6&amp;quot;;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/http.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
client_max_body_size 20m;&lt;br /&gt;
client_header_timeout 1m;&lt;br /&gt;
client_body_timeout 1m;&lt;br /&gt;
send_timeout 1m;&lt;br /&gt;
&lt;br /&gt;
connection_pool_size 256;&lt;br /&gt;
client_header_buffer_size 1k;&lt;br /&gt;
large_client_header_buffers 4 2k;&lt;br /&gt;
request_pool_size 4k;&lt;br /&gt;
&lt;br /&gt;
sendfile on;&lt;br /&gt;
tcp_nopush on;&lt;br /&gt;
tcp_nodelay on;&lt;br /&gt;
&lt;br /&gt;
output_buffers 1 32k;&lt;br /&gt;
postpone_output 1460;&lt;br /&gt;
&lt;br /&gt;
keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
ignore_invalid_headers on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/ssl.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ssl_ciphers &amp;quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&amp;quot;;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
ssl_session_cache shared:SSL:1m;&lt;br /&gt;
ssl_session_timeout 5m;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/public.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/phpfpm.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47709</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47709"/>
		<updated>2026-06-17T21:51:03Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	include logging.params;&lt;br /&gt;
&lt;br /&gt;
	include gzip.params;&lt;br /&gt;
&lt;br /&gt;
	include http.params;&lt;br /&gt;
&lt;br /&gt;
	include ssl.params;&lt;br /&gt;
&lt;br /&gt;
	server_names_hash_bucket_size 48;&lt;br /&gt;
&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/logging.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_format main&lt;br /&gt;
    &#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
    &#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
    &#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
    &#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/gzip.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_http_version 1.0;&lt;br /&gt;
gzip_comp_level 8;&lt;br /&gt;
gzip_min_length 1100;&lt;br /&gt;
gzip_buffers 4 8k;&lt;br /&gt;
gzip_types&lt;br /&gt;
    # text/html is always compressed by HttpGzipModule&lt;br /&gt;
    text/css&lt;br /&gt;
    text/javascript&lt;br /&gt;
    text/xml&lt;br /&gt;
    text/plain&lt;br /&gt;
    text/x-component&lt;br /&gt;
    application/javascript&lt;br /&gt;
    application/x-javascript&lt;br /&gt;
    application/json&lt;br /&gt;
    application/xml&lt;br /&gt;
    application/rss+xml&lt;br /&gt;
    font/truetype&lt;br /&gt;
    font/opentype&lt;br /&gt;
    application/vnd.ms-fontobject&lt;br /&gt;
    image/svg+xml;&lt;br /&gt;
gzip_static on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_disable &amp;quot;msie6&amp;quot;;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/http.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
client_max_body_size 20m;&lt;br /&gt;
client_header_timeout 1m;&lt;br /&gt;
client_body_timeout 1m;&lt;br /&gt;
send_timeout 1m;&lt;br /&gt;
&lt;br /&gt;
connection_pool_size 256;&lt;br /&gt;
client_header_buffer_size 1k;&lt;br /&gt;
large_client_header_buffers 4 2k;&lt;br /&gt;
request_pool_size 4k;&lt;br /&gt;
&lt;br /&gt;
sendfile on;&lt;br /&gt;
tcp_nopush on;&lt;br /&gt;
tcp_nodelay on;&lt;br /&gt;
&lt;br /&gt;
output_buffers 1 32k;&lt;br /&gt;
postpone_output 1460;&lt;br /&gt;
&lt;br /&gt;
keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
ignore_invalid_headers on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/ssl.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ssl_ciphers &amp;quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&amp;quot;;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
ssl_session_cache shared:SSL:1m;&lt;br /&gt;
ssl_session_timeout 5m;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/public.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/phpfpm.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.conf;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/fastcgi.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_param  QUERY_STRING       $query_string;&lt;br /&gt;
fastcgi_param  REQUEST_METHOD     $request_method;&lt;br /&gt;
fastcgi_param  CONTENT_TYPE       $content_type;&lt;br /&gt;
fastcgi_param  CONTENT_LENGTH     $content_length;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;&lt;br /&gt;
fastcgi_param  REQUEST_URI        $request_uri;&lt;br /&gt;
fastcgi_param  DOCUMENT_URI       $document_uri;&lt;br /&gt;
fastcgi_param  DOCUMENT_ROOT      $document_root;&lt;br /&gt;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;&lt;br /&gt;
fastcgi_param  HTTPS              $https if_not_empty;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;&lt;br /&gt;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  REMOTE_ADDR        $remote_addr;&lt;br /&gt;
fastcgi_param  REMOTE_PORT        $remote_port;&lt;br /&gt;
fastcgi_param  SERVER_ADDR        $server_addr;&lt;br /&gt;
fastcgi_param  SERVER_PORT        $server_port;&lt;br /&gt;
fastcgi_param  SERVER_NAME        $server_name;&lt;br /&gt;
&lt;br /&gt;
# PHP only, required if PHP was built with --enable-force-cgi-redirect&lt;br /&gt;
fastcgi_param  REDIRECT_STATUS    200;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47708</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47708"/>
		<updated>2026-06-16T00:49:39Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* PHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = ondemand&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	include logging.params;&lt;br /&gt;
&lt;br /&gt;
	include gzip.params;&lt;br /&gt;
&lt;br /&gt;
	include http.params;&lt;br /&gt;
&lt;br /&gt;
	include ssl.params;&lt;br /&gt;
&lt;br /&gt;
	server_names_hash_bucket_size 48;&lt;br /&gt;
&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/logging.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_format main&lt;br /&gt;
    &#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
    &#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
    &#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
    &#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/gzip.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_http_version 1.0;&lt;br /&gt;
gzip_comp_level 8;&lt;br /&gt;
gzip_min_length 1100;&lt;br /&gt;
gzip_buffers 4 8k;&lt;br /&gt;
gzip_types&lt;br /&gt;
    # text/html is always compressed by HttpGzipModule&lt;br /&gt;
    text/css&lt;br /&gt;
    text/javascript&lt;br /&gt;
    text/xml&lt;br /&gt;
    text/plain&lt;br /&gt;
    text/x-component&lt;br /&gt;
    application/javascript&lt;br /&gt;
    application/x-javascript&lt;br /&gt;
    application/json&lt;br /&gt;
    application/xml&lt;br /&gt;
    application/rss+xml&lt;br /&gt;
    font/truetype&lt;br /&gt;
    font/opentype&lt;br /&gt;
    application/vnd.ms-fontobject&lt;br /&gt;
    image/svg+xml;&lt;br /&gt;
gzip_static on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_disable &amp;quot;msie6&amp;quot;;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/http.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
client_max_body_size 20m;&lt;br /&gt;
client_header_timeout 1m;&lt;br /&gt;
client_body_timeout 1m;&lt;br /&gt;
send_timeout 1m;&lt;br /&gt;
&lt;br /&gt;
connection_pool_size 256;&lt;br /&gt;
client_header_buffer_size 1k;&lt;br /&gt;
large_client_header_buffers 4 2k;&lt;br /&gt;
request_pool_size 4k;&lt;br /&gt;
&lt;br /&gt;
sendfile on;&lt;br /&gt;
tcp_nopush on;&lt;br /&gt;
tcp_nodelay on;&lt;br /&gt;
&lt;br /&gt;
output_buffers 1 32k;&lt;br /&gt;
postpone_output 1460;&lt;br /&gt;
&lt;br /&gt;
keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
ignore_invalid_headers on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/ssl.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ssl_ciphers &amp;quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&amp;quot;;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
ssl_session_cache shared:SSL:1m;&lt;br /&gt;
ssl_session_timeout 5m;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/public.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
allow all;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/phpfpm.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.params;&lt;br /&gt;
fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/fastcgi.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_param  QUERY_STRING       $query_string;&lt;br /&gt;
fastcgi_param  REQUEST_METHOD     $request_method;&lt;br /&gt;
fastcgi_param  CONTENT_TYPE       $content_type;&lt;br /&gt;
fastcgi_param  CONTENT_LENGTH     $content_length;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;&lt;br /&gt;
fastcgi_param  REQUEST_URI        $request_uri;&lt;br /&gt;
fastcgi_param  DOCUMENT_URI       $document_uri;&lt;br /&gt;
fastcgi_param  DOCUMENT_ROOT      $document_root;&lt;br /&gt;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;&lt;br /&gt;
fastcgi_param  HTTPS              $https if_not_empty;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;&lt;br /&gt;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  REMOTE_ADDR        $remote_addr;&lt;br /&gt;
fastcgi_param  REMOTE_PORT        $remote_port;&lt;br /&gt;
fastcgi_param  SERVER_ADDR        $server_addr;&lt;br /&gt;
fastcgi_param  SERVER_PORT        $server_port;&lt;br /&gt;
fastcgi_param  SERVER_NAME        $server_name;&lt;br /&gt;
&lt;br /&gt;
# PHP only, required if PHP was built with --enable-force-cgi-redirect&lt;br /&gt;
fastcgi_param  REDIRECT_STATUS    200;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47707</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47707"/>
		<updated>2026-06-16T00:43:33Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/99-custom.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
innodb_buffer_pool_size = 6G&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
thread_cache_size       = 100&lt;br /&gt;
wait_timeout            = 1800&lt;br /&gt;
interactive_timeout     = 1800&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = static&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	include logging.params;&lt;br /&gt;
&lt;br /&gt;
	include gzip.params;&lt;br /&gt;
&lt;br /&gt;
	include http.params;&lt;br /&gt;
&lt;br /&gt;
	include ssl.params;&lt;br /&gt;
&lt;br /&gt;
	server_names_hash_bucket_size 48;&lt;br /&gt;
&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/logging.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_format main&lt;br /&gt;
    &#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
    &#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
    &#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
    &#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/gzip.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_http_version 1.0;&lt;br /&gt;
gzip_comp_level 8;&lt;br /&gt;
gzip_min_length 1100;&lt;br /&gt;
gzip_buffers 4 8k;&lt;br /&gt;
gzip_types&lt;br /&gt;
    # text/html is always compressed by HttpGzipModule&lt;br /&gt;
    text/css&lt;br /&gt;
    text/javascript&lt;br /&gt;
    text/xml&lt;br /&gt;
    text/plain&lt;br /&gt;
    text/x-component&lt;br /&gt;
    application/javascript&lt;br /&gt;
    application/x-javascript&lt;br /&gt;
    application/json&lt;br /&gt;
    application/xml&lt;br /&gt;
    application/rss+xml&lt;br /&gt;
    font/truetype&lt;br /&gt;
    font/opentype&lt;br /&gt;
    application/vnd.ms-fontobject&lt;br /&gt;
    image/svg+xml;&lt;br /&gt;
gzip_static on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_disable &amp;quot;msie6&amp;quot;;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/http.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
client_max_body_size 20m;&lt;br /&gt;
client_header_timeout 1m;&lt;br /&gt;
client_body_timeout 1m;&lt;br /&gt;
send_timeout 1m;&lt;br /&gt;
&lt;br /&gt;
connection_pool_size 256;&lt;br /&gt;
client_header_buffer_size 1k;&lt;br /&gt;
large_client_header_buffers 4 2k;&lt;br /&gt;
request_pool_size 4k;&lt;br /&gt;
&lt;br /&gt;
sendfile on;&lt;br /&gt;
tcp_nopush on;&lt;br /&gt;
tcp_nodelay on;&lt;br /&gt;
&lt;br /&gt;
output_buffers 1 32k;&lt;br /&gt;
postpone_output 1460;&lt;br /&gt;
&lt;br /&gt;
keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
ignore_invalid_headers on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/ssl.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ssl_ciphers &amp;quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&amp;quot;;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
ssl_session_cache shared:SSL:1m;&lt;br /&gt;
ssl_session_timeout 5m;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/public.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
allow all;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/phpfpm.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.params;&lt;br /&gt;
fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/fastcgi.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_param  QUERY_STRING       $query_string;&lt;br /&gt;
fastcgi_param  REQUEST_METHOD     $request_method;&lt;br /&gt;
fastcgi_param  CONTENT_TYPE       $content_type;&lt;br /&gt;
fastcgi_param  CONTENT_LENGTH     $content_length;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;&lt;br /&gt;
fastcgi_param  REQUEST_URI        $request_uri;&lt;br /&gt;
fastcgi_param  DOCUMENT_URI       $document_uri;&lt;br /&gt;
fastcgi_param  DOCUMENT_ROOT      $document_root;&lt;br /&gt;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;&lt;br /&gt;
fastcgi_param  HTTPS              $https if_not_empty;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;&lt;br /&gt;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  REMOTE_ADDR        $remote_addr;&lt;br /&gt;
fastcgi_param  REMOTE_PORT        $remote_port;&lt;br /&gt;
fastcgi_param  SERVER_ADDR        $server_addr;&lt;br /&gt;
fastcgi_param  SERVER_PORT        $server_port;&lt;br /&gt;
fastcgi_param  SERVER_NAME        $server_name;&lt;br /&gt;
&lt;br /&gt;
# PHP only, required if PHP was built with --enable-force-cgi-redirect&lt;br /&gt;
fastcgi_param  REDIRECT_STATUS    200;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47706</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47706"/>
		<updated>2026-06-16T00:23:11Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* SSH */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_password_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart ssh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = static&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	include logging.params;&lt;br /&gt;
&lt;br /&gt;
	include gzip.params;&lt;br /&gt;
&lt;br /&gt;
	include http.params;&lt;br /&gt;
&lt;br /&gt;
	include ssl.params;&lt;br /&gt;
&lt;br /&gt;
	server_names_hash_bucket_size 48;&lt;br /&gt;
&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/logging.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_format main&lt;br /&gt;
    &#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
    &#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
    &#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
    &#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/gzip.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_http_version 1.0;&lt;br /&gt;
gzip_comp_level 8;&lt;br /&gt;
gzip_min_length 1100;&lt;br /&gt;
gzip_buffers 4 8k;&lt;br /&gt;
gzip_types&lt;br /&gt;
    # text/html is always compressed by HttpGzipModule&lt;br /&gt;
    text/css&lt;br /&gt;
    text/javascript&lt;br /&gt;
    text/xml&lt;br /&gt;
    text/plain&lt;br /&gt;
    text/x-component&lt;br /&gt;
    application/javascript&lt;br /&gt;
    application/x-javascript&lt;br /&gt;
    application/json&lt;br /&gt;
    application/xml&lt;br /&gt;
    application/rss+xml&lt;br /&gt;
    font/truetype&lt;br /&gt;
    font/opentype&lt;br /&gt;
    application/vnd.ms-fontobject&lt;br /&gt;
    image/svg+xml;&lt;br /&gt;
gzip_static on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_disable &amp;quot;msie6&amp;quot;;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/http.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
client_max_body_size 20m;&lt;br /&gt;
client_header_timeout 1m;&lt;br /&gt;
client_body_timeout 1m;&lt;br /&gt;
send_timeout 1m;&lt;br /&gt;
&lt;br /&gt;
connection_pool_size 256;&lt;br /&gt;
client_header_buffer_size 1k;&lt;br /&gt;
large_client_header_buffers 4 2k;&lt;br /&gt;
request_pool_size 4k;&lt;br /&gt;
&lt;br /&gt;
sendfile on;&lt;br /&gt;
tcp_nopush on;&lt;br /&gt;
tcp_nodelay on;&lt;br /&gt;
&lt;br /&gt;
output_buffers 1 32k;&lt;br /&gt;
postpone_output 1460;&lt;br /&gt;
&lt;br /&gt;
keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
ignore_invalid_headers on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/ssl.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ssl_ciphers &amp;quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&amp;quot;;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
ssl_session_cache shared:SSL:1m;&lt;br /&gt;
ssl_session_timeout 5m;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/public.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
allow all;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/phpfpm.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.params;&lt;br /&gt;
fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/fastcgi.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_param  QUERY_STRING       $query_string;&lt;br /&gt;
fastcgi_param  REQUEST_METHOD     $request_method;&lt;br /&gt;
fastcgi_param  CONTENT_TYPE       $content_type;&lt;br /&gt;
fastcgi_param  CONTENT_LENGTH     $content_length;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;&lt;br /&gt;
fastcgi_param  REQUEST_URI        $request_uri;&lt;br /&gt;
fastcgi_param  DOCUMENT_URI       $document_uri;&lt;br /&gt;
fastcgi_param  DOCUMENT_ROOT      $document_root;&lt;br /&gt;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;&lt;br /&gt;
fastcgi_param  HTTPS              $https if_not_empty;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;&lt;br /&gt;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  REMOTE_ADDR        $remote_addr;&lt;br /&gt;
fastcgi_param  REMOTE_PORT        $remote_port;&lt;br /&gt;
fastcgi_param  SERVER_ADDR        $server_addr;&lt;br /&gt;
fastcgi_param  SERVER_PORT        $server_port;&lt;br /&gt;
fastcgi_param  SERVER_NAME        $server_name;&lt;br /&gt;
&lt;br /&gt;
# PHP only, required if PHP was built with --enable-force-cgi-redirect&lt;br /&gt;
fastcgi_param  REDIRECT_STATUS    200;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47705</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47705"/>
		<updated>2026-06-15T23:35:51Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* SSH */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart sshd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = static&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	include logging.params;&lt;br /&gt;
&lt;br /&gt;
	include gzip.params;&lt;br /&gt;
&lt;br /&gt;
	include http.params;&lt;br /&gt;
&lt;br /&gt;
	include ssl.params;&lt;br /&gt;
&lt;br /&gt;
	server_names_hash_bucket_size 48;&lt;br /&gt;
&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/logging.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_format main&lt;br /&gt;
    &#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
    &#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
    &#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
    &#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/gzip.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_http_version 1.0;&lt;br /&gt;
gzip_comp_level 8;&lt;br /&gt;
gzip_min_length 1100;&lt;br /&gt;
gzip_buffers 4 8k;&lt;br /&gt;
gzip_types&lt;br /&gt;
    # text/html is always compressed by HttpGzipModule&lt;br /&gt;
    text/css&lt;br /&gt;
    text/javascript&lt;br /&gt;
    text/xml&lt;br /&gt;
    text/plain&lt;br /&gt;
    text/x-component&lt;br /&gt;
    application/javascript&lt;br /&gt;
    application/x-javascript&lt;br /&gt;
    application/json&lt;br /&gt;
    application/xml&lt;br /&gt;
    application/rss+xml&lt;br /&gt;
    font/truetype&lt;br /&gt;
    font/opentype&lt;br /&gt;
    application/vnd.ms-fontobject&lt;br /&gt;
    image/svg+xml;&lt;br /&gt;
gzip_static on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_disable &amp;quot;msie6&amp;quot;;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/http.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
client_max_body_size 20m;&lt;br /&gt;
client_header_timeout 1m;&lt;br /&gt;
client_body_timeout 1m;&lt;br /&gt;
send_timeout 1m;&lt;br /&gt;
&lt;br /&gt;
connection_pool_size 256;&lt;br /&gt;
client_header_buffer_size 1k;&lt;br /&gt;
large_client_header_buffers 4 2k;&lt;br /&gt;
request_pool_size 4k;&lt;br /&gt;
&lt;br /&gt;
sendfile on;&lt;br /&gt;
tcp_nopush on;&lt;br /&gt;
tcp_nodelay on;&lt;br /&gt;
&lt;br /&gt;
output_buffers 1 32k;&lt;br /&gt;
postpone_output 1460;&lt;br /&gt;
&lt;br /&gt;
keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
ignore_invalid_headers on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/ssl.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ssl_ciphers &amp;quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&amp;quot;;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
ssl_session_cache shared:SSL:1m;&lt;br /&gt;
ssl_session_timeout 5m;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/public.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
allow all;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/phpfpm.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.params;&lt;br /&gt;
fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/fastcgi.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_param  QUERY_STRING       $query_string;&lt;br /&gt;
fastcgi_param  REQUEST_METHOD     $request_method;&lt;br /&gt;
fastcgi_param  CONTENT_TYPE       $content_type;&lt;br /&gt;
fastcgi_param  CONTENT_LENGTH     $content_length;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;&lt;br /&gt;
fastcgi_param  REQUEST_URI        $request_uri;&lt;br /&gt;
fastcgi_param  DOCUMENT_URI       $document_uri;&lt;br /&gt;
fastcgi_param  DOCUMENT_ROOT      $document_root;&lt;br /&gt;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;&lt;br /&gt;
fastcgi_param  HTTPS              $https if_not_empty;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;&lt;br /&gt;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  REMOTE_ADDR        $remote_addr;&lt;br /&gt;
fastcgi_param  REMOTE_PORT        $remote_port;&lt;br /&gt;
fastcgi_param  SERVER_ADDR        $server_addr;&lt;br /&gt;
fastcgi_param  SERVER_PORT        $server_port;&lt;br /&gt;
fastcgi_param  SERVER_NAME        $server_name;&lt;br /&gt;
&lt;br /&gt;
# PHP only, required if PHP was built with --enable-force-cgi-redirect&lt;br /&gt;
fastcgi_param  REDIRECT_STATUS    200;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47704</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47704"/>
		<updated>2026-06-10T20:44:40Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/ciphers_and_keying.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256&lt;br /&gt;
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr&lt;br /&gt;
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart sshd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = static&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/nginx.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
user www-data;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
pid /run/nginx.pid;&lt;br /&gt;
error_log /var/log/nginx/error.log;&lt;br /&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
	worker_connections 768;&lt;br /&gt;
	# multi_accept on;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
	include /etc/nginx/mime.types;&lt;br /&gt;
	default_type application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
	include logging.params;&lt;br /&gt;
&lt;br /&gt;
	include gzip.params;&lt;br /&gt;
&lt;br /&gt;
	include http.params;&lt;br /&gt;
&lt;br /&gt;
	include ssl.params;&lt;br /&gt;
&lt;br /&gt;
	server_names_hash_bucket_size 48;&lt;br /&gt;
&lt;br /&gt;
        server_tokens off;&lt;br /&gt;
	##&lt;br /&gt;
	# Virtual Host Configs&lt;br /&gt;
	##&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/conf.d/*.conf;&lt;br /&gt;
	include /etc/nginx/sites-enabled/*;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/logging.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
log_format main&lt;br /&gt;
    &#039;$remote_addr - $remote_user [$time_local] &#039;&lt;br /&gt;
    &#039;&amp;quot;$request&amp;quot; $status $bytes_sent &#039;&lt;br /&gt;
    &#039;&amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; &#039;&lt;br /&gt;
    &#039;&amp;quot;$gzip_ratio&amp;quot;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/gzip.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
gzip on;&lt;br /&gt;
gzip_http_version 1.0;&lt;br /&gt;
gzip_comp_level 8;&lt;br /&gt;
gzip_min_length 1100;&lt;br /&gt;
gzip_buffers 4 8k;&lt;br /&gt;
gzip_types&lt;br /&gt;
    # text/html is always compressed by HttpGzipModule&lt;br /&gt;
    text/css&lt;br /&gt;
    text/javascript&lt;br /&gt;
    text/xml&lt;br /&gt;
    text/plain&lt;br /&gt;
    text/x-component&lt;br /&gt;
    application/javascript&lt;br /&gt;
    application/x-javascript&lt;br /&gt;
    application/json&lt;br /&gt;
    application/xml&lt;br /&gt;
    application/rss+xml&lt;br /&gt;
    font/truetype&lt;br /&gt;
    font/opentype&lt;br /&gt;
    application/vnd.ms-fontobject&lt;br /&gt;
    image/svg+xml;&lt;br /&gt;
gzip_static on;&lt;br /&gt;
gzip_proxied expired no-cache no-store private auth;&lt;br /&gt;
gzip_disable &amp;quot;msie6&amp;quot;;&lt;br /&gt;
gzip_vary on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/http.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
client_max_body_size 20m;&lt;br /&gt;
client_header_timeout 1m;&lt;br /&gt;
client_body_timeout 1m;&lt;br /&gt;
send_timeout 1m;&lt;br /&gt;
&lt;br /&gt;
connection_pool_size 256;&lt;br /&gt;
client_header_buffer_size 1k;&lt;br /&gt;
large_client_header_buffers 4 2k;&lt;br /&gt;
request_pool_size 4k;&lt;br /&gt;
&lt;br /&gt;
sendfile on;&lt;br /&gt;
tcp_nopush on;&lt;br /&gt;
tcp_nodelay on;&lt;br /&gt;
&lt;br /&gt;
output_buffers 1 32k;&lt;br /&gt;
postpone_output 1460;&lt;br /&gt;
&lt;br /&gt;
keepalive_timeout 75 20;&lt;br /&gt;
&lt;br /&gt;
ignore_invalid_headers on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/ssl.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
ssl_ciphers &amp;quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&amp;quot;;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
ssl_session_cache shared:SSL:1m;&lt;br /&gt;
ssl_session_timeout 5m;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/public.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
allow all;&lt;br /&gt;
log_not_found off;&lt;br /&gt;
access_log off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/phpfpm.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_index   index.php;&lt;br /&gt;
fastcgi_pass    unix:/run/php/php-fpm.sock;&lt;br /&gt;
include         fastcgi.params;&lt;br /&gt;
fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;&lt;br /&gt;
fastcgi_param   SCRIPT_NAME $fastcgi_script_name;&lt;br /&gt;
fastcgi_hide_header &amp;quot;X-Powered-By&amp;quot;;&lt;br /&gt;
fastcgi_intercept_errors on;&lt;br /&gt;
fastcgi_next_upstream error timeout;&lt;br /&gt;
fastcgi_keep_conn on;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/fastcgi.params&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
fastcgi_param  QUERY_STRING       $query_string;&lt;br /&gt;
fastcgi_param  REQUEST_METHOD     $request_method;&lt;br /&gt;
fastcgi_param  CONTENT_TYPE       $content_type;&lt;br /&gt;
fastcgi_param  CONTENT_LENGTH     $content_length;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;&lt;br /&gt;
fastcgi_param  REQUEST_URI        $request_uri;&lt;br /&gt;
fastcgi_param  DOCUMENT_URI       $document_uri;&lt;br /&gt;
fastcgi_param  DOCUMENT_ROOT      $document_root;&lt;br /&gt;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;&lt;br /&gt;
fastcgi_param  HTTPS              $https if_not_empty;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;&lt;br /&gt;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;&lt;br /&gt;
&lt;br /&gt;
fastcgi_param  REMOTE_ADDR        $remote_addr;&lt;br /&gt;
fastcgi_param  REMOTE_PORT        $remote_port;&lt;br /&gt;
fastcgi_param  SERVER_ADDR        $server_addr;&lt;br /&gt;
fastcgi_param  SERVER_PORT        $server_port;&lt;br /&gt;
fastcgi_param  SERVER_NAME        $server_name;&lt;br /&gt;
&lt;br /&gt;
# PHP only, required if PHP was built with --enable-force-cgi-redirect&lt;br /&gt;
fastcgi_param  REDIRECT_STATUS    200;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47703</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47703"/>
		<updated>2026-06-10T20:34:38Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Restore forum backup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/ciphers_and_keying.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256&lt;br /&gt;
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr&lt;br /&gt;
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart sshd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Install Nginx, PHP, and memcached ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = static&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47702</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47702"/>
		<updated>2026-06-10T20:34:16Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Restore wiki backup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/ciphers_and_keying.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256&lt;br /&gt;
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr&lt;br /&gt;
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart sshd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Install Nginx, PHP, and memcached ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include params.d/public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include params.d/public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include params.d/phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } #&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = static&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47701</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47701"/>
		<updated>2026-06-10T20:33:51Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* Restore website backup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/ciphers_and_keying.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256&lt;br /&gt;
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr&lt;br /&gt;
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart sshd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Install Nginx, PHP, and memcached ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include params.d/public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include params.d/public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include params.d/phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } #&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include params.d/phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    # todo: remove this&lt;br /&gt;
    # root /var/www/miranda-ng.org/scripts;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include public.params;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep distr outside hugo dir so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl; # managed by Certbot&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/miranda-ng.org/fullchain.pem; # managed by Certbot&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/miranda-ng.org/privkey.pem; # managed by Certbot&lt;br /&gt;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot&lt;br /&gt;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=604800; includeSubDomains&amp;quot; always;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } # managed by Certbot&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404; # managed by Certbot&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = static&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
	<entry>
		<id>https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47700</id>
		<title>User:Dart Raiden/Server setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.miranda-ng.org/index.php?title=User:Dart_Raiden/Server_setup&amp;diff=47700"/>
		<updated>2026-06-10T01:32:44Z</updated>

		<summary type="html">&lt;p&gt;Dart Raiden: /* SMTP relay */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Export Prosody database from old server ==&lt;br /&gt;
&amp;lt;tt&amp;gt;mysqldump --user=prosody --password=&amp;quot;p@ssword&amp;quot; --default-character-set=utf8 prosody &amp;gt; prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup forum, wiki, and website ==&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;cd /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ./zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UFW ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install ufw&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 22/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw enable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/ciphers_and_keying.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256&lt;br /&gt;
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr&lt;br /&gt;
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/deny_root_login.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/ssh/sshd_config.d/enable_pubkey_authentication.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart sshd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Install Nginx, PHP, and memcached ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install nginx php-fpm php-mysql php-mbstring php-curl php-gd php-xml php-intl memcached&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 80/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 443/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install mariadb-server&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql_secure_installation&amp;lt;/tt&amp;gt;&lt;br /&gt;
(do not set a root password; enable the other restrictions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
max_connections         = 1000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;forum&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE forum_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f forum_miranda_ng_org &amp;lt; ~/forum_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON forum_miranda_ng_org.* to &#039;forum&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;wiki&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE wiki_miranda_ng_org;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f wiki_miranda_ng_org &amp;lt; ~/wiki_miranda_ng_org.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON wiki_miranda_ng_org.* to &#039;wiki&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssword&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore forum backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/forum.zip -d /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    root /var/www/forum.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/forum.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/forum.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include params.d/public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include params.d/public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
    # actions&lt;br /&gt;
    rewrite ^/(activate|admin|announce|ban|boardrecount|buddy|calendar|cleanperms)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(collapse|convertentities|convertutf8|coppa|deletemsg|detailedversion|display|dlattach)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(dumpdb|editpoll|editpoll2|featuresettings|featuresettings2|findmember|help|helpadmin)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(im|jsoption|jsmodify|lock|lockVoting|login|login2|logout)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(maintain|manageattachments|manageboards|managecalendar|managesearch|markasread|membergroups|mergetopics)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(mlist|modifycat|modifykarma|modlog|movetopic|movetopic2|news|notify)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(notifyboard|optimizetables|packageget|packages|permissions|pgdownload|pm|post)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(post2|postsettings|printpage|profile|profile2|quotefast|quickmod|quickmod2)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(recent|regcenter|register|register2|reminder|removetopic2|removeoldtopics2|removepoll)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(repairboards|reporttm|reports|requestmembers|search|search2|sendtopic|serversettings)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(serversettings2|smileys|smstats|spellcheck|splittopics|stats|sticky|theme)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(trackip|about:mozilla|about:unknown|unread|unreadreplies|viewErrorLog|viewmembers|viewprofile)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
    rewrite ^/(verificationcode|vote|viewquery|who|\.xml)/?$ &amp;quot;/index.php?pretty;action=$1&amp;quot; last;&lt;br /&gt;
&lt;br /&gt;
    # boards + topics&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*)/[0-9]?/?$ /index.php?pretty%3Bboard=$1.$2 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.0 last;&lt;br /&gt;
    rewrite ^/([-_!~*&#039;()$a-zA-Z0-9]+)/([-_!~*&#039;()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/[0-9]?/?$ /index.php?pretty%3Bboard=$1%3Btopic=$2.$3 last;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        fastcgi_split_path_info ^(.+.php)(.*)$;&lt;br /&gt;
        include params.d/phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /Packages {&lt;br /&gt;
        allow 127.0.0.1;&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /\.ht {&lt;br /&gt;
        deny all;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = forum.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    } #&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name forum.miranda-ng.org;&lt;br /&gt;
    return 404;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/forum.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/forum.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/forum.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/forum.miranda-ng.org/zipme.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use repair_settings.php and status.php from https://github.com/SimpleMachines/tools/&lt;br /&gt;
&lt;br /&gt;
== Restore wiki backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/wiki.zip -d /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    root /var/www/wiki.miranda-ng.org/htdocs;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/wiki.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    index index.php;&lt;br /&gt;
&lt;br /&gt;
    location ~* ^(.*)(install.php|LocalSettings.php|\.git) { deny all; }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files       $uri @404;&lt;br /&gt;
        include params.d/phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location /images/ {&lt;br /&gt;
        location ~.*\.(php)?$ {&lt;br /&gt;
            deny all;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @404 {&lt;br /&gt;
        return 404;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # https://stackoverflow.com/questions/35446113/using-short-urls-for-mediawiki-with-nginx&lt;br /&gt;
    location / {&lt;br /&gt;
        try_files $uri $uri/ @mediawiki;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location @mediawiki {&lt;br /&gt;
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&amp;amp;$2 last;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = wiki.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name wiki.miranda-ng.org;&lt;br /&gt;
    return 404;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/wiki.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/wiki.miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/wiki.miranda-ng.org/zipme.sh /var/www/wiki.miranda-ng.org/htdocs/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua /var/www/wiki.miranda-ng.org/htdocs/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;php /var/www/wiki.miranda-ng.org/htdocs/maintenance/update.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restore website backup ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install hugo&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo unzip ~/mainsite.zip -d /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R www-data:www-data /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/oauth.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# oauth for CloudFile&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/oauth.miranda-ng.org_access.log main;&lt;br /&gt;
    error_log /var/log/nginx/oauth.miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # todo: deny access to root (or remove root), allow only verification (or redirect whole subdomain to main domain), unify with miranda-ng.org.conf&lt;br /&gt;
    location ~* /verification(.*)$ { &lt;br /&gt;
        return 301 https://miranda-ng.org/verification$is_args$args;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = oauth.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name oauth.miranda-ng.org;&lt;br /&gt;
    return 404;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/oauth.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
# get locale&lt;br /&gt;
map $http_accept_language $browser_lang {&lt;br /&gt;
        default en;&lt;br /&gt;
        ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
map $cookie_lang $lang {&lt;br /&gt;
    default $browser_lang;&lt;br /&gt;
    ~en en;&lt;br /&gt;
    ~ru ru;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
map $http_user_agent $excluded_ua {&lt;br /&gt;
    ~SemrushBot 0;&lt;br /&gt;
    ~facebookexternalhit 0;&lt;br /&gt;
    default     1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
    root /var/www/miranda-ng.org/htdocs/public;&lt;br /&gt;
&lt;br /&gt;
    include google-analytics;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/miranda-ng.org_access.log main if=$excluded_ua;&lt;br /&gt;
    error_log /var/log/nginx/miranda-ng.org_error.log info;&lt;br /&gt;
&lt;br /&gt;
    # case sensitive http user agent blocking&lt;br /&gt;
    if ($excluded_ua ~ &amp;quot;0&amp;quot;) {&lt;br /&gt;
       return 403;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    index index.html;&lt;br /&gt;
    autoindex off;&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: verification.php&lt;br /&gt;
    location ~* \.php$ {&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
        include params.d/phpfpm.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # CloudFile: /verification -&amp;gt; /verification.php&lt;br /&gt;
    location ~ /verification {&lt;br /&gt;
        rewrite ^/verification(.*)$ /verification.php$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep /distr outside hugo directory so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /(x32|x64) {&lt;br /&gt;
        root /var/www/miranda-ng.org/distr; # we want to keep /distr outside hugo directory so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # ADDONS -&amp;gt; addons&lt;br /&gt;
    location ~ /ADDONS {&lt;br /&gt;
        rewrite ^/ADDONS/(.*)$ /addons/$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /addons/images {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    location ~ /addons/files {&lt;br /&gt;
        root /var/www/miranda-ng.org;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    error_page 404 /404.html;&lt;br /&gt;
&lt;br /&gt;
    location = /favicon.ico {&lt;br /&gt;
        include params.d/public.params;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location = /robots.txt {&lt;br /&gt;
        include params.d/public.params;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|pdf)$ {&lt;br /&gt;
        expires max;&lt;br /&gt;
        log_not_found off;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location ~ /hotcoffee {&lt;br /&gt;
        index index.html;&lt;br /&gt;
        add_header Cache-Control no-cache,no-store,must-revalidate;&lt;br /&gt;
&lt;br /&gt;
        set $lang en;&lt;br /&gt;
        if ($cookie_LANG = &#039;ru&#039;){ set $lang ru; }&lt;br /&gt;
        if ($http_accept_language ~* &#039;(ru|be|kz|ua)&#039;){ set $lang ru; }&lt;br /&gt;
        if ($cookie_LANG = &#039;en&#039;){ set $lang en; }&lt;br /&gt;
&lt;br /&gt;
        rewrite ^/hotcoffee(/?)$ /hotcoffee/$lang/index.html break;&lt;br /&gt;
        rewrite ^/hotcoffee/licenses/([^/]+\.html)(/?)$ /hotcoffee/$lang/licenses/$1 break;&lt;br /&gt;
        rewrite ^/hotcoffee/([^/]+)(/?)$ /hotcoffee/$lang/$1.html break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # redirect from miranda-ng.org/p/PluginName to wiki.miranda-ng.org/index.php?title=Plugin:PluginName&lt;br /&gt;
    location ~ /p/ {&lt;br /&gt;
	rewrite ^\/p\/(.*)\/?$ https://wiki.miranda-ng.org/index.php?title=Plugin:$1 redirect;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    # IM Updater doesn&#039;t support HTTPS, so we force HTTPS only for website&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # IM Updater&lt;br /&gt;
    location /distr {&lt;br /&gt;
        root /var/www/miranda-ng.org; # we want to keep /distr outside hugo directory so it doesn&#039;t get copied on every build&lt;br /&gt;
        post_action @GAlog;&lt;br /&gt;
        proxy_set_header Cache-Control  private;&lt;br /&gt;
        proxy_set_header Content-Disposition &amp;quot;attachment&amp;quot;;&lt;br /&gt;
        autoindex on;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/www.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
&lt;br /&gt;
    access_log off;&lt;br /&gt;
    error_log off;&lt;br /&gt;
&lt;br /&gt;
    return 301 $scheme://miranda-ng.org$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = www.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name www.miranda-ng.org;&lt;br /&gt;
    return 404;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/www.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/nginx/sites-available/addons.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 301 $scheme://miranda-ng.org/addons$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    if ($host = addons.miranda-ng.org) {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name addons.miranda-ng.org;&lt;br /&gt;
    return 404;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ln -s /etc/nginx/sites-available/addons.miranda-ng.org /etc/nginx/sites-enabled/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 644 /var/www/miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo find /var/www/miranda-ng.org -type d -print0 | sudo xargs -0 chmod 755&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 775 /var/www/miranda-ng.org/htdocs/content /var/www/miranda-ng.org/htdocs/static /var/www/miranda-ng.org/distr&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod +x /var/www/miranda-ng.org/zipme.sh /var/www/miranda-ng.org/scripts/*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certbot ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install certbot python3-certbot-nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo certbot --nginx -d miranda-ng.org -d www.miranda-ng.org -d addons.miranda-ng.org -d forum.miranda-ng.org -d oauth.miranda-ng.org -d wiki.miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart nginx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/php/8.3/fpm/pool.d/www.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
listen = /run/php/php-fpm.sock&lt;br /&gt;
&lt;br /&gt;
pm = static&lt;br /&gt;
&lt;br /&gt;
pm.max_children = 200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo DEBIAN_PRIORITY=low apt install postfix opendkim opendkim-tools&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo dpkg-reconfigure postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Internet Site&lt;br /&gt;
miranda-ng.org&lt;br /&gt;
empty&lt;br /&gt;
default&lt;br /&gt;
No&lt;br /&gt;
default&lt;br /&gt;
0&lt;br /&gt;
+&lt;br /&gt;
all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
myhostname = miranda-ng.org&lt;br /&gt;
inet_interfaces = loopback-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo opendkim-genkey -D /etc/dkimkeys/ --domain miranda-ng.org --selector dkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/opendkim.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
LogWhy                  yes&lt;br /&gt;
UMask                   002&lt;br /&gt;
Socket                  local:/var/spool/postfix/run/opendkim/opendkim.sock&lt;br /&gt;
InternalHosts           refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
AutoRestart             yes&lt;br /&gt;
AutoRestartRate         10/1h&lt;br /&gt;
ExternalIgnoreList      refile:/etc/dkimkeys/TrustedHosts&lt;br /&gt;
KeyTable                refile:/etc/dkimkeys/KeyTable&lt;br /&gt;
SigningTable            refile:/etc/dkimkeys/SigningTable&lt;br /&gt;
SignatureAlgorithm      rsa-sha256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo adduser postfix opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mkdir -p /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown opendkim:opendkim /var/spool/postfix/run/opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/TrustedHosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1&lt;br /&gt;
localhost&lt;br /&gt;
*.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/KeyTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
dkim._domainkey.miranda-ng.org miranda-ng.org:dkim:/etc/dkimkeys/dkim.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/dkimkeys/SigningTable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
*@miranda-ng.org dkim._domainkey.miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chown -R opendkim:opendkim /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 600 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 700 /etc/dkimkeys&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
milter_protocol = 2&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
non_smtpd_milters = unix:/run/opendkim/opendkim.sock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/hosts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
139.100.207.143 miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo hostnamectl set-hostname miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart opendkim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS records:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
miranda-ng.org MX miranda-ng.org 10&lt;br /&gt;
miranda-ng.org TXT v=spf1 +a +mx -all&lt;br /&gt;
DKIM._DOMAINKEY.miranda-ng.org TXT dkim_from_/etc/dkimkeys/dkim.txt&lt;br /&gt;
_DMARC.miranda-ng.org TXT v=DMARC1; p=none; aspf=r; sp=none&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo &amp;quot;Subject: hello&amp;quot; | sendmail test@example.com&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Port 25 may be blocked on cheap VPS; in this case, see the next section about SMTP relay.&lt;br /&gt;
&lt;br /&gt;
== SMTP relay ==&lt;br /&gt;
Remove all MX, SPF and DKIM records from DNS.&lt;br /&gt;
&lt;br /&gt;
Register VK WorkSpace account.&lt;br /&gt;
&lt;br /&gt;
Add and confirm miranda-ng.org domain.&lt;br /&gt;
&lt;br /&gt;
Create user: noreply@miranda-ng.org.&lt;br /&gt;
&lt;br /&gt;
Login to this maibox via mail.ru website.&lt;br /&gt;
&lt;br /&gt;
Create passwords for external application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
[smtp.mail.ru]:587 noreply@miranda-ng.org:appP@ssword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/sasl_passwd&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
www-data              noreply@miranda-ng.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo postmap /etc/postfix/generic&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano etc/postfix/main.cf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
&lt;br /&gt;
relayhost = [smtp.mail.ru]:587&lt;br /&gt;
&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_loglevel = 1&lt;br /&gt;
smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install libsasl2-modules&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl restart postfix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prosody ==&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O/etc/apt/sources.list.d/prosody.sources&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt update&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo apt install prosody lua-dbi-mysql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;p@ssw0rd&#039;;&lt;br /&gt;
CREATE DATABASE prosody;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root -f prosody &amp;lt; ~/prosody.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo mysql -u root&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
GRANT ALL ON prosody.* to &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo nano /etc/prosody/prosody.cfg.lua&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
admins = { &amp;quot;username@miranda-ng.org&amp;quot;, &amp;quot;username2@miranda-ng.org&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
modules_enabled = {&lt;br /&gt;
		--&amp;quot;register&amp;quot;; -- Allow users to register on this server&lt;br /&gt;
        &amp;quot;mam&amp;quot;; -- Store recent messages to allow multi-device synchronization&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
modules_disabled = {&lt;br /&gt;
        &amp;quot;s2s&amp;quot;; -- Handle server-to-server connections&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
storage = &amp;quot;sql&amp;quot; -- Default is &amp;quot;internal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sql = { driver = &amp;quot;MySQL&amp;quot;, database = &amp;quot;prosody&amp;quot;, username = &amp;quot;prosody&amp;quot;, password = &amp;quot;p@ssword&amp;quot;, host = &amp;quot;localhost&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
archive_expires_after = &amp;quot;never&amp;quot; -- Keep messages forever&lt;br /&gt;
&lt;br /&gt;
--VirtualHost &amp;quot;localhost&amp;quot;&lt;br /&gt;
-- Prosody requires at least one enabled VirtualHost to function. You can&lt;br /&gt;
-- safely remove or disable &#039;localhost&#039; once you have added another.&lt;br /&gt;
&lt;br /&gt;
VirtualHost &amp;quot;miranda-ng.org&amp;quot;&lt;br /&gt;
ssl = {&lt;br /&gt;
        key = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/privkey.pem&amp;quot;;&lt;br /&gt;
        certificate = &amp;quot;/etc/letsencrypt/live/miranda-ng.org/fullchain.pem&amp;quot;;&lt;br /&gt;
        protocol = &amp;quot;tlsv1_1+&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Component &amp;quot;conference.miranda-ng.org&amp;quot; &amp;quot;muc&amp;quot;&lt;br /&gt;
modules_enabled = { &amp;quot;muc_mam&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo chmod -R 755 /etc/letsencrypt/live&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo prosodyctl adduser username@miranda-ng.org&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo systemctl enable --now prosody&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5000/tcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sudo ufw allow 5222/tcp&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dart Raiden</name></author>
	</entry>
</feed>