<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.comfac.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dani</id>
	<title>MediawikiCIT - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.comfac.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dani"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.comfac.net/index.php/Special:Contributions/Dani"/>
	<updated>2026-06-05T09:45:17Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://mediawiki.comfac.net/index.php?title=Main_Page&amp;diff=126</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.comfac.net/index.php?title=Main_Page&amp;diff=126"/>
		<updated>2026-03-05T08:29:31Z</updated>

		<summary type="html">&lt;p&gt;Dani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
# [[Mediawiki Setting Up Guide]]&lt;br /&gt;
# [[Mediawiki Additional Configuration]]&lt;br /&gt;
# [[Mediawiki Docker Migration Guide]]&lt;br /&gt;
# [[ERPNext Webshop Setup Guide]]&lt;br /&gt;
# [[Manufacturing v16 260125]]&lt;br /&gt;
# [[ERpnext Asset Management Procedure 260113 ]]&lt;br /&gt;
# [[260108 CGG- GitHub Administration Guide ]]&lt;br /&gt;
# [[ERPNext HR Module Outline ]]&lt;br /&gt;
# [[Controller Systems 251213-01 ]]&lt;br /&gt;
# [[Power Distribution Tree 251213 ]]&lt;br /&gt;
# [[Home ]]&lt;br /&gt;
# [[Standard Operating Procedure: Distributed Minute Taking &amp;amp; Task Ownership 251208 ]]&lt;br /&gt;
# [[OpenWebUI - 251128-justin ]]&lt;br /&gt;
# [[Comfac ERPNext Strategy Canvas (Expanded) ]]&lt;br /&gt;
# [[IT Purchase Requests 241126 ]]&lt;br /&gt;
# [[TrueNAS Business Plan: Project 251212 ]]&lt;br /&gt;
# [[ERPNEXT Payroll POC 251212 ]]&lt;br /&gt;
# [[Offline Malware Remediation &amp;amp; Data Recovery ]]&lt;br /&gt;
# [[TrueNAS Configuration Options &amp;amp; Scale Options 251130 ]]&lt;br /&gt;
# [[SOP: Network Troubleshooting &amp;amp; pfSense Monitoring 251130 ]]&lt;br /&gt;
# [[System Hardening Strategy: Win2Lin Migration &amp;amp; Infrastructure 251129 ]]&lt;br /&gt;
# [[IT IMPORTS PROCESSES ]]&lt;br /&gt;
# [[Skills and Competencies for IT Staff Trained in pfSense ]]&lt;br /&gt;
# [[pfSense Sales Training Material ]]&lt;br /&gt;
# [[Industrial Controllers and Water Utilities 251011 ]]&lt;br /&gt;
# [[Comfac Sales Knowledge Base ]]&lt;br /&gt;
# [[🌐 WordPress Website — *You Own Everything, Learn Everything* ]]&lt;br /&gt;
# [[Business Continuity ]]&lt;br /&gt;
# [[Using Frappe Wiki ]]&lt;br /&gt;
# [[Procedure: CC-Blast Data Breach Prevention ]]&lt;br /&gt;
# [[8D (Eight Discipline) Problem Solving Procedure ]]&lt;br /&gt;
# [[IT REQUEST (OP-ERP-ITR) - EDITED 250801 ]]&lt;br /&gt;
# [[Steps to Repair and OCR a Scanned or Corrupted PDF in Ubuntu ]]&lt;br /&gt;
# [[Projects in Process Report 251023 ]]&lt;br /&gt;
# [[SALES INVOICE TAX OUTPUT 250829 ]]&lt;br /&gt;
# [[2026 MIS IT KRA KPI Biz Plan ]]&lt;br /&gt;
# [[Tplink Mikrotik Equivalent ]]&lt;br /&gt;
# [[Google Drive and Shared Drive Training ]]&lt;br /&gt;
# [[Mailcow SOGo: Creating Filters for Events, Approvals, and Organizational Emails ]]&lt;br /&gt;
# [[Comparison: TrueNAS Mini X+ vs Dell Precision 3680 Tower (2025) ]]&lt;br /&gt;
# [[ERPNext Webshop Setup and Publishing Process ]]&lt;br /&gt;
# [[Excel Description Filler Tool 📝 ]]&lt;br /&gt;
# [[Biz Analysis Methodology 251109 ]]&lt;br /&gt;
# [[Comfac CRM – Customer Qualification &amp;amp; Conversion Process ]]&lt;br /&gt;
# [[Comfac GPU Scaling and AI Research Goals ]]&lt;br /&gt;
# [[Backblaze Drive Stats for Server and Storage Qualification ]]&lt;br /&gt;
# [[🧠 Process: Selecting and Installing the Right Ollama Model for Your Hardware ]]&lt;br /&gt;
# [[Partner Reseller Pricing 251109 ]]&lt;br /&gt;
# [[LibreOffice / Nextcloud Office – &amp;quot;Due Tasks&amp;quot; Conditional Formatting ]]&lt;br /&gt;
# [[pfSense CE → pfSense Plus Upgrade Guide ]]&lt;br /&gt;
# [[Introduction: Why Self-Host Your Email? ]]&lt;br /&gt;
# [[Spoof Timezone Extension – Setup Guide for Comfac Staff ]]&lt;br /&gt;
# [[Mailcow + Thunderbird Setup Guide (Email + Calendar) ]]&lt;br /&gt;
# [[Viber Focus-Stealing ]]&lt;br /&gt;
# [[Modern Guide: pfSense Captive Portal with FreeRADIUS &amp;amp; ACME ]]&lt;br /&gt;
# [[Frappe Links and References ]]&lt;br /&gt;
&lt;br /&gt;
== For Users Only ==&lt;br /&gt;
* [[Private:Private Ngani]]&lt;br /&gt;
* [[Private:Private Nganipart2]]&lt;br /&gt;
&lt;br /&gt;
== CIT-OJT Project Documentations ==&lt;br /&gt;
&lt;br /&gt;
* [[OJTDocs: For OJTs only]]&lt;br /&gt;
&lt;br /&gt;
== Need Help? ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;br /&gt;
* [[Troubleshooting: Access &amp;amp; Permission Issues]]&lt;/div&gt;</summary>
		<author><name>Dani</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.comfac.net/index.php?title=Main_Page&amp;diff=123</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.comfac.net/index.php?title=Main_Page&amp;diff=123"/>
		<updated>2026-03-05T08:09:45Z</updated>

		<summary type="html">&lt;p&gt;Dani: /* CIT-OJT Project Documentations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
# [[Mediawiki Setting Up Guide]]&lt;br /&gt;
# [[Mediawiki Additional Configuration]]&lt;br /&gt;
# [[Mediawiki Docker Migration Guide]]&lt;br /&gt;
# [[ERPNext Webshop Setup Guide]]&lt;br /&gt;
# [[Manufacturing v16 260125]]&lt;br /&gt;
# [[ERpnext Asset Management Procedure 260113 ]]&lt;br /&gt;
# [[260108 CGG- GitHub Administration Guide ]]&lt;br /&gt;
# [[ERPNext HR Module Outline ]]&lt;br /&gt;
# [[Controller Systems 251213-01 ]]&lt;br /&gt;
# [[Power Distribution Tree 251213 ]]&lt;br /&gt;
# [[Home ]]&lt;br /&gt;
# [[Standard Operating Procedure: Distributed Minute Taking &amp;amp; Task Ownership 251208 ]]&lt;br /&gt;
# [[OpenWebUI - 251128-justin ]]&lt;br /&gt;
# [[Comfac ERPNext Strategy Canvas (Expanded) ]]&lt;br /&gt;
# [[IT Purchase Requests 241126 ]]&lt;br /&gt;
# [[TrueNAS Business Plan: Project 251212 ]]&lt;br /&gt;
# [[ERPNEXT Payroll POC 251212 ]]&lt;br /&gt;
# [[Offline Malware Remediation &amp;amp; Data Recovery ]]&lt;br /&gt;
# [[TrueNAS Configuration Options &amp;amp; Scale Options 251130 ]]&lt;br /&gt;
# [[SOP: Network Troubleshooting &amp;amp; pfSense Monitoring 251130 ]]&lt;br /&gt;
# [[System Hardening Strategy: Win2Lin Migration &amp;amp; Infrastructure 251129 ]]&lt;br /&gt;
# [[IT IMPORTS PROCESSES ]]&lt;br /&gt;
# [[Skills and Competencies for IT Staff Trained in pfSense ]]&lt;br /&gt;
# [[pfSense Sales Training Material ]]&lt;br /&gt;
# [[Industrial Controllers and Water Utilities 251011 ]]&lt;br /&gt;
# [[Comfac Sales Knowledge Base ]]&lt;br /&gt;
# [[🌐 WordPress Website — *You Own Everything, Learn Everything* ]]&lt;br /&gt;
# [[Business Continuity ]]&lt;br /&gt;
# [[Using Frappe Wiki ]]&lt;br /&gt;
# [[Procedure: CC-Blast Data Breach Prevention ]]&lt;br /&gt;
# [[8D (Eight Discipline) Problem Solving Procedure ]]&lt;br /&gt;
# [[IT REQUEST (OP-ERP-ITR) - EDITED 250801 ]]&lt;br /&gt;
# [[Steps to Repair and OCR a Scanned or Corrupted PDF in Ubuntu ]]&lt;br /&gt;
# [[Projects in Process Report 251023 ]]&lt;br /&gt;
# [[SALES INVOICE TAX OUTPUT 250829 ]]&lt;br /&gt;
# [[2026 MIS IT KRA KPI Biz Plan ]]&lt;br /&gt;
# [[Tplink Mikrotik Equivalent ]]&lt;br /&gt;
# [[Google Drive and Shared Drive Training ]]&lt;br /&gt;
# [[Mailcow SOGo: Creating Filters for Events, Approvals, and Organizational Emails ]]&lt;br /&gt;
# [[Comparison: TrueNAS Mini X+ vs Dell Precision 3680 Tower (2025) ]]&lt;br /&gt;
# [[ERPNext Webshop Setup and Publishing Process ]]&lt;br /&gt;
# [[Excel Description Filler Tool 📝 ]]&lt;br /&gt;
# [[Biz Analysis Methodology 251109 ]]&lt;br /&gt;
# [[Comfac CRM – Customer Qualification &amp;amp; Conversion Process ]]&lt;br /&gt;
# [[Comfac GPU Scaling and AI Research Goals ]]&lt;br /&gt;
# [[Backblaze Drive Stats for Server and Storage Qualification ]]&lt;br /&gt;
# [[🧠 Process: Selecting and Installing the Right Ollama Model for Your Hardware ]]&lt;br /&gt;
# [[Partner Reseller Pricing 251109 ]]&lt;br /&gt;
# [[LibreOffice / Nextcloud Office – &amp;quot;Due Tasks&amp;quot; Conditional Formatting ]]&lt;br /&gt;
# [[pfSense CE → pfSense Plus Upgrade Guide ]]&lt;br /&gt;
# [[Introduction: Why Self-Host Your Email? ]]&lt;br /&gt;
# [[Spoof Timezone Extension – Setup Guide for Comfac Staff ]]&lt;br /&gt;
# [[Mailcow + Thunderbird Setup Guide (Email + Calendar) ]]&lt;br /&gt;
# [[Viber Focus-Stealing ]]&lt;br /&gt;
# [[Modern Guide: pfSense Captive Portal with FreeRADIUS &amp;amp; ACME ]]&lt;br /&gt;
# [[Frappe Links and References ]]&lt;br /&gt;
# [[testing]]&lt;br /&gt;
&lt;br /&gt;
== For Users Only ==&lt;br /&gt;
* [[Private:Private Ngani]]&lt;br /&gt;
* [[Private:Private Nganipart2]]&lt;br /&gt;
&lt;br /&gt;
== CIT-OJT Project Documentations ==&lt;br /&gt;
&lt;br /&gt;
* [[OJTDocs: For OJTs only]]&lt;br /&gt;
&lt;br /&gt;
== Need Help? ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;br /&gt;
* [[Troubleshooting: Access &amp;amp; Permission Issues]]&lt;/div&gt;</summary>
		<author><name>Dani</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.comfac.net/index.php?title=For_interns_only&amp;diff=122</id>
		<title>For interns only</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.comfac.net/index.php?title=For_interns_only&amp;diff=122"/>
		<updated>2026-03-05T08:07:49Z</updated>

		<summary type="html">&lt;p&gt;Dani: Dani moved page For interns only to OJTDocs:For interns only&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[OJTDocs:For interns only]]&lt;/div&gt;</summary>
		<author><name>Dani</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.comfac.net/index.php?title=Main_Page&amp;diff=119</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.comfac.net/index.php?title=Main_Page&amp;diff=119"/>
		<updated>2026-03-05T08:04:23Z</updated>

		<summary type="html">&lt;p&gt;Dani: /* CIT-OJT Project Documentations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
# [[Mediawiki Setting Up Guide]]&lt;br /&gt;
# [[Mediawiki Additional Configuration]]&lt;br /&gt;
# [[Mediawiki Docker Migration Guide]]&lt;br /&gt;
# [[ERPNext Webshop Setup Guide]]&lt;br /&gt;
# [[Manufacturing v16 260125]]&lt;br /&gt;
# [[ERpnext Asset Management Procedure 260113 ]]&lt;br /&gt;
# [[260108 CGG- GitHub Administration Guide ]]&lt;br /&gt;
# [[ERPNext HR Module Outline ]]&lt;br /&gt;
# [[Controller Systems 251213-01 ]]&lt;br /&gt;
# [[Power Distribution Tree 251213 ]]&lt;br /&gt;
# [[Home ]]&lt;br /&gt;
# [[Standard Operating Procedure: Distributed Minute Taking &amp;amp; Task Ownership 251208 ]]&lt;br /&gt;
# [[OpenWebUI - 251128-justin ]]&lt;br /&gt;
# [[Comfac ERPNext Strategy Canvas (Expanded) ]]&lt;br /&gt;
# [[IT Purchase Requests 241126 ]]&lt;br /&gt;
# [[TrueNAS Business Plan: Project 251212 ]]&lt;br /&gt;
# [[ERPNEXT Payroll POC 251212 ]]&lt;br /&gt;
# [[Offline Malware Remediation &amp;amp; Data Recovery ]]&lt;br /&gt;
# [[TrueNAS Configuration Options &amp;amp; Scale Options 251130 ]]&lt;br /&gt;
# [[SOP: Network Troubleshooting &amp;amp; pfSense Monitoring 251130 ]]&lt;br /&gt;
# [[System Hardening Strategy: Win2Lin Migration &amp;amp; Infrastructure 251129 ]]&lt;br /&gt;
# [[IT IMPORTS PROCESSES ]]&lt;br /&gt;
# [[Skills and Competencies for IT Staff Trained in pfSense ]]&lt;br /&gt;
# [[pfSense Sales Training Material ]]&lt;br /&gt;
# [[Industrial Controllers and Water Utilities 251011 ]]&lt;br /&gt;
# [[Comfac Sales Knowledge Base ]]&lt;br /&gt;
# [[🌐 WordPress Website — *You Own Everything, Learn Everything* ]]&lt;br /&gt;
# [[Business Continuity ]]&lt;br /&gt;
# [[Using Frappe Wiki ]]&lt;br /&gt;
# [[Procedure: CC-Blast Data Breach Prevention ]]&lt;br /&gt;
# [[8D (Eight Discipline) Problem Solving Procedure ]]&lt;br /&gt;
# [[IT REQUEST (OP-ERP-ITR) - EDITED 250801 ]]&lt;br /&gt;
# [[Steps to Repair and OCR a Scanned or Corrupted PDF in Ubuntu ]]&lt;br /&gt;
# [[Projects in Process Report 251023 ]]&lt;br /&gt;
# [[SALES INVOICE TAX OUTPUT 250829 ]]&lt;br /&gt;
# [[2026 MIS IT KRA KPI Biz Plan ]]&lt;br /&gt;
# [[Tplink Mikrotik Equivalent ]]&lt;br /&gt;
# [[Google Drive and Shared Drive Training ]]&lt;br /&gt;
# [[Mailcow SOGo: Creating Filters for Events, Approvals, and Organizational Emails ]]&lt;br /&gt;
# [[Comparison: TrueNAS Mini X+ vs Dell Precision 3680 Tower (2025) ]]&lt;br /&gt;
# [[ERPNext Webshop Setup and Publishing Process ]]&lt;br /&gt;
# [[Excel Description Filler Tool 📝 ]]&lt;br /&gt;
# [[Biz Analysis Methodology 251109 ]]&lt;br /&gt;
# [[Comfac CRM – Customer Qualification &amp;amp; Conversion Process ]]&lt;br /&gt;
# [[Comfac GPU Scaling and AI Research Goals ]]&lt;br /&gt;
# [[Backblaze Drive Stats for Server and Storage Qualification ]]&lt;br /&gt;
# [[🧠 Process: Selecting and Installing the Right Ollama Model for Your Hardware ]]&lt;br /&gt;
# [[Partner Reseller Pricing 251109 ]]&lt;br /&gt;
# [[LibreOffice / Nextcloud Office – &amp;quot;Due Tasks&amp;quot; Conditional Formatting ]]&lt;br /&gt;
# [[pfSense CE → pfSense Plus Upgrade Guide ]]&lt;br /&gt;
# [[Introduction: Why Self-Host Your Email? ]]&lt;br /&gt;
# [[Spoof Timezone Extension – Setup Guide for Comfac Staff ]]&lt;br /&gt;
# [[Mailcow + Thunderbird Setup Guide (Email + Calendar) ]]&lt;br /&gt;
# [[Viber Focus-Stealing ]]&lt;br /&gt;
# [[Modern Guide: pfSense Captive Portal with FreeRADIUS &amp;amp; ACME ]]&lt;br /&gt;
# [[Frappe Links and References ]]&lt;br /&gt;
# [[testing]]&lt;br /&gt;
&lt;br /&gt;
== For Users Only ==&lt;br /&gt;
* [[Private:Private Ngani]]&lt;br /&gt;
* [[Private:Private Nganipart2]]&lt;br /&gt;
&lt;br /&gt;
== CIT-OJT Project Documentations ==&lt;br /&gt;
&lt;br /&gt;
* [[For interns only]]&lt;br /&gt;
&lt;br /&gt;
== Need Help? ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;br /&gt;
* [[Troubleshooting: Access &amp;amp; Permission Issues]]&lt;/div&gt;</summary>
		<author><name>Dani</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.comfac.net/index.php?title=Main_Page&amp;diff=118</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.comfac.net/index.php?title=Main_Page&amp;diff=118"/>
		<updated>2026-03-05T07:37:36Z</updated>

		<summary type="html">&lt;p&gt;Dani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
# [[Mediawiki Setting Up Guide]]&lt;br /&gt;
# [[Mediawiki Additional Configuration]]&lt;br /&gt;
# [[Mediawiki Docker Migration Guide]]&lt;br /&gt;
# [[ERPNext Webshop Setup Guide]]&lt;br /&gt;
# [[Manufacturing v16 260125]]&lt;br /&gt;
# [[ERpnext Asset Management Procedure 260113 ]]&lt;br /&gt;
# [[260108 CGG- GitHub Administration Guide ]]&lt;br /&gt;
# [[ERPNext HR Module Outline ]]&lt;br /&gt;
# [[Controller Systems 251213-01 ]]&lt;br /&gt;
# [[Power Distribution Tree 251213 ]]&lt;br /&gt;
# [[Home ]]&lt;br /&gt;
# [[Standard Operating Procedure: Distributed Minute Taking &amp;amp; Task Ownership 251208 ]]&lt;br /&gt;
# [[OpenWebUI - 251128-justin ]]&lt;br /&gt;
# [[Comfac ERPNext Strategy Canvas (Expanded) ]]&lt;br /&gt;
# [[IT Purchase Requests 241126 ]]&lt;br /&gt;
# [[TrueNAS Business Plan: Project 251212 ]]&lt;br /&gt;
# [[ERPNEXT Payroll POC 251212 ]]&lt;br /&gt;
# [[Offline Malware Remediation &amp;amp; Data Recovery ]]&lt;br /&gt;
# [[TrueNAS Configuration Options &amp;amp; Scale Options 251130 ]]&lt;br /&gt;
# [[SOP: Network Troubleshooting &amp;amp; pfSense Monitoring 251130 ]]&lt;br /&gt;
# [[System Hardening Strategy: Win2Lin Migration &amp;amp; Infrastructure 251129 ]]&lt;br /&gt;
# [[IT IMPORTS PROCESSES ]]&lt;br /&gt;
# [[Skills and Competencies for IT Staff Trained in pfSense ]]&lt;br /&gt;
# [[pfSense Sales Training Material ]]&lt;br /&gt;
# [[Industrial Controllers and Water Utilities 251011 ]]&lt;br /&gt;
# [[Comfac Sales Knowledge Base ]]&lt;br /&gt;
# [[🌐 WordPress Website — *You Own Everything, Learn Everything* ]]&lt;br /&gt;
# [[Business Continuity ]]&lt;br /&gt;
# [[Using Frappe Wiki ]]&lt;br /&gt;
# [[Procedure: CC-Blast Data Breach Prevention ]]&lt;br /&gt;
# [[8D (Eight Discipline) Problem Solving Procedure ]]&lt;br /&gt;
# [[IT REQUEST (OP-ERP-ITR) - EDITED 250801 ]]&lt;br /&gt;
# [[Steps to Repair and OCR a Scanned or Corrupted PDF in Ubuntu ]]&lt;br /&gt;
# [[Projects in Process Report 251023 ]]&lt;br /&gt;
# [[SALES INVOICE TAX OUTPUT 250829 ]]&lt;br /&gt;
# [[2026 MIS IT KRA KPI Biz Plan ]]&lt;br /&gt;
# [[Tplink Mikrotik Equivalent ]]&lt;br /&gt;
# [[Google Drive and Shared Drive Training ]]&lt;br /&gt;
# [[Mailcow SOGo: Creating Filters for Events, Approvals, and Organizational Emails ]]&lt;br /&gt;
# [[Comparison: TrueNAS Mini X+ vs Dell Precision 3680 Tower (2025) ]]&lt;br /&gt;
# [[ERPNext Webshop Setup and Publishing Process ]]&lt;br /&gt;
# [[Excel Description Filler Tool 📝 ]]&lt;br /&gt;
# [[Biz Analysis Methodology 251109 ]]&lt;br /&gt;
# [[Comfac CRM – Customer Qualification &amp;amp; Conversion Process ]]&lt;br /&gt;
# [[Comfac GPU Scaling and AI Research Goals ]]&lt;br /&gt;
# [[Backblaze Drive Stats for Server and Storage Qualification ]]&lt;br /&gt;
# [[🧠 Process: Selecting and Installing the Right Ollama Model for Your Hardware ]]&lt;br /&gt;
# [[Partner Reseller Pricing 251109 ]]&lt;br /&gt;
# [[LibreOffice / Nextcloud Office – &amp;quot;Due Tasks&amp;quot; Conditional Formatting ]]&lt;br /&gt;
# [[pfSense CE → pfSense Plus Upgrade Guide ]]&lt;br /&gt;
# [[Introduction: Why Self-Host Your Email? ]]&lt;br /&gt;
# [[Spoof Timezone Extension – Setup Guide for Comfac Staff ]]&lt;br /&gt;
# [[Mailcow + Thunderbird Setup Guide (Email + Calendar) ]]&lt;br /&gt;
# [[Viber Focus-Stealing ]]&lt;br /&gt;
# [[Modern Guide: pfSense Captive Portal with FreeRADIUS &amp;amp; ACME ]]&lt;br /&gt;
# [[Frappe Links and References ]]&lt;br /&gt;
# [[testing]]&lt;br /&gt;
&lt;br /&gt;
== For Users Only ==&lt;br /&gt;
* [[Private:Private Ngani]]&lt;br /&gt;
* [[Private:Private Nganipart2]]&lt;br /&gt;
&lt;br /&gt;
== CIT-OJT Project Documentations ==&lt;br /&gt;
&lt;br /&gt;
== Need Help? ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;br /&gt;
* [[Troubleshooting: Access &amp;amp; Permission Issues]]&lt;/div&gt;</summary>
		<author><name>Dani</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.comfac.net/index.php?title=Mediawiki_Additional_Configuration&amp;diff=110</id>
		<title>Mediawiki Additional Configuration</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.comfac.net/index.php?title=Mediawiki_Additional_Configuration&amp;diff=110"/>
		<updated>2026-03-05T00:33:47Z</updated>

		<summary type="html">&lt;p&gt;Dani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MediaWiki Additional Configuration Guide ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;This guide covers advanced configuration options for your MediaWiki installation, including logos, permissions, email, private namespaces, and two-factor authentication.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Prerequisites:&#039;&#039;&#039; Complete the &#039;&#039;&#039;[[MediaWiki Docker Setup Guide]]&#039;&#039;&#039; before proceeding with this configuration.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Advanced Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Part 1: Customizing Your Wiki&#039;s Appearance ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Upload Your Logo Files&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Before configuring logos, you need to upload your logo images to the wiki&#039;s images folder.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step A: Prepare Your Logo Files&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Create logo images in these sizes:&lt;br /&gt;
* &#039;&#039;&#039;Small logo (50x50 pixels):&#039;&#039;&#039; For favicon and small displays - save as &amp;lt;code&amp;gt;yourlogo-50.svg&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;yourlogo-50.png&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Large logo (160x160 pixels):&#039;&#039;&#039; For the main wiki logo - save as &amp;lt;code&amp;gt;yourlogo-160.svg&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;yourlogo-160.png&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; SVG format is recommended because it scales cleanly at any size. PNG is also acceptable.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step B: Copy Logo Files to the Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
First, you need to upload files to the Docker volume:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
# Create a temporary container to access the images volume&lt;br /&gt;
docker run -d --name temp-mediawiki \&lt;br /&gt;
  -v 230912_images:/var/www/html/images \&lt;br /&gt;
  mediawiki sleep 3600&lt;br /&gt;
&lt;br /&gt;
# Copy your logo files into the container&lt;br /&gt;
docker cp ~/Downloads/yourlogo-50.svg temp-mediawiki:/var/www/html/images/&lt;br /&gt;
docker cp ~/Downloads/yourlogo-160.svg temp-mediawiki:/var/www/html/images/&lt;br /&gt;
&lt;br /&gt;
# Fix permissions&lt;br /&gt;
docker exec temp-mediawiki chown 33:33 /var/www/html/images/yourlogo-50.svg&lt;br /&gt;
docker exec temp-mediawiki chown 33:33 /var/www/html/images/yourlogo-160.svg&lt;br /&gt;
&lt;br /&gt;
# Remove the temporary container&lt;br /&gt;
docker stop temp-mediawiki&lt;br /&gt;
docker rm temp-mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #f8f9fa; border-left: 4px solid #3498db; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Replace &amp;lt;code&amp;gt;yourlogo-50.svg&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;yourlogo-160.svg&amp;lt;/code&amp;gt; with your actual filename. Adjust the path &amp;lt;code&amp;gt;~/Downloads/&amp;lt;/code&amp;gt; if your files are saved elsewhere.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Configure Logo and Favicon in LocalSettings.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Open your LocalSettings.php file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /opt/stacks/mediawiki/LocalSettings.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Find the existing &amp;lt;code&amp;gt;$wgLogos&amp;lt;/code&amp;gt; section and replace it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
$wgLogos = [&lt;br /&gt;
	&#039;1x&#039;   =&amp;gt; &amp;quot;$wgResourceBasePath/images/yourlogo-160.svg&amp;quot;,&lt;br /&gt;
	&#039;icon&#039; =&amp;gt; &amp;quot;$wgResourceBasePath/images/yourlogo-50.svg&amp;quot;,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
$wgFavicon = &amp;quot;$wgResourceBasePath/images/yourlogo-50.svg&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #f8f9fa; border-left: 4px solid #3498db; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What this does:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;1x&#039;&amp;lt;/code&amp;gt; sets your main wiki logo (shown in the corner)&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;icon&#039;&amp;lt;/code&amp;gt; sets the smaller icon version&lt;br /&gt;
* &amp;lt;code&amp;gt;$wgFavicon&amp;lt;/code&amp;gt; sets the browser tab icon&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit.&lt;br /&gt;
&lt;br /&gt;
=== Part 2: Customizing the Wiki Skin (Theme) ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Configure the Modern Vector Skin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Open LocalSettings.php and find &amp;lt;code&amp;gt;$wgDefaultSkin&amp;lt;/code&amp;gt;. Replace it with this configuration block:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
# Use the modern Vector 2022 skin by default&lt;br /&gt;
$wgDefaultSkin = &amp;quot;vector-2022&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Make existing users see the new skin too&lt;br /&gt;
$wgVectorDefaultSkinVersionForExistingAccounts = &amp;quot;2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Make the skin work well on mobile devices&lt;br /&gt;
$wgVectorResponsive = true;&lt;br /&gt;
&lt;br /&gt;
# Enable appearance customization options for users&lt;br /&gt;
$wgVectorFeatureFlags = [&lt;br /&gt;
    &#039;VectorAppearance&#039; =&amp;gt; [&lt;br /&gt;
        &#039;logged_in&#039;  =&amp;gt; true,&lt;br /&gt;
        &#039;logged_out&#039; =&amp;gt; true,&lt;br /&gt;
    ],&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #f8f9fa; border-left: 4px solid #3498db; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What this does:&#039;&#039;&#039;&lt;br /&gt;
* Sets the modern Vector skin as default&lt;br /&gt;
* Makes it responsive for mobile/tablet viewing&lt;br /&gt;
* Allows users to customize appearance settings&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit.&lt;br /&gt;
&lt;br /&gt;
=== Part 3: Setting Up Email and SMTP ===&lt;br /&gt;
&lt;br /&gt;
This allows your wiki to send password reset emails, notifications, and user-to-user messages.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Configure Email Settings&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; This configuration uses environment variables to keep sensitive credentials out of LocalSettings.php. You will need to configure both your &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; file and &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step A: Set Up the .env File&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Create or edit your &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; file at &amp;lt;code&amp;gt;/opt/stacks/mediawiki/.env&amp;lt;/code&amp;gt; and add your SMTP credentials:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
# SMTP Configuration&lt;br /&gt;
SMTP_HOST=mail.comfac-it.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=your-email@comfac-it.com&lt;br /&gt;
SMTP_PASS=your_smtp_password_here&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Warning:&#039;&#039;&#039; Never commit your &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; file to version control. Add it to &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step B: Pass Environment Variables in docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ensure your &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; passes the SMTP variables into the MediaWiki container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  mediawiki:&lt;br /&gt;
    image: mediawiki&lt;br /&gt;
    container_name: mediawiki&lt;br /&gt;
    restart: always&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;${MEDIAWIKI_PORT}:80&amp;quot;&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - database&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./230912_images:/var/www/html/images&lt;br /&gt;
      - /opt/stacks/mediawiki/extensions:/var/www/html/extensions&lt;br /&gt;
      - /opt/stacks/mediawiki/LocalSettings.php:/var/www/html/LocalSettings.php:ro&lt;br /&gt;
    environment:&lt;br /&gt;
      - SMTP_HOST=${SMTP_HOST}&lt;br /&gt;
      - SMTP_PORT=${SMTP_PORT}&lt;br /&gt;
      - SMTP_USER=${SMTP_USER}&lt;br /&gt;
      - SMTP_PASS=${SMTP_PASS}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step C: Add Email Configuration to LocalSettings.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Open LocalSettings.php and add the following section after the extensions block:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*-------------------------------------------&lt;br /&gt;
 EMAIL &amp;amp; SMTP CONFIGURATION&lt;br /&gt;
-------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
# Enable email features&lt;br /&gt;
$wgEnableEmail      = true;&lt;br /&gt;
$wgEnableUserEmail  = true;&lt;br /&gt;
$wgEmailAuthentication = true;&lt;br /&gt;
&lt;br /&gt;
# Enable email notifications for talk pages and watchlist&lt;br /&gt;
$wgEnotifUserTalk  = true;&lt;br /&gt;
$wgEnotifWatchlist = true;&lt;br /&gt;
&lt;br /&gt;
# Set your wiki&#039;s email addresses&lt;br /&gt;
$wgEmergencyContact = &amp;quot;your-email@comfac-it.com&amp;quot;;&lt;br /&gt;
$wgPasswordSender   = &amp;quot;your-email@comfac-it.com&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# SMTP configuration — credentials loaded from environment variables&lt;br /&gt;
$wgSMTP = [&lt;br /&gt;
    &#039;host&#039;     =&amp;gt; getenv(&#039;SMTP_HOST&#039;),   # e.g. mail.comfac-it.com&lt;br /&gt;
    &#039;IDHost&#039;   =&amp;gt; &#039;comfac-it.com&#039;,        # Your mail domain&lt;br /&gt;
    &#039;port&#039;     =&amp;gt; getenv(&#039;SMTP_PORT&#039;),   # 587 for TLS&lt;br /&gt;
    &#039;auth&#039;     =&amp;gt; true,&lt;br /&gt;
    &#039;username&#039; =&amp;gt; getenv(&#039;SMTP_USER&#039;),   # Your SMTP username&lt;br /&gt;
    &#039;password&#039; =&amp;gt; getenv(&#039;SMTP_PASS&#039;),   # Your SMTP password&lt;br /&gt;
    &#039;secure&#039;   =&amp;gt; &#039;tls&#039;&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
# Additional email settings&lt;br /&gt;
$wgUserEmailUseReplyTo = true;&lt;br /&gt;
$wgAllowHTMLEmail      = true;&lt;br /&gt;
&lt;br /&gt;
# Enable password reset via email&lt;br /&gt;
$wgPasswordResetRoutes = [&lt;br /&gt;
    &#039;username&#039; =&amp;gt; true,&lt;br /&gt;
    &#039;email&#039;    =&amp;gt; true,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
# Password reset links expire after 24 hours&lt;br /&gt;
$wgNewPasswordExpiry = 86400;&lt;br /&gt;
&lt;br /&gt;
# ================================&lt;br /&gt;
# ALLOWED EMAIL DOMAINS&lt;br /&gt;
# ================================&lt;br /&gt;
&lt;br /&gt;
# Users can register/use these email domains&lt;br /&gt;
$wgAllowedEmailDomains = [&lt;br /&gt;
    &#039;gmail.com&#039;,&lt;br /&gt;
    &#039;comfac.net&#039;,&lt;br /&gt;
    &#039;comfac-it.com&#039;,&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #f8f9fa; border-left: 4px solid #3498db; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What this does:&#039;&#039;&#039;&lt;br /&gt;
* Uses &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt; to read SMTP credentials from Docker environment variables at runtime&lt;br /&gt;
* Keeps passwords out of &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and version control&lt;br /&gt;
* &amp;lt;code&amp;gt;IDHost&amp;lt;/code&amp;gt; is set to your mail domain (&amp;lt;code&amp;gt;comfac-it.com&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Restricts user email registration to approved domains only&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit.&lt;br /&gt;
&lt;br /&gt;
=== Part 4: Permission System (Who Can Do What) ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Create a Clean Permission Structure&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Open LocalSettings.php and replace the permissions section with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*-------------------------------------------&lt;br /&gt;
CLEAN PERMISSION SYSTEM&lt;br /&gt;
----------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
# Anonymous users&lt;br /&gt;
$wgGroupPermissions[&#039;*&#039;][&#039;read&#039;]          = true;&lt;br /&gt;
$wgGroupPermissions[&#039;*&#039;][&#039;edit&#039;]          = false;&lt;br /&gt;
$wgGroupPermissions[&#039;*&#039;][&#039;createaccount&#039;] = false;&lt;br /&gt;
&lt;br /&gt;
# Allow bureaucrats/admins to create accounts&lt;br /&gt;
$wgGroupPermissions[&#039;bureaucrat&#039;][&#039;createaccount&#039;] = true;&lt;br /&gt;
&lt;br /&gt;
# Logged-in users (view only)&lt;br /&gt;
$wgGroupPermissions[&#039;user&#039;][&#039;read&#039;] = true;&lt;br /&gt;
$wgGroupPermissions[&#039;user&#039;][&#039;edit&#039;] = false;&lt;br /&gt;
&lt;br /&gt;
# Editor group&lt;br /&gt;
$wgGroupPermissions[&#039;editor&#039;][&#039;read&#039;]     = true;&lt;br /&gt;
$wgGroupPermissions[&#039;editor&#039;][&#039;edit&#039;]     = true;&lt;br /&gt;
$wgGroupPermissions[&#039;editor&#039;][&#039;upload&#039;]   = true;&lt;br /&gt;
$wgGroupPermissions[&#039;editor&#039;][&#039;reupload&#039;] = true;&lt;br /&gt;
&lt;br /&gt;
# Sysop (admin)&lt;br /&gt;
$wgGroupPermissions[&#039;sysop&#039;][&#039;read&#039;]          = true;&lt;br /&gt;
$wgGroupPermissions[&#039;sysop&#039;][&#039;edit&#039;]          = true;&lt;br /&gt;
$wgGroupPermissions[&#039;sysop&#039;][&#039;protect&#039;]       = true;&lt;br /&gt;
$wgGroupPermissions[&#039;sysop&#039;][&#039;userrights&#039;]    = true;&lt;br /&gt;
$wgGroupPermissions[&#039;sysop&#039;][&#039;createaccount&#039;] = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #f8f9fa; border-left: 4px solid #3498db; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What this permission structure means:&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Anonymous visitors:&#039;&#039;&#039; Can only read pages&lt;br /&gt;
* &#039;&#039;&#039;Logged-in users:&#039;&#039;&#039; Can only read pages (no editing)&lt;br /&gt;
* &#039;&#039;&#039;Editors:&#039;&#039;&#039; Can read, edit, and upload files (assigned by admins)&lt;br /&gt;
* &#039;&#039;&#039;Sysops (Admins):&#039;&#039;&#039; Full control over the wiki&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;How to assign the Editor role:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
After restarting your wiki, log in as an admin and go to:&lt;br /&gt;
* &#039;&#039;&#039;Special:UserRights&#039;&#039;&#039; (or click &#039;&#039;&#039;Special Pages&#039;&#039;&#039; → &#039;&#039;&#039;User and rights section&#039;&#039;&#039;)&lt;br /&gt;
* Enter a username&lt;br /&gt;
* Check the &#039;&#039;&#039;editor&#039;&#039;&#039; box&lt;br /&gt;
* Click &#039;&#039;&#039;Save user groups&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit.&lt;br /&gt;
&lt;br /&gt;
=== Part 5: Creating a Private Namespace ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6. Configure the Private Namespace&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Open LocalSettings.php and add this section after your extensions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*-------------------------------------------&lt;br /&gt;
PRIVATE NAMESPACE (RESTRICTED ACCESS)&lt;br /&gt;
----------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
# Load the Lockdown extension&lt;br /&gt;
wfLoadExtension( &#039;Lockdown&#039; );&lt;br /&gt;
&lt;br /&gt;
# Define namespace IDs (must be unique)&lt;br /&gt;
define(&amp;quot;NS_PRIVATE&amp;quot;,      3000);&lt;br /&gt;
define(&amp;quot;NS_PRIVATE_TALK&amp;quot;, 3001);&lt;br /&gt;
&lt;br /&gt;
# Register the namespace names&lt;br /&gt;
$wgExtraNamespaces[NS_PRIVATE]      = &amp;quot;Private&amp;quot;;&lt;br /&gt;
$wgExtraNamespaces[NS_PRIVATE_TALK] = &amp;quot;Private_talk&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Only logged-in users, editors, and admins can READ&lt;br /&gt;
$wgNamespacePermissionLockdown[NS_PRIVATE][&#039;read&#039;] = [&#039;user&#039;, &#039;editor&#039;, &#039;sysop&#039;];&lt;br /&gt;
&lt;br /&gt;
# Only editors and admins can EDIT&lt;br /&gt;
$wgNamespacePermissionLockdown[NS_PRIVATE][&#039;edit&#039;] = [&#039;editor&#039;, &#039;sysop&#039;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #f8f9fa; border-left: 4px solid #3498db; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;How to use the Private namespace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To create a private page, use this format: &amp;lt;code&amp;gt;Private:YourPageName&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;Private:Company_Policies&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anonymous users and non-logged-in visitors will get an access denied message.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit.&lt;br /&gt;
&lt;br /&gt;
=== Part 6: Additional Recommended Extensions ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7. Enable Additional Extensions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Open LocalSettings.php and expand your extensions section:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*-------------------------------------------&lt;br /&gt;
ADDITIONAL RECOMMENDED EXTENSIONS&lt;br /&gt;
----------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
# Content organization&lt;br /&gt;
wfLoadExtension( &#039;CategoryTree&#039; );&lt;br /&gt;
wfLoadExtension( &#039;ImageMap&#039; );&lt;br /&gt;
&lt;br /&gt;
# User experience&lt;br /&gt;
wfLoadExtension( &#039;Echo&#039; );&lt;br /&gt;
wfLoadExtension( &#039;Thanks&#039; );&lt;br /&gt;
wfLoadExtension( &#039;DiscussionTools&#039; );&lt;br /&gt;
&lt;br /&gt;
# Content features&lt;br /&gt;
wfLoadExtension( &#039;TemplateData&#039; );&lt;br /&gt;
wfLoadExtension( &#039;TemplateStyles&#039; );&lt;br /&gt;
wfLoadExtension( &#039;Poem&#039; );&lt;br /&gt;
&lt;br /&gt;
# File handling&lt;br /&gt;
wfLoadExtension( &#039;PdfHandler&#039; );&lt;br /&gt;
wfLoadExtension( &#039;MultimediaViewer&#039; );&lt;br /&gt;
&lt;br /&gt;
# Moderation &amp;amp; security&lt;br /&gt;
wfLoadExtension( &#039;ConfirmEdit&#039; );&lt;br /&gt;
wfLoadExtension( &#039;SpamBlacklist&#039; );&lt;br /&gt;
wfLoadExtension( &#039;TitleBlacklist&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CiteThisPage&#039; );&lt;br /&gt;
wfLoadExtension( &#039;AbuseFilter&#039; );&lt;br /&gt;
wfLoadExtension( &#039;LoginNotify&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you get an error about a missing extension after restarting, comment out that line by adding &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; at the beginning.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit.&lt;br /&gt;
&lt;br /&gt;
=== Part 7: Enable File Uploads ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8. Configure Upload Settings&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Open LocalSettings.php and update the upload settings:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
# Enable file uploads&lt;br /&gt;
$wgEnableUploads  = true;&lt;br /&gt;
$wgUseImageMagick = true;&lt;br /&gt;
$wgImageMagickConvertCommand = &amp;quot;/usr/bin/convert&amp;quot;;&lt;br /&gt;
$wgUseInstantCommons = false;&lt;br /&gt;
&lt;br /&gt;
# Allow these file types to be uploaded&lt;br /&gt;
$wgFileExtensions = [&#039;png&#039;,&#039;gif&#039;,&#039;jpg&#039;,&#039;jpeg&#039;,&#039;webp&#039;,&#039;svg&#039;,&#039;pdf&#039;,&#039;doc&#039;,&#039;docx&#039;,&#039;xls&#039;,&#039;xlsx&#039;];&lt;br /&gt;
&lt;br /&gt;
# Allow SVG files with embedded titles&lt;br /&gt;
$wgAllowTitleInSVG = true;&lt;br /&gt;
$wgSVGConverter    = &#039;ImageMagick&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit.&lt;br /&gt;
&lt;br /&gt;
=== Part 8: Two-Factor Authentication for Administrators ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9. Install the OATHAuth Extension&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
First, check if the extension already exists:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
ls /opt/stacks/mediawiki/extensions/ | grep -i oath&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t see &amp;lt;code&amp;gt;OATHAuth&amp;lt;/code&amp;gt;, install it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/stacks/mediawiki/extensions&lt;br /&gt;
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/OATHAuth.git&lt;br /&gt;
sudo chown -R 33:33 OATHAuth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10. Configure OATHAuth for Admins Only&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Open LocalSettings.php and add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*-------------------------------------------&lt;br /&gt;
TWO-FACTOR AUTHENTICATION (ADMINS ONLY)&lt;br /&gt;
----------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
# Load the OATHAuth extension&lt;br /&gt;
wfLoadExtension( &#039;OATHAuth&#039; );&lt;br /&gt;
&lt;br /&gt;
# REQUIRE 2FA for administrators (sysops) only&lt;br /&gt;
$wgOATHRequiredForGroups = [&#039;sysop&#039;];&lt;br /&gt;
&lt;br /&gt;
# Optional: Also require 2FA for bureaucrats&lt;br /&gt;
# $wgOATHRequiredForGroups = [&#039;sysop&#039;, &#039;bureaucrat&#039;];&lt;br /&gt;
&lt;br /&gt;
# Allow TOTP - works with Google Authenticator, Authy, etc.&lt;br /&gt;
$wgOATHAuthModules = [&lt;br /&gt;
    &#039;totp&#039; =&amp;gt; [&lt;br /&gt;
        &#039;class&#039; =&amp;gt; &#039;MediaWiki\\Extension\\OATHAuth\\Module\\TOTP&#039;,&lt;br /&gt;
    ],&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #f8f9fa; border-left: 4px solid #3498db; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What this does:&#039;&#039;&#039;&lt;br /&gt;
* Requires 2FA only for users in the &amp;lt;code&amp;gt;sysop&amp;lt;/code&amp;gt; (administrator) group&lt;br /&gt;
* Regular users and editors do NOT need 2FA&lt;br /&gt;
* Uses TOTP method (compatible with most authenticator apps)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit.&lt;br /&gt;
&lt;br /&gt;
=== Part 9: Apply All Changes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11. Update the Database and Restart&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
# Update database to recognize new extensions and namespaces&lt;br /&gt;
docker exec -it mediawiki php maintenance/update.php --quick&lt;br /&gt;
&lt;br /&gt;
# Restart MediaWiki to apply all changes&lt;br /&gt;
cd /opt/stacks/mediawiki&lt;br /&gt;
docker compose restart&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait about 30 seconds for the containers to fully restart.&lt;br /&gt;
&lt;br /&gt;
== Setting Up Two-Factor Authentication ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12. Set Up 2FA for Administrator Accounts&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step A: Install an Authenticator App (If Not Already Installed)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
On your phone or tablet, install one of these apps:&lt;br /&gt;
* &#039;&#039;&#039;Google Authenticator&#039;&#039;&#039; (iOS/Android)&lt;br /&gt;
* &#039;&#039;&#039;Microsoft Authenticator&#039;&#039;&#039; (iOS/Android)&lt;br /&gt;
* &#039;&#039;&#039;Authy&#039;&#039;&#039; (iOS/Android)&lt;br /&gt;
* &#039;&#039;&#039;1Password&#039;&#039;&#039; (if you use a password manager)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step B: Enable 2FA on Your Admin Account&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Log in to MediaWiki as an administrator&lt;br /&gt;
# Click on your username in the top-right corner&lt;br /&gt;
# Click &#039;&#039;&#039;Preferences&#039;&#039;&#039;&lt;br /&gt;
# Click the &#039;&#039;&#039;Two-factor authentication&#039;&#039;&#039; tab (or &#039;&#039;&#039;OATH&#039;&#039;&#039; tab)&lt;br /&gt;
# Click &#039;&#039;&#039;Manage&#039;&#039;&#039; and &#039;&#039;&#039;Add an authenticator app&#039;&#039;&#039;&lt;br /&gt;
# You&#039;ll see a QR code on the screen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step C: Scan the QR Code&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Open your authenticator app on your phone&lt;br /&gt;
# Tap the &amp;quot;+&amp;quot; or &amp;quot;Add account&amp;quot; button&lt;br /&gt;
# Scan the QR code shown on your screen&lt;br /&gt;
# The app will add an entry like &amp;quot;MediaWiki - YourUsername&amp;quot;&lt;br /&gt;
# You&#039;ll see a 6-digit code that changes every 30 seconds&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step D: Verify the Setup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Enter the 6-digit code from your authenticator app into the MediaWiki form&lt;br /&gt;
# You&#039;ll also see &#039;&#039;&#039;scratch codes&#039;&#039;&#039; (recovery codes) - SAVE THESE SAFELY!&lt;br /&gt;
# Click &#039;&#039;&#039;Confirm&#039;&#039;&#039; or &#039;&#039;&#039;Enable&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;CRITICAL - Save Your Recovery Codes!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Write down or securely save your recovery codes. If you lose access to your phone, these codes are the ONLY way to regain access to your account. Each recovery code can only be used once.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13. Test Two-Factor Authentication&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Log out of your MediaWiki account&lt;br /&gt;
# Log back in with your username and password&lt;br /&gt;
# You&#039;ll now see a screen asking for a &#039;&#039;&#039;Two-factor authentication token&#039;&#039;&#039;&lt;br /&gt;
# Open your authenticator app and enter the current 6-digit code&lt;br /&gt;
# Click &#039;&#039;&#039;Continue&#039;&#039;&#039; or &#039;&#039;&#039;Log in&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Verification Checklist ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;14. Test Your Configuration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Logo &amp;amp; Skin&#039;&#039;&#039;&lt;br /&gt;
* Your custom logo appears in the top-left corner and as the favicon&lt;br /&gt;
* The modern Vector 2022 skin is active&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Permissions&#039;&#039;&#039;&lt;br /&gt;
# Log out and confirm you can only read pages&lt;br /&gt;
# Log in as a regular user and confirm you cannot edit&lt;br /&gt;
# Log in as admin and assign the &amp;quot;editor&amp;quot; role via &#039;&#039;&#039;Special:UserRights&#039;&#039;&#039;&lt;br /&gt;
# Confirm the editor can now edit pages&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Email&#039;&#039;&#039;&lt;br /&gt;
# Click &amp;quot;Forgot password?&amp;quot; on the login page&lt;br /&gt;
# Enter your username or email and verify you receive the reset email&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Private Namespace&#039;&#039;&#039;&lt;br /&gt;
# Create a page like &amp;lt;code&amp;gt;Private:Test&amp;lt;/code&amp;gt;&lt;br /&gt;
# Log out and confirm anonymous users cannot access it&lt;br /&gt;
# Log in as a regular user and confirm you can view it&lt;br /&gt;
# Check that only editors and admins can edit it&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File Uploads&#039;&#039;&#039;&lt;br /&gt;
# Log in as an editor or admin&lt;br /&gt;
# Go to &#039;&#039;&#039;Special:Upload&#039;&#039;&#039;&lt;br /&gt;
# Try uploading an image file and verify it appears on the page&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Two-Factor Authentication&#039;&#039;&#039;&lt;br /&gt;
# Verify all admins have set up 2FA&lt;br /&gt;
# Test login process with 2FA code&lt;br /&gt;
# Verify recovery codes are saved securely&lt;br /&gt;
&lt;br /&gt;
== Managing Two-Factor Authentication ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If an Admin Loses Access to Their Phone:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# At the 2FA prompt, enter one of the saved recovery codes&lt;br /&gt;
# Once logged in, go to &#039;&#039;&#039;Preferences&#039;&#039;&#039; → &#039;&#039;&#039;Two-factor authentication&#039;&#039;&#039;&lt;br /&gt;
# Disable 2FA, then re-enable it with a new QR code&lt;br /&gt;
# Generate new recovery codes&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If Recovery Codes Are Also Lost:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Another administrator needs to disable 2FA for that account:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
# Run this command to disable 2FA for a specific user&lt;br /&gt;
docker exec -it mediawiki php maintenance/run.php OATHAuth:deleteUser --user=&amp;quot;USERNAME&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;code&amp;gt;USERNAME&amp;lt;/code&amp;gt; with the actual username.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Security Tip:&#039;&#039;&#039; Create at least two administrator accounts so one admin can help recover another&#039;s account if needed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Email not sending?&#039;&#039;&#039;&lt;br /&gt;
* Verify SMTP credentials are correct in your &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; file&lt;br /&gt;
* Check &amp;lt;code&amp;gt;SMTP_HOST&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SMTP_PORT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SMTP_USER&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SMTP_PASS&amp;lt;/code&amp;gt; values&lt;br /&gt;
* Ensure environment variables are passed correctly in &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
* Check container logs: &amp;lt;code&amp;gt;docker compose logs -f mediawiki&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Logo not appearing?&#039;&#039;&#039;&lt;br /&gt;
* Verify files were copied correctly: &amp;lt;code&amp;gt;docker exec mediawiki ls -la /var/www/html/images/&amp;lt;/code&amp;gt;&lt;br /&gt;
* Hard refresh your browser: &amp;lt;code&amp;gt;Ctrl + Shift + R&amp;lt;/code&amp;gt; (Windows/Linux) or &amp;lt;code&amp;gt;Cmd + Shift + R&amp;lt;/code&amp;gt; (Mac)&lt;br /&gt;
* Check the exact filenames in LocalSettings.php match the uploaded files&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Private namespace not working?&#039;&#039;&#039;&lt;br /&gt;
* Ensure Lockdown extension is installed: &amp;lt;code&amp;gt;ls /opt/stacks/mediawiki/extensions/Lockdown&amp;lt;/code&amp;gt;&lt;br /&gt;
* Run database update: &amp;lt;code&amp;gt;docker exec -it mediawiki php maintenance/update.php --quick&amp;lt;/code&amp;gt;&lt;br /&gt;
* Restart containers: &amp;lt;code&amp;gt;docker compose restart&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2FA prompt not appearing for admins:&#039;&#039;&#039;&lt;br /&gt;
* Verify the OATHAuth configuration in LocalSettings.php&lt;br /&gt;
* Run: &amp;lt;code&amp;gt;docker exec -it mediawiki php maintenance/update.php&amp;lt;/code&amp;gt;&lt;br /&gt;
* Restart containers and clear your browser cache&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Authenticator codes not working:&#039;&#039;&#039;&lt;br /&gt;
* Verify your phone&#039;s time is set to automatic (not manual)&lt;br /&gt;
* Time synchronization is critical for TOTP to work&lt;br /&gt;
* Try syncing time in your authenticator app settings&lt;br /&gt;
&lt;br /&gt;
== Maintenance Tasks ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Regular Backups&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Save as /opt/scripts/backup-mediawiki.sh&lt;br /&gt;
&lt;br /&gt;
BACKUP_DIR=&amp;quot;/opt/backups/mediawiki&amp;quot;&lt;br /&gt;
DATE=$(date +%Y%m%d_%H%M%S)&lt;br /&gt;
&lt;br /&gt;
mkdir -p $BACKUP_DIR&lt;br /&gt;
&lt;br /&gt;
# Backup database&lt;br /&gt;
docker exec mediawiki-db mysqldump -u root -pyour_root_password my_wiki &amp;gt; $BACKUP_DIR/db_$DATE.sql&lt;br /&gt;
&lt;br /&gt;
# Backup LocalSettings.php&lt;br /&gt;
cp /opt/stacks/mediawiki/LocalSettings.php $BACKUP_DIR/LocalSettings_$DATE.php&lt;br /&gt;
&lt;br /&gt;
# Backup images&lt;br /&gt;
docker run --rm -v 230912_images:/data -v $BACKUP_DIR:/backup alpine tar czf /backup/images_$DATE.tar.gz -C /data .&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Backup completed: $DATE&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Updating MediaWiki&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
# Pull the latest MediaWiki image&lt;br /&gt;
docker pull mediawiki:latest&lt;br /&gt;
&lt;br /&gt;
# Restart with the new image&lt;br /&gt;
cd /opt/stacks/mediawiki&lt;br /&gt;
docker compose down&lt;br /&gt;
docker compose up -d&lt;br /&gt;
&lt;br /&gt;
# Update the database schema&lt;br /&gt;
docker exec -it mediawiki php maintenance/update.php&lt;br /&gt;
&lt;br /&gt;
# Clear the cache&lt;br /&gt;
docker exec -it mediawiki php maintenance/rebuildLocalisationCache.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
You&#039;ve successfully configured advanced features for your MediaWiki installation:&lt;br /&gt;
&lt;br /&gt;
✓ Custom logos and modern Vector 2022 theme&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✓ Email notifications via SMTP (environment-variable-secured credentials)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✓ Multi-level permission system (Anonymous, User, Editor, Sysop)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✓ Private namespace for confidential content&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✓ Additional professional extensions&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✓ File upload capabilities&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✓ Two-factor authentication for administrators&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✓ Enhanced security hardening&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Your MediaWiki installation is now fully configured and production-ready!&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Next Steps ==&lt;br /&gt;
&lt;br /&gt;
Your wiki is now fully configured! You can:&lt;br /&gt;
&lt;br /&gt;
* Create user accounts and assign roles via &#039;&#039;&#039;Special:UserRights&#039;&#039;&#039;&lt;br /&gt;
* Start creating content in the main namespace&lt;br /&gt;
* Create private documentation in the &amp;lt;code&amp;gt;Private:&amp;lt;/code&amp;gt; namespace&lt;br /&gt;
* Customize the main page by editing &#039;&#039;&#039;MediaWiki:Mainpage&#039;&#039;&#039;&lt;br /&gt;
* Explore &#039;&#039;&#039;Special:SpecialPages&#039;&#039;&#039; to discover all available features&lt;br /&gt;
* Set up automatic backups (see Maintenance Tasks above)&lt;br /&gt;
* Configure SSL/HTTPS if not already done&lt;br /&gt;
* Install additional extensions from https://www.mediawiki.org/wiki/Category:Extensions&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;For additional help, visit the official MediaWiki documentation at&#039;&#039;&#039;&#039;&#039; https://www.mediawiki.org/&lt;/div&gt;</summary>
		<author><name>Dani</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.comfac.net/index.php?title=Mediawiki_Additional_Configuration&amp;diff=109</id>
		<title>Mediawiki Additional Configuration</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.comfac.net/index.php?title=Mediawiki_Additional_Configuration&amp;diff=109"/>
		<updated>2026-03-05T00:25:25Z</updated>

		<summary type="html">&lt;p&gt;Dani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MediaWiki Additional Configuration Guide ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;This guide covers advanced configuration options for your MediaWiki installation, including logos, permissions, email, private namespaces, and two-factor authentication.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Prerequisites:&#039;&#039;&#039; Complete the &#039;&#039;&#039;[[MediaWiki Docker Setup Guide]]&#039;&#039;&#039; before proceeding with this configuration.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Advanced Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Part 1: Customizing Your Wiki&#039;s Appearance ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Upload Your Logo Files&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Before configuring logos, you need to upload your logo images to the wiki&#039;s images folder.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step A: Prepare Your Logo Files&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Create logo images in these sizes:&lt;br /&gt;
* &#039;&#039;&#039;Small logo (50x50 pixels):&#039;&#039;&#039; For favicon and small displays - save as &amp;lt;code&amp;gt;yourlogo-50.svg&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;yourlogo-50.png&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Large logo (160x160 pixels):&#039;&#039;&#039; For the main wiki logo - save as &amp;lt;code&amp;gt;yourlogo-160.svg&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;yourlogo-160.png&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; SVG format is recommended because it scales cleanly at any size. PNG is also acceptable.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step B: Copy Logo Files to the Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
First, you need to upload files to the Docker volume:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
# Create a temporary container to access the images volume&lt;br /&gt;
docker run -d --name temp-mediawiki \&lt;br /&gt;
  -v 230912_images:/var/www/html/images \&lt;br /&gt;
  mediawiki sleep 3600&lt;br /&gt;
&lt;br /&gt;
# Copy your logo files into the container&lt;br /&gt;
docker cp ~/Downloads/yourlogo-50.svg temp-mediawiki:/var/www/html/images/&lt;br /&gt;
docker cp ~/Downloads/yourlogo-160.svg temp-mediawiki:/var/www/html/images/&lt;br /&gt;
&lt;br /&gt;
# Fix permissions&lt;br /&gt;
docker exec temp-mediawiki chown 33:33 /var/www/html/images/yourlogo-50.svg&lt;br /&gt;
docker exec temp-mediawiki chown 33:33 /var/www/html/images/yourlogo-160.svg&lt;br /&gt;
&lt;br /&gt;
# Remove the temporary container&lt;br /&gt;
docker stop temp-mediawiki&lt;br /&gt;
docker rm temp-mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #f8f9fa; border-left: 4px solid #3498db; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Replace &amp;lt;code&amp;gt;yourlogo-50.svg&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;yourlogo-160.svg&amp;lt;/code&amp;gt; with your actual filename. Adjust the path &amp;lt;code&amp;gt;~/Downloads/&amp;lt;/code&amp;gt; if your files are saved elsewhere.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Configure Logo and Favicon in LocalSettings.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Open your LocalSettings.php file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /opt/stacks/mediawiki/LocalSettings.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Find the existing &amp;lt;code&amp;gt;$wgLogos&amp;lt;/code&amp;gt; section and replace it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
$wgLogos = [&lt;br /&gt;
	&#039;1x&#039;   =&amp;gt; &amp;quot;$wgResourceBasePath/images/yourlogo-160.svg&amp;quot;,&lt;br /&gt;
	&#039;icon&#039; =&amp;gt; &amp;quot;$wgResourceBasePath/images/yourlogo-50.svg&amp;quot;,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
$wgFavicon = &amp;quot;$wgResourceBasePath/images/yourlogo-50.svg&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #f8f9fa; border-left: 4px solid #3498db; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What this does:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;1x&#039;&amp;lt;/code&amp;gt; sets your main wiki logo (shown in the corner)&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;icon&#039;&amp;lt;/code&amp;gt; sets the smaller icon version&lt;br /&gt;
* &amp;lt;code&amp;gt;$wgFavicon&amp;lt;/code&amp;gt; sets the browser tab icon&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit.&lt;br /&gt;
&lt;br /&gt;
=== Part 2: Customizing the Wiki Skin (Theme) ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Configure the Modern Vector Skin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Open LocalSettings.php and find &amp;lt;code&amp;gt;$wgDefaultSkin&amp;lt;/code&amp;gt;. Replace it with this configuration block:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
# Use the modern Vector 2022 skin by default&lt;br /&gt;
$wgDefaultSkin = &amp;quot;vector-2022&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Make existing users see the new skin too&lt;br /&gt;
$wgVectorDefaultSkinVersionForExistingAccounts = &amp;quot;2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Make the skin work well on mobile devices&lt;br /&gt;
$wgVectorResponsive = true;&lt;br /&gt;
&lt;br /&gt;
# Enable appearance customization options for users&lt;br /&gt;
$wgVectorFeatureFlags = [&lt;br /&gt;
    &#039;VectorAppearance&#039; =&amp;gt; [&lt;br /&gt;
        &#039;logged_in&#039;  =&amp;gt; true,&lt;br /&gt;
        &#039;logged_out&#039; =&amp;gt; true,&lt;br /&gt;
    ],&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #f8f9fa; border-left: 4px solid #3498db; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What this does:&#039;&#039;&#039;&lt;br /&gt;
* Sets the modern Vector skin as default&lt;br /&gt;
* Makes it responsive for mobile/tablet viewing&lt;br /&gt;
* Allows users to customize appearance settings&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit.&lt;br /&gt;
&lt;br /&gt;
=== Part 3: Setting Up Email and SMTP ===&lt;br /&gt;
&lt;br /&gt;
This allows your wiki to send password reset emails, notifications, and user-to-user messages.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Configure Email Settings&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; This configuration uses environment variables to keep sensitive credentials out of LocalSettings.php. You will need to configure both your &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; file and &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step A: Set Up the .env File&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Create or edit your &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; file at &amp;lt;code&amp;gt;/opt/stacks/mediawiki/.env&amp;lt;/code&amp;gt; and add your SMTP credentials:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
# SMTP Configuration&lt;br /&gt;
SMTP_HOST=mail.comfac-it.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=your-email@comfac-it.com&lt;br /&gt;
SMTP_PASS=your_smtp_password_here&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Warning:&#039;&#039;&#039; Never commit your &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; file to version control. Add it to &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step B: Pass Environment Variables in docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ensure your &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; passes the SMTP variables into the MediaWiki container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  mediawiki:&lt;br /&gt;
    image: mediawiki&lt;br /&gt;
    container_name: mediawiki&lt;br /&gt;
    restart: always&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;${MEDIAWIKI_PORT}:80&amp;quot;&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - database&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./230912_images:/var/www/html/images&lt;br /&gt;
      - /opt/stacks/mediawiki/extensions:/var/www/html/extensions&lt;br /&gt;
      - /opt/stacks/mediawiki/LocalSettings.php:/var/www/html/LocalSettings.php:ro&lt;br /&gt;
    environment:&lt;br /&gt;
      - SMTP_HOST=${SMTP_HOST}&lt;br /&gt;
      - SMTP_PORT=${SMTP_PORT}&lt;br /&gt;
      - SMTP_USER=${SMTP_USER}&lt;br /&gt;
      - SMTP_PASS=${SMTP_PASS}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step C: Add Email Configuration to LocalSettings.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Open LocalSettings.php and add the following section after the extensions block:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*-------------------------------------------&lt;br /&gt;
 EMAIL &amp;amp; SMTP CONFIGURATION&lt;br /&gt;
-------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
# Enable email features&lt;br /&gt;
$wgEnableEmail      = true;&lt;br /&gt;
$wgEnableUserEmail  = true;&lt;br /&gt;
$wgEmailAuthentication = true;&lt;br /&gt;
&lt;br /&gt;
# Enable email notifications for talk pages and watchlist&lt;br /&gt;
$wgEnotifUserTalk  = true;&lt;br /&gt;
$wgEnotifWatchlist = true;&lt;br /&gt;
&lt;br /&gt;
# Set your wiki&#039;s email addresses&lt;br /&gt;
$wgEmergencyContact = &amp;quot;your-email@comfac-it.com&amp;quot;;&lt;br /&gt;
$wgPasswordSender   = &amp;quot;your-email@comfac-it.com&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# SMTP configuration — credentials loaded from environment variables&lt;br /&gt;
$wgSMTP = [&lt;br /&gt;
    &#039;host&#039;     =&amp;gt; getenv(&#039;SMTP_HOST&#039;),   # e.g. mail.comfac-it.com&lt;br /&gt;
    &#039;IDHost&#039;   =&amp;gt; &#039;comfac-it.com&#039;,        # Your mail domain&lt;br /&gt;
    &#039;port&#039;     =&amp;gt; getenv(&#039;SMTP_PORT&#039;),   # 587 for TLS&lt;br /&gt;
    &#039;auth&#039;     =&amp;gt; true,&lt;br /&gt;
    &#039;username&#039; =&amp;gt; getenv(&#039;SMTP_USER&#039;),   # Your SMTP username&lt;br /&gt;
    &#039;password&#039; =&amp;gt; getenv(&#039;SMTP_PASS&#039;),   # Your SMTP password&lt;br /&gt;
    &#039;secure&#039;   =&amp;gt; &#039;tls&#039;&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
# Additional email settings&lt;br /&gt;
$wgUserEmailUseReplyTo = true;&lt;br /&gt;
$wgAllowHTMLEmail      = true;&lt;br /&gt;
&lt;br /&gt;
# Enable password reset via email&lt;br /&gt;
$wgPasswordResetRoutes = [&lt;br /&gt;
    &#039;username&#039; =&amp;gt; true,&lt;br /&gt;
    &#039;email&#039;    =&amp;gt; true,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
# Password reset links expire after 24 hours&lt;br /&gt;
$wgNewPasswordExpiry = 86400;&lt;br /&gt;
&lt;br /&gt;
# ================================&lt;br /&gt;
# ALLOWED EMAIL DOMAINS&lt;br /&gt;
# ================================&lt;br /&gt;
&lt;br /&gt;
# Users can register/use these email domains&lt;br /&gt;
$wgAllowedEmailDomains = [&lt;br /&gt;
    &#039;gmail.com&#039;,&lt;br /&gt;
    &#039;comfac.net&#039;,&lt;br /&gt;
    &#039;comfac-it.com&#039;,&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #f8f9fa; border-left: 4px solid #3498db; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What this does:&#039;&#039;&#039;&lt;br /&gt;
* Uses &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt; to read SMTP credentials from Docker environment variables at runtime&lt;br /&gt;
* Keeps passwords out of &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and version control&lt;br /&gt;
* &amp;lt;code&amp;gt;IDHost&amp;lt;/code&amp;gt; is set to your mail domain (&amp;lt;code&amp;gt;comfac-it.com&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Restricts user email registration to approved domains only&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit.&lt;br /&gt;
&lt;br /&gt;
=== Part 4: Permission System (Who Can Do What) ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Create a Clean Permission Structure&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Open LocalSettings.php and replace the permissions section with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*-------------------------------------------&lt;br /&gt;
CLEAN PERMISSION SYSTEM&lt;br /&gt;
----------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
# Anonymous users&lt;br /&gt;
$wgGroupPermissions[&#039;*&#039;][&#039;read&#039;]          = true;&lt;br /&gt;
$wgGroupPermissions[&#039;*&#039;][&#039;edit&#039;]          = false;&lt;br /&gt;
$wgGroupPermissions[&#039;*&#039;][&#039;createaccount&#039;] = false;&lt;br /&gt;
&lt;br /&gt;
# Allow bureaucrats/admins to create accounts&lt;br /&gt;
$wgGroupPermissions[&#039;bureaucrat&#039;][&#039;createaccount&#039;] = true;&lt;br /&gt;
&lt;br /&gt;
# Logged-in users (view only)&lt;br /&gt;
$wgGroupPermissions[&#039;user&#039;][&#039;read&#039;] = true;&lt;br /&gt;
$wgGroupPermissions[&#039;user&#039;][&#039;edit&#039;] = false;&lt;br /&gt;
&lt;br /&gt;
# Editor group&lt;br /&gt;
$wgGroupPermissions[&#039;editor&#039;][&#039;read&#039;]     = true;&lt;br /&gt;
$wgGroupPermissions[&#039;editor&#039;][&#039;edit&#039;]     = true;&lt;br /&gt;
$wgGroupPermissions[&#039;editor&#039;][&#039;upload&#039;]   = true;&lt;br /&gt;
$wgGroupPermissions[&#039;editor&#039;][&#039;reupload&#039;] = true;&lt;br /&gt;
&lt;br /&gt;
# Sysop (admin)&lt;br /&gt;
$wgGroupPermissions[&#039;sysop&#039;][&#039;read&#039;]          = true;&lt;br /&gt;
$wgGroupPermissions[&#039;sysop&#039;][&#039;edit&#039;]          = true;&lt;br /&gt;
$wgGroupPermissions[&#039;sysop&#039;][&#039;protect&#039;]       = true;&lt;br /&gt;
$wgGroupPermissions[&#039;sysop&#039;][&#039;userrights&#039;]    = true;&lt;br /&gt;
$wgGroupPermissions[&#039;sysop&#039;][&#039;createaccount&#039;] = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #f8f9fa; border-left: 4px solid #3498db; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What this permission structure means:&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Anonymous visitors:&#039;&#039;&#039; Can only read pages&lt;br /&gt;
* &#039;&#039;&#039;Logged-in users:&#039;&#039;&#039; Can only read pages (no editing)&lt;br /&gt;
* &#039;&#039;&#039;Editors:&#039;&#039;&#039; Can read, edit, and upload files (assigned by admins)&lt;br /&gt;
* &#039;&#039;&#039;Sysops (Admins):&#039;&#039;&#039; Full control over the wiki&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;How to assign the Editor role:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
After restarting your wiki, log in as an admin and go to:&lt;br /&gt;
* &#039;&#039;&#039;Special:UserRights&#039;&#039;&#039; (or click &#039;&#039;&#039;Special Pages&#039;&#039;&#039; → &#039;&#039;&#039;User rights management&#039;&#039;&#039;)&lt;br /&gt;
* Enter a username&lt;br /&gt;
* Check the &#039;&#039;&#039;editor&#039;&#039;&#039; box&lt;br /&gt;
* Click &#039;&#039;&#039;Save user groups&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit.&lt;br /&gt;
&lt;br /&gt;
=== Part 5: Creating a Private Namespace ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6. Configure the Private Namespace&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Open LocalSettings.php and add this section after your extensions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*-------------------------------------------&lt;br /&gt;
PRIVATE NAMESPACE (RESTRICTED ACCESS)&lt;br /&gt;
----------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
# Load the Lockdown extension&lt;br /&gt;
wfLoadExtension( &#039;Lockdown&#039; );&lt;br /&gt;
&lt;br /&gt;
# Define namespace IDs (must be unique)&lt;br /&gt;
define(&amp;quot;NS_PRIVATE&amp;quot;,      3000);&lt;br /&gt;
define(&amp;quot;NS_PRIVATE_TALK&amp;quot;, 3001);&lt;br /&gt;
&lt;br /&gt;
# Register the namespace names&lt;br /&gt;
$wgExtraNamespaces[NS_PRIVATE]      = &amp;quot;Private&amp;quot;;&lt;br /&gt;
$wgExtraNamespaces[NS_PRIVATE_TALK] = &amp;quot;Private_talk&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Only logged-in users, editors, and admins can READ&lt;br /&gt;
$wgNamespacePermissionLockdown[NS_PRIVATE][&#039;read&#039;] = [&#039;user&#039;, &#039;editor&#039;, &#039;sysop&#039;];&lt;br /&gt;
&lt;br /&gt;
# Only editors and admins can EDIT&lt;br /&gt;
$wgNamespacePermissionLockdown[NS_PRIVATE][&#039;edit&#039;] = [&#039;editor&#039;, &#039;sysop&#039;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #f8f9fa; border-left: 4px solid #3498db; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;How to use the Private namespace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To create a private page, use this format: &amp;lt;code&amp;gt;Private:YourPageName&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;Private:Company_Policies&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anonymous users and non-logged-in visitors will get an access denied message.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit.&lt;br /&gt;
&lt;br /&gt;
=== Part 6: Additional Recommended Extensions ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7. Enable Additional Extensions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Open LocalSettings.php and expand your extensions section:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*-------------------------------------------&lt;br /&gt;
ADDITIONAL RECOMMENDED EXTENSIONS&lt;br /&gt;
----------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
# Content organization&lt;br /&gt;
wfLoadExtension( &#039;CategoryTree&#039; );&lt;br /&gt;
wfLoadExtension( &#039;ImageMap&#039; );&lt;br /&gt;
&lt;br /&gt;
# User experience&lt;br /&gt;
wfLoadExtension( &#039;Echo&#039; );&lt;br /&gt;
wfLoadExtension( &#039;Thanks&#039; );&lt;br /&gt;
wfLoadExtension( &#039;DiscussionTools&#039; );&lt;br /&gt;
&lt;br /&gt;
# Content features&lt;br /&gt;
wfLoadExtension( &#039;TemplateData&#039; );&lt;br /&gt;
wfLoadExtension( &#039;TemplateStyles&#039; );&lt;br /&gt;
wfLoadExtension( &#039;Poem&#039; );&lt;br /&gt;
&lt;br /&gt;
# File handling&lt;br /&gt;
wfLoadExtension( &#039;PdfHandler&#039; );&lt;br /&gt;
wfLoadExtension( &#039;MultimediaViewer&#039; );&lt;br /&gt;
&lt;br /&gt;
# Moderation &amp;amp; security&lt;br /&gt;
wfLoadExtension( &#039;ConfirmEdit&#039; );&lt;br /&gt;
wfLoadExtension( &#039;SpamBlacklist&#039; );&lt;br /&gt;
wfLoadExtension( &#039;TitleBlacklist&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CiteThisPage&#039; );&lt;br /&gt;
wfLoadExtension( &#039;AbuseFilter&#039; );&lt;br /&gt;
wfLoadExtension( &#039;LoginNotify&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you get an error about a missing extension after restarting, comment out that line by adding &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; at the beginning.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit.&lt;br /&gt;
&lt;br /&gt;
=== Part 7: Enable File Uploads ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8. Configure Upload Settings&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Open LocalSettings.php and update the upload settings:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
# Enable file uploads&lt;br /&gt;
$wgEnableUploads  = true;&lt;br /&gt;
$wgUseImageMagick = true;&lt;br /&gt;
$wgImageMagickConvertCommand = &amp;quot;/usr/bin/convert&amp;quot;;&lt;br /&gt;
$wgUseInstantCommons = false;&lt;br /&gt;
&lt;br /&gt;
# Allow these file types to be uploaded&lt;br /&gt;
$wgFileExtensions = [&#039;png&#039;,&#039;gif&#039;,&#039;jpg&#039;,&#039;jpeg&#039;,&#039;webp&#039;,&#039;svg&#039;,&#039;pdf&#039;,&#039;doc&#039;,&#039;docx&#039;,&#039;xls&#039;,&#039;xlsx&#039;];&lt;br /&gt;
&lt;br /&gt;
# Allow SVG files with embedded titles&lt;br /&gt;
$wgAllowTitleInSVG = true;&lt;br /&gt;
$wgSVGConverter    = &#039;ImageMagick&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit.&lt;br /&gt;
&lt;br /&gt;
=== Part 8: Two-Factor Authentication for Administrators ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9. Install the OATHAuth Extension&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
First, check if the extension already exists:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
ls /opt/stacks/mediawiki/extensions/ | grep -i oath&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t see &amp;lt;code&amp;gt;OATHAuth&amp;lt;/code&amp;gt;, install it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/stacks/mediawiki/extensions&lt;br /&gt;
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/OATHAuth.git&lt;br /&gt;
sudo chown -R 33:33 OATHAuth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10. Configure OATHAuth for Admins Only&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Open LocalSettings.php and add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*-------------------------------------------&lt;br /&gt;
TWO-FACTOR AUTHENTICATION (ADMINS ONLY)&lt;br /&gt;
----------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
# Load the OATHAuth extension&lt;br /&gt;
wfLoadExtension( &#039;OATHAuth&#039; );&lt;br /&gt;
&lt;br /&gt;
# REQUIRE 2FA for administrators (sysops) only&lt;br /&gt;
$wgOATHRequiredForGroups = [&#039;sysop&#039;];&lt;br /&gt;
&lt;br /&gt;
# Optional: Also require 2FA for bureaucrats&lt;br /&gt;
# $wgOATHRequiredForGroups = [&#039;sysop&#039;, &#039;bureaucrat&#039;];&lt;br /&gt;
&lt;br /&gt;
# Allow TOTP - works with Google Authenticator, Authy, etc.&lt;br /&gt;
$wgOATHAuthModules = [&lt;br /&gt;
    &#039;totp&#039; =&amp;gt; [&lt;br /&gt;
        &#039;class&#039; =&amp;gt; &#039;MediaWiki\\Extension\\OATHAuth\\Module\\TOTP&#039;,&lt;br /&gt;
    ],&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #f8f9fa; border-left: 4px solid #3498db; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What this does:&#039;&#039;&#039;&lt;br /&gt;
* Requires 2FA only for users in the &amp;lt;code&amp;gt;sysop&amp;lt;/code&amp;gt; (administrator) group&lt;br /&gt;
* Regular users and editors do NOT need 2FA&lt;br /&gt;
* Uses TOTP method (compatible with most authenticator apps)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit.&lt;br /&gt;
&lt;br /&gt;
=== Part 9: Apply All Changes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11. Update the Database and Restart&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
# Update database to recognize new extensions and namespaces&lt;br /&gt;
docker exec -it mediawiki php maintenance/update.php --quick&lt;br /&gt;
&lt;br /&gt;
# Restart MediaWiki to apply all changes&lt;br /&gt;
cd /opt/stacks/mediawiki&lt;br /&gt;
docker compose restart&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait about 30 seconds for the containers to fully restart.&lt;br /&gt;
&lt;br /&gt;
== Setting Up Two-Factor Authentication ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12. Set Up 2FA for Administrator Accounts&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step A: Install an Authenticator App (If Not Already Installed)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
On your phone or tablet, install one of these apps:&lt;br /&gt;
* &#039;&#039;&#039;Google Authenticator&#039;&#039;&#039; (iOS/Android)&lt;br /&gt;
* &#039;&#039;&#039;Microsoft Authenticator&#039;&#039;&#039; (iOS/Android)&lt;br /&gt;
* &#039;&#039;&#039;Authy&#039;&#039;&#039; (iOS/Android)&lt;br /&gt;
* &#039;&#039;&#039;1Password&#039;&#039;&#039; (if you use a password manager)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step B: Enable 2FA on Your Admin Account&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Log in to MediaWiki as an administrator&lt;br /&gt;
# Click on your username in the top-right corner&lt;br /&gt;
# Click &#039;&#039;&#039;Preferences&#039;&#039;&#039;&lt;br /&gt;
# Click the &#039;&#039;&#039;Two-factor authentication&#039;&#039;&#039; tab (or &#039;&#039;&#039;OATH&#039;&#039;&#039; tab)&lt;br /&gt;
# Click &#039;&#039;&#039;Manage&#039;&#039;&#039; and &#039;&#039;&#039;Add an authenticator app&#039;&#039;&#039;&lt;br /&gt;
# You&#039;ll see a QR code on the screen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step C: Scan the QR Code&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Open your authenticator app on your phone&lt;br /&gt;
# Tap the &amp;quot;+&amp;quot; or &amp;quot;Add account&amp;quot; button&lt;br /&gt;
# Scan the QR code shown on your screen&lt;br /&gt;
# The app will add an entry like &amp;quot;MediaWiki - YourUsername&amp;quot;&lt;br /&gt;
# You&#039;ll see a 6-digit code that changes every 30 seconds&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step D: Verify the Setup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Enter the 6-digit code from your authenticator app into the MediaWiki form&lt;br /&gt;
# You&#039;ll also see &#039;&#039;&#039;scratch codes&#039;&#039;&#039; (recovery codes) - SAVE THESE SAFELY!&lt;br /&gt;
# Click &#039;&#039;&#039;Confirm&#039;&#039;&#039; or &#039;&#039;&#039;Enable&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;CRITICAL - Save Your Recovery Codes!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Write down or securely save your recovery codes. If you lose access to your phone, these codes are the ONLY way to regain access to your account. Each recovery code can only be used once.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13. Test Two-Factor Authentication&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Log out of your MediaWiki account&lt;br /&gt;
# Log back in with your username and password&lt;br /&gt;
# You&#039;ll now see a screen asking for a &#039;&#039;&#039;Two-factor authentication token&#039;&#039;&#039;&lt;br /&gt;
# Open your authenticator app and enter the current 6-digit code&lt;br /&gt;
# Click &#039;&#039;&#039;Continue&#039;&#039;&#039; or &#039;&#039;&#039;Log in&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Verification Checklist ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;14. Test Your Configuration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Logo &amp;amp; Skin&#039;&#039;&#039;&lt;br /&gt;
* Your custom logo appears in the top-left corner and as the favicon&lt;br /&gt;
* The modern Vector 2022 skin is active&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Permissions&#039;&#039;&#039;&lt;br /&gt;
# Log out and confirm you can only read pages&lt;br /&gt;
# Log in as a regular user and confirm you cannot edit&lt;br /&gt;
# Log in as admin and assign the &amp;quot;editor&amp;quot; role via &#039;&#039;&#039;Special:UserRights&#039;&#039;&#039;&lt;br /&gt;
# Confirm the editor can now edit pages&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Email&#039;&#039;&#039;&lt;br /&gt;
# Click &amp;quot;Forgot password?&amp;quot; on the login page&lt;br /&gt;
# Enter your username or email and verify you receive the reset email&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Private Namespace&#039;&#039;&#039;&lt;br /&gt;
# Create a page like &amp;lt;code&amp;gt;Private:Test&amp;lt;/code&amp;gt;&lt;br /&gt;
# Log out and confirm anonymous users cannot access it&lt;br /&gt;
# Log in as a regular user and confirm you can view it&lt;br /&gt;
# Check that only editors and admins can edit it&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File Uploads&#039;&#039;&#039;&lt;br /&gt;
# Log in as an editor or admin&lt;br /&gt;
# Go to &#039;&#039;&#039;Special:Upload&#039;&#039;&#039;&lt;br /&gt;
# Try uploading an image file and verify it appears on the page&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Two-Factor Authentication&#039;&#039;&#039;&lt;br /&gt;
# Verify all admins have set up 2FA&lt;br /&gt;
# Test login process with 2FA code&lt;br /&gt;
# Verify recovery codes are saved securely&lt;br /&gt;
&lt;br /&gt;
== Managing Two-Factor Authentication ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If an Admin Loses Access to Their Phone:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# At the 2FA prompt, enter one of the saved recovery codes&lt;br /&gt;
# Once logged in, go to &#039;&#039;&#039;Preferences&#039;&#039;&#039; → &#039;&#039;&#039;Two-factor authentication&#039;&#039;&#039;&lt;br /&gt;
# Disable 2FA, then re-enable it with a new QR code&lt;br /&gt;
# Generate new recovery codes&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If Recovery Codes Are Also Lost:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Another administrator needs to disable 2FA for that account:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
# Run this command to disable 2FA for a specific user&lt;br /&gt;
docker exec -it mediawiki php maintenance/run.php OATHAuth:deleteUser --user=&amp;quot;USERNAME&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;code&amp;gt;USERNAME&amp;lt;/code&amp;gt; with the actual username.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 15px 0; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Security Tip:&#039;&#039;&#039; Create at least two administrator accounts so one admin can help recover another&#039;s account if needed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Email not sending?&#039;&#039;&#039;&lt;br /&gt;
* Verify SMTP credentials are correct in your &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; file&lt;br /&gt;
* Check &amp;lt;code&amp;gt;SMTP_HOST&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SMTP_PORT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SMTP_USER&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SMTP_PASS&amp;lt;/code&amp;gt; values&lt;br /&gt;
* Ensure environment variables are passed correctly in &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
* Check container logs: &amp;lt;code&amp;gt;docker compose logs -f mediawiki&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Logo not appearing?&#039;&#039;&#039;&lt;br /&gt;
* Verify files were copied correctly: &amp;lt;code&amp;gt;docker exec mediawiki ls -la /var/www/html/images/&amp;lt;/code&amp;gt;&lt;br /&gt;
* Hard refresh your browser: &amp;lt;code&amp;gt;Ctrl + Shift + R&amp;lt;/code&amp;gt; (Windows/Linux) or &amp;lt;code&amp;gt;Cmd + Shift + R&amp;lt;/code&amp;gt; (Mac)&lt;br /&gt;
* Check the exact filenames in LocalSettings.php match the uploaded files&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Private namespace not working?&#039;&#039;&#039;&lt;br /&gt;
* Ensure Lockdown extension is installed: &amp;lt;code&amp;gt;ls /opt/stacks/mediawiki/extensions/Lockdown&amp;lt;/code&amp;gt;&lt;br /&gt;
* Run database update: &amp;lt;code&amp;gt;docker exec -it mediawiki php maintenance/update.php --quick&amp;lt;/code&amp;gt;&lt;br /&gt;
* Restart containers: &amp;lt;code&amp;gt;docker compose restart&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2FA prompt not appearing for admins:&#039;&#039;&#039;&lt;br /&gt;
* Verify the OATHAuth configuration in LocalSettings.php&lt;br /&gt;
* Run: &amp;lt;code&amp;gt;docker exec -it mediawiki php maintenance/update.php&amp;lt;/code&amp;gt;&lt;br /&gt;
* Restart containers and clear your browser cache&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Authenticator codes not working:&#039;&#039;&#039;&lt;br /&gt;
* Verify your phone&#039;s time is set to automatic (not manual)&lt;br /&gt;
* Time synchronization is critical for TOTP to work&lt;br /&gt;
* Try syncing time in your authenticator app settings&lt;br /&gt;
&lt;br /&gt;
== Maintenance Tasks ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Regular Backups&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Save as /opt/scripts/backup-mediawiki.sh&lt;br /&gt;
&lt;br /&gt;
BACKUP_DIR=&amp;quot;/opt/backups/mediawiki&amp;quot;&lt;br /&gt;
DATE=$(date +%Y%m%d_%H%M%S)&lt;br /&gt;
&lt;br /&gt;
mkdir -p $BACKUP_DIR&lt;br /&gt;
&lt;br /&gt;
# Backup database&lt;br /&gt;
docker exec mediawiki-db mysqldump -u root -pyour_root_password my_wiki &amp;gt; $BACKUP_DIR/db_$DATE.sql&lt;br /&gt;
&lt;br /&gt;
# Backup LocalSettings.php&lt;br /&gt;
cp /opt/stacks/mediawiki/LocalSettings.php $BACKUP_DIR/LocalSettings_$DATE.php&lt;br /&gt;
&lt;br /&gt;
# Backup images&lt;br /&gt;
docker run --rm -v 230912_images:/data -v $BACKUP_DIR:/backup alpine tar czf /backup/images_$DATE.tar.gz -C /data .&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Backup completed: $DATE&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Updating MediaWiki&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;font-size: 85%;&amp;quot;&amp;gt;&lt;br /&gt;
# Pull the latest MediaWiki image&lt;br /&gt;
docker pull mediawiki:latest&lt;br /&gt;
&lt;br /&gt;
# Restart with the new image&lt;br /&gt;
cd /opt/stacks/mediawiki&lt;br /&gt;
docker compose down&lt;br /&gt;
docker compose up -d&lt;br /&gt;
&lt;br /&gt;
# Update the database schema&lt;br /&gt;
docker exec -it mediawiki php maintenance/update.php&lt;br /&gt;
&lt;br /&gt;
# Clear the cache&lt;br /&gt;
docker exec -it mediawiki php maintenance/rebuildLocalisationCache.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
You&#039;ve successfully configured advanced features for your MediaWiki installation:&lt;br /&gt;
&lt;br /&gt;
✓ Custom logos and modern Vector 2022 theme&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✓ Email notifications via SMTP (environment-variable-secured credentials)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✓ Multi-level permission system (Anonymous, User, Editor, Sysop)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✓ Private namespace for confidential content&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✓ Additional professional extensions&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✓ File upload capabilities&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✓ Two-factor authentication for administrators&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✓ Enhanced security hardening&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Your MediaWiki installation is now fully configured and production-ready!&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Next Steps ==&lt;br /&gt;
&lt;br /&gt;
Your wiki is now fully configured! You can:&lt;br /&gt;
&lt;br /&gt;
* Create user accounts and assign roles via &#039;&#039;&#039;Special:UserRights&#039;&#039;&#039;&lt;br /&gt;
* Start creating content in the main namespace&lt;br /&gt;
* Create private documentation in the &amp;lt;code&amp;gt;Private:&amp;lt;/code&amp;gt; namespace&lt;br /&gt;
* Customize the main page by editing &#039;&#039;&#039;MediaWiki:Mainpage&#039;&#039;&#039;&lt;br /&gt;
* Explore &#039;&#039;&#039;Special:SpecialPages&#039;&#039;&#039; to discover all available features&lt;br /&gt;
* Set up automatic backups (see Maintenance Tasks above)&lt;br /&gt;
* Configure SSL/HTTPS if not already done&lt;br /&gt;
* Install additional extensions from https://www.mediawiki.org/wiki/Category:Extensions&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;For additional help, visit the official MediaWiki documentation at&#039;&#039;&#039;&#039;&#039; https://www.mediawiki.org/&lt;/div&gt;</summary>
		<author><name>Dani</name></author>
	</entry>
</feed>