At this moment there is one way to install Open CSP yourself.

Install MediaWiki

The first step is to install MediaWiki. If you have done this, go to the next step.

Install Elasticsearch

In Open CSP Elasticsearch is used as Elasticstore for Semantic MediaWiki. Having the data in Elasticsearch is a prerequisite for the use of WikiSearch.

How to install Elasticsearch is described here: https://www.mediawiki.org/wiki/Extension:CirrusSearch#Elasticsearch.

Download the Open CSP extensions

Go to Extensions in Open CSP and download all the extensions that are not included with MediaWiki.

Configuration of settings

Our approach is to have LocalSettings.php as it is and put settings in different files. This promotes clarity and upgradability.

Change LocalSettings.php

Add this to the end of LocalSettings.php and create a 'settings' folder in the public_html with these files.

require_once( 'settings/ServerSettings.php' );
require_once( 'settings/AdditionalSettings.php' );
require_once( 'settings/ExtensionSettings.php' );
require_once( 'settings/SkinSettings.php' );

Configure server settings

<?php
// Project namespace (choose your project namespace)
// $wgMetaNamespace = "Wiki";

// Short URL (optional)
// $wgArticlePath = "/$1";
// $wgUsePathInfo = true;

// Elasticsearch (configure according your ES installation)
$GLOBALS['smwgElasticsearchEndpoints'] = [ 'elasticsearch-master.helm.svc.cluster.local:9200', ];
$GLOBALS['smwgElasticsearchConfig']['settings']['data'] = [ 'number_of_shards' => 2,
	'number_of_replicas' => 0 ];

// Disable jobqueue on webrequest (optional, if set to 0 create cronjob to run runJobs.php)
// $wgJobRunRate = 0;

Configure additional settings

<?php
// Uncomment to see Exception Details
//	$wgShowExceptionDetails = true;

// Please fill in your page name here:
$wgSitename = "CSP Wiki";

// Allow uploads
$wgEnableUploads = true;
// Under evaluation: Might no longer be required for FlexForm
$wgAllowCopyUploads = true;
$wgCopyUploadsFromSpecialUpload = true;

// Use img_auth.php for all files served. (optional)
// $wgUploadPath = "/img_auth.php";

// Switch off cache (optional)
// $wgCachePages = false;
// $wgMainCacheType = CACHE_NONE;
// $wgCacheDirectory = false;
// $wgParserCacheType = CACHE_NONE;

// Enable ElasticSearch as the standard backend
$smwgDefaultStore = 'SMWElasticStore';

// Explicitly set wgRawHtml to false, since it is unsafe.
$wgRawHtml = false;

// Below are settings for a private wiki that all users can edit
// No need to patrol pages
$wgUseRCPatrol = false;
$wgUseNPPatrol = false;

// Private wiki
$wgGroupPermissions['*']['read'] = false;
$wgGroupPermissions['*']['edit'] = false;
$wgGroupPermissions['*']['createaccount'] = false;

// Give read and write rights to all registered users.
$wgGroupPermissions['user']['read'] = true;
$wgGroupPermissions['user']['edit'] = true;
// Give a faux permission to 'moderator' so it will show up as a role.
$wgGroupPermissions['moderator']['read'] = true;

// Allow moderators edit access to the Wiki namespace.
$wgNamespaceProtection[NS_PROJECT] = [ 'edit project' ];
$wgGroupPermissions['sysop']['edit project'] = true;
$wgGroupPermissions['moderator']['edit project'] = true;

Configure extension settings

<?php
##### Admin Links
wfLoadExtension( 'AdminLinks' );

##### CodeMirror (optional
// Required for source editing with CodeMirror.
// wfLoadExtension( 'WikiEditor' );
// wfLoadExtension( 'CodeMirror' );
// $wgDefaultUserOptions['usecodemirror'] = 1;

##### CSPResources
wfLoadExtension( 'CSPResources' );
$wgCSPShowSmwIndicator = false;

##### DataTransfer
wfLoadExtension( 'DataTransfer' );

##### DeleteBatch
wfLoadExtension( 'DeleteBatch' );

##### DisplayTitle
wfLoadExtension( 'DisplayTitle' );
// defaults to true
$wgAllowDisplayTitle = true;
// defaults to true
$wgRestrictDisplayTitle = false;

##### Echo
wfLoadExtension( 'Echo' );
$wgEchoWatchlistNotifications = true;

$wgExtensionFunctions[] = static function () {
	global $wgEchoNotifications;
	unset( $wgEchoNotifications["thank-you-edit"] );

	global $wgEchoNotificationCategories;
	unset( $wgEchoNotificationCategories["edit-user-talk"] );
	unset( $wgEchoNotificationCategories["mention"] );
	unset( $wgEchoNotificationCategories["emailuser"] );
	unset( $wgEchoNotificationCategories["thank-you-edit"] );
};

##### FlexForm (formerly: WSForm)
wfLoadExtension( 'FlexForm' );
$wgFlexFormConfig['secure'] = true;
$wgFlexFormConfig['sec_key'] = getenv( 'GITLAB_ENVIRONMENT_URL' ) . "salt";
$wgFlexFormConfig['auto_save_interval'] = 30000;
$wgFlexFormConfig['auto_save_after_change'] = 3000;
$wgFlexFormConfig['auto_save_btn_on'] = 'Autosave on';
$wgFlexFormConfig['auto_save_btn_off'] = 'Autosave off';
$wgFlexFormConfig['FlexFormDefaultTheme'] = "plain";
$wgFlexFormConfig['rc_site_key'] = "";
$wgFlexFormConfig['rc_secret_key'] = "";
$wgFlexFormConfig['file_temp_path'] = "";
$wgFlexFormConfig['CreateAndEditForms']['allowedGroups'] = ["sysop","moderator"];
$wgFlexFormConfig['CreateAndEditForms']['hideEdit'] = true;
$wgFlexFormConfig['can_create_user'] = false;
$wgFlexFormConfig['create-seo-titles'] = true;
$wgFlexFormConfig['form_timeout_limit'] = 7200;

##### Lockdown
wfLoadExtension( 'Lockdown' );

##### MultimediaViewer
wfLoadExtension( 'MultimediaViewer' );
$wgMediaViewerIsInBeta = true;

##### MyVariables
wfLoadExtension( 'MyVariables' );

##### NumberFormat
require_once "$IP/extensions/NumberFormat/NumberFormat.php";

##### ParserFunctions
wfLoadExtension( 'ParserFunctions' );
$wgPFEnableStringFunctions = true;
$wgPFStringLengthLimit = 80000;

##### Realnames
wfLoadExtension( 'Realnames' );
$wgRealnamesLinkStyle = "replace";

##### RegexFun
require_once $IP . '/extensions/RegexFun/RegexFun.php';

##### ReplaceText
wfLoadExtension( 'ReplaceText' );

##### SSO Stack
###		PluggableAuth
###		WSAzureAuth
###		WSOAuth
$wgGroupPermissions['*']['autocreateaccount'] = true;
wfLoadExtension( 'PluggableAuth' );
wfLoadExtension( 'WSAzureAuth' );
wfLoadExtension( 'WSOAuth' );
$wgPluggableAuth_EnableLocalLogin = true;
$wgPluggableAuth_Config['WikibaseSolutionsAAD'] = [
	'plugin' => 'WSOAuth',
	'data' => [
		'type' => 'azure',
		'clientId' => getenv( 'AAD_CLIENT_ID' ),
		'clientSecret' => getenv( 'AAD_CLIENT_SECRET' ),
		'redirectUri' => str_replace( "http",
				"https",
				getenv( 'GITLAB_ENVIRONMENT_URL' ) ) . '/Special:PluggableAuthLogin'
	],
	'buttonLabelMessage' => 'wikibase-solutions-oauth-button-label'
];
$wgOAuthAzureTenant = getenv( 'AAD_TENANT_ID' );
$wgOAuthAutoPopulateGroups = [ 'sysop',
	'interface-admin' ];

##### SemanticMediaWiki
enableSemantics( 'wikibase.nl' );
$smwgConfigFileDir = $IP . '/cache';
# Default disabled (CSP Basis#13)
$smwgCheckForConstraintErrors = SMW_CONSTRAINT_ERR_CHECK_NONE;
const NS_WIDGET = 274;
const NS_WIDGET_TALK = 275;
$smwgNamespacesWithSemanticLinks[NS_TEMPLATE] = true;
$smwgNamespacesWithSemanticLinks[SMW_NS_PROPERTY] = true;
$smwgNamespacesWithSemanticLinks[SMW_NS_CONCEPT] = true;
$smwgNamespacesWithSemanticLinks[NS_WIDGET] = true;
$smwgNamespacesWithSemanticLinks[SMW_NS_PROPERTY_TALK] = false;
$smwgNamespacesWithSemanticLinks[SMW_NS_CONCEPT_TALK] = false;
$smwgNamespacesWithSemanticLinks[NS_WIDGET_TALK] = false;
$smwgPageSpecialProperties = [ '_MDAT',
	'_CDAT' ];

##### SemanticExtraSpecialProperties
wfLoadExtension( 'SemanticExtraSpecialProperties' );
$sespgEnabledPropertyList = [ '_EUSER',
	'_CUSER',
	'_PAGEID', ];

##### SemanticResultFormats
wfLoadExtension( 'SemanticResultFormats' );

##### SyntaxHighlight_GeSHi
wfLoadExtension( 'SyntaxHighlight_GeSHi' );

##### TemplateData
wfLoadExtension( 'TemplateData' );

##### UrlGetParameters
require_once $IP . '/extensions/UrlGetParameters/UrlGetParameters.php';

##### UserFunctions
require_once "$IP/extensions/UserFunctions/UserFunctions.php";
$wgUFAllowedNamespaces = array_fill( 0,
	4000,
	true );
$wgUFAllowedNamespaces += array_fill( 50000,
	5000,
	true );

##### UserMerge
wfLoadExtension( 'UserMerge' );
$wgGroupPermissions['bureaucrat']['usermerge'] = true;

##### Variables
wfLoadExtension( 'Variables' );

##### VisualEditor
wfLoadExtension( 'VisualEditor' );
$wgTmpDirectory = $IP . '/images/temp/';
$wgExtraSignatureNamespaces = [ NS_MAIN ];
$wgVisualEditorEnableWikitext = true;
$wgVisualEditorEnableDiffPage = true;
for ( $i = 50000; $i < 55000; $i += 2 ) {
	$wgContentNamespaces[] = $i;
}
$wgVisualEditorNamespaces = array_merge( $wgContentNamespaces,
	[ NS_USER ] );

##### Widgets
wfLoadExtension( 'Widgets' );

##### WSArrays
wfLoadExtension( 'WSArrays' );
$wfEnableResultPrinter = true;

##### WSImageVersion
wfLoadExtension( 'WSImageVersion' );
$wgWSImageVersionVersionDescriptions = [ [ "product" => "CSP",
	"file" => $IP . "/.version" ], ];

##### WSPageSync
wfLoadExtension( 'WSPageSync' );
$wgWSPageSync['filePath'] = $IP . '/wsps';

##### WikiSearch (and WikiSearchFront)
wfLoadExtension( 'WikiSearch' );
wfLoadExtension( 'WikiSearchFront' );

##### WSSemanticParsedText
wfLoadExtension( 'WSSemanticParsedText' );
$smwgElasticsearchConfig["indexer"]["raw.text"] = true;

##### WSSlots
# Note: We still define and append the 'ws-page-props' slot, because it is used on some wikis.
wfLoadExtension( 'WSSlots' );
$wgWSSlotsDefaultSlotRoleLayout = [ "display" => "none",
	"region" => "center",
	"placement" => "append", ];
$wgWSSlotsDefaultContentModel = "wikitext";
$wgWSSlotsDefinedSlots = [ "ws-base-props", "ws-class-props" ];
$wgWSSlotsSemanticSlots = [ "ws-base-props", "ws-class-props" ];
$wgWSSlotsDoPurge = true;

##### WSSpaces
wfLoadExtension( 'WSSpaces' );
for ( $i = 50000; $i < 55000; $i++ ) {
	$smwgNamespacesWithSemanticLinks[$i] = true;
}

##### WSTools
wfLoadExtension( 'WSTools' );

Configure skin settings

<?php
wfLoadExtension( 'Bootstrap' );
wfLoadSkin( 'chameleon' );
$wgDefaultSkin = "chameleon";

// Define the location of the css and the layout xml
$egChameleonLayoutFile = "$IP/skin/wikibaseLayout.xml";
$egChameleonExternalStyleModules = glob( $IP . '/skin/scss/[^_]*.scss' );
$wgAllowSiteCSSOnRestrictedPages = true;

// Replace "Powered by SMW" by "Powered by Wikibase"
$wgFooterIcons = [ "copyright" => [ "copyright" => [], ],
	"poweredby" => [ "wikibase" => [ "src" => "/skin/PoweredByWikibase.png",
		"url" => "https://www.wikibase-solutions.com/",
		"alt" => "Powered by Wikibase", ], ], ];
$wgRightsIcon = null;

// Logo and favicon
$wgFavicon = "/skin/favicon.png";

// Common message files
$wgMessagesDirs['WikibaseSolutions'] = __DIR__ . '/../skin/i18n';

// Style settings
// If you want to use container-max-widths, take this step or it won't respond:
// -> Go to skin/wikibaseLayout.xml and from <grid>, remove: 'class="flex-fill" mode="fluid"'
// Add this to the following array: 'container-max-widths'	=> '(sm: 100%, md: 100%, lg: 70vw, xl:
// 70vw)'
$egChameleonExternalStyleVariables = [ 'primary' => '#0576a8' ];