GNU socialのインストール

提供: Akionux-wiki
Share/Save/Bookmark
2017年4月15日 (土) 15:20時点におけるAkionux (トーク | 投稿記録)による版 (Webインターフェース)

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索

概要

GNUsocial(旧称: StatusNet)はTwitterのようなマイクロブログサイトのサービスを提供してくれるソフトウェアである。 もちろん同じインスタンス(サーバー)内のユーザー同士でフォローし合うことができるが、異なるインスタンスに属するユーザー同士でもフォローし合うことができる(リモートフォロー)。 実は、GNUsocialはOStatusというプロトコルを使っていて、このOStatusを使っている他のマイクロブロギングソフトウェア(Mastodon, Diaspora, Friendica, Hubzillaなど)のインスタンスのユーザーともフォローし合うことができるのである。 それゆえ、OStatusのプロトコルを持つマイクロブロギングソフトウェアのインスタンス達は、一つのサーバーやサービスに依存することなく各インスタンスが自立していて、さらに互いに連合(federation)を組んでいることになる。

このマイクロブロガー連合を築くことこそが、TwitterやFacebookのような中央集権化された(centralized)サービスから離脱し、脱中央集権化(decentralize)するということである。

GNUsocialインスタンスは多数あり(これも一例である)、ユーザー登録の可否・招待制、1クイップ(投稿のこと。Twitterで言うツイート)当たりの最大文字数、どのプラグインを有効にしているか、規制の基準など設定は各インスタンスによる。 ほとんどが管理者の私費で運営されているものと思われる。

GNUsocialはフリーソフトウェア(ライセンスはGNU Affero General Public License Version 3)なので、ソースコードは公開されていて、もちろん自分でインスタンスを立てることもできる。

インターネット上にGNUsocialインスタンスは多数あり、例えばfediverse.orgに一覧がある。 仕様をカスタマイズしたい、またはもっと自由に発言をしたいならば、自分でインスタンスを立てるのがよいだろう。

ここでのインストールの流れはINSTALL[1]に従った。

なお後にも述べるが、インスタンスを公開する前に、fancyURLsの設定とhttpsアドレスの強制をしておいたほうが良い。というのも、インスタンスのユーザは別のインスタンスにユーザのURLを登録されるので、URLを登録された後に変更してしまうと修正が困難でいろいろと面倒なことになってしまう可能性があるからである。

参考リンク

連合、脱中央集権、GNU SocialやMastodonなどOStatus準拠のマイクロブロギングソフトウェアの仕組みと考え方、それらについての巷の記事の誤解などを解説している。
GNU Socialとは何か、連合(federation)と脱中央集権化(decentralize)、GNU Socialの歴史などがよくまとめられている。
世界のGNU Socialのインスタンス一覧。一覧にないインスタンスを登録することもできる。
GNU Socialに限らずSNSインスタンスを立てる場合には、電気通信事業法をチェックしておくと良い。

テスト環境

Slackware Linux x86_64 14.1

2015年12月20日ごろに公式Gitリポジトリからクローンしてインストールしたときの記録。

Requirements

基本的には次の3つ:

  • PHP
  • MariaDB
  • Web server(Apache, lighttpdまたはnginx)

PHP

PHPは5.5以上である必要があり、slackware-14.1ではPHPのバージョンが5.4.43なので、アップグレードする必要がある。

そこで、slackware-14.1のソースコードからパッケージを作る。 phpのビルドにはalpinのSlackbuildも必要なので、以下のようにダウンロード:

mkdir alpin
cd alpin
wget ftp://ftp.slackware.com/pub/slackware/slackware64-14.1/source/n/alpine/*
cd ..
mkdir php
wget ftp://ftp.slackware.com/pub/slackware/slackware64-14.1/source/n/php/*
cd php

php-5.5.305.6.16.tar.xz[note 1]をダウンロードし、5.4.20は消す:

w3m http://jp2.php.net/get/php-5.6.16.tar.xz/from/this/mirror
rm -f php-5.4.20.tar.xz

slackware64-compat32を使っている場合は、alpin.SlackBuild./configureの後(88行目あたり)に次の2行を追加(たぶんもう少し良いやりかたがあると思う)

sed -i Makefile -e 's/usr\/lib/usr\/lib64/g'
sed -i pico/Makefile -e 's/usr\/lib/usr\/lib64/g'

実行権限を与える

chmod +x php.SlackBuild
chmod +x ../alpin/alpin.SlackBuild

SlackBuild実行

sudo ./php.SlackBuild

インストール

sudo /sbin/upgradepkg /tmp/php-5.6.16-x86_64-1.txz

ちなみに、phpをアップグレードすると、MediaWikiが動かなくなった。詳細と解決方法は#PHP 5.4のAPCを使っていた場合を参照。

ダウンロード

gitよりダウンロードして、適当な場所に置く(ここでは、/var/lib/gnusocialとした):

git clone https://git.gnu.io/gnu/gnu-social.git
mv gnu-social /var/lib/gnusocial

MariaDBの設定

新しいデータベースsocialを作成

mysqladmin -u "root" -p create social

mysqlsocialデータベースのユーザー・パスワードを設定。

mysql -u root -p
GRANT ALL on social.* TO 'social'@'localhost' IDENTIFIED BY 'agoodpassword';
quit;

必要なフォルダの作成

Webサーバーのユーザー(ここでは、apacheとする)で書き込める次の3つフォルダを作る:

su apache
mkdir /var/gnusocial/avatar
mkdir /var/gnusocial/background
mkdir /var/gnusocial/file

ページにアクセスして設定

自分のgnusocialのページ(例えば、http://domainname.com/gnusocial/)にアクセスし、インストールがうまくいっていれば初期設定ができる。 サイトの名前、ホスト名(localhost)、データベース名(social)、ユーザー名(social)などを入力する。 これでとりあえず動くようになる。

fancy URLsの設定

gnusocialのデフォルトでは、social.example.netにあるgnusocialのユーザーfredのhome profileは

https://social.example.net/index.php/fred

または

https://social.example.net/index.php?p=fred

というURLになるが、"fancy URLs"というのはそれを

https://social.example.net/fred

というようにしても良くする設定である。 デフォルトではfancy URLsは設定されないようだが、特別な理由のない限りはできるだけ設定すべきである。注意すべきは、インスタンスを公開する前にfancy URLsの設定をすることである。というのも、fancy URLs設定前に公開してしまうとfancy URLs未設定のURLでユーザやグループが別のインスタンスに登録されてしまって、後にそれを修正することが困難になるためである。 Apache 2.xでは.htaccessが使える状態にした上で、htaccess.sample.htaccessにコピーすればよい:

 cp htaccess.sample .htaccess

lighttpdとnginxの設定ファイルもあるようだ。

パフォーマンスのための設定

OPCache

パフォーマンスを良くするために、PHPでOPCacheを有効化する。 環境によるが、/etc/php.iniまたは/etc/php/opcache.iniなどで設定が必要。 例[2][3]:

zend_extension=opcache.so
[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1

schemacheck

gnusocialのフォルダにあるconfig.phpでschemacheckを有効化する[4]:

// Uncomment below for better performance. Just remember you must run
// php scripts/checkschema.php whenever your enabled plugins change!
$config['db']['schemacheck'] = 'script';

queuedaemon

GNU socialがOStatusの投稿を配信したり、TwitterBridgeでTwitterに投稿したりという仕事はMySQLキューに入れられて、オフラインで動くbotにより実行される。 デフォルトではOpportunisticQMプラグインがキューの仕事をするが、HTTPリクエストの間にできる限りのことをやるだけなので配信が非常に遅い。 そこで、高速なキューの処理のためにはqueuedaemonというデーモンを有効にしておく必要がある。 まず、コマンドラインインターフェース(CLI)バージョンのPHPがインストールされていて、かつ/etc/php5/cli/php.inipcntl_fork, pcntl_wait, pcntl_wifexited, pcntl_wexitstatus, pcntl_wifsignaled, pcntl_wtermsigdisable_functionsに列挙されていて無効にされていないことを確認しておく。

config.phpに以下の行を追加する:

$config['queue']['daemon'] = true;

スクリプトフォルダにあるstartdaemons.shを実行すると、queuedaemonが動きだす。

scripts/startdaemons.sh

このデーモンを止めるには、

scripts/stopdaemons.sh

を実行する。

queuedaemonは、gnusocialの動いているサーバとは別のマシンで実行することもできるようだ。詳細は公式のINSTALLを参照。

MySQLよりパワフルで軽量なキュー実行としてRabbitMQを使う方法もあるらしく、次のページで解説されている。

プラグイン

プラグインの使い方はPLUGINS.txt[5]に書いてある。

TwitterBridge

How to connect your GnuSocial with Twitter » talkplusを参考にして、プラグインTwitterBridgeを有効にしてみたメモ。

  1. https://apps.twitter.com/ にアクセスして、Twitterにログインしてなければログインする。
    1. Name : アプリケーション名。できるだけユニークな名前にする。
    2. Description : アプリケーションの説明。
    3. Website : 自分のGnuSocialページのアドレスを入れる。
    4. "Developer Rules of the Road"を良く読んで確認する。
    5. "Create"をクリック。
  2. access tokenを作る。
  3. API KeyとAPI secretをメモる。
  4. gnusocialディレクトリにあるconfig.phpに次のように追記:
addPlugin(
        'TwitterBridge',
        array(
                'consumer_key'  => '<API Key>',
                'consumer_secret' => '<API secret>'
        )
);

あとは、gnusocialの自分のアカウントで、Setting > Twitter > Connect my Twitter account > Validateに行ってTwitterと接続する。

InfiniteScroll

表示しているページの一番下のステータスまで行ったら、自動的に次のページのステータスを読み込むようにするためのプラグイン。以下の行をconfig.phpへ追記することで有効化できる。

addPlugin('InfiniteScroll');

Webインターフェース

Qvitter

QvitterはGNU socialのインターフェースを拡張してくれる。これでインターフェースがTwi**er風になる。 pluginsディレクトリへgit cloneする:

cd /path/to/gnusocial/plugins
git clone https://git.gnu.io/h2p/Qvitter.git

あとは、config.phpに以下の設定を追記:

// Qvitter
addPlugin('Qvitter');
// Qvitter-settings
$config['site']['qvitter']['enabledbydefault'] = true;
$config['site']['qvitter']['defaultbackgroundcolor'] = '#f4f4f4';
$config['site']['qvitter']['defaultlinkcolor'] = '#0084B4';
$config['site']['qvitter']['timebetweenpolling'] = 5000;
//$config['site']['qvitter']['urlshortenerapiurl'] = 'http://qttr.at/yourls-api.php'; // if your site is on HTTPS, use url to shortener.php here
//$config['site']['qvitter']['urlshortenersignature'] = 'b6afeec983';
$config['site']['qvitter']['sitebackground'] = 'img/vagnsmossen.jpg';
$config['site']['qvitter']['favicon'] = 'img/favicon.ico?v=4';
$config['site']['qvitter']['sprite'] = Plugin::staticPath('Qvitter', '').'img/sprite.png?v=40';
$config['site']['qvitter']['enablewelcometext'] = true;
// $config['site']['qvitter']['customwelcometext']['sv'] = '<h1>Välkommen till Quitter.se – en federerad<sup>1</sup> mikrobloggsallmänning!</h1><p>Etc etc...</p>';
// $config['site']['qvitter']['customwelcometext']['en'] = '<h1>Welcome to Quitter.se – a federated microblog common!</h1><p>Etc etc...</p>';
$config['site']['qvitter']['blocked_ips'] = array();

// Recommended GNU social settings
$config['thumbnail']['maxsize'] = 3000; // recommended setting to get more high-res image previews
$config['profile']['delete'] = true; // twitter users are used to being able to remove their accounts
$config['profile']['changenick'] = true; // twitter users are used to being able to change their nicknames
$config['public']['localonly'] = true; // only local users in the public timeline (qvitter always has a timeline for the whole known network)
addPlugin('StoreRemoteMedia'); // makes remote images appear in the feed

qttr.atに迷惑がかかるので、url短縮機能はここでは無効にしておいた。自前でURL短縮をする場合は、短いドメインを買って、YOURLSを使うと良いと思われる。

Qvitterによるミュート、サンドボックス、サイレンス

Qvitterはユーザーの投稿に規制をかけるためにミュート、サンドボックス、サイレンスという機能が提供されている。

  • ユーザー単位での規制
ブロック(GNU socialの機能)
ブロックはQvitterではなくGNU socialにある機能で、基本的に同じインスタンスのユーザーに対するブロックが想定されている。Qvitterでは/ユーザー名/blocksでブロックしているユーザー一覧が見える。
ミュート
ユーザーのタイムラインから、ミュートしたユーザーを隠す。お知らせページの歯車のメニューにある"ミュートしたユーザーからのお知らせを隠す"を選択しなかったユーザー以外からは、まだお知らせを受け取る。Qvitterでは/ユーザー名/mutesでミュートしているユーザー一覧が見える。
  • インスタンス単位での規制
サンドボックス
サンドボックスされたユーザーからのクイップは「パブリックタイムライン」および「関連ネットワーク全体」から除外される。アンサンドボックスされたユーザーのサンドボックス期間中に投稿されたクイップはパブリックタイムラインに含まれない。Qvitterでは/main/sandboxedでサンドボックスされているユーザー一覧が見える。
サイレンス
サイレンスされたユーザーはログインおよびクイップの投稿ができなくなり、そのユーザーの既に投稿されたクイップは非表示になる。ローカルユーザーにとっては復旧可能な削除のような状態で、リモートユーザーにとっては全サイトでブロックされているような状態になる。Qvitterでは/main/silencedでサイレンスされているユーザー一覧が見える。

ブロック以外はQvitter上のみで有効なので、クライアントソフトウェアには適用されないと思われる。

pleroma-fe

pleroma-feはGNU socialのWebインターフェースの一つ。 nodejsが必須である。SlackBuildsではdevelopment/nodejsにあるが、nodeがインストールされていると競合してうまく動かないので、nodeはアンインストールしておく。 インストール

npm install

プロダクションビルド

npm run build

しかし、足りないパッケージがあるようなので手動でインストール

npm install babel-loader
npm install babel-runtime

再びbuild

npm run build

あとは、Webサーバの設定である。 ここでは、pleromaのファイルを/srv/pleroma.yourdomain.netに置き、pleroma.yourdomain.netにpleroma用のドメインがあって、もう一つのドメインgnusocial.yourdomain.netにGNU socialが動いているものとして、pleroma.yourdomain.netからgnusocial.yourdomain.netへフォーワードプロキシすることで実現する(公式[6]のMethod 2)ためのApache2の設定例を載せる。

# pleroma-fe
# rewrite http to https
<VirtualHost *:80>
        DocumentRoot /srv/pleroma.yourdomain.net
        ServerName pleroma.yourdomain.net
        ErrorLog /var/log/httpd/pleroma.yourdomain.net-error_log
        CustomLog /var/log/httpd/pleroma.yourdomain.net-access_log common
        <IfModule rewrite_module>
        RewriteEngine On
        RewriteCond %{SERVER_PORT} 80
        RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R]
        </IfModule>
</VirtualHost>
<VirtualHost *:443>
        DocumentRoot /srv/pleroma.yourdomain.net
        ServerName pleroma.yourdomain.net:443
        ErrorLog /var/log/httpd/pleroma.yourdomain.net-error_log
        CustomLog /var/log/httpd/pleroma.yourdomain.net-access_log common

        SSLProxyEngine On
        ProxyPass /api/ https://gnusocial.yourdomain.net/api/

        <IfModule dir_module>
                DirectoryIndex index.html
        </IfModule>
        <Directory /srv/pleroma.yourdomain.net>
                Options +FollowSymLinks
                AllowOverride All
                Require all granted
        </Directory>

        #SSL Engine Switch:
        #Enable/Disable SSL for this virtual host.
        SSLEngine on

        #   Server Private Key:
        #   If the key is not combined with the certificate, use this
        #   directive to point at the key file.  Keep in mind that if
        #   you've both a RSA and a DSA private key you can configure
        #   both in parallel (to also allow the use of DSA ciphers, etc.)
        SSLCertificateFile "/etc/letsencrypt/live/yourdomain.net/cert.pem"
        SSLCertificateKeyFile "/etc/letsencrypt/live/yourdomain.net/privkey.pem"
        SSLCertificateChainFile "/etc/letsencrypt/live/yourdomain.net/chain.pem"
</VirtualHost>

メンテナンス

ログ

gnusocialのログは主にsyslogに出力するみたいです[7]

アップグレード

まずデーモンを止めるスクリプトを実行:

bash scripts/stopdaemons.sh

gitでpullしたりcheckoutしたりする:

git pull origin master

再びデーモンを起動する:

bash scripts/startdaemons.sh

ドキュメント・マニュアル

クライアント

参考: en:gnusocial:clients [GNUsocial.de Wiki] https://wiki.gnusocial.de/start?id=en:gnusocial:clients#which_clients_are_there_around

GNU/Linux

Windows

Android

その他

英語以外の言語で表示する

gnusocialのディレクトリでmakeを実行:

make

ユーザーのページの"Settings"->"Language"で"Japanese"または表示したい言語を選択する。

PHP 5.4のAPCを使っていた場合

ここでは、gnu-socialのインストールとは関係ないが、PHPのバージョンを5.5以上にしたことによってキャッシングを有効にしていたMediawikiで起きた問題の解決について書いた。

phpをアップグレードすると、MediaWikiがFatal exception of type MWExceptionというエラー[8]を出したので、LocalSettings.php

require_once( "$IP/extensions/LocalisationUpdate/LocalisationUpdate.php" );

を追記して詳細確認すると、どうやらキャッシュが問題を起こしているらしいことがわかった。

Mediawikiのキャッシングで用いていたAPC(Alternative PHP Cache)はバイトコードキャッシングおよびオブジェクトキャッシングによりPHPを高速化するものである。 PHP 5.5.0からPHPがバイトコードキャッシングするためのOPcacheというのを持つようになったのだが、OPcacheはオブジェクトキャッシングができないにもかかわらずAPCが無くなったらしい。そこで、APCuというので無くなってしまったAPCの機能を補うことになるそうだ[9]

ゆえに、この問題はAPCuをインストールすることで解決できる。 SlackBuildsにはAPCuがある。新しいバージョンのPHPをインストールした後(インストールされているPHPのバージョンに基づいてビルドするため)、development/php-apcuをインストールする。

それから忘れてはいけないのが、APCuをインストールした後、php.iniまたはその他phpの設定ファイル(例えば、/etc/php/apc.iniのapcを読み込んでいる箇所:

extension=apc.so

を次のように書き換える:

extension=apcu.so

Firefoxで表示しているページをGNUSocialへ投稿するFirefox Add-on

Note

  1. バージョン5.5.30はGNUsocialの動作自体には問題はないのだが、私の環境ではMediawikiを動かしていてPHP Bug #70150にて報告されているバグと同様の現象が起きてMediawikiが動かなくなったため、5.6.16にした。

References

  1. https://github.com/foocorp/gnu-social/blob/master/INSTALL
  2. PHP 5.5 から導入された Zend OPCache を設定 | Check!Site http://www.checksite.jp/php55-zend-opcache/
  3. PHP: Installation - Manual http://www.php.net/manual/en/opcache.installation.php
  4. http://quitter.se/notice/4390330
  5. gnu-social/PLUGINS.txt at master · foocorp/gnu-social https://github.com/foocorp/gnu-social/blob/master/PLUGINS.txt
  6. Dual boot with qvitter · Wiki · lambadalambda / pleroma-fe · GitLab https://gitgud.io/lambadalambda/pleroma-fe/wikis/dual-boot-with-qvitter X-Forwarded-For
  7. gnu.io / gnu-social | GitLab https://git.gnu.io/gnu/gnu-social
  8. mediawiki - Fatal exception of type MWException - Stack Overflow http://stackoverflow.com/questions/17824295/fatal-exception-of-type-mwexception#19357795
  9. Manual:APC - MediaWiki https://www.mediawiki.org/wiki/Manual:APC