OSS一覧

AmpacheをUbuntu16.04にインストールしてHTTPSでアクセスできるようにする

Ampacheが結構便利なのでインストール方法と必要そうな設定と機能の有効化方法をざっくりメモしておく。
スマホなどでのインターネット越しのアクセスも便利なので、セキュリティも考えてHTTPSでのアクセスをできるようにする。

まえおき

確認環境としてVultrのVPSを使用しました。
ソフトウェアはPHP7.0+MySQL5.7+ffmpeg2.8です。
無料で用意できるよう、HTTPSの証明書はLet’s Encryptで取得し、そのためのドメインはNo-IPで取得しています。

インストール方法は以下のgithub上のwikiを参考にしています。
https://github.com/ampache/ampache/wiki/Installation

ffmpegはエンコード形式やビットレートを変換するために必要なだけなので、利用方法がMP3しかデータを置かない等であれば無くても問題ないと思います。
なので工夫すればPHPとMySQLのあるレンタルサーバでも動かせそう。(未確認)

ドメインの取得と準備

No-IP以外のDDNSサービスを利用する場合

ここでは例としてDDNSサービスのNo-IPの場合を書きますが、他のDDNSサービスを使用する場合にはLet’s Encryptの制限に影響されないかPublic Suffix Listへの記載有無を確認する必要があります。
参考 : DDNS and let’s encrypt

自前のドメインを使用する場合は気にしなくてもいいです。

準備

No-IPでアカウントとドメインの取得を行ってください。
その後、サーバのグローバルIPアドレスが固定の場合はNo-IPのWebサイト上の設定でIPアドレスを設定し、変動する場合は以下のCRONを設定します。

*/30 * * * * curl -s "https://(ユーザ):(パスワード)@dynupdate.no-ip.com/nic/update?hostname=(ドメイン)" > /dev/null

No-IPの無料プランの場合、30日毎にドメイン使用の確認ページをクリックしないと無効になるようなのでご注意ください。

インストール

必要パッケージのインストール

sudo apt install apache2 \
mysql-server \
mysql-client \
php \
libapache2-mod-php \
php-mysql \
php-mbstring \
php-gettext \
php-curl \
php-gd \
composer \
ffmpeg \
git

Ampacheのダウンロードと準備

ディレクトリを作成してAmpacheをダウンロード。
例では最新の開発版を指定します。

sudo mkdir -p /var/www/ampache/
cd /var/www/ampache/
sudo git clone https://github.com/ampache/ampache.git html
sudo chown -R www-data:www-data /var/www/ampache
cd html

composerでライブラリを展開

sudo composer install --prefer-source --no-interaction

Apacheの設定

必要となるモジュールの有効化

sudo a2enmod headers
sudo a2enmod ssl

バーチャルホストの設定

sudo vi /etc/apache2/sites-available/(ドメイン名).conf
======
<VirtualHost *:80>
    ServerName (ドメイン名)
    DocumentRoot /var/www/ampache/html
    ErrorLog /var/log/apache2/(ドメイン名).error.log
    CustomLog /var/log/apache2/(ドメイン名).access.log combined
    LogLevel warn
    <Directory /var/www/ampache/html>
       AllowOverride All
       Require all granted
    </Directory>
</VirtualHost>
======

sudo a2ensite (ドメイン名)

PHPの設定
「upload_max_filesize」と「post_max_size」はAmpacheのWebUIから音楽ファイルをアップロードする際のサイズ制限に影響します。
「max_execution_time」は音楽ファイルの登録処理がタイムアウトしないよう、ファイルの量によって調整するといいです。

sudo vi /etc/php/7.0/apache2/php.ini
======
upload_max_filesize = 100M
post_max_size = 100M

max_execution_time = 300;
======

Apacheを再起動

sudo systemctl restart apache2.service

Let’s Encryptからの証明書取得

この記事の編集時点ではaptで取得できるクライアントのバージョンが古く、TLS-SNI-01 challengeが使用できない問題があるため、最新版を取得します。

cd /usr/local/bin
sudo wget https://dl.eff.org/certbot-auto
sudo chmod a+x certbot-auto

certbot-autoを実行し、画面の指示に従い対象とするドメインを選択して証明書の発行手続きと設定をします。

certbot-auto

Apacheを再起動

sudo systemctl restart apache2.service

また、定期的に自動更新するためにCRONに以下を登録すると便利です。

45 4 15 * * certbot-auto renew

Web画面からのインストール設定

Webブラウザからアクセス公開したドメインにアクセスすると、インストールページにリダイレクトされます。
https://(ドメイン名)/

言語を選択

インストールの必要条件をチェックする画面となるので、ERRORの表示がある場合は設定を変更するなどしてから再読込し、ERRORがなくなった後に次へ進みます。

データベースを設定します
「MySQLのホスト名」はlocalhostを指定し、アカウントとしてrootとインストール時に指定したパスワードを入力。
「Create Database User」はrootと別にデータベースユーザを作成するもので、多少面倒ですがrootユーザを乗っ取られるリスクを低減できるためオンにすることをおすすめします。

Webパスはディレクトリがルートディレクトリでない場合に、ルートとの差分を記述してください。上記の設定のとおりにルートに置いている場合は空欄で問題ないです。
(例:https://(ドメイン名)/ampache/ -> ampache/)
「Installation type」は特定ユーザのみがアクセスできるようにする場合は「デフォルト」、家の中等のクローズドな環境で使用する場合は「Minimalist」、ユーザ登録した不特定多数からアクセス可能にするなら「Community」を選択します。
「トランスコーディング」はffmpegを選択。
「Players」は音楽プレーヤーのアクセス方法を選択します。後からWeb画面で設定変更することも可能です。

管理用アカウントを設定します。

この時点で更新があった場合、更新画面になります。
更新ができたら「Return to main page」でトップページに移動します。

トップページが表示できたら、管理者アカウントでログインし、詳細な設定やユーザの作成を行ってください。

各機能の設定

カタログの追加

カタログは音楽/動画ファイルのディレクトリまたはURLを指定するものです。
音楽/動画ファイルを追加する場合、カタログを指定してファイルをデータベースに追加する処理を行わないとAmpacheのリストに表示ができないです。

以下の例ではローカルディレクトリの「/var/www/ampache/catalog」を指定します。

カタログに追加するディレクトリを作成し、apacheユーザのアクセス権限を設定

sudo mkdir -p /var/www/ampache/catalog
sudo chown -R www-data:www-data /var/www/ampache/catalog

Web画面の 管理者-> カタログ -> カタログの追加 からディレクトリを指定して、カタログの追加を行います。
ファイル名・フォルダ名のパターンはWeb画面からのアップロードを行う際に使用されるもので、あまり単純すぎるとファイル名がブッキングする可能性もあるためご注意ください。

カタログで指定した場所へのファイルの置き方は、sambaやFTPなどによるファイル操作や、この後の解説によるWeb画面からのアップロードで行うといいと思います。

カタログの手動操作

カタログで指定したディレクトリ/URLにファイルを置いた後、Ampacheのリストに反映するには、カタログ情報を更新する処理が必要です。

Web画面の 管理者-> カタログ -> カタログの表示 から対象のカタログの操作を選択して、「GO」ボタンで処理を実行します。

各操作の意味は以下のとおりです。

  • 追加(Add)
    カタログの指定先で新しく追加されているファイルをAmpacheのデータベースに追加します。
  • 確認(Verify)
    Ampacheに登録されているファイルのタグを検証し、異なっていたらデータベースに反映します。
  • クリーン(Clean)
    Ampacheのデータベースから元となるファイルのなくなったアルバムやアーティストの情報を削除します。
  • 更新(Update)
    クリーン、確認、追加の順で実行します。
  • アート収集(Gather Art)
    config/ampache.cfg.php内の設定で指定した先からアルバムアートを収集します。
  • 削除
    カタログを削除します。

ファイル数が特別多いわけでなければファイルの追加/削除の後に「更新」を実行すれば問題なく反映されると思われます。
ファイル数が多い場合は「更新」の処理が重たくなるため、高い頻度で実行することを避けるか、処理を使い分けることをおすすめします。

カタログの定期自動操作

カタログはCLIから操作するインタフェースも用意されているため、CRONで自動的に更新させることも可能です。
操作方法の詳細については以下からご確認ください。
https://github.com/ampache/ampache/wiki/CLI

CRONの登録例

以下のオプションではカタログのクリーン、確認、追加を行います。

0 1 * * * php /var/www/ampache/html/bin/catalog_update.inc (カタログ名) -c -v -a > /dev/null

Web画面からのアップロードを許可する

管理者-> サーバ設定 -> System を開く。
画面下の方にある「アップロード」の箇所を設定。

各設定の意味は以下のとおりです。

  • Allow users to upload media
    ユーザに音楽ファイルのWeb画面経由でのアップロードを許可します。
  • Rename uploaded file according to catalog pattern
    カタログで設定したファイルの名のパターンを使用してアップロードしたファイル名を変更します。
  • Upload: allow users to edit uploaded songs
    アップロードした音楽ファイルの登録データ編集をユーザに許可します。
  • Upload: allow users to remove uploaded songs
    アップロードした音楽ファイルの削除をユーザに許可します。(ただし、後述の削除許可の設定を追記しないと、この機能も有効になりません)
  • Upload: consider the user sender as the track’s artist
    アップロードした音楽ファイルのトラックアーティスト情報をアップロードしたユーザにします。(自作曲をアップロードするサイト向け?)
  • Upload: create a subdirectory per user (recommended)
    ユーザ毎にサブディレクトリを作成します。
  • Upload: run the following script after upload (current directory = upload target directory)
    アップロードされた後に実行するスクリプトを指定します。(特殊な操作をする場合以外は空欄で問題ないです)
  • アップロード先のカタログ
    ここで選択したカタログで指定しているディレクトリにファイルが保存されます。

個人的に使う分には画像の設定と同様にすれば問題ないかと思います。

設定を反映すると ホーム -> Musicに「アップロード」という項目が増え、ここからアップロードが可能となります。

削除もWeb画面上から行いたい場合、Ampacheの設定ファイルに以下を追記する必要があります。

sudo vi /var/www/ampache/html/config/ampache.cfg.php
======
delete_from_disk = "true"
======

ちなみに、Web画面からアップロードした場合にもカタログの操作によるデータベースへの追加をしないとAmpacheからは見れないため、ご注意ください。

タグにSJISを使用していた場合の文字化けを解消する

文字化けしているファイルとデータベースの登録を削除し、以下の方法で対応してください。

Ampacheを無理やりSJISのタグに対応させる

クライアントの紹介

AmpacheのWeb画面は完成度が高いと個人的に思っていますが。
クライアントアプリケーションを利用してアクセスすることで、モバイル環境などでさらに快適に使用することができます。

AmpacheとしてのAPIだけでなく、SubSonic等のAPIにも対応しているため、それらに準拠している多数のクライアントからもアクセスが可能です。
特に、SubSonicに対応したクライアントは成熟度の高いものが多いため、私はそのようなものを使用することが多いです。

DSub for Subsonic (Android)

DSub for Subsonic (Google Play)

SubSonicクライアント
有料で日本語にも対応していませんが、操作がしやすく、Wifiとモバイル回線でのビットレートの変更などの細かい設定にも対応しているため、がっつり使う人にはおすすめできるクライアントです。

Jamstash (Chromeアプリ)

Jamstash (Chromeウェブストア)

SubSonicクライアント
Chrome開けるなら通常のウェブ画面で操作すればいいことも多いですが、何かしらの理由でそうでない場合に使っています。
PC向けのミュージックプレイヤーでSubSonicに対応しているものは機能が複雑な印象ですが、こちらはシンプルで使いやすかったです。


Ampacheを無理やりSJISのタグに対応させる

何をするのか

Ampacheは便利なのですが、そのままだと日本語のSJISのタグが付いたmp3などを突っ込むと文字化けしまくる。
WindowsはSJIS以外だとエクスプローラで文字化けするため、意識してないとSJISで管理しちゃうことが多い。

タグを別の文字コードに変換するのは面倒なため、Ampache側をいじることとする。

やり方

注意:かなり雑な方法なので、通常だと問題ない文字コードや特殊な文字などを処理したときに文字化けするかも。

確認環境

ubuntu 16.04 + nginx + php 7.0 + Ampache 3.8.3 (+ getID3 1.9.11)

「mb_detect_encoding」関数を使うので、php-mbstringパッケージをインストールして有効化

もう入っていれば飛ばして問題なし。

sudo apt-get install php7.0-mbstring
sudo systemctl restart php7.0-fpm.service

getID3にSJIS判定を追加

以下のファイルを編集する
– (ampacheインストールディレクトリ)/lib/vendor/james-heinrich/getid3/getid3/getid3.lib.php

この部分のすぐ後に

public static function iconv_fallback($in_charset, $out_charset, $string) {

       if ($in_charset == $out_charset) {
                return $string;
       }

以下を追加する

       if( mb_detect_encoding($string,"SJIS-win",true) ){
                return mb_convert_encoding($string,$out_charset,"SJIS-win");
       }

対応方法についてのメモ

何か問題が起こったときに確認するためのメモ。

getID3について

以下で公開されてる。
https://github.com/JamesHeinrich/getID3

Ampacheではこれを使ってmp3などのタグを処理してるのですが、getID3は本記事時点で最新のv1.9.13でもSJISに対応していない。
とはいえプルリクエストしてどうにかなるものではなさそう。

文字コードに何を使っているのか文字列から判定する必要があるのですが、その対応がとても難しいです。
少なくともPHPの関数だけでは世界中の文字コードを間違いなく判定することはできないと思われる。
なので、対応する文字列を無難な中から取捨選択するしかなさそう。

そもそもSJISなんて使ってるMicrosoftが諸悪の根源に違いない。

getID3に追記した内容について

文字列の判定と変換を、通常では以下の順番でやってる。

  1. [変換前文字コード=変換後文字コード]の場合
  2. …もろもろそれ以外の場合

それをこうする

  1. [変換前文字コード=変換後文字コード]の場合
  2. [変換前文字コード=SJIS]の場合 <= 追加
  3. …もろもろそれ以外の場合

Ubuntu16.04にnginx-rtmp-moduleを入れてRTMP配信をする

最終的にストリーミングキーにパスワードを入れる簡易認証について書くのですが、全て一つの投稿にすると長くなるのでまずは前段の環境構築から。
[追記] RTMPSできないと中間者攻撃対策できなくて、nginx-rtmp-moduleで対応していないということもあり一旦保留。

RTMPについて


ストリーミングでデータをやり取りするためのプロトコルで、ここでは映像をライブストリーミング(生放送)するために使用する。
通常利用するポートはTCP 1935番。

NginxでRTMPを扱うためのモジュールが公開されており、ソースに追加してMakeすることで利用可能。

確認環境


  • ubuntu 16.04

インストール手順


必要パッケージのインストール

makeするために必要なものを一通り準備。

sudo aptitude install build-essential libpcre3 libpcre3-dev libssl-dev unzip

Nginxのソースとrtmpモジュールをダウンロードしてmake/install

mkdir -p ~/work/nginx
cd ~/work/nginx

wget http://nginx.org/download/nginx-1.11.7.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip

tar -zxvf nginx-1.11.7.tar.gz
unzip master.zip

cd nginx-1.11.7/

./configure --user=www-data --group=www-data --with-http_ssl_module --with-http_realip_module --add-module=../nginx-rtmp-module-master

make
sudo make install

サーバ起動時に自動起動するためSystemdにサービスとして登録

sudo vi /lib/systemd/system/nginx.service

/lib/systemd/system/nginx.service

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Nginxの設定

RTMPと、テスト用のプレーヤーページを用意。

sudo vi /usr/local/nginx/conf/nginx.conf

/usr/local/nginx/conf/nginx.conf

worker_processes  1;

user  www-data www-data;
pid        /run/nginx.pid;

events {
    worker_connections  1024;
}

rtmp {
    server {
        listen 1935;

        application app {
            live on;
            record off;
        }
    }
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    server {
        listen 80;
        server_name  localhost;
        #デフォルトのルートディレクトリは /usr/local/nginx/html
        #変えるのめんどいのでそのまま使う
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        index index.html index.htm;
    }
}

テスト用のプレーヤーページを作成

テストなのでCDNのvideo.jsを利用させていただき簡易的に作る。

sudo vi /usr/local/nginx/html/live.html

/usr/local/nginx/html/live.html

<!DOCTYPE html>
<html lang="en" class="">
<head>
    <title>Test Live</title>
    <link href="//vjs.zencdn.net/5.11/video-js.min.css" rel="stylesheet">
    <script src="//vjs.zencdn.net/5.11/video.min.js"></script>
</head>
<body>
    <video id="player" class="video-js vjs-default-skin" height="450" width="800" controls autoplay preload="auto">
        <source src="rtmp://(サーバのIP or ドメイン)/app/StreamKey" type='rtmp/mp4' />
    </video>
    <script>
        var player = videojs('#player');
    </script>
</body>
</html>

一応、所有者を変更しておく。

sudo chown www-data:www-data /usr/local/nginx/html/live.html

Nginxの起動と自動起動設定

sudo systemctl start nginx.service
sudo systemctl enable nginx.service

OBSで配信する際のURL指定


OBSClassicを使う場合は以下の値をいい感じに設定。

設定 -> 放送設定
FMS URL : rtmp://192.168.30.16/app
プレイパス/ストリームキー : StreamKey

使用方法は別途調べてください。

視聴


HTML5が見れるWEBブラウザで以下を開く。

http://(サーバのIP or ドメイン)/live.html

もちろん、配信していないと何も再生されないので注意。


Pocketみたいに後で読むサービスをホストできるwallabagをインストールしてみた

Wallabagについて

オープンソースで開発されてるPHP製のWebアプリケーションです。

後で読みたいWebサイトの情報を保存しておくことができ、Chrome/Firefox等の拡張プラグインやAndroidのアプリ、ブックマークレットから手軽に呼び出すことができるようになっています。

これを書いている時点での最新バージョン(2.1.5)だと検索機能がありませんが、2.2.0には簡易検索機能が追加される予定。

  • 2017/4/9追記 2.2.0で検索機能が追加されました。

似たようなオープンソースのWebアプリだとunmarkがあるのですが、こちらは一度登録したものがUIから消せないため、私はWallabagを使ってます。

インストール手順

公式ドキュメントのインストール方法には以下2つの環境で動作させる方法が記述されてます。

  • PHPのビルトインウェブサーバー
  • Apache/Nginx/lighttpd

ここではApacheによる方法を記載します。

確認環境

  • Wallabag 2.1.5
  • ubuntu 16.04
  • PHP 7.0
  • apache 2.4

データベースはデフォルトのSQLiteを使用します。

手順

ApacheとPHPのインストール

sudo aptitude -y install\
apache2 php\
libapache2-mod-php\
php-session\
php-ctype\
php-dom\
php-hash\
php-simplexml\
php-json\
php-gd\
php-mbstring\
php-xml\
php-tidy\
php-iconv\
php-curl\
php-gettext\
php-tokenizer\
php-bcmath\
php-sqlite3

Wallabagのダウンロードと展開

mkdir -p ~/work/wallabag
cd ~/work/wallabag

wget http://wllbg.org/latest-v2-package
tar xvf latest-v2-package

sudo mv release-2.1.5 /var/www/wallabag

sudo chown -R www-data:www-data /var/www/wallabag

設定ファイルの編集

sudo vi /var/www/wallabag/app/config/parameters.yml
# /var/www/wallabag/app/config/parameters.yml
secret: (任意の文字列に変更)

データベースをSQLite以外にする場合も同じファイルの設定変更が必要。

Apacheのバーチャルホストを設定

cd /etc/apache2/sites-available/
sudo vi bag.local.conf
# bag.local.conf
<VirtualHost *:80>
    ServerName bag.local
    DocumentRoot /var/www/wallabag/web
    ErrorLog /var/log/apache2/bag.local.error.log
    CustomLog /var/log/apache2/bag.local.access.log combined
    LogLevel warn
    <Directory /var/www/wallabag/web>
       AllowOverride None
       Require all granted
       <IfModule mod_rewrite.c>
            Options -MultiViews
            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ app.php [QSA,L]
        </IfModule>
    </Directory>

    <Directory /var/www/wallabag/web/bundles>
        <IfModule mod_rewrite.c>
            RewriteEngine Off
        </IfModule>
    </Directory>
</VirtualHost>
sudo a2ensite bag.local
sudo systemctl reload apache2.service

初回アクセス

Webブラウザでアクセス。
上記の例なら「http://bag.local/」
デフォルトのユーザとパスワードは以下。
– ユーザ : wallabag
– パスワード : wallabag