User:MeowyCats2/Install CreateWiki and ManageWiki on your wiki
Note: This memo is an slightly modified version of the memo originally made by Waki285 from Miraheze Meta at mh:meta:User:Waki285/Install CreateWiki and ManageWiki on your wiki to make it work with newer CreateWiki versions.
Note: This is less of a "tutorial" and more of a "memo" on the means by which I have been successful. Disclaimer: I will not be liable for any damages caused by this memo.
Note: This was done for production, but could also be used for development as an extension development.
Prerequisites
This is the environment in which I have succeeded. I am not sure if I would be successful in any other environment than this.
- VPS with free IP port open and sudo privileges (you may have to sudo the commands if you're not root)
- Ubuntu Server 22.02
- Nginx
- MySQL or MariaDB
- Cloudflare (optional)
- Domain with ability to add A wildcard record
Procedure
- Install packages such as PHP and MySQL, which are required for a normal MediaWiki installation. We will also purchase a domain and connect it to Cloudflare.
- Extract MediaWiki to
/var/www/mediawiki
. - Enter MySQL and create a database named "testwiki".
- Write the following in
/etc/nginx/conf.d/mediawiki.conf
(the file name can be anything, but it should end with .conf), save it, and reload nginx withsystemctl reload nginx
. - Remember to open port 80 if you are using a firewall.
- Go to Cloudflare if you're using it, or otherwise your domain registry, and add the following to your DNS.
- Type:
A
Name:*
IPv4 address: Your VPS IP Proxy status:Proxied
(if using Cloudflare) - Go to the Cloudflare SSL/TLS settings and set the SSL/TLS encryption mode to Flexible. (if using Cloudflare, otherwise set up SSL, maybe with Let's Encrypt)
- At this point, go to test.[yourdomain.tld] and you should see "LocalSettings.php not found. Please set up the wiki first."
- Click "set up the wiki", set up the wiki as usual, but install the extensions AbuseFilter, Interwiki, Echo, and WikiEditor. DON'T INSTALL MinervaNeue. Set the database name to "testwiki" created earlier and leave the table prefix blank.
- After setup is complete and the downloaded LocalSettings.php is in place, verify that MediaWiki starts properly.
- Install mw:Extension:AntiSpoof. Follow the guide on the MediaWiki Extension page.
- Install mw:Extension:CheckUser. Follow the guide on the MediaWiki Extension page.
- mw:Extension:CentralAuth.
- Download and extract.
- Enter MySQL and create a database named
centralauth
. - Put this to your LocalSettings.
- Run
php maintenance/run.php sql --wikidb centralauth extensions/CentralAuth/schema/mysql/tables-generated.sql
- Run
php maintenance/run.php sql --wikidb centralauth extensions/AntiSpoof/sql/mysql/tables-generated.sql
- Run
php maintenance/run.php CentralAuth:migratePass0.php
- Run
php maintenance/run.php CentralAuth:migratePass1.php
- Have a cup of coffee.
- Install mw:Extension:CreateWiki.
- Download and extract.
- Enter MySQL and create a database named
wikidb
. - Put this to your LocalSettings.
- Make
cw_cache
directory and give 777 permission. - Put
$wgCreateWikiCacheDirectory = 'cw_cache';
to your LocalSettings. - Run these commands.
- Remove # from
#wfLoadExtension( 'CreateWiki' );
. - Create
SetupCreateWiki.php
and paste this, and change wiki_url and database password. Note: This script is copied and edited by https://github.com/miraheze/ci-scripts/blob/master/mediawiki/globals/setup-CreateWiki.php - Insert
require_once "$IP/SetupCreateWiki.php";
TOP of LocalSettings.php (below<?php
) - Visit tets.yourdomain.tld. You will get an MediaWiki error message. Ignore it and check if TestWiki exists in wikidb.cw_wikis using e.g. phpMyAdmin.
- Remove
require_once "$IP/SetupCreateWiki.php";
.
- Get MirahezeFunctions.php from https://github.com/miraheze/mw-config/blob/master/initialise/MirahezeFunctions.php and paste it to /var/www/mediawiki/MirahezeFunctions.php
- Modify
MirahezeFunctions.php
. Please changedefault
. Not sure if you need to removebeta
on all of the following. I did not remove it. - Change ALLOWED_DOMAINS and DEFAULT_SERVER to yourdomain.tld
- Change CACHE_DIRECTORY to /var/www/mediawiki/cw_cache
- Change CENTRAL_DATABASE to testwiki
- Change GLOBAL_DATABASE to wikidb
- Change MEDIAWIKI_DIRECTORY to /var/www/mediawiki/
- Change path to correct path for
LocalSettings.php
,ManageWikiExtensions.php
,ManageWikiNamespaces.php
,ManageWikiSettings.php
and extensions(skins) folder path. For Example: '/../LocalSettings.php' → '/LocalSettings.php', '/../ManageWikiExtensions.php' → '/ManageWikiExtensions.php',self::MEDIAWIKI_DIRECTORY . $this->version . '/extensions/*/extension*.json'
→self::MEDIAWIKI_DIRECTORY . '/extensions/*/extension*.json'
- Add this to LocalSettings. Put BEFORE loading extensions
- Add this to LocalSettings.php Put JUST UNDER
$wi = new MirahezeFunctions();
. Remember to change yourdomain.tld - Remove $wgServer, $wgSitename, $wgLanguageCode, $wgLocaltimezone, $wgLogos, $wgDBname definition.
- Kick cache through
rm -rf cw_cache/*
- Run update script with
php maintenance/run update --wiki testwiki
. - Make sure you can access the wiki without error.
- Have a cup of coffee.
- Get ManageWikiExtensions.php and place /var/www/mediawiki/ManageWikiExtensions.php from https://github.com/miraheze/mw-config/blob/master/ManageWikiExtensions.php .
- Get ManageWikiNamespaces.php and place /var/www/mediawiki/ManageWikiNamespaces.php from https://github.com/miraheze/mw-config/blob/master/ManageWikiNamespaces.php .
- Get ManageWikiNamespaces.php and place /var/www/mediawiki/ManageWikiSettings.php from https://github.com/miraheze/mw-config/blob/master/ManageWikiSettings.php .
- Put
require_once "$IP/ManageWikiExtensions.php";
to LocalSettings. Put under $wgConf->settings definition. - Put this to LocalSettings. Put under ManageWikiExtensions.php loading.
- Install mw:Extension:ManageWiki.
- Download and extract.
- Put
$wgManageWiki = ['cdb' => false, 'core' => true, 'extensions' => true, 'namespaces' => true, 'permissions' => true, 'settings' => true];
to LocalSettings. Put JUST ABOVErequire_once "$IP/MirahezeFunctions.php";
. - Run these commands.
- Put
wfLoadExtension( 'ManageWiki' );
to LocalSettings. Put ABOVErequire_once "$IP/MirahezeFunctions.php";
- Move
wfLoadExtension( 'CreateWiki' );
to abovewfLoadExtension( 'ManageWiki' );
. - Move all wfLoadExtension and wfLoadSkin to above
wfLoadExtension( 'CreateWiki' );
. - Run update script with
php maintenance/run update --wiki testwiki
. - Have a cup of coffee.
- Put this to LocalSettings. Put BELOW
extract($globals);
. - Log in to the wiki using the account you used during installation.
- Put
$wgGroupPermissions['bureaucrat']['createwiki'] = true;
to LocalSettings. Put very bottom. - Put
$wgGroupPermissions['*']['createaccount'] = true;
to LocalSettings. Put very bottom. - Create new account for enabling CentralAuth. (don't switch account)
- Go to Special:CreateWiki, Database name
metawiki
, Requester the account you just created, Sitename MetaWiki. Create wiki. - Wait a minute, go to meta.yourdomain.tld and verify that the site exists.
- Verify that ManageWiki is working properly and that installation of extensions and assignment of permissions is functional.
- Congratulations!
- Change wgCreateWikiGlobalWiki to metawiki (LocalSettings)
- Change CENTRAL_DATABASE to metawiki (MirahezeFunctions)
- Run
php maintenance/run CreateWiki:deleteWiki --wiki testwiki --deletewiki testwiki --delete
to delete testwiki. (The TestWiki at this point has a lot of bugs) - Enter MySQL and Drop database testwiki.
- Remove this from LocalSettings.php.
- Run the below in MySQL as the wiki may not be fully deleted.
- ALL DONE!
server {
listen 80;
listen [::]:80;
server_name .yourdomain.tld; # Make sure to insert '.' first to your domain
root /var/www/mediawiki;
index index.php index.html index.htm;
location / {
rewrite ^/$ /wiki/ permanent;
}
location /wiki/ {
rewrite ^/wiki/([^\?]*) /index.php?title=$1&$args last;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # Make sure to change it to your PHP version
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ ^/cw_cache/ {
deny all;
}
error_log /var/log/nginx/mediawiki_error.log;
access_log /var/log/nginx/mediawiki_access.log;
}
wfLoadExtension( 'CentralAuth' );
$wgCentralAuthDatabase = 'centralauth';
#wfLoadExtension( 'CreateWiki' );
$wgCreateWikiDatabase = 'wikidb';
php maintenance/run sql --wikidb wikidb extensions/CreateWiki/sql/cw_wikis.sql
php maintenance/run sql --wikidb wikidb extensions/CreateWiki/sql/cw_comments.sql
php maintenance/run sql --wikidb wikidb extensions/CreateWiki/sql/cw_requests.sql
<?php
# Protect against web entry
if ( !defined( 'MEDIAWIKI' ) ) {
exit;
}
use MediaWiki\MediaWikiServices;
use Miraheze\CreateWiki\WikiInitialize;
use Wikimedia\Rdbms\DBQueryError;
$wgWikimediaJenkinsCI = true;
define( 'CW_DB', 'wikidb' );
require_once "$IP/extensions/CreateWiki/includes/WikiInitialize.php";
$wgHooks['MediaWikiServices'][] = 'insertWiki';
function insertWiki( MediaWikiServices $services ) {
wfLoadConfiguration();
try {
if ( getenv( 'WIKI_CREATION_SQL_EXECUTED' ) ) {
return;
}
$db = wfInitDBConnection();
$db->selectDomain( 'wikidb' );
$db->newInsertQueryBuilder()
->insertInto( 'cw_wikis' )
->ignore()
->row( [
'wiki_dbname' => 'testwiki',
'wiki_dbcluster' => 'c1',
'wiki_sitename' => 'TestWiki',
'wiki_language' => 'en',
'wiki_private' => (int)0,
'wiki_creation' => $db->timestamp(),
'wiki_category' => 'uncategorised',
'wiki_closed' => (int)0,
'wiki_deleted' => (int)0,
'wiki_locked' => (int)0,
'wiki_inactive' => (int)0,
'wiki_inactive_exempt' => (int)0,
'wiki_url' => 'https://test.yourdomain.tld', # CHANGE THIS
] )
->caller( __METHOD__ )
->execute();
putenv( 'WIKI_CREATION_SQL_EXECUTED=true' );
} catch ( DBQueryError $e ) {
return;
}
}
function wfLoadConfiguration() {
global $wgCreateWikiGlobalWiki, $wgCreateWikiDatabase,
$wgCreateWikiCacheDirectory, $wgConf;
$wgCreateWikiGlobalWiki = 'wikidb';
$wgCreateWikiDatabase = 'wikidb';
$wgCreateWikiCacheDirectory = MW_INSTALL_PATH . '/cache';
$wi = new WikiInitialize();
$wi->setVariables(
MW_INSTALL_PATH . '/cache',
[
''
],
[
'127.0.0.1' => ''
]
);
$wi->config->settings += [
'cwClosed' => [
'default' => false,
],
'cwInactive' => [
'default' => false,
],
'cwPrivate' => [
'default' => false,
],
'cwExperimental' => [
'default' => false,
],
];
$wi->readCache();
$wi->config->extractAllGlobals( $wi->dbname );
$wgConf = $wi->config;
}
function wfInitDBConnection() {
return MediaWikiServices::getInstance()->getDatabaseFactory()->create( 'mysql', [
'host' => $GLOBALS['wgDBserver'],
'user' => 'root',
'password' => 'y0ur p@$$w0rd' # CHANGE THIS
] );
}
?>
require_once "$IP/MirahezeFunctions.php";
$wi = new MirahezeFunctions();
$wgConf->settings += [
'wgCentralAuthDatabase' => [
'default' => 'centralauth',
],
'wgCreateWikiUseJobQueue' => [
'default' => true,
],
'wgCreateWikiSubdomain' => [
'default' => 'yourdomain.tld',
],
'wgCreateWikiUseClosedWikis' => [
'default' => true,
],
'wgCreateWikiUseCustomDomains' => [
'default' => true,
],
'wgCreateWikiUseEchoNotifications' => [
'default' => true,
],
'wgCreateWikiUseExperimental' => [
'default' => true,
],
'wgCreateWikiUseInactiveWikis' => [
'default' => true,
],
'wgCreateWikiUsePrivateWikis' => [
'default' => true,
],
'wgCreateWikiCacheDirectory' => [
'default' => 'cw_cache',
],
'wgCreateWikiDatabaseSuffix' => [
'default' => 'wiki',
],
'wgCreateWikiDisableRESTAPI' => [
'default' => true,
'metawiki' => false,
],
'wgCreateWikiGlobalWiki' => [
'default' => 'testwiki',
],
'wgCreateWikiEmailNotifications' => [
'default' => true,
],
'wgFileExtensions' => [
'default' => [
'djvu',
'gif',
'ico',
'jpg',
'jpeg',
'ogg',
'pdf',
'png',
'svg',
'webp',
],
],
'wgArticlePath' => [
'default' => '/wiki/$1',
],
'wgScriptPath' => [
'default' => '',
],
'wgUsePathInfo' => [
'default' => true,
],
'wgResourceBasePath' => [
'default' => '',
],
'wgCreateWikiSQLfiles' => [
'default' => [
"$IP/maintenance/tables-generated.sql",
"$IP/extensions/AbuseFilter/db_patches/mysql/tables-generated.sql",
"$IP/extensions/AntiSpoof/sql/mysql/tables-generated.sql",
#"$IP/extensions/BetaFeatures/sql/tables-generated.sql",
#"$IP/extensions/CheckUser/schema/mysql/tables-generated.sql",
#"$IP/extensions/DataDump/sql/data_dump.sql",
"$IP/extensions/Echo/sql/mysql/tables-generated.sql",
#"$IP/extensions/GlobalBlocking/sql/mysql/tables-generated-global_block_whitelist.sql",
"$IP/extensions/OATHAuth/sql/mysql/tables-generated.sql",
#"$IP/extensions/RottenLinks/sql/rottenlinks.sql",
#"$IP/extensions/UrlShortener/schemas/tables-generated.sql",
],
],
'wgManageWikiPermissionsAdditionalAddGroups' => [
'default' => [],
],
'wgManageWikiPermissionsAdditionalRights' => [
'default' => [
'*' => [
'autocreateaccount' => true,
'read' => true,
'oathauth-enable' => true,
'viewmyprivateinfo' => true,
'editmyoptions' => true,
'editmyprivateinfo' => true,
'editmywatchlist' => true,
'writeapi' => true,
],
'checkuser' => [
'checkuser' => true,
'checkuser-log' => true,
'abusefilter-privatedetails' => true,
'abusefilter-privatedetails-log' => true,
],
'suppress' => [
'abusefilter-hidden-log' => true,
'abusefilter-hide-log' => true,
'browsearchive' => true,
'deletedhistory' => true,
'deletedtext' => true,
'deletelogentry' => true,
'deleterevision' => true,
'hideuser' => true,
'suppressionlog' => true,
'suppressrevision' => true,
'viewsuppressed' => true,
],
'steward' => [
'userrights' => true,
],
'user' => [
'mwoauthmanagemygrants' => true,
'user' => true,
],
],
'+metawiki' => [
'steward' => [
'abusefilter-modify-global' => true,
'centralauth-lock' => true,
'centralauth-suppress' => true,
'centralauth-rename' => true,
'centralauth-unmerge' => true,
'createwiki' => true,
'createwiki-deleterequest' => true,
'globalblock' => true,
'handle-import-request-interwiki' => true,
'handle-import-requests' => true,
'managewiki-core' => true,
'managewiki-extensions' => true,
'managewiki-namespaces' => true,
'managewiki-permissions' => true,
'managewiki-settings' => true,
'managewiki-restricted' => true,
'noratelimit' => true,
'oathauth-verify-user' => true,
'userrights' => true,
'userrights-interwiki' => true,
'globalgroupmembership' => true,
'globalgrouppermissions' => true,
'view-private-import-requests' => true,
],
]
],
'wgManageWikiPermissionsAdditionalRemoveGroups' => [
'default' => [],
],
'wgManageWikiPermissionsDisallowedRights' => [
'default' => [
'any' => [
'abusefilter-hide-log',
'abusefilter-hidden-log',
'abusefilter-modify-global',
'abusefilter-private',
'abusefilter-private-log',
'abusefilter-privatedetails',
'abusefilter-privatedetails-log',
'aft-oversighter',
'autocreateaccount',
'bigdelete',
'centralauth-createlocal',
'centralauth-lock',
'centralauth-suppress',
'centralauth-rename',
'centralauth-unmerge',
'checkuser',
'checkuser-log',
'createwiki',
'createwiki-deleterequest',
'createwiki-suppressionlog',
'createwiki-suppressrequest',
'editincidents',
'editothersprofiles-private',
'flow-suppress',
'generate-random-hash',
'globalblock',
'globalblock-exempt',
'globalgroupmembership',
'globalgrouppermissions',
'handle-import-request-interwiki',
'handle-import-requests',
'handle-pii',
'hideuser',
'investigate',
'ipinfo',
'ipinfo-view-basic',
'ipinfo-view-full',
'ipinfo-view-log',
'managewiki-restricted',
'managewiki-editdefault',
'moderation-checkuser',
'mwoauthmanageconsumer',
'mwoauthmanagemygrants',
'mwoauthsuppress',
'mwoauthviewprivate',
'mwoauthviewsuppressed',
'oathauth-api-all',
'oathauth-enable',
'oathauth-disable-for-user',
'oathauth-verify-user',
'oathauth-view-log',
'renameuser',
'request-import',
'requestwiki',
'siteadmin',
'securepoll-view-voter-pii',
'smw-admin',
'smw-patternedit',
'smw-viewjobqueuewatchlist',
'stopforumspam',
'suppressionlog',
'suppressrevision',
'themedesigner',
'titleblacklistlog',
'updatepoints',
'userrights',
'userrights-interwiki',
'view-private-import-requests',
'viewglobalprivatefiles',
'viewpmlog',
'viewsuppressed',
'writeapi',
],
'user' => [
'autoconfirmed',
'noratelimit',
'skipcaptcha',
'managewiki-core',
'managewiki-extensions',
'managewiki-namespaces',
'managewiki-permissions',
'managewiki-settings',
'globalblock-whitelist',
'ipblock-exempt',
'interwiki',
],
'*' => [
'read',
'skipcaptcha',
'torunblocked',
'centralauth-merge',
'generate-dump',
'editsitecss',
'editsitejson',
'editsitejs',
'editusercss',
'edituserjson',
'edituserjs',
'editmyoptions',
'editmyprivateinfo',
'editmywatchlist',
'globalblock-whitelist',
'interwiki',
'ipblock-exempt',
'viewmyprivateinfo',
'viewmywatchlist',
'managewiki-core',
'managewiki-extensions',
'managewiki-namespaces',
'managewiki-permissions',
'managewiki-settings',
'noratelimit',
'autoconfirmed',
],
],
],
'wgManageWikiPermissionsDisallowedGroups' => [
'default' => [
'checkuser',
'smwadministrator',
'oversight',
'steward',
'staff',
'suppress',
'techteam',
'trustandsafety',
],
],
'wgManageWikiPermissionsDefaultPrivateGroup' => [
'default' => 'member',
],
'wgWhitelistRead' => [
'default' => [
'Special:UserLogin',
'Special:UserLogout',
'Special:CreateAccount',
'Main Page',
],
],
'wgWhitelistReadRegexp' => [
'default' => [
'/^(Special):CentralAutoLogin.*/',
'/^(Special):CentralLogin.*/',
],
],
'wgManageWikiExtensionsDefault' => [
'default' => [
'categorytree',
'cite',
'citethispage',
'codeeditor',
'codemirror',
'darkmode',
'globaluserpage',
'minervaneue',
'mobilefrontend',
'syntaxhighlight_geshi',
'textextracts',
'urlshortener',
'wikiseo',
],
],
'wgUseImageMagick' => [
'default' => true,
],
'wgImageMagickConvertCommand' => [
'default' => '/usr/bin/convert',
],
'wgSharedTables' => [
'default' => [],
],
'wgEnableUploads' => [
'default' => true,
],
];
$globals = MirahezeFunctions::getConfigGlobals();
// phpcs:ignore MediaWiki.Usage.ForbiddenFunctions.extract
extract($globals);
php maintenance/run sql --wikidb wikidb --wiki testwiki extensions/ManageWiki/sql/mw_namespaces.sql
php maintenance/run sql --wikidb wikidb --wiki testwiki extensions/ManageWiki/sql/mw_permissions.sql
php maintenance/run sql --wikidb wikidb --wiki testwiki extensions/ManageWiki/sql/mw_settings.sql
php maintenance/run sql --wikidb wikidb --wiki testwiki extensions/ManageWiki/sql/defaults/mw_namespaces.sql
php maintenance/run sql --wikidb wikidb --wiki testwiki extensions/ManageWiki/sql/defaults/mw_permissions.sql
$wi->loadExtensions();
require_once __DIR__ . '/ManageWikiNamespaces.php';
require_once __DIR__ . '/ManageWikiSettings.php';
$wgGroupPermissions['bureaucrat']['createwiki'] = true;
$wgGroupPermissions['*']['createaccount'] = true;
DELETE FROM localuser WHERE lu_wiki='wikidb';
DELETE FROM localnames WHERE ln_wiki='wikidb';
Common Errors
You can view error in /var/log/nginx/mediawiki_error.log
Uncaught InvalidArgumentException: Database must be null or a non-empty string.
Sometimes, especially after purging the cache, the subdomain is lost at some point while accessing the wiki. Please re-add the subdomain.
Permission denied
Sometimes after performing maintenance scripts, you may encounter this error, which may be hidden under a blank screen. To fix this, try giving cw_cache 777 permission or chown it to www-data again. If it appears the relevant file is outside cw_cache, you may have to chmod or chown another folder, which may be /var/www/mediawiki.
Wikis not creating fully
Create opcache-blacklist.txt in your PHP config folder with the contents as /var/www/mediawiki
and add opcache.blacklist_filename=(your PHP folder)/opcache-blacklist.txt
to your php.ini.