LoginSignup
3
3

More than 3 years have passed since last update.

Pixelfedインストール手順

Last updated at Posted at 2019-04-17

おことわり

  • Pixelfedは現在ベータ版であり、使用には十分な注意が必要です。
  • この手順は、あくまでもローカルでの動作確認を目的としたものであり、Web公開に耐えられるか分かりません。

Pixelfedとは?

PHP Laravelベースの写真シェアWebアプリ。インスタグラムみたいな感じ?

ActivityPubに対応しており、他の実装(Mastodon、Pleroma等)と連合を組める。

環境

uname
Linux pixelfed.local 5.6.14-300.fc32.x86_64 #1 SMP Wed May 20 20:47:32 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
  • Pixelfed 0.10.9
  • PostgreSQL 12.2
  • PHP 7.4.6
  • Laravel 6.18.8

にて、画像が投稿できるところまで確認済み。
(連合を組むところまではテストしていない)

既知の問題点

  • Horizon Dashboard上でstatusinactiveのままになってしまう

下準備

依存性パッケージをインストール

Git、PostgreSQL、Redis、Nginx、PHP-FPM、Composer、PHP、ImageMagick

$ sudo yum install git postgresql-server redis nginx php-fpm composer php ImageMagick

PHPのモジュールなど

$ sudo yum install php php-redis php-bcmath php-ctype php-curl php-exif php-iconv php-intl php-json php-mbstring php-openssl php-tokenizer php-xml php-zip php-pdo php-pgsql

PHPのTimezone設定、PHPのバージョン情報非通知

デフォルトではUTCになっているため、Asia/Tokyoに変更
バージョン情報非通知はやらなくても動きますが、無駄な情報を表示したくないので消しておきます

$ vim /etc/php.ini
/etc/php.ini
date.timezone = Asia/Tokyo
expose_php = Off

Redisの自動起動設定と起動

$ sudo systemctl enable redis
$ sudo systemctl start redis

データベースを用意する(PostgreSQL)

データベースの初期化と自動起動設定

$ sudo postgresql-setup --initdb
$ sudo systemctl enable postgresql

ローカルの認証方式をmd5(パスワード認証)に変更

ident認証は使えない

$ sudo vim /var/lib/pgsql/data/pg_hba.conf
pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
#host    all             all             127.0.0.1/32            ident
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
#host    all             all             ::1/128                 ident
host    all             all             ::1/128                 md5

データベースの起動

$ sudo systemctl start postgresql

データベースに pixelfed ユーザとデータベースを作る

$ sudo su - postgres
$ createuser pixelfed -P
新しいロールのためのパスワード:
もう一度入力してください:
$ createdb pixelfed -O pixelfed
$ exit

パスワードは後で使うので控えておく

Pixelfed 本体のインストール

Linuxに Pixelfed 専用ユーザをつくる

$ sudo useradd pixelfed

専用ユーザでPixelfedをインストールする

$ sudo su - pixelfed
$ cd ~ && git clone https://github.com/pixelfed/pixelfed live && cd live/
$ composer install

設定ファイルの編集

$ cp .env.example .env
$ php artisan key:generate
$ vim .env

.envの必要な部分を編集する(とりあえず今は必要最低限のみ)

.env
APP_URL=http://(ドメイン)
APP_DOMAIN="(ドメイン)"
ADMIN_DOMAIN="(ドメイン)"
SESSION_DOMAIN="(ドメイン)"

DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=pixelfed
DB_USERNAME=pixelfed
DB_PASSWORD=(PgSQLのパスワード)

OPEN_REGISTRATION=false

データベースマイグレーション

実行すると、本当によいか聞いてくるので yes と答える。

$ php artisan migrate
**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? (yes/no) [no]:
 > yes

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.01 seconds)

(後略)

$ 

全て問題なく流れればOK

なにかしらのエラーが出た場合は、読み解いて解決する。

Illuminate\Database\QueryException  : SQLSTATE[08006] [7] FATAL:  Ident authentication failed for user "pixelfed" (SQL: select * from information_schema.tables where table_schema = public and table_name = migrations and table_type = 'BASE TABLE')

たとえば上記エラーの場合は、「"pixelfed"ユーザーのIdent認証に失敗した」ということなので、PostgreSQL側の認証方式が正しいか(md5か)を確認する。
設定ファイルを触った後は、postgresサービスの再起動を忘れずに!

キャッシュの生成

本番環境として使用する場合は、パフォーマンス向上のためキャッシュを生成しておくとよいとのこと。

$ php artisan config:cache
$ php artisan route:cache
$ php artisan view:cache

Laravel Horizon(バックグラウンド処理用スーパバイザ)のインストール

$ php artisan horizon:install

Horizon のサービス化

公式にはないが、systemd経由で動かしてみる

$ sudo vim /etc/systemd/system/horizon.service
/etc/systemd/system/horizon.service
[Unit]
Description=Laravel Horizon Queue Manager
After=network.target auditd.service

[Service]
User=pixelfed
WorkingDirectory=/home/pixelfed/live
ExecStart=/usr/bin/php /home/pixelfed/live/artisan horizon
Restart=always

[Install]
WantedBy=multi-user.target

WorkingDirectoryを合わせてあげないと、Webの管理画面から状況が確認できない。
(でも一応動きはする)

$ sudo systemctl daemon-reload
$ sudo systemctl start horizon
$ sudo systemctl status horizon
● horizon.service - Laravel Horizon Queue Manager
     Loaded: loaded (/etc/systemd/system/horizon.service; disabled; vendor preset: disabled)
     Active: active (running) since Thu 2020-05-28 09:37:50 JST; 1s ago

動かしてみて Active: active (running) となっていれば正常に動作している。
問題なさそうなら自動起動を有効にしておく。

$ sudo systemctl enable horizon

スケジューラタスクのインストール

$ crontab -e
crontab
* * * * * cd /home/pixelfed/live && /usr/bin/php artisan schedule:run >> /dev/null 2>&1

定期的に画像の最適化やガーベジコレクションを行う。

後処理

最新の都市情報を取り込み、ストレージ領域をリンクする

$ php artisan import:cities
$ php artisan storage:link

PHP-FPMの設定

Pixelfed用のUNIX Socketを準備する

# vim /etc/php-fpm.d/pixelfed.conf
/etc/php-fpm.d/pixelfed.conf
[pixelfed]
user = pixelfed
group = pixelfed

listen = /run/php-fpm/pixelfed.sock
;          ↑ このPathは後で使うので控えておく!!
listen.owner = pixelfed
listen.group = pixelfed
listen.mode = 0660

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 50
access.log = /var/log/php-fpm/$pool.access.log
slowlog    = /var/log/php-fpm/$pool.slow.log
php_admin_value[error_log] = /var/log/php-fpm/$pool.error.log
php_admin_flag[log_errors] = on

php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/session
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache

サービスファイルを調整する

$ sudo vim /usr/lib/systemd/system/php-fpm.service

PrivateTmp=true という文言があれば、コメントアウトし無効にする

$ sudo systemctl daemon-reload
$ sudo systemctl restart php-fpm

$ sudo ls -l /run/php-fpm/
total 4
-rw-r--r-- 1 root     root     5 May 28 16:21 php-fpm.pid
srw-rw---- 1 pixelfed pixelfed 0 May 28 16:21 pixelfed.sock

pixelfed.sock が存在していればOK

Nginxの設定

初期設定

Pixelfedの設定

$ sudo vim /etc/nginx/conf.d/pixelfed.conf
pixelfed.conf
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name photos.example.jp;                 # change this to your fqdn
    root /home/pixelfed/live/public;               # path to repo/public

    ssl_certificate /etc/letsencrypt/live/photos.example.jp/cert.pem;          # generate your own
    ssl_certificate_key /etc/letsencrypt/live/photos.example.jp/privkey.pem;   # or use letsencrypt

    ssl_protocols TLSv1.2;
    ssl_ciphers EECDH+AESGCM:EECDH+CHACHA20:EECDH+AES;
    ssl_prefer_server_ciphers on;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    client_max_body_size 100m;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php-fpm/pixelfed.sock;
#                                 ↑ 控えたUNIXソケットのパスを記入する
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # or $request_filename
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

server {                                           # Redirect http to https
    server_name photos.example.jp;                 # change this to your fqdn
    listen 80;
    listen [::]:80;
    return 301 https://$host$request_uri;
}
~                                                                                          

ユーザの作成

対話型プロンプトで作成ができる

$ php artisan user:create

こんなときは

Horizonがエラーになって開けない

php artisan horizon:assets を実行してみてください

.envファイルを書き換えたのに設定が変わらない

php artisan config:clear

アバターや画像のアップロードができない

TODO

  • 公開に耐えうる設定を見つける
  • 管理コマンド一覧を用意する
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3