GNU social v2.0のインストール

GNUsocial/install

概要

2008-05-05に最初のコミットがなされ、分散SNSの中では最古参となるGNU socialのv2のインストール方法を記します。

GNU socialは昔ながらのWebアプリケーションのアーキテクチャーであるLAMP環境を採用しており、VPSの他レンタルサーバーでも動作します。

レンタルサーバーへのインストールを想定して、コマンドを実行しなくてもインストールできるように手順を併記します。

GNU socialの最新ソースコードは以下の2種類のリポジトリ―で管理されています。

NotAbug.orgがメインで、Undefined Hackersはv3の開発用です。v3は開発中でうまく動作しないのでv2をインストールします。

ブランチはmasterが最新安定板です。手順内では [32aeec858e1ebf712494a5f578931d9f2c809a5c] のコミットで確認しました。

v2.0.0beta0のタグがありますが、Misskeyと通信できない問題があるので、masterブランチを推奨します。

v2.0.0beta0の次以降のバージョンがリリースされたら、バージョンがわかりやすくなるので、そちらのタグを使うのがよいと思います。

依存関係

INSTALL.md」がインストール手順になります。これをベースにインストールしていきます。インストールに必要な環境は以下となります。

  • 言語: PHP v.7.4+
  • DB: MariaDB v10.3+/PostgreSQL v11+
  • Webサーバー: Apache/lighttpd/nginx

PHPは以下のモジュールが必要です。

  • openssl
  • php-curl
  • php-exif
  • pgp-gd
  • php-intl
  • php-json
  • php-mbstring
  • php-mysql
  • php-gmp
  • php-bcmath
  • php-opcache
  • php-readline
  • php-xml

ただし、php-opcacheなどはなくても動作します。インストールしたところ、以下は必要でした。

  • php-bcmath
  • php-exif: JPEGアップロード時。
  • php-gettext
  • php-gd: PNG=zlib/libpng (インストール時)、WebP=libwebp (画像アップロード時)、JPEG=libjpeg (JPEGアップロード時)。
  • php-intl: libicu。
  • php-mysqli/php-pgsql

PHP v7.4以上ということで、PHP v8でも動作しそうですが、管理人が試したところうまく機能しませんでした。そのため、PHP v7.4を推奨します。

ここでは以下の環境で動作を確認しました。

  • PHP v7.4
  • DB: MariaDB v10.6
  • Webサーバー: Apache HTTP Server v2.4

ホームディレクトリー直下にgs.example.comというドメインで公開することを想定した手順となります。また、上記の依存関係はインストール済みとします。

ソースコード取得

まずソースコード一式を取得します。

gitコマンドを使う場合以下となります。

git clone --depth 1 https://notabug.org/diogo/gnu-social
cd gnu-social
git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

ブランチ・コミット・タグを指定したい場合は以下のコマンドを続けます。

# COMMIT変数にブランチ名、タグ名、コミットSHA1
COMMIT=32aeec858e1ebf712494a5f578931d9f2c809a5c
git fetch --depth 1 origin $COMMIT # ブランチ・タグの場合
git fetch --depth 1 origin tag $COMMIT # タグ指定の場合
git checkout $COMMIT

gitコマンドを使わない場合、リポジトリ―にアクセスして右上のダウンロードボタンの [ZIP]/[TAR.GZ] のどちらかを選んで、ダウンロードします。コミット、ブランチ、タグを指定する場合、上部の [Commits]/[Branches]/[Releases] から指定できます。ファイルサイズは 現時点のmasterブランチ (32aeec858e1ebf712494a5f578931d9f2c809a5c) だと、35.5 MBです。

コマンドだと以下になります。

curl -JO https://notabug.org/diogo/gnu-social/archive/master.zip

[gnu-social-master.zip]/[gnu-social-master.tar.gz] のようなファイル名でダウンロードできるので、これをWebサーバー上の任意の場所に配置して、解凍します。コマンドだと以下になります。

unzip gnu-social-master.zip

解凍して [gnu-social] ディレクトリーが残ります。

公開ディレクトリーの配置

GNU social v2.0からディレクトリー構成が変更になり、Webサーバー上のDocumentRootに配置して公開するファイルは、publicディレクトリー以下となりました。そのため、公開用にディレクトリー配置を調整します。

コマンドが使える場合、シンボリックリンクを作成し、それ以外の場合、手動でpublic/index.phpの参照先を変更して対応します。

シンボリックリンクを作成するコマンドは以下となります。

DOMAIN=gs.example.com
ln -fns gnu-social/public $DOMAIN

コマンドが使えない場合、gnu-social/publicディレクトリーを$DOMAIN名 (gs.example.com) に変更して、同じ階層に移動させます。コマンドだと以下となります。

mv gnu-social/public $DOMAIN

その後、以下のようにindex.phpinstall.phpの冒頭の参照先パスを以下のように変更します。

// define('INSTALLDIR', dirname(__DIR__));
define('INSTALLDIR', dirname(__DIR__) . DIRECTORY_SEPARATOR . 'gnu-social');

コマンドで修正する場合、以下となります。git applypatchコマンドに置き換えても問題ありません。

cd $DOMAIN
git apply -p 2 <<-'EOT'
diff --git a/public/index.php b/public/index.php index 8613cd83..82823a97 100644 --- a/public/index.php +++ b/public/index.php @@ -57,7 +57,7 @@ $_perfCounters = []; // libraries are maintained through repositories) set_include_path('.'); // mainly fixes an issue where /usr/share/{pear,php*}/DB/DataObject.php is _old_ on various systems... -define('INSTALLDIR', dirname(__DIR__)); +define('INSTALLDIR', dirname(__DIR__) . DIRECTORY_SEPARATOR . 'gnu-social'); define('PUBLICDIR', INSTALLDIR . DIRECTORY_SEPARATOR . 'public'); define('GNUSOCIAL', true); define('STATUSNET', true); // compatibility

diff --git a/public/install.php b/public/install.php index e9cff8ff..9cc0e5eb 100644 --- a/public/install.php +++ b/public/install.php @@ -36,7 +36,7 @@ * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -define('INSTALLDIR', dirname(__DIR__)); +define('INSTALLDIR', dirname(__DIR__) . DIRECTORY_SEPARATOR . 'gnu-social'); define('PUBLICDIR', INSTALLDIR . DIRECTORY_SEPARATOR . 'public'); require INSTALLDIR . '/lib/util/installer.php';
EOT

ファイルディレクトリー作成

この状態でインストールを試みると、ファイルとアバター画像の保存ディレクトリーがないというエラーが出ます。

Install GNU social
GNU social was unable to create a directory on this path: /virtual/senooken/public_html/gnu-social@private.gnusocial.jp/file/avatar/

Either create that directory with the right permissions so that GNU social can use it or set the necessary permissions and it will be created.

GNU social was unable to create a directory on this path: /virtual/senooken/public_html/gnu-social@private.gnusocial.jp/file/

Either create that directory with the right permissions so that GNU social can use it or set the necessary permissions and it will be created.

Please fix the above stated problems and refresh this page to continue installing.

これを回避するために、事前にディレクトリーを作成します。コマンドだと以下となります。

mkdir -p gnu-social/file/avatar

Fancy URL対応

GNU socialはデフォルトではhttps://gs.example.com/index.php/adminのように間にindex.phpというパスが挟まります。

URLは短くてわかりやすいほうがよいため、GNU socialではこのURLをhttps://gs.example.com/adminのようにindex.phpのないURL (Fancy URL) にリダイレクトで変更することを推奨しています。

このFancy URLはインストール後に設定することもできます。しかし、途中で変更せずにできるだけ最初と同じものを継続したほうが、リンク切れなどの余計な問題を回避できるため、インストール時に設定します。

サンプルのサーバー設定ファイルがあるので、これをコピーして配置します。

cp gnu-social/DOCUMENTATION/SYSTEM_ADMINISTRATORS/webserver_conf/htaccess.sample $DOMAIN/.htaccess

これでインストール画面で [Fancy URLs]-[◎ enable] が有効になります。

HTTPS設定

パスワードを使ったWebサービスであるため、セキュリティー対策としてHTTPSの設定を行います。

Apache HTTP Serverであれば、mod_sslが有効で、証明書の設定などが適切になされていれば、インストール画面で [Server SSL]-[◎ enable] が有効になります。

[enable] を選ぶとGNU socialのサーバー設定で307リダイレクトで常時HTTPSを実現します。

Apache HTTP Serverでの常時HTTPS化の設定 | GNU social JP」にHTTPSの設定を記しました。.htaccessに以下の内容を追記すれば、これでも常時HTTPSになります。

## Always HTTPS
<If "%{HTTPS} == 'on'">
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</If>
<ElseIf "%{REQUEST_URI} !~ m#^/\.well-known#">
    RewriteEngine On
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI}?%{QUERY_STRING} [L,R=301]
</ElseIf>

こちらの設定のほうが、HSTSでHTTPアクセスを事前に予防できるので、こちらも設定したほうが好ましいでしょう。ただ、.htaccessの設定は別にしなくても問題ありません。

API認証設定

クライアントアプリなどAPIにアクセスする場合、PHPがCGIモードで動作していると認証に失敗するため、.htaccessの以下のコメント文を解除します。

@@ -33,8 +33,8 @@
   ## Uncomment these if having trouble with API authentication
   ## when PHP is running in CGI or FastCGI mode.
   #
-  #RewriteCond %{HTTP:Authorization} ^(.*)
-  #RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
+  RewriteCond %{HTTP:Authorization} ^(.*)
+  RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d

インストール時に必須ではないので、インストール後のアプリ認証の失敗時に行っても問題ありません。

DB作成

GNU socialで使用するデータベースを用意します。DB名は何でも問題ありません。

コマンドでは以下となります。

mysqladmin -u root -p create gnusocial

レンタルサーバーの場合、コントロールパネルから作成します。

DB作成時にはDBの文字エンコーディングがutf8mb4でなければなりません。

そうでなければ、インストーラーでのインストール時に以下のエラーが表示されます。

Page notice
Initializing...
Starting installation...
Checking database...
GNU social requires the "utf8mb4" character set. Yours is utf8mb3

以下のコマンド・SQLで現在の文字エンコーディングを確認できます。

DB_USER=root
mysql -u $DB_USER -p -e \
'SELECT SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME
    FROM INFORMATION_SCHEMA.SCHEMATA;'
+--------------------+----------------------------+------------------------+
| SCHEMA_NAME        | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+--------------------+----------------------------+------------------------+
| information_schema | utf8mb3                    | utf8mb3_general_ci     |
| senooken_privategs | utf8mb3                    | utf8mb3_general_ci     |
| test               | latin1                     | latin1_swedish_ci      |
+--------------------+----------------------------+------------------------+  

以下のコマンド・SQLでutf8mb4に変更できます。

DB_USER=root
DB_NAME=gnusocial
mysql -u $DB_USER -p -e \
  "ALTER DATABASE \`$DB_NAME\` DEFAULT CHARACTER SET 'utf8mb4' DEFAULT COLLATE 'utf8mb4_bin';"

コマンドが使えない場合、レンタルサーバーのコントロールパネルから、phpmyadminにログインするなどして、上記SQLを実行します。

バグ修正

インストーラーでのインストール時に以下のようなエラーが表示される場合があります。

Install GNU social
Page notice
        Initializing...
        Fatal error: Cannot redeclare _PEAR_call_destructors() (previously declared in /virtual/senooken/public_html/gnu-social@gnusocial.jp/extlib/PEAR.php:774) in /opt/remi/php74/root/usr/share/pear/PEAR.php on line 793

Cannot redeclare _PEAR_call_destructors() (previously declared in /home/fuccom/public_html/social/extlib/PEAR.php:774) in /opt/cpanel/ea-php73/root/usr/share/pear/PEAR.php on line 834 – NotABug.org: Free code hosting」で同じ問題が報告されています。

PHP標準のPEAR拡張機能とGNU socialが内部で使用しているPEARの名前が競合しているのが原因のようです。

以下のように、GNU socialのPEAR側でインクルードパスをGNU social側に固定することで一時的に回避します。

cd gnu-social
git apply <<-'EOT'
diff --git a/extlib/PEAR.php b/extlib/PEAR.php index 220fa7890b..e75fa10fea 100644 --- a/extlib/PEAR.php +++ b/extlib/PEAR.php @@ -43,6 +43,8 @@ if (substr(PHP_OS, 0, 3) == 'WIN') { define('PEAR_OS', 'Unix'); // blatant assumption } +set_include_path(__DIR__ . PATH_SEPARATOR . get_include_path()); + $GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN; $GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE; $GLOBALS['_PEAR_destructor_object_list'] = array();
EOT

上記の課題が解決したら、情報を追記します。

インストーラー

設定が完了したら、https://$DOMAINにアクセスします。

No configuration file found.

I looked for configuration files in the following places:
/etc/gnusocial/config.php
/etc/gnusocial/config.d/private.gnusocial.jp.php
/virtual/senooken/public_html/gnu-social@private.gnusocial.jp/config.php

You may wish to run the installer to fix this.

Go to the installer.

GNU socialの設定ファイルconfig.phpを検索して、見つからないため一番下の [Go to the installer] のリンクからインストール画面 (/install.php) を開きます。

[Install GNU social] のインストーラー画面が表示されるので、以下の項目を入力していきます。

設定例
項目
Site settingsSite nameサイト名

Fancy URLsenable

Server SSLenable
Database settingsHostname127.0.0.1

TypeMariaDB

Nameデータベース名

DB usernameDBユーザー名

DB passwordDBパスワード (任意)
Administrator settingsAdministrator nickname管理者ニックネーム (ユーザー名相当)

Administrator password管理者パスワード

Confirm password管理者パスワード

Administrator e-mail管理者メールアドレス (任意)
Site profileSite profileSingle User

[Database settings]-[Hostname] にDBのIPアドレスとポート番号を指定します。localhostだと接続に失敗するので注意します。ポート番号はホスト名の後ろに:3306のように指定します。DBのデフォルトポートの場合省略しても問題ありません。

テスト用途などで、DBにパスワードがない場合は、[DB password] は空欄でも問題ありません。

メールアドレスは必須ではありませんが、通知の受け取りに必要になるので、テストでなければ設定したほうがよいです。

[Site profile] はユーザー登録可否に応じて以下を選べます。インストール後にも変更できます。連合 (他のサーバーと) 接続予定で、迷ったら [Community] を選んでおけばひとまず大丈夫です。

  • Community: メール招待者のみ登録可能。
  • Public: フォームから一般登録可能。
  • Single User: 自分専用 (ユーザー=管理者のみ)。
  • Private: 連合接続しないクローズドサーバー。

なお、ここでの設定内容は後から全て変更できますので、安心してください。

入力が完了したら、[Submit] を選びます。

以下のメッセージが表示されインストールが完了します。

Page notice
Initializing...
Starting installation...
Checking database...
Creating database tables...
Adding SMS carrier data to database...
Adding notice source data to database...
Adding foreign service data to database...
Writing config file...
An initial user with the administrator role has been created.
Setting site profile...
GNU social has been installed at https://private.gnusocial.jp/
DONE! You can visit your new GNU social site (log in as "admin"). If this is your first GNU social install, make your experience the best possible by visiting our resource site to join the mailing list or IRC. FAQ is found here.

[new GNU social site] のリンクを選ぶと、サイトに移動できます。

ログイン

ログイン画面が表示されますのでインストール時に登録したnicknameかメールアドレスとパスワードを入力して [Login] を選びます。

ログインできれば、インストール完了です。

結論

GNU social v2のインストール方法を説明しました。

一部、コード修正がありますが、それ以外は基本的な設定を行うだけで、インストール可能です。サーバーの設定もそんなになく、分散SNSのインストール方法としては、比較的簡単な方だと思います。

コマンドが使えなくてもインストールできるように説明したつもりです。万が一わからないところ、わかりにくいところがあればコメントいただけますと、説明を追加します。

デフォルトでは無効になっているものの、有効にしたほうがいいオススメ設定などがありますので、時間のある時に記事に整理してリンクを追加します。

コメント

  1. […] A guy in Japan really loves it and he’s made a guide to get it working, along with a repository for a port of qvitter to newer versions. This isn’t too much of a surprise as Japan is notorious for being a place where old tech seems to fin […]

タイトルとURLをコピーしました