設置: 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の次以降のバージョンがリリースされたら、バージョンがわかりやすくなるので、そちらのタグを使うのがよいと思います。

2023-02-18 Sat追記。その後、開発がやはり滞っており、私がPull Request送っても無視されたり、Qvitterプラグインのバグへの対応などで、上記の公式リポジトリ―だと都合が悪く感じました。そのため、私が保守する [gnusocialjp/gnu-social] のmainブランチを使います。公式のコミットのmasterブランチから派生させています。

2023-02-27 Mon追記。ディレクトリー構成や、コマンドと手動部分の判別がわかりにくいとのコメントがあったので改善しました。

依存

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

Webサーバーの公開ディレクトリーにgs.example.comというドメインで公開することを想定した手順となります。ディレクトリー構成は以下となります。

/home/user/public_html: Webサーバーの公開ディレクトリールート。
- gnu-social: GNU socialのソースコード。
- gs.example.com: GNU socialの公開サイト。手順内で$DOMAINとも表記。中身はgnu-social/public (シンボリックリンクかディレクトリーのコピー)。

以降では、現在ディレクトリーがWebサーバーの公開ディレクトリールート (/home/user/public_html) であることを前提に記載します。

取得

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

コマンド

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

git clone --depth 1 https://notabug.org/gnusocialjp/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/gnusocialjp/gnu-social/archive/main.zip

[gnu-social-main.zip]/[gnu-social-main.tar.gz] のようなファイル名でダウンロードできるので、これをWebサーバー上の公開ディレクトリールート直下に配置して、解凍します。コマンドだと以下になります。

unzip gnu-social-main.zip

解凍して [gnu-social] ディレクトリーが残ります。ローカル環境で解凍して、展開された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

移動させた後、以下のように$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はインストール後に設定することもできます。しかし、途中で変更せずにできるだけ最初と同じものを継続したほうが、リンク切れなどの余計な問題を回避できるため、インストール時に設定します。

サンプルのサーバー設定ファイルがgnu-social/DOCUMENTATION/SYSTEM_ADMINISTRATORS/webserver_conf/htaccess.sampleにあるので、これをコピーしてgs.example.com/.htaccessにリネームして配置します。

コマンドだと以下相当です。

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の設定を記しました。gs.example.com/.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モードで動作していると認証に失敗するため、gs.example.com/.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
DB_NAME=gnusocial
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を実行します。

なお、DBにPostgreSQLを使用する場合はこの文字エンコーディングの問題は起きないようです。PostgreSQLが使えるならば、そちらのほうがいいかもしれません。

バグ修正

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

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/lib/util/framework.php b/lib/util/framework.php index 237533a517..9c99d02472 100644 --- a/lib/util/framework.php +++ b/lib/util/framework.php @@ -85,7 +85,7 @@ define('URL_REGEX_DOMAIN_NAME', '(?:(?!-)[A-Za-z0-9\-]{1,63}(? <!-)\.)+[A-Za-z]{2 require_once INSTALLDIR . '/vendor/autoload.php'; // append our extlib dir as the last-resort place to find libs -set_include_path(get_include_path() . PATH_SEPARATOR . INSTALLDIR . '/extlib/'); +set_include_path(INSTALLDIR . '/extlib/' . PATH_SEPARATOR . get_include_path()); // global configuration object
EOT

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

2023-02-18 Sat追記。gnusocialjp/gnu-socialのリポジトリ―では上記の修正を取り込んでいるため対応不要です。

インストーラー

設定が完了したら、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サイト名 (例: gs.example.com)

Fancy URLsenable

Server SSLenable
Database settingsHostname127.0.0.1

TypeMariaDB

Nameデータベース名 (例: gnusocial)

DB usernameDBユーザー名 (例: root)

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 […]

Copied title and URL