音楽ストリーミング · 4 min read · Nov 03, 2025

Rocky Linux 8でDockerを使用してKoel音楽ストリーミングサーバーをインストールする方法

Koelは、Laravel PHPフレームワークで書かれたウェブベースのオーディオストリーミングサービスです。これにより、個人の音楽コレクションをストリーミングし、世界中のどこからでもアクセスできます。AAC、OGG、WMA、FLAC、APEなど、複数のメディアフォーマットをサポートしています。

このチュートリアルでは、Rocky Linux 8マシン上でDockerを使用してKoel音楽ストリーミングサーバーをインストールする方法を学びます。

前提条件

  • Rocky Linux 8.5を実行しているサーバー。
  • sudo権限を持つ非rootユーザー。
  • すべてを更新します。 $ sudo dnf update
  • 必要なパッケージをインストールします。 $ sudo dnf install yum-utils nano curl
  • サーバーを指すカスタムドメイン名(例:koel.example.com)。

ステップ1 - ファイアウォールの設定

最初のステップはファイアウォールを設定することです。Rocky LinuxはFirewalldファイアウォールを使用します。ファイアウォールの状態を確認します。

$ sudo firewall-cmd --state
running

ファイアウォールは異なるゾーンで動作し、パブリックゾーンがデフォルトで使用されます。ファイアウォールでアクティブなすべてのサービスとポートをリストします。

$ sudo firewall-cmd --permanent --list-services

次の出力が表示されるはずです。

cockpit dhcpv6-client ssh

HTTPおよびHTTPSポートを許可します。

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

ファイアウォールの状態を再確認します。

$ sudo firewall-cmd --permanent --list-services

同様の出力が表示されるはずです。

cockpit dhcpv6-client http https ssh

変更を有効にするためにファイアウォールを再読み込みします。

$ sudo firewall-cmd --reload

ステップ2 - Dockerのインストール

Rocky Linuxには古いバージョンのDockerが付属しています。最新バージョンをインストールするには、まず公式のDockerリポジトリをインストールします。

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

最新バージョンのDockerをインストールします。

$ sudo dnf install docker-ce docker-ce-cli containerd.io

Dockerデーモンを有効にして実行します。

$ sudo systemctl enable docker --now

それが実行されていることを確認します。

? docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2022-04-02 13:26:08 UTC; 2s ago
     Docs: https://docs.docker.com
 Main PID: 21152 (dockerd)
    Tasks: 7
   Memory: 30.9M
   CGroup: /system.slice/docker.service
           ??21152 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
...

デフォルトでは、Dockerはroot権限を必要とします。dockerコマンドを実行するたびにsudoを使用したくない場合は、ユーザー名をdockerグループに追加します。

$ sudo usermod -aG docker $(whoami)

この変更を有効にするには、サーバーからログアウトし、同じユーザーとして再度ログインする必要があります。

ステップ3 - Docker Composeのインストール

Docker Composeの最新の安定リリースをダウンロードします。

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Docker Composeバイナリファイルに実行権限を適用します。

$ sudo chmod +x /usr/local/bin/docker-compose

インストールをテストします。

$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c

Docker-compose Bash Completionスクリプトをインストールします。

$ sudo curl \
    -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \
    -o /etc/bash_completion.d/docker-compose

bash-completionを機能させるためにプロファイル設定を再読み込みします。

$ source ~/.bashrc

ステップ4 - Koelアプリケーションキーの作成

コンテナを短時間実行してKoelのアプリケーションキーを生成します。次のコマンドを実行してコンテナを実行し、そのシェルにアクセスします。

$ docker run -it --rm phanan/koel bash

コンテナ内で次のコマンドを実行してアプリケーションキーを生成します。

$ php artisan key:generate --force

新しく生成されたアプリケーションキーを持つ修正された環境ファイルを出力します。

$ cat .env
APP_KEY=base64:fjtO7aVHHKWfk4DThKqf1nci6o2DuMkNd90TKX6Gj+4=

キーの値をコピーしてコンテナシェルを終了します。

$ exit

ステップ5 - Koel環境ファイルの作成

Koel用のディレクトリを作成します。

$ mkdir ~/koel

ディレクトリに移動します。

$ cd ~/koel

音楽ディレクトリを作成します。

$ mkdir music

.envファイルを作成して開きます。

$ nano .env

次のコードを貼り付けます。

APP_NAME=Koel

# ランダムな32文字の文字列。php artisan koel:initを使用する場合は空のままにできます。
APP_KEY=base64:fjtO7aVHHKWfk4DThKqf1nci6o2DuMkNd90TKX6Gj+4=

# メディアへの絶対パス。この値は後でウェブインターフェースを介して変更できます。
MEDIA_PATH=/music

APP_ENV=production
APP_DEBUG=true
APP_URL=https://koel.example.com

# 最大スキャン時間(秒)。ライブラリが巨大な場合はこれを増やします。
# 注意:この設定はkoel:syncを介してスキャンする場合には影響しません。
APP_MAX_SCAN_TIME=600

# スキャンプロセスで使用されるメモリ制限(MB)。
# たとえば、2048MBのメモリ制限を設定したい場合は、ここに「2048」(引用符なし)と入力します。
MEMORY_LIMIT=512

# ストリーミング方法。
# 'php'(デフォルト)、'x-sendfile'、または'x-accel-redirect'のいずれかです。
# 詳細についてはhttps://docs.koel.dev/#streaming-musicを参照してください。
# 注意:メディアがトランスコーディングを必要とする場合(例:FLAC)、この設定は影響しません。
STREAMING_METHOD=x-sendfile

# KoelをLast.fmと統合したい場合は、ここにAPIの詳細を設定します。
# 詳細についてはhttps://docs.koel.dev/3rd-party.html#last-fmを参照してください。
LASTFM_API_KEY=
LASTFM_API_SECRET=

# KoelでAmazon S3を使用したい場合は、ここに情報を入力し、
# https://docs.koel.dev/aws-s3.htmlのインストールガイドに従ってください。
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_REGION=

# KoelをYouTubeと統合したい場合は、ここにAPIキーを設定します。
# 詳細についてはhttps://docs.koel.dev/3rd-party.html#youtubeを参照してください。
YOUTUBE_API_KEY=

# Koelがメディアファイルを提供するためにCDNを使用するように設定することもできます。
# このURLはKoelのインストールのホームURLにマッピングされる必要があります。
# トレーリングスラッシュは不要です。
CDN_URL=

# 出力mp3ストリームのビットレート。値が高いほど品質が向上しますが、
# ストリーミングが遅くなり、帯域幅が増加します。
OUTPUT_BIT_RATE=128

# 曲のダウンロードを許可するかどうか。
# 複数の曲をダウンロードする場合、KoelはPHPのZipArchiveを使用してそれらをzip化します。
# したがって、現在の環境にモジュールがない場合、そのダウンロードは(静かに)失敗します。
ALLOW_DOWNLOAD=true

# これがtrueに設定されている場合、アーティスト、アルバム、曲情報を取得するためのクエリがキャッシュされます。
# これにより、特にライブラリが巨大な場合、Koelの起動時間が短縮される可能性があります。
# ただし、キャッシュのデシリアライズプロセスはメモリに敏感な場合があるため、
# エラーが発生した場合は、これをfalseに設定してみてください。
CACHE_MEDIA=true

# Koelは、ウェブサイトがHTTPSを使用しているかどうかを検出し、それに応じて安全なURLを生成しようとします。
# 何らかの理由でこれが失敗した場合は、この値をtrueに設定することで強制できます。
FORCE_HTTPS=true

# 以下の変数はLaravel特有のものです。
# 何をしているかわかっている場合は変更できます。それ以外はそのままにしてください。
APP_LOG_LEVEL=debug
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。

上記の設定のほとんどは自己説明的です。機能させるために設定する必要がある設定は次のとおりです。前のステップで生成されたアプリキーをAPP_KEY変数に貼り付けます。APP_URLの下にドメイン名を入力し、サーバーのリソースに応じてMB単位でメモリ制限を設定します。ストリーミング方法はx-sendfileに設定しました。これはKoelのDockerイメージがApacheを使用し、事前に設定されているためです。FORCE_HTTPS設定はtrueに設定されています。これは、Nginxをロードバランサーとして使用し、Let’s Encrypt SSLを使用してKoelをウェブに提供するためです。他のサービスを使用したい場合は、それらを設定してください。

ステップ6 - Koel Docker Composeファイルの作成

docker-compose.ymlファイルを作成して編集します。

$ nano docker-compose.yml

次のコードを貼り付けます。

version: '3.3'

services:
  koel:
    image: phanan/koel
    container_name: koel
    depends_on:
      - koeldb
    restart: unless-stopped
    ports:
      - 8080:80
    environment:
      - DB_CONNECTION=mysql
      - DB_HOST=koeldb
      - DB_USERNAME=koel
      - DB_PASSWORD=koelpassword
      - DB_DATABASE=koel
    volumes:
      - ./music:/music
      - ./.env:/var/www/html/.env
      - covers:/var/www/html/public/img/covers
      - search_index:/var/www/html/storage/search-indexes

  koeldb:
    image: mysql/mysql-server:8.0
    restart: unless-stopped
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_DATABASE=koel
      - MYSQL_USER=koel
      - MYSQL_PASSWORD=koelpassword

volumes:
  db:
    driver: local
  covers:
    driver: local
  search_index:
    driver: local

Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。

上記のファイルは、KoelとMySQLのDockerイメージに基づいてコンテナを起動します。Koelをマシンのポート8080に公開します。音楽と環境ファイルは、コンテナ内のそれぞれの場所にマウントされます。音楽カバーと検索インデックスのディレクトリ、およびMySQLデータはローカルボリュームとしてマウントされます。MYSQL_ROOT_PASSWORDMYSQL_PASSWORDの変数に強力なパスワードを選択し、上記のファイルのKoelコンテナの変数と一致させてください。Koelコンテナをデータベースコンテナにリンクするには、DB_HOSTdepends_on変数がデータベースコンテナのサービス名に名前を付ける必要があります。

ステップ7 - Koelコンテナの起動

次のコマンドを使用してKoelコンテナを起動します。

$ docker-compose up -d

初めてKoelを初期化する

Koelコンテナシェルにログインします。以下のコマンドのkoelは、上記のDocker Composeファイルでcontainer_name変数を介して設定されたコンテナの名前を指します。コンテナ名が設定されていない場合は、最初にコンテナの名前を見つけて、次のコマンドでそれを使用する必要があります。

$ docker exec --user www-data -it koel bash

次のコマンドを実行して管理者アカウントを作成し、データベースを初期化します。

$ php artisan koel:init --no-assets

管理者パスワードの変更

Koelは、次の資格情報でデフォルトの管理者アカウントを作成します。

email: [email protected]
password: KoelIsCool

コンテナシェル内から次のコマンドを使用して管理者アカウントのパスワードを変更できます。

$ php artisan koel:admin:change-password

コンテナシェルを終了します。

$ exit

ステップ8 - SSLのインストール

Let’s Encryptを使用してSSL証明書をインストールするには、Certbotツールをインストールする必要があります。

まず、EPELリポジトリをダウンロードしてインストールする必要があります。

$ sudo dnf install epel-release

次のコマンドを実行してCertbotをインストールします。

$ sudo dnf install certbot

SSL証明書を生成します。

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d koel.example.com

上記のコマンドは、サーバーの/etc/letsencrypt/live/koel.example.comディレクトリに証明書をダウンロードします。

Diffie-Hellmanグループ証明書を生成します。

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

Let’s Encryptの自動更新のためのチャレンジウェブルートディレクトリを作成します。

$ sudo mkdir -p /var/lib/letsencrypt

SSLを更新するためのCronジョブを作成します。これは毎日実行され、証明書を確認し、必要に応じて更新します。そのために、最初に/etc/cron.daily/certbot-renewファイルを作成し、編集のために開きます。

$ sudo nano /etc/cron.daily/certbot-renew

次のコードを貼り付けます。

#!/bin/sh
certbot renew --cert-name koel.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"

Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。

タスクファイルの権限を変更して実行可能にします。

$ sudo chmod +x /etc/cron.daily/certbot-renew

ステップ9 - Nginxのインストール

最新バージョンのNginxをインストールします。/etc/yum.repos.d/nginx.repoファイルを作成して編集します。

$ sudo nano /etc/yum.repos.d/nginx.repo

次の行を貼り付けます。

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。

Nginxをインストールします。

$ sudo dnf install nginx

インストールを確認します。

$ nginx -v
nginx version: nginx/1.20.2

Nginxサービスを有効にして開始します。

$ sudo systemctl enable nginx --now

/etc/nginx/conf.d/koel.confファイルを作成して編集します。

$ sudo nano /etc/nginx/conf.d/koel.conf

次のコードを貼り付けます。

# 暗号化されていないすべてのリクエストを暗号化されたものにリダイレクト
server {
    listen 80;
    listen [::]:80;
    server_name koel.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    
    server_name koel.example.com;

    ssl_certificate     /etc/letsencrypt/live/koel.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/koel.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/koel.example.com/chain.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    access_log /var/log/nginx/koel.example.com.access.log main;
    error_log  /var/log/nginx/koel.example.com.error.log;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-Host $host;
        client_max_body_size 400M;
     proxy_pass  http://localhost:8080;
     proxy_http_version 1.1;
        proxy_set_header Host $host;
    }
}

完了したら、Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。上記の設定により、Nginxはプロキシサーバーとして機能し、localhostのポート8080にバインドします。

/etc/nginx/nginx.confファイルを編集します。

$ sudo nano /etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf;の前に次の行を追加します。

server_names_hash_bucket_size  64;

Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。

Nginx設定ファイルの構文を確認します。

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

新しい設定を有効にするためにNginxサービスを再起動します。

$ sudo systemctl restart nginx

ステップ10 - Koelにアクセス

ブラウザでhttps://koel.example.comにアクセスすることでKoelにアクセスできます。次のログイン画面が表示されます。

Koelログイン画面

ユーザー名として[email protected]を入力し、ログイン前に設定したパスワードを入力します。成功したログイン後、次のダッシュボードが表示されます。

Koelダッシュボード

ステップ11 - 音楽のインポート

インポートしたい音楽ファイルをシステムの~/koel/musicフォルダにコピーします。scpコマンドを使用して、ローカルPCからサーバーにファイルをインポートできます。

$ scp test.mp3 user@:/home/user/koel/music

ファイルを~/koel/musicフォルダにコピーしたら、次のコマンドを実行して音楽をKoelにインポートします。

$ docker exec --user www-data koel php artisan koel:sync

音楽はKoelのウェブインターフェースに表示され、再生を開始できます。

Koelのウェブインターフェースでは、曲を直接アップロードすることもできます。

ステップ12 - Koelの更新

Koelディレクトリに移動します。

$ cd ~/koel

最新のKoel Dockerイメージをプルします。

$ docker-compose pull

コンテナをシャットダウンします。

$ docker-compose down --remove-orphans

更新されたイメージでコンテナを起動します。

$ docker-compose up -d

Dockerコンテナを確認します。

$ docker ps

結論

これで、Rocky Linuxサーバー上でDockerを使用してKoel音楽ストリーミングサービスをインストールするチュートリアルが終了しました。質問がある場合は、下のコメントに投稿してください。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。