User:MeowyCats2/Install CreateWiki and ManageWiki on your wiki

From Meta Wiki
Revision as of 11:45, 25 May 2024 by mh:meta>Waki285 (todo)
Jump to navigation Jump to search

 Note: This is less of a "tutorial" and more of a "memo" on the means by which I have been successful. Disclaimer: I, Waki285, 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 4-core CPU, 8GB memory, free IP port open, and sudo privileges
  • Ubuntu Server 22.02
  • Nginx 1.18.0
  • MySQL 8.0.36
  • Cloudflare (I bought 1 domain for this)

Procedure

  1. Install packages such as php-intl and mysql, which are required for a normal MediaWiki installation. We will also purchase a domain and connect it to Cloudflare.
  2. Extract MediaWiki to /var/www/mediawiki.
  3. Enter MySQL and create a database named "testwiki".
  4. 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 with systemctl reload nginx.
  5. 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;
    }
    
  6. Remember to open port 80 if you are using a firewall.
  7. Go to Cloudflare and add the following to your DNS.
  8. Type: A Name: * IPv4 address: Your VPS IP Proxy status: Proxied
  9. Go to the Cloudflare SSL/TLS settings and set the SSL/TLS encryption mode to Flexible.
  10. At this point, go to test.[yourdomain.tld] and you should see "LocalSettings.php not found. Please set up the wiki first."
  11. Click "set up the wiki", set up the wiki as usual, but install the extensions AbuseFilter, Interwiki and Echo. Set the database name to "testwiki" created earlier and leave the table prefix blank.
  12. After setup is complete and the downloaded LocalSettings.php is in place, verify that MediaWiki starts properly.
  13. Install mw:Extension:AntiSpoof. Follow the guide on the MediaWiki Extension page.
  14. Install mw:Extension:CheckUser. Follow the guide on the MediaWiki Extension page.
  15. mw:Extension:CentralAuth.
    1. Download and extract.
    2. Enter MySQL and create a database named centralauth.
    3. Put this to your LocalSettings.
    4. wfLoadExtension( 'CentralAuth' );
      $wgCentralAuthDatabase = 'centralauth';
      
    5. Run php maintenance/run.php sql --wikidb centralauth extensions/CentralAuth/schema/mysql/tables-generated.sql
    6. Run php maintenance/run.php sql --wikidb centralauth extensions/AntiSpoof/sql/mysql/tables-generated.sql
    7. Run php maintenance/run.php CentralAuth:migratePass0.php
    8. Run php maintenance/run.php CentralAuth:migratePass1.php
  16. Have a cup of coffee.
  17. Install mw:Extension:CreateWiki.
    1. Download and extract.
    2. Enter MySQL and create a database named wikidb.
    3. Put this to your LocalSettings.
    4. #wfLoadExtension( 'CreateWiki' );
      $wgCreateWikiDatabase = 'wikidb';
      
    5. Make cw_cache directory and give 777 permission.
    6. Put $wgCreateWikiCacheDirectory = 'cw_cache'; to your LocalSettings.
    7. Run these commands.
    8. 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
      
    9. Remove # from #wfLoadExtension( 'CreateWiki' );.
    10. 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
    11. <?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
      	] );
      }
      
      ?>
      
    12. Insert require_once "$IP/SetupCreateWiki.php"; TOP of LocalSettings.php (below <?php)
    13. 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.
    14. Remove require_once "$IP/SetupCreateWiki.php";
    15. .
  18. Get MirahezeFunctions.php from https://github.com/miraheze/mw-config/blob/master/initialise/MirahezeFunctions.php and paste it to /var/www/mediawiki/MirahezeFunctions.php
  19. Modify MirahezeFunctions.php. Please change default. Not sure if you need to remove beta on all of the following. I did not remove it.
    1. Change ALLOWED_DOMAINS and DEFAULT_SERVER to yourdomain.tld
    2. Change CACHE_DIRECTORY to /var/www/mediawiki/cw_cache
    3. Change CENTRAL_DATABASE to testwiki
    4. Change GLOBAL_DATABASE to wikidb
    5. Change MEDIAWIKI_DIRECTORY to /var/www/mediawiki/
    6. Change path to correct path for LocalSettings.php, ManageWikiExtensions.php, ManageWikiNamespaces.php, ManageWikiSettings.php. For Example: '/../LocalSettings.php' → '/LocalSettings.php', '/../ManageWikiExtensions.php' → '/ManageWikiExtensions.php'
  20. Add this to LocalSettings. Put BEFORE loading extensions
  21. require_once "$IP/MirahezeFunctions.php";
    $wi = new MirahezeFunctions();
    
  22. Add this to LocalSettings.php Put JUST UNDER $wi = new MirahezeFunctions();. Remember to change yourdomain.tld
  23. $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,
    	],
    
    ];
    
  24. TODO