본문 바로가기
미디어위키

MediaWiki Install 1.36.0 on Manjaro

by 다움위키 2023. 12. 21.

이 기사는 너무 많은 내용을 담고 있기 때문에, 최신 상태를 유지하기가 쉽지 않습니다. 반면에 이 기사에 필요한 각각의 프로그램 등은 해당 기사에서 가능한 최신 정보를 기록해 두려고 합니다. 따라서, 이 기사에서 동작하지 않는 부분은 해당 기사로 가셔서 확인하시기 바랍니다!!

MediaWiki/Install 1.36.0 on Ubuntu의 문서 내용을 맨자로우에 맞게 수정했습니다.

아래의 내용 중에서, 일부 참조 파일은 우분투의 기본 설정을 사용하기 때문에, 다음과 같이 바꾸어 주어야 합니다:

  • /var/www/html -> /srv/http
  • php -> php7

게다가, php7의 필요 모듈이 자동으로 올라오지 않기 때문에, 오류를 보고 모듈을 별도로 로드해야 합니다.

Prerequisites

PHP

  • sudo pacman -S php7
  • sudo pacman -S php7-apcu php7-fpm php7-gd php7-igbinary php7-intl php7-xsl
  • sudo systemctl enable php-fpm7.service
  • sudo systemctl start php-fpm7.service
  • sudo nano /etc/php7/php.ini (설치 중에 필요한 모듈을 주석해제해야 할 수 있습니다)

redis 모듈을 로드하기 전에 igbinary 모듈을 먼저 로드해야 합니다. 등등.

MariaDB

  • sudo pacman -S mariadb
  • sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
  • sudo systemctl enable mariadb.service
  • sudo systemctl start mariadb.service

처음 설치 후 작업.

  • sudo mysql_secure_installation

데이터베이스 만들기.

  • mysql -u root -p
MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS `wikidb` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
MariaDB [(none)]> use mysql;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON wikidb.* TO wikiuser@localhost  IDENTIFIED BY 'password';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit;

여기서 'wikidb', 'wikiuser'의 이름과 'password'를 적절히 바꾸십시오.

Redis

메인 캐시 서버는 Redis를 이용하는데, 맨자로우 저장소에서 설치합니다:

  • sudo pacman -S redis php7-redis
  • sudo systemctl enable redis.service
  • sudo systemctl start redis.service

Nginx

맨자로우 저장소의 패키지를 이용합니다.

다음 패키지를 설치하십시오.

  • sudo pacman -S nginx
  • sudo pacman -S nginx-mod-brotli nginx-mod-ndk nginx-mod-pagespeed nginx-mod-redis
  • sudo systemctl enable nginx.service
  • sudo systemctl start nginx.service

Installations

웹에서 설치하는 과정은 MediaWiki#Setup의 과정을 따라 하시면 됩니다. 그리고, Nginx 설정 파일은 이 파일을 받으셔서 사용하시고, 일부 나중에 필요한 부분을 수정하셔야 합니다.

설치를 진행하기 전에 위에서 받은 nginx 설정 파일을 일부 수정해야 합니다. 먼저, nginx 설정 파일을 /etc/nginx/로 옮기고, 다음 줄을 찾아서 아래와 같이 주석처리합니다:

#location /w/mw-config { deny all; } 설치가 완료되면, 주석 해제하고 서비스를 다시 시작해야 합니다.

다음으로, pagespeed를 설정하시기 귀찮으시면, 맨 아래에 있는 다음 줄을 아래와 같이 주석처리합니다.

#include pagespeed/optimize.conf;

이제 설정을 점검하시고 서비스를 재시작합니다:

  • sudo nginx -t
  • sudo systemctl restart nginx

그런-다음 미디어위키 다운로드 지면에서 최신 안정 버전을 받으십시오.

  • /srv/http/w 아래에 소스를 풉니다.
  • sudo chown -R root:root /srv/http/w
  • 웹브라우저로 http://localhost/w/mw-config/로 접근해서 설치를 진행하십시오.

다음으로 업로드 디렉토리 사용자와 허가권을 변경해야 합니다.

  • cd /srv/http/w
  • sudo chmod 775 images cache
  • sudo chown root:http images cache
  • sudo cp /home/user/Downloads/LocalSettings.php .

웹에서 localhost로 접근합니다.

시각 편집기가 동작하기 위해서 nginx 설정을 추가해야 합니다: 이 부분은 설정 파일에 반영되어 있습니다!

	location /w/rest.php/ {
    	try_files $uri $uri/ /w/rest.php?$query_string;
	}

Configurations

미디어위키 디버깅

미디어위키에서 문제가 생겨 흰 화면만 출력될 때, 오류 메시지를 확인하고 디버깅을 하기 위해 출력 메시지 저장해야 합니다. 평소에는 아래와 같이 주석처리해 두었다가 문제 생겼을 때, 주석을 해제하고 사용하시기 바랍니다.

#error_reporting( E_ALL );
#ini_set( 'display_errors', 1 );
#$wgResourceLoaderDebug = true;
#$wgShowDBErrorBacktrace = true;
#$wgDebugLogFile= "/tmp/MediaWikiDebug.log";
#$wgShowExceptionDetails = true;

Pretty URI

다음 내용을 LocalSettings.php에 추가하십시오.

$wgScriptPath      = "/w";              # 원래 있던 줄.
$wgScriptExtension = ".php";

// Pretty URIs MW
$wgArticlePath = "/wiki/$1";            
$wgUsePathInfo = true;

Redis

다음 내용을 LocalSettings.php에 추가하십시오.

$wgObjectCaches['redis'] = array(
    'class'                => 'RedisBagOStuff',
    'servers'              => array( '127.0.0.1:6379' ),
    'persistent'        => true,
);
$wgMainCacheType = 'redis';
$wgSessionCacheType = 'redis'; 
$wgSessionsInObjectCache = true;
$wgMessageCacheType = 'redis';
$wgParserCacheType = 'redis';
$wgLanguageConverterCacheType = 'redis';

$wgJobTypeConf['default'] = [
    'class'          => 'JobQueueRedis',
    'redisServer'    => '127.0.0.1:6379',
	'redisConfig' => [],
	'claimTTL'       => 3600,
    'daemonized'     => true
];

# Job queue
$wgJobRunRate = 0;

Job queue

미디어 위키 설정은 위의 파일에 넣었습니다.

Manual:Job queue#Simple service to run jobs의 순서에 따라 진행하시고, 파일의 내용은 그대로 사용하셔도 됩니다:

  • sudo nano /usr/local/bin/mwjobrunner
  • sudo chmod 755 /usr/local/bin/mwjobrunner
  • sudo nano /etc/systemd/system/mw-jobqueue.service
  • sudo systemctl daemon-reload
  • sudo systemctl enable mw-jobqueue
  • sudo systemctl start mw-jobqueue
  • sudo systemctl status mw-jobqueue
  • sudo systemctl restart nginx

Email enable

사용자 사이의 전자우편을 활성화합니다.

$wgEnableEmail = true;
$wgEnableUserEmail = true; # UPO

$wgEmergencyContact = "관리자_email";
$wgPasswordSender = "관리자_email";

$wgEnotifUserTalk = true; # UPO
$wgEnotifWatchlist = true; # UPO
$wgEmailAuthentication = true;

Timezone & ExteranlLink

$wgLocaltimezone = "Asia/Seoul";
date_default_timezone_set( $wgLocaltimezone );

#외부링크 새 탭에서 열기
$wgExternalLinkTarget = '_blank';

File upload & related

$wgEnableUploads = true;
$wgUploadPath = "{$wgScriptPath}/images";
$wgGenerateThumbnailOnParse = false;
$wgThumbnailScriptPath = "{$wgScriptPath}/thumb.php";
$wgFileExtensions = array('png','gif','jpg','jpeg','doc','ogg','xls','ppt','tiff','tif','bmp','docx','xlsx','pptx','mp3','sxc','pdf','ebuild','gz','bz2','xz','tar','patch','svg','zip','ogv');
# Files with these extensions will never be allowed as uploads.
$wgFileBlacklist = array(
        # HTML may contain cookie-stealing JavaScript and web bugs
        'html', 'htm',
        # PHP scripts may execute arbitrary code on the server
        'php', 'phtml', 'php3', 'php4', 'php5', 'phps',
        # Other types that may be interpreted by some servers
        'shtml', 'jhtml', 'pl', 'py',
        # May contain harmful executables for Windows victims
        'exe', 'scr', 'dll', 'msi', 'vbs', 'bat', 'com', 'pif', 'cmd', 'vxd', 'cpl' );

$wgAllowTitlesInSVG = true;
$wgSVGConverter = 'rsvg-secure';
$wgSVGConverterPath = '/usr/bin';
$wgSVGMaxSize = 4096;
$wgSVGConverters['rsvg-secure'] = '$path/rsvg-convert -w $width -h $height -o $output < $input';

$wgCheckFileExtensions = true;

$wgStrictFileExtensions = true;

$wgUploadSizeWarning = 30000000;
$wgUseImageMagick = true;
$wgImageMagickConvertCommand = "/usr/bin/convert";
$wgMaxShellFileSize = 512 * 1024; // Kilobytes
$wgMaxShellMemory = 1024 * 1024;  // Kilobytes
$wgMaxShellTime = 50;  // seconds

$wgUseInstantCommons = true;
$wgShellLocale = "C.UTF-8";

$wgHashedUploadDirectory = true;

Recent changes

새로운 인터페이스가 약간은 늦은 응답을 보여주기도 합니다. 이전 형식으로 바꿀 수 있습니다.

$wgDefaultUserOptions['rcenhancedfilters-disable'] = true;
$wgDefaultUserOptions['wlenhancedfilters-disable'] = true;
$wgHiddenPrefs = ['rcenhancedfilters-disable', 'wlenhancedfilters-disable'];

소스 가져오기

간혹 다른 곳의 템플릿(Template), 모듈(Module), 또는 기사를 가져올 필요가 있습니다.

$wgImportSources = array(
      'wikipedia' => array( 'en' )
);

Vector skin

$wgDefaultSkin = "Vector";
$wgVectorResponsive = false;
$wgVectorShowSkinPreferences = true;
$wgVectorDefaultSkinVersion = 2;
$wgVectorDefaultSkinVersionForExistingAccounts = 2;
$wgVectorDefaultSkinVersionForNewAccounts = 2;
$wgVectorLayoutMaxWidth = true;
$wgVectorDefaultSidebarVisibleForAnonymousUser = true;
$wgVectorUseWvuiSearch = true;
$wgVectorWvuiSearchOptions['showThumbnail'] = true;
$wgVectorWvuiSearchOptions['showDescription'] = true;

Extensions

아래의 것이 미디어위키 1.36과 함께 번들로 제공되는 확장입니다.

wfLoadExtension( 'CategoryTree' );
wfLoadExtension( 'Cite' );
wfLoadExtension( 'CiteThisPage' );
wfLoadExtension( 'CodeEditor' );
wfLoadExtension( 'ConfirmEdit' );
wfLoadExtension( 'Gadgets' );
wfLoadExtension( 'ImageMap' );
wfLoadExtension( 'InputBox' );
wfLoadExtension( 'Interwiki' );
#wfLoadExtension( 'LocalisationUpdate' );
wfLoadExtension( 'MultimediaViewer' );
wfLoadExtension( 'Nuke' );
#wfLoadExtension( 'OATHAuth' );
wfLoadExtension( 'PageImages' );
wfLoadExtension( 'ParserFunctions' );
wfLoadExtension( 'PdfHandler' );
wfLoadExtension( 'Poem' );
wfLoadExtension( 'Renameuser' );
wfLoadExtension( 'ReplaceText' );
wfLoadExtension( 'Scribunto' );
wfLoadExtension( 'SecureLinkFixer' );
wfLoadExtension( 'SpamBlacklist' );
wfLoadExtension( 'SyntaxHighlight_GeSHi' );
wfLoadExtension( 'TemplateData' );
wfLoadExtension( 'TextExtracts' );
wfLoadExtension( 'TitleBlacklist' );
wfLoadExtension( 'VisualEditor' );
wfLoadExtension( 'WikiEditor' );

추가적인 확장은 미디어위키 확장 배포 지면에서 검색을 통해 받으실 수 있습니다.

그런 다음, 예를 들어, Extension:Math 확장을 아래와 같이 풀어줍니다.

  • sudo tar xvf Math-REL1_36-8c7c35b.tar.gz -C /var/www/html/w/extensions

수식 입력

설정 파일 LocalSettings.php에 다음을 추가하십시오.

wfLoadExtension( 'Math' );

물론 네트워크 속도 품질을 일정하게 개선하기 위해, 로컬에 RESTBaseMathoid를 설치할 필요가 있지만, 크게 속도에 영향을 받지 않을 때에는 그냥 사용하셔도 무방합니다.

검색 개선

먼저, Elasticsearch를 설치하십시오.

  • sudo pacman -S java8-openjfx

java -version으로 확인하십시오.

  • yay -S elasticsearch6
  • sudo systemctl start elasticsearch6
  • sudo systemctl enable elasticsearch6

제대로 동작하지 않을 경우 해당 지면의 설정을 확인하십시오.

AdvancedSearch, Elastica, CirrusSearch를 설치하십시오.

wfLoadExtension( 'AdvancedSearch' );
wfLoadExtension( 'Elastica' );
wfLoadExtension( 'CirrusSearch' );
$wgDisableSearchUpdate = true;

인덱스 생성.

  • cd /srv/http/w
  • php7 extensions/CirrusSearch/maintenance/UpdateSearchIndexConfig.php

위의 설정에서 $wgDisableSearchUpdate = true; 주석처리하십시오.

다음으로 다음을 실행하여 검색 인덱스를 부트스트랩합니다:

  • php7 extensions/CirrusSearch/maintenance/ForceSearchIndex.php --skipLinks --indexOnSkip
  • php7 extensions/CirrusSearch/maintenance/ForceSearchIndex.php --skipParse

설정 파일에 $wgSearchType = 'CirrusSearch';를 추가하십시오.

  • sudo systemctl start cronie.service
  • sudo systemctl enable cronie.service

필요하다면, Extension:CirrusSearch#Completion_Suggester를 설정하십시오. 어렵지 않으니, 가능한 설정하십시오.

에디터 개선

CodeMirror, CharInsert를 설치하고, 설정 파일에 추가하십시오.

wfLoadExtension( 'CodeMirror' );
$wgDefaultUserOptions['usecodemirror'] = 1;
wfLoadExtension( 'CharInsert' );

다음 파일을 만드십시오. 영문 위키피디아의 것을 그대로 이용하셔도 좋겠습니다.

토론 개선

Extension:Echo, Extension:Flow, Extension:CheckUser, Extension:CLDR, 및 Extension:Thanks를 설치하십시오.

wfLoadExtension( 'Echo' );
wfLoadExtension( 'Flow' );
$wgNamespaceContentModels[NS_TALK] = 'flow-board';
$wgNamespaceContentModels[NS_USER_TALK] = 'flow-board';
$wgGroupPermissions['sysop']['flow-create-board'] = true;
$wgContentHandlerUseDB = true;
$wgFlowContentFormat = 'html';
wfLoadExtension( 'CheckUser' );
$wgGroupPermissions['sysop']['checkuser'] = true;
$wgGroupPermissions['sysop']['checkuser-log'] = true;
$wgGrantPermissionGroups['checkuser'] = 'administration';
wfLoadExtension( 'cldr' );
wfLoadExtension( 'Thanks' );
$wgThanksSendToBots = false;
$wgThanksLogging = true;
$wgThanksConfirmationRequired = true;
$wgThanksLogTypeWhitelist = [
	"contentmodel",
	"delete",
	"import",
	"merge",
	"move",
	"patrol",
	"protect",
	"tag",
	"managetags",
	"rights"
];

RESTBase & Mathoid

BESTBase master 버전을 사용하면, 일부 수식 표현에서 오류가 발생할 수 있으므로, 최근 안정 버전 1.1.4를 설치하는 것이 바람직해 보입니다.

이전 수식 확장 아래에 다음 내용을 추가하십시오.

wfLoadExtension( 'Math' );
$wgMathValidModes[] = 'mathml';
$wgDefaultUserOptions['math'] = 'mathml';
$wgVisualEditorFullRestbaseURL = "http://localhost/api/rest_";
$wgMathFullRestbaseURL= 'http://localhost/api/rest_';

새로운 Nginx 설정 파일과 RESTBase 설정 파일을 받고, 풀어서 정해진 위치에 옮겨야 합니다. 타르 파일을 풀어서 나오는 파일을 아래의 디렉토리로 옮기십시오:

게다가 2개의 파일을 수정해야 합니다. 아래 파일을 열어서 wikimedia.orglocalhost로 바꿉니다:

  • sudo nano /usr/local/lib/restbase/sys/mathoid.js
  • sudo nano /usr/local/lib/restbase/v1/mathoid.yaml

시작 스크립트 파일 만들기

RESTBase 서비스에 대한 새 사용자를 만들고 해당 사용자의 홈 폴더를 만듭니다.

  • sudo useradd --home=/var/lib/restbase -M --user-group --system --shell=/usr/sbin/nologin -c "RESTBase for MediaWiki" restbase
  • sudo mkdir -p /var/lib/restbase
  • sudo chown restbase:restbase /var/lib/restbase

Systemd 서비스 스크립트 /etc/systemd/system/restbase.service를 다음과 같이 만듭니다:

[Unit]
Description=Mediawiki RESTBase Service
Documentation=https://www.mediawiki.org/wiki/RESTBase
Wants=local-fs.target network.target
After=local-fs.target network.target

[Install]
WantedBy=multi-user.target

[Service]
Type=simple
User=restbase
Group=restbase
WorkingDirectory=/usr/local/lib/restbase
ExecStart=/usr/bin/node /usr/local/lib/restbase/server.js
KillMode=process
Restart=on-success
PrivateTmp=true
StandardOutput=syslog

서비스를 다시 가져와서 서비스를 시작합니다.

  • sudo systemctl daemon-reload
  • sudo systemctl enable restbase
  • sudo systemctl start restbase
  • sudo systemctl status restbase

Mathoid를 독립형 데몬으로 실행하고 시작 스크립트를 만들기 위해서, 폴더를 시스템 폴더로 이동하고 다음과 같이 데몬을 실행하는 "mathoid" 사용자를 만듭니다:

  • sudo useradd --home=/var/lib/mathoid -M --user-group --system --shell=/usr/sbin/nologin -c "Mathoid for MediaWiki" mathoid
  • sudo mkdir -p /var/lib/mathoid
  • sudo chown mathoid:mathoid /var/lib/mathoid

Systemd 시작 스크립트 /etc/systemd/system/mathoid.service로 다음과 같이 만듭니다.

[Unit]
Description=Mediawiki Mathoid Service
Documentation=https://www.mediawiki.org/wiki/Mathoid
Wants=local-fs.target network.target
After=local-fs.target network.target

[Install]
WantedBy=multi-user.target

[Service]
Type=simple
User=mathoid
Group=mathoid
WorkingDirectory=/usr/local/lib/mathoid
ExecStart=/usr/bin/node /usr/local/lib/mathoid/server.js
KillMode=process
Restart=on-success
Nice=10
OOMScoreAdjust=900
PrivateTmp=true
StandardOutput=syslog

그런 다음 서비스를 활성화하고, 시스템 시작 시 자동으로 시작하도록 등록해 줍니다.

  • sudo systemctl daemon-reload
  • sudo systemctl enable mathoid
  • sudo systemctl start mathoid
  • sudo systemctl status mathoid

문제점 및 활용

만약 이 설정을 참조하고 외부에서 수식을 랜더링하기 위해서는 다른 부분은 수정할 필요가 없고, 아래의 내용에서 localhostFQDN으로 바꾸시면 됩니다:

wfLoadExtension( 'Math' );
$wgMathValidModes[] = 'mathml';
$wgDefaultUserOptions['math'] = 'mathml';
$wgVisualEditorFullRestbaseURL = "http://localhost/api/rest_";
$wgMathFullRestbaseURL= 'http://localhost/api/rest_';