外出先から自分の音楽関連のファイルをいつでも聴けるようにします。自分で購入したmp3ファイルやCDにある音楽データを聴けるようになります。koelというオープンソースなツールをセットアップして実現します。koelはクライアント側がVueで、サーバー側がLaravelで記述された、Webベースのパーソナルオーディオ ストリーミングサービスです。
公式の説明書を参考にしてDockerを使用してインストールします。説明書の中にあるGithubのリンクをクリックすると詳しく説明されています。公式のDockerイメージも用意されています。
それでは作業をしていきましょう。設置する環境はOSがUbuntu22.04になっております。まずはイメージを取得します。
docker pull phanan/koel
次に説明書を参考にkoelのコンテナを立ち上げます。koelはデータベースを必要としますが、このDockerコマンドにはデータベースは含まれていません。
docker run -d --name koel \
-p 8888:80 \
-v music:/music \
-v covers:/var/www/html/public/img/covers \
-v search_index:/var/www/html/storage/search-indexes \
phanan/koel
ファイヤーウォールが有効になっていたので開放します。
ufw allow 8888/tcp
ufw status
データベースは同じネットワーク内の別サーバーにあります。MySQL Community Serverが設置してあり、空のデータベースを作成しておきます。さらにそのユーザーが、外部接続して操作できる許可をしておきます。
データベースの設定について
前述の通り、データベースを同じネットワーク内の別サーバーに設定していました。このサーバーにはMySQL Community Serverをインストールし、外部からの接続を許可したユーザーが操作できるようにしています。しかし、Dockerを使用してMySQLのコンテナを作成する場合、デフォルトで外部接続が許可されていることがあります。これはローカルホストからの接続に限定されていることが多いですが、通常のMySQLインストールでは、外部接続を手動で許可する必要があるため、混乱するかもしれません。
そこで、以下にDockerでMySQLコンテナを設定し、必要なユーザーやデータベースを作成し、外部からの接続を許可する方法を、初心者にも分かりやすく解説します。
- MySQLコンテナの作成
- まず、DockerでMySQLコンテナを作成します。この際、デフォルトでは外部からの接続が許可されているかもしれませんが、必要に応じて設定を確認しましょう。
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest
このコマンドでMySQLのコンテナが起動し、my-secret-pw
というパスワードが設定されたrootユーザーが作成されます。 - 新規データベースの作成
- MySQLコンテナに接続し、新しいデータベースを作成します。
docker exec -it mysql-container mysql -u root -p
次に、MySQLのコマンドラインにアクセスしたら、新しいデータベースを作成します。CREATE DATABASE mydatabase;
- ユーザーの作成と権限の付与
- 外部からの接続を許可するユーザーを作成し、必要な権限を付与します。
CREATE USER 'newuser'@'%' IDENTIFIED BY 'userpassword';
GRANT ALL PRIVILEGES ON mydatabase.* TO 'newuser'@'%';
FLUSH PRIVILEGES;
%
は、すべての外部ホストからの接続を許可するワイルドカードですが、セキュリティのために特定のIPアドレスを指定することもできます。 - 外部接続の確認
- 最後に、外部からの接続が適切に設定されているかを確認します。このステップは、セキュリティの観点からも非常に重要です。
データベースの準備ができたらkoelのコンテナに入って初期設定ができるコマンドを入力します。指定されたユーザーでコンテナに入ります。
docker exec --user www-data -it koel bash
php artisan koel:init --no-assets
データベース名やユーザー名、ポート番号などを設定したらブラウザでアクセスします。
http://ipアドレス:8888
次のメールアドレスとパスワードでログインします。
email: admin@koel.dev
password: KoelIsCool
セキュリティ向上のため、これらを変更する場合はコマンドを入力します。
docker exec -it <container_name_for_koel> php artisan koel:admin:change-password
なお、コマンド入力ではなくブラウザでログインして変更も可能でした。
せっかくなのでmp3ファイルをアップロードして動作確認します。
アップロードしたファイルは、ホスト側では次のディレクトリ配下に領域が確保されます。もちろんコンテナ内でも確認することができます。
/var/lib/docker/volumes/
cd /var/lib/docker/volumes/
koelのコンテナは一般的なwebポートしかサポートしていないので、SSLに対応したページを作成するにはリバースプロキシの導入を検討します。
前回は、データベースが別サーバーにある前提での方法を説明しました。今回は、同一サーバー上にkoelとデータベースのコンテナを作成する手順を解説します。また、時間の経過によりkoelがバージョンアップされているため、その内容に基づいて記事を更新します。以下のGitHubページを参考に進めていきます。
- リポジトリのクローン作成
まず、GitHubからリポジトリをクローンします。このコマンドでクローンが作成され、docker-compose.mysql.yml
ファイルが含まれたディレクトリが作成されます。git clone https://github.com/koel/docker.git
docker-compose
ファイルの使用
クローン作成後、docker-compose.mysql.yml
が含まれるディレクトリに移動し、次のコマンドを実行してコンテナを立ち上げます。docker-compose -f ./docker-compose.mysql.yml up -d
環境によっては、以下のようにdocker compose
を使用する必要があるかもしれません。docker compose -f ./docker-compose.mysql.yml up -d
この手順でkoelとデータベースが同一サーバー上にセットアップされ、初心者でも簡単に環境を構築できるはずです。
初回起動時の手順
初めてKoelを起動する際には、以下の手順を行う必要があります。
- APP_KEYの生成
- 管理者ユーザーの作成
- データベースの初期化
これらのステップは、koel:init
コマンドを実行することで一度に行うことができます。
実行手順
まず、以下のコマンドでKoelのコンテナ内に入り、必要なコマンドを実行します。
※ <container_name_for_koel>
の部分は、実際のKoelコンテナの名前に置き換えてください。
docker exec --user www-data -it <container_name_for_koel> bash
コンテナ内に入ったら、次のコマンドを実行して初期設定を行います:
php artisan koel:init --no-assets
--no-assets
オプションは、Koelの「Release」GitHubアクションによってフロントエンドのアセットがすでに生成されているため、それをスキップするためのものです。
デフォルトの管理者アカウント
注意: バージョン5.1.0以降、Koelは管理者アカウントのユーザー名、メールアドレス、パスワードを尋ねることはなく、以下の認証情報で自動的にアカウントが作成されます。
- メール:
admin@koel.dev
- パスワード:
KoelIsCool
この初期パスワードは非常に安全ではないため、次の手順でユーザーインターフェースから変更するか、以下のコマンドを実行して変更してください。
docker exec -it <container_name_for_koel> php artisan koel:admin:change-password
ポート80の競合に関する注意
ホストでもポート80を使用している場合、競合が発生する可能性があります。その場合は、docker-compose.yml
ファイルで別のポートを指定するか、既存のサービスを停止する必要があります。例えば、ホスト側のポートを8080に変更するには、以下のように設定します。
ports:
- "8080:80"
この設定により、ホスト側で8080番ポートにアクセスすると、コンテナ内の80番ポートにリダイレクトされます。
ボリュームマウントに関する注意docker-compose.mysql.yml
ファイルには、音楽ファイルやカバー画像などを保存するためのボリュームが指定されています。これらのボリュームは、ホスト側のディレクトリとコンテナ内のディレクトリをリンクするため、データが永続化されます。
もし、特定のホスト側ディレクトリを指定したい場合は、docker-compose.mysql.yml
ファイルでマウントパスを変更することができます。例えば、ホストの特定のディレクトリに音楽ファイルを保存したい場合は、以下のように設定します。
volumes:
- /path/to/your/music:/music
このように設定することで、ホスト側の指定ディレクトリにデータが保存され、コンテナを再作成してもデータが失われることはありません。