GNU social にアクセスするとなにも表示されなくなって困る

gnusocial

さっきまでは動いていたのにウェブブラウザ(qutebrowser)のバージョンアップに追従するために再起動して,自分用 GNU social にアクセスすると画面が真っ白です><
スマートフォンのアプリ経由(Twidere)だと動作しているので表示周りの問題でしょうか?

config.php
$config['site']['logfile'] に指定しているログファイルを確認するとこんなメッセージがありました.

2019-03-22 14:35:28 LOG_DEBUG: [gnusocial.matoken.org:29424.bda9531d GET /] action.php - Server error '500' on 'qvitter': Class 'Locale' not found
2019-03-22 14:35:28 LOG_ERR: [gnusocial.matoken.org:29424.bda9531d GET /] Handled serverError (500) but cannot output into desired format (NULL): 'Class \'Locale\' not found'
2019-03-22 14:35:28 LOG_ERR: [gnusocial.matoken.org:29424.bda9531d GET /] ServerErrorAction: 500 Class 'Locale' not found

このあたりで使おうとしているよう

$ find plugins/Qvitter -type f -print0 | xargs -0 grep -n Locale
plugins/Qvitter/actions/qvitter.php:341:                    window.usersLanguageNameInEnglish = <?php print json_encode(Locale::getDisplayLanguage($user_browser_language, 'en')) ?>;
plugins/Qvitter/actions/qvitter.php:462:                                                $languagecodesandnames[$lancode]['english_name'] = Locale::getDisplayName($lancode, 'en');
plugins/Qvitter/actions/qvitter.php:463:                                                $languagecodesandnames[$lancode]['name'] = Locale::getDisplayName($lancode, $lancode);

これが見つからないか存在しない状態のようです.

それらしいpackage を探して,

$ apt-cache search ^php international
php-horde-idna - IDNA backend normalization package
php-horde-ingo - An email filter rules manager
php-intl - Internationalisation module for PHP [default]
php-net-idna2 - PHP Pear module for handling international domain names
php-symfony-translation - tools to internationalize an application
php7.2-intl - Internationalisation module for PHP
phpmyadmin - MySQL web administration tool
php7.0-intl - Internationalisation module for PHP
$ apt show php-intl
Package: php-intl
Version: 1:7.2+60ubuntu1
Priority: optional
Section: universe/php
Source: php-defaults (60ubuntu1)
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 12.3 kB
Depends: php-common, php7.2-intl
Download-Size: 2,012 B
APT-Sources: http://jp.archive.ubuntu.com/ubuntu bionic/universe amd64 Packages
Description: Internationalisation module for PHP [default]
 This package provides a Internationalisation module for PHP.
 .
 PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used
 open source general-purpose scripting language that is especially suited
 for web development and can be embedded into HTML.
 .
 This package is a dependency package, which depends on Ubuntu's default
 PHP version (currently 7.2).

導入することで解決しました.

sudo apt-get install php7.2-intl

恐らく php のバージョンを上げたときに漏れてしまい,API などは問題なく使えていたのでウェブブラウザを再起動するまで気づかなかった感じのようです.

しかし,GNU social はこういう警告をよく見かけるのでどうにかしないといけないですね.開発は滞っている感じなので Pleroma あたりに移行するのがいいんでしょうが…….

this will throw an Error in a future version of PHP

環境

$ dpkg-query -W php7.2-intl
php7.2-intl     7.2.15-0ubuntu0.18.04.1
$ w3m -dump https://gnusocial.matoken.org/nodeinfo/2.0|jq .software
{
  "name": "gnusocial",
  "version": "1.2.0-beta5"
}
$ lsb_release -d
Description:    Ubuntu 18.04.2 LTS
$ uname -m
x86_64

GNU socialでNodeInfoを有効にする

GNU socialのIssueで気になるものが.

インスタンス情報を確認できるエンドポイントがあると便利だよねってIssueでそれを実現する以下のプラグインが紹介されていました.

これがなくても以下で補足されているようですが,もっと簡単に情報を提供できそうです.

入れてみました.

$ git clone https://github.com/chimo/gs-nodeinfo
$ sudo -u www-data rsync -avn --exclude="gs-nodeinfo/.git/" ./gs-nodeinfo /var/www/gnusocial.matoken.org/plugins/
$ sudo -u www-data rsync -av --exclude="gs-nodeinfo/.git/" ./gs-nodeinfo /var/www/gnusocial.matoken.org/plugins/
$ sudo mv /var/www/gnusocial.matoken.org/plugins/gs-nodeinfo /var/www/gnusocial.matoken.org/plugins/Nodeinfo
$ echo 'addPlugin('Nodeinfo');' | sudo tee -a /var/www/gnusocial.matoken.org/config.php 
addPlugin(Nodeinfo);

とりあえず動かしてみます.

$ w3m -dump https://gnusocial.matoken.org/.well-known/nodeinfo
{"links":[{"rel":"http:\/\/nodeinfo.diaspora.software\/ns\/schema\/2.0","href":"https:\/\/gnusocial.matoken.org\/nodeinfo\/2.0"}]}

見にくいのでjqに食わせてみます.

$ w3m -dump https://gnusocial.matoken.org/.well-known/nodeinfo|jq
{
  "links": [
    {
      "rel": "http://nodeinfo.diaspora.software/ns/schema/2.0",
      "href": "https://gnusocial.matoken.org/nodeinfo/2.0"
    }
  ]
}

詳細情報も.こちらは10秒くらい掛かります.

$ w3m -dump https://gnusocial.matoken.org/nodeinfo/2.0|jq
{
  "version": "2.0",
  "software": {
    "name": "gnusocial",
    "version": "1.2.0-beta5"
  },
  "protocols": [
    "ostatus"
  ],
  "services": {
    "inbound": [
      "atom1.0",
      "rss2.0",
      "gnusocial"
    ],
    "outbound": [
      "atom1.0",
      "rss2.0",
      "twitter",
      "gnusocial"
    ]
  },
  "openRegistrations": false,
  "usage": {
    "users": {
      "total": 5,
      "activeHalfyear": 2,
      "activeMonth": 1
    },
    "localPosts": 3448,
    "localComments": 427
  },
  "metadata": {}
}

使われるかわからないけどとりあえず.

自分用GNU socialのタイムラインの反映がとても遅くなって困る

自宅のPCでGNU social(nightly)を動かしているのですが,ふと気づくとタイムラインの最新が30分ほど前になっています.自分の投稿も他のMastodonインスタンスなどに反映されていません.
ログ(config.phpの$config['site']['logfile']で設定してあるもの)を見ると怪しそうなのはこの辺.

2018-02-18 22:46:31 LOG_ERR: [gnusocial.matoken.org:8923.6a16ed84 GET /api/statuses/public_and_external_timeline.json?since_id=312334&count=20] OpportunisticQueueManager: [mirror:Notice 221617] Exception (ServerException) thrown: '[SubMirror] DB_DataObject error []: DB Error: no such table'

DB Error: no such table?最近アップデートもプラグインの追加などもした覚えがないので関係あるかわかりません.連合からの投稿も次々届いているし,遅いながらもタイムラインは更新されているので捌ききれていない?とQueueDaemonを増やしてみました.

daemonを一旦停止して,

$ sudo -u www-data scripts/stopdaemons.sh 

config.phpに以下を追加,

$config['queue']['threads'] = 8;

再度daemonを実行

$ sudo -u www-data scripts/startdaemons.sh 

前(cpu coreから2threadsだった)から変わった感じがしません.vmstatを見ても特に負荷も上がっていないようです.

log levelを上げてみようとconfig.phpに以下を設定してみましたが上のエラーと同じものしか見当たりません.

$config['site']['logdebug'] = true;

mysqlcheck --auto-repairを試しにかけてみましたが変わらず.

そういえばpluginを追加したとき等にカスタムテーブルのチェックをしてくれるscript(checkschema.php)があったなと試してみました.

$ sudo -u www-data scripts/stopdaemons.sh 
$ sudo -u www-data php scripts/checkschema.php
Constraint checking Notice table...
* notice_reply_to_fkey (reply_to => notice.id)
        Found 2 notices with reply_to NOT IN notice.id, reseting...DONE.
* notice_repeat_of_fkey (repeat_of => notice.id)
* notice_profile_id_fkey (profile_id => profile.id)
PHP Warning:  fopen(/var/log/gnusocial.log): failed to open stream: ???????? in /export/data/www/gnusocial.matoken.org/lib/util.php on line 1853
PHP Warning:  fopen(/var/log/gnusocial.log): failed to open stream: ???????? in /export/data/www/gnusocial.matoken.org/lib/util.php on line 1853
  :
PHP Warning:  fopen(/var/log/gnusocial.log): failed to open stream: ???????? in /export/data/www/gnusocial.matoken.org/lib/util.php on line 1853
PHP Warning:  fopen(/var/log/gnusocial.log): failed to open stream: ???????? in /export/data/www/gnusocial.matoken.org/lib/util.php on line 1853
Ensuring no NULL values for foreign keys in QvitterNotification...DONE.
Ensuring no dead profile or notice IDs are stored in QvitterNotification...DONE.
$ sudo -u www-data scripts/startdaemons.sh 

これが当たりだったようでDB errorは消えてタイムラインの流速も戻りました.
原因は不明のままなのがちょっと気持ち悪いですが,バックアップから原因を探すのも面倒なので多分放置です…….

GNU socialのQvitter pluginの背景画像を変更

imgp3854

他の連合でも大抵規定値の同じ背景だし外から来た時目立つしという感じでなんとなく変えたくなったので非ログイン状態のQvitterサイト背景画像を変更してみました.

/plugins/Qvitter/README.md から

$config['site']['qvitter']['sitebackground'] = 'img/vagnsmossen.jpg';

/plugins/Qvitter/img/画像.jpg のような感じで対象の画像を置いて,

/config.php にこんな感じで設定.

$config['site']['qvitter']['sitebackground'] = 'img/画像.jpg';

フルパスはOKだけどFlickrのurlを直に書いたらダメだった.

img/画像.jpg
/img/画像.jpg
/plugins/Qvitter/img/画像.jpg
https://farm1.staticflickr.com/58/230823787_1515cd477c_b.jpg

README.md の形式で書いておくのが無難でしょうね.

GNU social に Pleroma FE を導入してみる

OStatus の実装の一つに Pleroma というものがあります.

Mastodonともある程度APIの互換性があって一部のMastodon clientも利用できたりするらしいです. Elixir製で軽量,Raspberry Pi でも動くとのこと.ActivityPub に対応予定なのも良さそう.GNU social からの移行も出来るようになる予定とのことなのでこの辺りの実装が終わったら開発がとどおおっているように見える GNU social からの移行者が増えそうな気がします.( 自分はサブドメインに gnusocial とつけてしまったのを後悔.social とかにするんだった)

この辺の記事が参考になります.

Pleroma はバックエンドとフロントエンドが別れていて GNU social( + Qvitter Plugin ) と Pleroma FE(フロントエンド) という組み合わせが可能です.この Pleroma FE の導入は簡単そうなので既存の GNU social の上に導入してみました.

導入

導入は一番手軽そうな以下の手順を真似しました.

前提条件として,GNU social が動いていて Qvitter plugin が有効になっている必要があります.Qvitter は GNU social に含まれているので設定ファイルで有効にするだけでOKなはずです.

$ grep Qvitter /var/www/gnusocial.matoken.org/config.php 
addPlugin('Qvitter');

<追記>
Qvitter は GNU social に含まれているのは勘違いでした.以下から導入してください.

</追記>

次に以下の Pipelines から最新のzipを入手して展開します.

$ wget 'https://git.pleroma.social/pleroma/pleroma-fe/-/jobs/974/artifacts/download' -O pleroma-fe.zip
$ unzip pleroma-fe.zip 

展開してできたdistディレクトリ中の index.html を pleroma.html に変更します.

$ mv dist/index.html dist/pleroma.html

dist以下をGNU social のディレクトリにコピーして完了.

$ sudo -u www-data rsync -av dist/* /var/www/gnusocial.matoken.org/

導入した GNU social にログインした状態で /pleroma.html にアクセスすると Pleroma FE になります. / にアクセスすると元の Qviter なので併用可能です.

見た目は Qvitter とそんなに変わりませんがこの辺が気に入っています.

  • アイコンのアニメーション対応
  • 設定することでタイムラインの自動更新が可能(Enable automatic streaming of new posts when scrolled to the top)
  • ‘#NSFW’ が R18 注意の画像に差し替わってそれをクリックしないと表示されなく出来る 20180106_00:01:53-18586

縦長の画面にすると Qvitter と同じで Sidebar / Timeline に別れるので自動スクロールを有効にしてサブモニタに Timeline を表示するようにしています.

20180107_14:01:52-1314220180107_14:01:40-13089

Qvitter では自動更新されないし,自動更新可能なクライアントもいくつか試してみましたがいい感じのものが見当たらなかったので今これで落ち着いています.

ちなみに Pleroma FE だけだと API などは GNU social のままなので注意.

ちょっとしたカスタマイズ

static/config.json を修正することでデフォルトの壁紙やロゴ,テーマなどの変更が可能です. 壁紙は /static/bg.jpg /static/bgalt.jpg の2つが用意されています. NSFW 画像は static/img/nsfw.9399fe3.png のようです. static/styles.json でテーマが設定可能です.

不具合とか?

  • 非ログイン状態で /Pleroma.html にアクセスすると認証の窓が出てくるけど正しい認証情報を入力してもログインできない?一旦GSでログインしておくと良い.(GNU social は
    nightry だし 認証系の2FA plugin も入れているのでそのせいかも
  • タイミングにより通知が更新されないことがある?左側の「通知」を押すとmentionは全部取得する.(お気に入りの再取得は無理?)
  • 設定で「Enable automatic streaming of new posts when scrolled to the top」を有効にしているのに Timeline が自動更新されない.一番上にスクロールしている必要がある.上部のロゴ近辺をクリックすると一番上にジャンプする.

GNU socialに2要素認証を

Mastodonなどでは使える2要素認証ですが,GNU socialにはありません.
先日 GNU social を nightly にしたのでこれが利用できそうです.

Plugin形式で戻すのも簡単そうだし試してみました.

backup
dbとファイルをバックアップしておきます.

$ sudo -u www-data rsync -avv /var/www/gnusocial.matoken.org
rsync --stats -av --delete --link-dest=/export/backup/micro/gs/www/`/bin/date -d '1 day ago' +%Y%m%d`/ /var/www/gnusocial.matoken.org /export/backup/micro/gs/www/`/bin/date +\%Y\%m\%d`/
$ sudo -u www-data tar cvf - /export/backup/micro/gs/www/`/bin/date +\%Y\%m\%d`/ > /export/backup/micro/gs/www/`/bin/date +\%Y\%m\%d`-2fa.tar.xz
$ umask 0266 && /usr/bin/mysqldump --defaults-file=/export/backup/micro/gs/db/.my-backup.cnf --opt --all-databases --events | /usr/bin/xz -9 > /export/backup/micro/gs/db/`date +\%Y-\%M-\%d_\%H:\%m:\%S_\%s_$$`-master2nightly.sql.xz

GNU social の source ディレクトリに移動して 2fa を marge する

$ cd gnu-social
$ git fetch https://git.gnu.io/sstjohn/gnu-social.git 2fa-beta
$ git checkout -b sstjohn/gnu-social-2fa-beta FETCH_HEAD
$ git checkout nightly
$ git merge --no-ff sstjohn/gnu-social-2fa-beta
$ git push origin nightly

動いているGNU social環境にcopy

$ sudo -u www-data rsync -avv --omit-dir-times --exclude=".git*" ./ <GNUSOCIAL_PATH>/

config.phpに以下の行を追加してTwoFactorAuth pluginを有効にする

addPlugin('TwoFactorAuth');

動作確認
設定画面の左側に 2FA という項目が増える.

https://farm5.staticflickr.com/4588/39554232041_1d85c51a91_n.jpg

「Require secondary authentication upon login」のチェックボックスにチェックを付けて SAVE で2FAが有効になる.
Default provider で常用する2FA方式を選択しておくと便利です.

https://farm5.staticflickr.com/4633/39524857262_899ae15086_n.jpg

認証には,「FIDO 2.0」「TOTP」「U2F」が利用できます.
自分はTOTPを利用しています.TOTPの場合スマホアプリのGoogle Autharicatorなどが使えます.QR CodeやKEYを使ってアプリに登録します.

https://farm5.staticflickr.com/4589/38845402154_14ac40b77a_n.jpg

自分は信頼できるスマホを持っていないのでoathtoolを使って適当なscriptを書いて使っています.

$ oathtool --totp -b YJVHGFLJBWJAEROQVQ5MTIAKA2XVCUAH
148825

バックアップコードも保存しておきましょう.

https://farm5.staticflickr.com/4730/39554339271_99efd6658b_n.jpg

この状態で一旦GNU socialをログアウト,いつものID/PASSWORDでログインすると2FAの認証画面になるので,認証情報を入力してログインします.
既定値以外の認証情報を用いたい場合は「Try another way to sign in.」から選択可能です.

https://farm5.staticflickr.com/4587/39555314441_9b42544cc8_n.jpg

bug?
認証後真っ白な画面若しくは「Aythentication success!」と表示されるけど認証画面になります.多分バグです.URLを手動で編集したらログインできています.

https://farm5.staticflickr.com/4736/38658168725_4c15bc2765.jpg

サードパーティアプリケーションの対応
スマホアプリなどを利用している場合はパスワードを変更しなければいけません.
2FAの設定画面の「Application Passwords」の「ADD APPLICATION」ボタンから追加します.「Application name」に識別用の適当な名前を入れて,「Generate」ボタンでパスワードが生成されます.必要が無くなったら「Revoke」で消しましょう.

https://farm5.staticflickr.com/4637/27779332399_189cde7bdc_n.jpg
https://farm5.staticflickr.com/4590/27779333139_0753ed2c8e_n.jpg
https://farm5.staticflickr.com/4588/27779333639_68495ef93b_n.jpg

AndroidアプリのTwidereでは認証情報の変更画面が見当たりませんでした,アカウントの追加をして何時ものhost/id/新しい2faアプリケーションパスワードを設定するとすでにアカウントがあるとか言われて認証情報が書き換わりました.

という感じでとりあえず利用できるようになりました.
GNU socialでは結構長く放置されているので暫くは入らないような感じですかね.
バグはTOTP利用してる人が居ない?Ubico YubiKeyとかほしいですね.

GNU socialをnightlyにしてみる

GNU socialは以前はloadaverage.orgにアカウントを持っていたのですが,現在は自分用に自宅PCで動かしています.同じOStatusのMastodonは開発が活発ですが,GNU socialはそれに比べると大分静かです.新しい機能も試してみたいしnightlyに上げてみました.

実際試してみるといつものUPGRADEと同じ手順でトラブルもなくnightlyにできました.

動いている GNU social をバックアップする

導入ディレクトリ以下(ここでは /var/www/gnusocial.matoken.org )とdbをバックアップしておく.
デイリーでバックアップしているので今回はそれを手動で回してtar ballにしておいた.

$ sudo -u www-data rsync -avv /var/www/gnusocial.matoken.org 
ionice -c2 -n7 nice -n19 rsync --stats -av --delete --link-dest=/export/backup/micro/gs/www/`/bin/date -d '1 day ago' +%Y%m%d`/ /var/www/gnusocial.matoken.org /export/backup/micro/gs/www/`/bin/date +\%Y\%m\%d`/
$ sudo -u www-data tar cvf - /export/backup/micro/gs/www/`/bin/date +\%Y\%m\%d`/ > /export/backup/micro/gs/www/`/bin/date +\%Y\%m\%d`-master2nightly.tar.xz
$ umask 0266 && /usr/bin/mysqldump --defaults-file=/export/backup/micro/gs/db/.my-backup.cnf --opt --all-databases --events | /usr/bin/xz -9 > /export/backup/micro/gs/db/`date +\%Y-\%M-\%d_\%H:\%m:\%S_\%s_$$`-master2nightly.sql.xz

nightlyを導入する

前もってgit loneしてあったところに移動.cloneしてなかったらする.

$ git clone https://git.gnu.io/gnu/gnu-social.git
$ cd gnu-social

git pullしてnightlyをcheckoutする.

$ git pull
$ git checkout nightly

nightlyをcpする.sudo -u www-data は httpd がそのユーザーで動いていてファイルもその権限になっているので合わせている.

$ sudo -u www-data rsync -av --exclude={.git,.gitignore,.htaccess,config.php,file,avatar} ./ /var/www/gnusocial.matoken.org/

upgrade

ここでは GNU social の scripts/startdaemons.sh をmonit で監視しているので一時的に停止しておく.monitやそれに類するものを動かしてなければ無視して次へ.

$ sudo service monit stop

UPGRADE ファイルに書かれているとおり,デーモンを停止して,アップグレードスクリプトの実行を行い,デーモンを再開する.

$ cd /var/www/gnusocial.matoken.org/
$ sudo -u www-data bash scripts/stopdaemons.sh
$ sudo -u www-data php scripts/upgrade.php
$ sudo -u www-data bash scripts/startdaemons.sh

これで動作確認がとれたらOK
monitも再開しておく.

$ sudo service monit start

GNU socialのフッターのバーションはこうなった.

It runs on GNU social, version 1.2.0-beta5