미디어위키 개발자 버전 설치/설정
위키피디아에서 사용되고 있는 미디어위키는 매주 (또는 특별한 경우에 2주 또는 3주 후) 제공되는 개발자 (알파) 버전, 그 주의 master 가지의 스냅샷을 사용해서 운영됩니다.
이 버전은 개발자 버전이라서 문제가 있을 것으로 추정되지만, 그동안의 경험으로 보자면, 아주 드물게 일부에서 문제가 발생하긴 하지만 코어 부분에서는 문제가 거의 발생하지 않는 것으로 보입니다. 게다가, 문제가 발생할 경우에 1~2일 후에 해당 패치가 master 가지에 제공되기 때문에 문제의 원인을 알고 있으면 생각보다 쉽게 해결이 되기도 합니다. 만약 패치가 되었다면, 아래에 소개되는 업데이트 스크립트를 실행함으로써 해결됩니다!
이런 문제의 해결 과정은 MediaWiki/Troubleshootings에 기록된 내용을 참조하시기 바랍니다.
어쨌든, 매주 새로운 스냅샵이 제공되다 보니, 매주 업그레이드를 진행해야 한다는 귀찮은 문제가 있습니다.
한편, 요즘의 주요 저장 장치 SSD는 가능한 쓰기를 적게 하는 것이 수명에 도움이 됩니다. 이런 상황에서 잦은 업그레이드는 쓰기에 부담을 줄 수 있기 때문에, 변경되지 않는 파일을 거듭 다운로드 및 업그레이드 중에 복사 등의 과정을 줄일 필요가 있습니다.
이 기사는 매주 제공되는 스냅샷 대신에 master 가지 자체를 이용해서 미디어위키를 설치하고, 지속적으로 업그레이드하는 과정을 진행해 보고자 합니다. 이를 위해 기존의 Upgrading Mediawiki from Git OR Snapshot 기사와 최근 출시로부터 미디어위키를 거의 완전히 설정하는 MediaWiki/Install 1.36.0 on Debian을 참조해서 데비안 테스팅 버전에서 이 과정을 진행해 보고자 합니다.
게다가, 현재 시스템은 설치 직후의 상태라서, 필요한 프로그램의 설치도 같이 표시해 둘 예정입니다.
Prerequisites
PHP
- sudo nala install php8.2-fpm
- sudo nala install php8.2-curl php8.2-gd php8.2-intl php8.2-mbstring php8.2-mysql php8.2-xml
- sudo nala install php-luasandbox
MariaDB
- sudo nala install mariadb-server
처음 설치 후 작업.
- sudo mysql_secure_installation
데이터베이스 만들기.
- sudo 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
- sudo nala install redis-server php-redis
Nginx
다음 패키지를 설치하십시오.
- sudo nala install libnginx-mod-http-geoip libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream libnginx-mod-stream-geoip nginx nginx-common nginx-core
MediaWiki Installations
이전 문서들과는 다르게, 미디어위키 코어, 확장, 및 스킨을 모두 master 버전을 사용할 것이라서, 최초에 모든 것을 git로 가져와야 합니다. 나중에 업데이트에서도 모든 부분을 git로 업데이트를 진행할 예정이므로, 귀찮은 작업을 줄이기 위해, 약간의 스크립트가 필요할 수 있습니다.
먼저, 코어를 가져옵니다
- cd /var/www/html
- sudo git clone --depth 1 https://gerrit.wikimedia.org/r/mediawiki/core.git w
그런-다음 스킨과 확장은 개별적으로 하나씩 다운로드해야 합니다. 사실, 주로 사용하는 스킨은 Vector, MinervaNeue 정도이고, Timeless를 문제/해결에 사용하기 위해 받아둘 필요가 있습니다.
- cd w/skins
- sudo git clone --depth 1 https://gerrit.wikimedia.org/r/mediawiki/skins/Vector
- sudo git clone --depth 1 https://gerrit.wikimedia.org/r/mediawiki/skins/MinervaNeue
- sudo git clone --depth 1 https://gerrit.wikimedia.org/r/mediawiki/skins/Timeless
이제 확장을 받아야 하는데, 보통 확장은 자신이 필요한 것이 무엇인지 먼저 확인을 해야 합니다. 1.36 버전에서 번들로 제공하는 확장은 위에서 소개한 문서에서 확인할 수 있습니다. 먼저 필요한 확장을 줄마나 하나씩 씁니다:
- cd ../extensions
- sudo gvim extension.list
줄마다 읽어서 확장을 가져오는 스크립트를 만듭니다.
- sudo gvim extension_install.sh
#!/bin/bash
while read LINE; do
echo $LINE
git clone --recurse-submodules --depth 1 https://gerrit.wikimedia.org/r/mediawiki/extensions/$LINE
sleep 3
done < extension.list
실행 권한을 주고, 실행합니다:
- sudo chmod +x extension_install.sh
- sudo ./extension_install.sh
확장 중에 master 가지를 사용하면 추가적인 외부 라이브러리가 필요한 것들이 있으며. 각 확장 지면에서 확인할 수 있습니다. 그것들은 해당 확장 가져올 때, 확인하는 것이 비효율적이므로, 하나의 파일에서 관리할 수 있습니다. 예제 파일은 이미 제공하고 있기 때문에, 해당 파일을 복사한 후, 예를 들어, 필요한 Flow 확장 등을 기록해 두어야 합니다.
- cd ..
- sudo cp composer.local.json-sample composer.local.json
이제, master 가지를 사용함으로 인해서 필요한 코어와 확장 외부 라이브러리를 다운로드합니다:
- sudo composer update --no-dev
미디어위키 코어와 스킨, 그리고 필요한 확장을 업데이트하는 스크립트를 만듭니다. 이 파일은 해당 디렉토리로 이동해서 git pull만 실행하면 되기 때문에, 별도로 내용을 제공하지는 않습니다:
- sudo gvim mediawiki_update.sh
그리고 확장 디렉토리에서 extension_update.sh 스크립트를 만듭니다.
- cd extensions
- sudo gvim extension_update.sh
이것도 해당 디렉토리로 이동해서 git pull만 실행하기 때문에 별도로 제공하지 않고, 위의 스크립트를 참조하십시오.
이제 설치를 시작합니다!!
웹에서 설치하는 과정은 MediaWiki#Setup을 참조하십시오. 그리고, Nginx 설정 파일은 이 파일을 받으셔서 사용하시고, 일부 필요한 부분을 수정하셔야 합니다.
설치를 진행하기 전에 위에서 받은 nginx 설정 파일을 일부 수정해야 합니다. 먼저, nginx 설정 파일을 /etc/nginx/sites-available/로 옮기고, 다음 줄을 찾아서 아래와 같이 주석처리합니다:
#location /w/mw-config { deny all; }
다음으로, pagespeed를 설정하시기 귀찮으시면, 맨 아래에 있는 다음 줄을 아래와 같이 주석처리합니다.
#include pagespeed/optimize.conf;
다음으로, /etc/nginx/snippets/fastcgi-php.conf 파일에서 다음 줄을 주석처리합니다.
#try_files $fastcgi_script_name =404;
마지막으로, php7.4를 php8.2로 수정하십시오.
이제 서비스를 재시작합니다:
- sudo systemctl restart nginx
이때, 서비스에서 문제가 발생할 수 있습니다. 그럴 때에는 status를 확인해서, 필요한 사항을 바로잡고 서비스를 시작해야 합니다.
- sudo chown -R root:root /var/www/html/w
- 웹브라우저로 http://localhost/w/mw-config/로 접근해서 설치를 진행하십시오.
다음으로 업로드 디렉토리 사용자와 허가권을 변경해야 합니다.
- cd /var/www/html/w
- sudo chmod 775 images cache
- sudo chown root:www-data images cache
- sudo cp /home/user/Downloads/LocalSettings.php .
아직 위키를 시작하지 마시고, 아마도 오류가 있을 것이므로, 아래 과정을 진행한 후에 특정 부분에서 위키를 시작하십시오.
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;
소스 가져오기
간혹 다른 곳의 템플릿(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
설치 중에 master 가지에서 다운받은 확장 목록을 선택했으면, 예를 들어, 아래와 같이 로딩이 되어 있을 것입니다.
wfLoadExtension( 'CategoryTree' );
wfLoadExtension( 'Cite' );
wfLoadExtension( 'CiteThisPage' );
wfLoadExtension( 'CodeEditor' );
wfLoadExtension( 'ConfirmEdit' );
wfLoadExtension( 'Gadgets' );
wfLoadExtension( 'ImageMap' );
wfLoadExtension( 'InputBox' );
wfLoadExtension( 'Interwiki' );
wfLoadExtension( 'MultimediaViewer' );
wfLoadExtension( 'Nuke' );
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' );
가능한 필요한 확장만 먼저 사용하시고, 진행하십시오. 확장 중에 데이터베이스를 변경하는 것들이 있을 수 있기 때문에 그것부터 먼저 처리합니다:
- cd /var/www/html/w
- ./maintenance/run ./maintenance/update.php --wiki=위키이름
이때, 위키이름은 설치 중에 사용한 이름이고, 설정 파일에 기록되어 있습니다.
검색 개선
먼저, Elasticsearch에 대한 기사를 참고해서 다운로드 받은 후에 설치하십시오. 그리고, 자바는 다움 위키에서 제공하는 패키지를 이용하거나, 다른 곳에서 배포하는 deb 파일을 사용하거나, jre 다운로드 페이지에서 최근 버전을 받아서 사용할 수 있습니다.
제대로 동작하지 않을 경우 해당 지면의 설정을 확인하십시오.
AdvancedSearch, Elastica, CirrusSearch를 설치하십시오.
wfLoadExtension( 'AdvancedSearch' );
wfLoadExtension( 'Elastica' );
wfLoadExtension( 'CirrusSearch' );
$wgDisableSearchUpdate = true;
인덱스 생성.
- cd /var/www/html/w
- ./maintenance/run ./extensions/CirrusSearch/maintenance/UpdateSearchIndexConfig.php
위의 설정에서 $wgDisableSearchUpdate = true; 주석처리하십시오.
다음으로 다음을 실행하여 검색 인덱스를 부트스트랩합니다:
- ./maintenance/run ./extensions/CirrusSearch/maintenance/ForceSearchIndex.php --skipLinks --indexOnSkip
- ./maintenance/run ./extensions/CirrusSearch/maintenance/ForceSearchIndex.php --skipParse
설정 파일에 $wgSearchType = 'CirrusSearch';를 추가하십시오.
필요하다면, Extension:CirrusSearch#Completion_Suggester를 설정하십시오. 어렵지 않으니, 가능한 설정하십시오.
여기까지 작업하고, 위키로 접근하니 정상적으로 접근이 되었습니다.
미디어위키에서 제공하는 기본 로고가 표시될 것이므로, 로고를 만들거나, 다움위키에서 사용하는 것처럼 MediaWiki/Troubleshootings#Wordmark_제작를 참고하셔서 워드마크로 제작해서 사용할 수 있습니다.
추가 작업 없이, 시각 편집기 동작하고, 수식 출력 가능합니다. 이전 문서를 참조하셔서 추가적인 설정이 필요할 수 있습니다.
RESTBase & Mathoid
로컬에서 두 서비스는 각각 작동하는 것처럼 보이고, 서비스가 연결된 것처럼 보이지만, 실제 수식 표현에서는 RESTBase에 연결하지 못한다는 메시지가 출력됩니다.
이 문제는 bookworm에서 trixie로 업그레이드한 시스템에서 두 서비스가 잘 작동하고 문제 없이 수식 출력을 하기 때문에, 어떤 부분의 오류인지 확인하기 어려웠습니다. 더구나, 여기 저기 메시지 출력도 문제를 특정하기에 어려웠습니다.
어쨌든, 이 문제는 node 버전에 기인합니다. 따라서, Node.js에 설명된 것처럼, node LTS-버전 16을 설치해서 서비스를 기동하면, 이상없이 수식 출력을 할 것입니다.
한편, restbase 설치 시에, sqlite 노드 모듈이 컴파일되지 않을 수 있습니다. 이 경우에는 cassandra-3.x 버전을 테이블 backend로 사용해야 하고, 카산드라를 설치하기 위해 python-2.7을 bullseye에서 제공되는 버전으로 설치해야 할 것입니다. 물론, 다른 의존성 패키지도 bullseye에서 제공하는 버전을 설치할 수 있습니다.
미디어위키 개발자 버전 (1.41), RESTBase 개발자 버전, 카산드라 4.1.2, 자바-8으로 작동합니다. 자바-11에서도 작동할 것으로 기대되지만, 작동하지 않을 수 있고, 어쨌든, 파이썬-2를 별도로 설치할 필요가 없습니다.
또한, 이전 문서에서의 설정으로 동작하지 않을 때, 미디어위키 알파 버전에서 RESTBase와 Mathoid 설정을 추가해야 할 수 있습니다.
Usage
사실, 이것마저 귀찮은 분들이 있을 것입니다. 그런 분들은 코어, 스킨, 확장, 데이터베이스, 외부 라이브러리 등의 업데이트 스크립트를 만들어서 매주 화요일 12:00 쯤에 크론으로 실행해 두면, 스냅샷 업데이트없이 최신의 미디어위키 개발자 버전을 계속 사용할 수 있습니다.
문제점/해결책
- 어떤 경우에는 composer.lock 파일이 존재하면, 외부 라이브러리 업데이트가 이루어지지 않을 수 있습니다. 그냥, 외부 라이브러리 업데이트 전에 제거하고 시작할 수 있습니다.
- 어떤 경우에는 시각 편집기를 완전히 새롭게 다운로드해야 할 수 있습니다. 확장 목록에서 제거하고 맨 아래쪽에 해당 디렉토리를 지우고 새롭게 다운로드하도록 처리해 줄 수 있습니다.