音楽聞くためのサーバー構築

- #### まえがき
**これはある程度わかってる人向けです。ご了承ください。**
ちょっとAndroidアプリでSubstreamerっていうAndroidでサーバー建てて音楽聞くことできるらしいんすよ。自分の好きな音楽を自分の好きなようにできるんでこれ入れました。他にも、WindowsとAndroidで同期再生できないかなって思ったり。Windowsの方では臨場感出すために複数のスピーカー使ってます。けど3.5mmジャックをさす箇所がパソコンにもうないのでとりあえずの処置でこのサーバーを導入してます。他にも外で聞くときとかにもデータの節約なるかも？(わかりませんが)

- ## 1-1 Windows用サーバーセットアップ
ほんとはubuntuの方にインストールしようとしていたのですがまえがきにあった通り同期再生をWindowsの方でできるか確かめるためです(~~ほんとはubuntuが起動不能になったから~~)。いやまあ気が向いたらLinux側でもやりたいと思います。ということで本題入ります。まず私が選んだのはAmpacheです。guiとかも高度な機能ありそうだったので。substreamerに対応したサーバーは[ここ](https://substreamerapp.com/)に色々あるので使いやすそうなの選んでください(全部のサーバーのセットアップ方法は解説しません)。

:::note warn
注意
PHPのバージョン関係のことがあるのでまだダウンロードしないでください
:::

- ### 1-2 Apacheのインストール
まずはApacheサーバーからです。この[URL](https://httpd.apache.org/docs/current/platform/windows.html#down)からダウンロードしてください。流石にビルドするのはめんどいので事前にコンパイルされたやつ使いましょう。私はApache Loungeからダウンロードしました。そのzipを解凍したらApache24というフォルダがあると思うので適当な場所に配置してApache24のなかにあるbinフォルダをpathを通してそれが終わったらcmdでこれ確認してください。
```ruby:bash
httpd -version
```
バージョンが出てきたらインストール成功です。

- ### 1-3 phpのインストール

このあとphpをインストールします。このバージョンはさっき確認したphpのバージョンのものをインストールします。phpバージョンが8.3.xや7.2.xだった場合、8.3、7.2のAmpacheのサーバーのものを使えます。[ここから](https://windows.php.net/download/)phpをダウンロードしてください。non thread safeとかthread safeとかありますがこれはマルチスレッドにするかシングルスレッドにするかです。こちらは適宜ダウンロードしてください。まあ私はマルチスレッドを使っています。ダウンロード出来たら解凍してphp.ini-developmentとかphp.ini-productionとかあると思いますが私はphp.ini-production使ってます。これをリネームしてphp.iniに変えてください。次に、Apacheで必要なphpのdllをダウンロードしていきます。公式とかのやつが見つからなかったので非公式のやつにします。[これ](https://jp.dll-files.com/php8apache2_4.dll.html)です。注意ですがこれはphp8の場合です。バージョンが7だった場合適当に探してダウンロードしてこれをphpの解凍したルートに配置してください。その後にApache24のconfにあるhttpd.confを編集し、これを追加で記述します。

```ruby:Apache24/conf/httpd.conf

LoadModule php_module C:/PHP/php8apache2_4.dll


<FilesMatch "\.php$">
  AddHandler php-script .php
  AddType application/x-httpd-php .php
</FilesMatch>

PHPIniDir "C:/PHP"
```

このphp_moduleのあとのパスについてはphpのフォルダの先ほどのapache用のphpのdllのパスを指定してください。phpindirはphpフォルダのルートのパスを記入してください。

ここまでできたらこのphpのバージョンに対応したAmpacheのサーバーをダウンロードしてzipを解凍してください。
解凍されたものをApache24/htdocsに全部張り付けてください。
とりあえずは完了です。cmdで
```rubu:bash
httpd.exe
```
と実行して、localhostまたは127.0.0.1にブラウザでアクセスします。多分いろんなファイルが出てくると思うのでindex.phpを選択してください。言語を選択してください。そうすると、なんかOKとかWarningとか書かれているはずです。これらを適宜...だとわかりづらいので私がWarningだったりしたやつのを修正します。まずはPHP intl extensionです。これはphp.iniを編集します。extension=intlを検索して;(コメントアウト)を消してください。
次にPHP cURL extensionです。これもextension=curlと検索して;を消してください。PHP GD 拡張モジュールも同じでextenison=gdと検索して;を消してください。PHP max upload sizeはupload_max_filesizeの値を20MB以上にしてください。20MB以上だったら大丈夫です。post_max_sizeもさっき選んだ値と一緒にしてください。これは関係ないですが私は使い勝手を考えて値を変更しています。max_file_uploads　最大ファイルアップロード数です。いじりたい方はいじってください。これらを変更したらhttpd.exeを一旦切ってもう一度起動します。それで解消されるはずです。

またLinux版の手順も出したいと思うので期待して待っておいてください！今日はこれで終わります！ありがとうございました！
ってことでLinux版書いていこうと思います。

- ## 2-1 Linux用サーバーセットアップ
まずはApacheからインストールしていきましょう。ちなみに言っておきますがwindowsと比べたら手間が4,5倍省けます。実際ApacheとphpとMySQL入れるだけでWindowsでは2時間、下手したら4時間行きますから。(私はApacheもphpもMySQLも前からインストールしているのであんま変わんないです)それに比べてLinuxは5分でインストール終わりました笑
Windowsってインストーラー使ったりパス通したりとか色々あってめんどいんですよねー
phpのapache用のdllがなかったせいで何時間も苦戦していたときがありました。
まあということでやっていきます。

Apacheからでしたね。私はubuntuを使ってるのでそれ用のコマンド出しますね。
まずはaptをupdateしましょう。その次にapacheインストールです。

```ruby:bash
sudo apt update
```

```ruby:bash
sudo apt install apache2
```
Apacheインストール完了です。おめでとうございます笑

次にMySQLをインストールしましょう。

```ruby:bash
sudo apt install mysql-server
```

MySQLのインストール完了です。

次にphpをインストールしましょう。

```ruby:bash
sudo apt install php libapache2-mod-php php-mysql
```
これでphpインストール完了です

これらをまとめたプロンプトを記述します。個別ダウンロードめんどい方どうぞ。

```ruby:bash
sudo apt update && sudo apt install -y apache2 mysql-server php libapache2-mod-php php-mysql
```

なんかMySQLのルール変更によって何もしないままではエラーが出るらしいので修正します。まずmysqlのプロンプトに入ります。

```ruby:bash
sudo mysql
```

- ### 2-2 インストールしたアプリの細かい設定
その次にこのコマンドの最後の'password'の部分をお好きなパスワードに変更して実行してください。

```ruby:bash
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
```

終わったらexitすればいいです。その次にこのコマンドをターミナルで実行します。

```ruby:bash
sudo mysql_secure_installation
```

パスワードの設定をします。よくわからない方はyと入力しておけば大丈夫です
次にパスワードの強さを求められます。0と入力すれば易しく、1だとまあまあ、2だとかなり厳しいです。おまかせします。パスワードの入力求められると思うのでパスワードを入力してください。リタイプも忘れないでください。
後は色々聞かれますが忘れたので自分で調べてちゃっちゃとやってください笑(ごめんなさい悪い癖が出ちゃって)
~~なにかわからない事あったら教えてください。教えてもらうだけです~~(最善は尽くします)

引用 [DigitalOcean](https://www-digitalocean-com.translate.goog/community/tutorials/how-to-install-lamp-stack-on-ubuntu?_x_tr_sl=auto&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_hist=true)

後はwebサイトにアクセスした際なんのファイルがルートで表示されるかの設定です。まあこれは任意で設定してください。一応設定方法載せておきます。
```ruby:bash
sudo nano /etc/apache2/mods-enabled/dir.conf
```
ここに書かれてるDirectoryIndex index.html　とかのところを書き換えてindex.htmlのところに後ろっかわにあるindex.phpを引っ張り出せば良いです。これで完全にサーバーを動かす環境は整いました。

- ### 2-3 Ampacheサーバーのインストール
まずはAmpacheの保存先ディレクトリを作成します。
```ruby:bash
sudo mkdir /var/www/ampache
```

その次に、

```ruby:bash
cd /var/www/ampache
```
で作業ディレクトリを変えて、

```ruby:bash
php -v
```
で、phpのバージョンを確かめます。私の場合は8.1.2だったので8.1用のAmpacheをインストールします。AmpacheのgithubのReleasesはが[こちら](https://github.com/ampache/ampache/releases)です。ダウンロードするコマンドがこちらです。
```ruby:bash
wget https://github.com/ampache/ampache/releases/download/6.6.0/ampache-6.6.0_all_squashed_php8.1.zip
```
これで/vat/www/ampacheにダウンロードできたらunzipします。sudoを忘れないでください。
```ruby:bash
sudo unzip ファイル名
```
その次に、
zipファイルを削除します。
```ruby:bash
sudo rm -rf ファイル名
```
これでおっけーです。
次にファイルのアクセス権を変更します。
```ruby:bash
sudo chown --recursive  user:user /var/www/ampache/
```
所有権をuserにしました。適宜変更を加えてください。
これが終わったら次にffmpegをインストールします。対応していないコーデックを変換させるためです。
```ruby:bash
sudo chown www-data:www-data /data/Music
```

- ### 2-4 phpのモジュールインストールおよびampacheのセッティング
次にいろいろなモジュールをインストールしていきます。あのwindowsでwarningが出てたやつのことですね。
```ruby:bash
sudo apt install php-mysql php-curl php-json php-gd php8.1-xml
```
最後のphp8.1-xmlについてはバージョンのところを合ったものにしてください。
次にApacheのモジュールを有効にします。
```ruby:bash
sudo a2enmod rewrite expires
```

ここまで終わったら、次にapacheのwebサーバーの公開ディレクトリの変更です。
```ruby:bash
sudo nano /etc/apache2/apache2.conf
```
ここの
```ruby:/etc/apache2/apache2.conf
<Directory /var/www/ampache>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>
```
デフォルトが/var/wwwなんですがそれに/ampacheを付け足してください。他にも
```ruby:bash
sudo nano /etc/apache2/sites-enabled/000-default.conf
```
ここにあるDocumentRootも
```ruby:/etc/apache2/sites-enabled/000-default.conf
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/ampache/public
```
/var/www/htmlだと思うんですが/htmlを消して/ampache/publicを付け足してください。

または、VirtualHostを使う方法もあります。

このファイルを作成し編集します。
```ruby:bash
sudo nano /etc/apache2/sites-available/ampache.conf
```

入力内容はこちらです。
```ruby:bash
<VirtualHost *:80>

    ServerName localhost
    DocumentRoot /var/www/ampache

    <Directory /var/www/ampache/>
        AllowOverride All
        Require all granted
    </Directory>

    RewriteEngine on
    CustomLog /var/log/apache2/ampache.access.log common
    ErrorLog  /var/log/apache2/ampache.error.log

</VirtualHost>
```
多分これでいけます。
次にこのコマンドを実行します。
```ruby:bash
sudo apachectl configtest
```
行けませんでした。
```ruby:log
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK
```
AH0558というエラーが発生しました。この場合は、/etc/apache2/apache2.confのservicenameを記述しないといけないそうです。
```ruby:bash
sudo nano /etc/apache2/apache2.conf
```
ここの一番下の行にこれを追加してください。
```ruby:bash
ServiceName localhost
```
これで解決しました。

- ### 2-5 php.iniの編集
php.iniを編集して最大アップロードサイズや最大アップロードファイル数とか色々いじります。
```ruby:bash
sudo nano /etc/php/8.1/apache2/php.ini
```
8.1はそれぞれのバージョンに変更してください。そして、windowsのやつと同じように
upload_max_filesizeで検索
post_max_sizeで検索して数値を20MB以上にしてください。最大アップロードファイル数はmax_file_uploadsです。好きな値に変えてください。それとintlはextension_intlで検索してコメントアウト消して保存してください。その次に、
```ruby:bash
sudo systemctl reload apache2
```
で、終わりです！
ようやく終わりです！！！動作確認したいと思います。

## intlができてない！！！！
もう一瞬絶望でした。けど私のただの抜けみたいなだけであっさり直って良かったです。
```ruby:bash
sudo apt install php-intl
```

いやあほんと良かったです。こっちはもう7時間くらいやってるので。これで次に進めます。SQLの登録とかもしていきます。

- ## 3-1 DDNSによるWeb公開
サーバーを公開するのはPlayitを使おうと思いましたがせっかくなのでDDNS(DDNS Now)使ってやりたいと思います。
ってことでやっていきたいと思います。

- ### 3-2 DDNSの設定
本当はhttps化しようとしてたんですがLet's encryptで失敗しまくってレート制限かかっちゃったんでやめることにしました。ってことで余談終わりです。
まずはDDNS Nowを使ってサブドメインを作成しましょう。作成したら、DDNS Now公式の[拡張機能](https://chromewebstore.google.com/detail/ddns-now/gncchnpliieikedkbgapmfkjbgbikdoe?hl=ja&pli=1)を使ってip自動更新をしてください。crondを使った方法もありますが手っ取り早く終わらすのと今回はこれがメインではないので拡張機能使います。それとルーターの静的NAT設定とipマスカレード設定適当にいじっといてください。多分知りませんがv6プラスの方でもできると思います。私もそうですが接続先の設定いじらなくても行けました。
後はファイアウォールについてです。httpの80番ポートと443番ポート開けます。
```ruby:bash
sudo ufw allow http
```
これと、
```ruby:bash
sudo ufw allow https
```
その次にファイアウォールの設定を有効化します。
```ruby:bash
sudo ufw enable
```
その次に状態確認します。
```ruby:bash
sudo ufw status
```
アクティブになっていて80と443という文字列が見当たったらうまくいってます。これでとりあえずDDNSは終わりです。少し時間経てば多分webサイトにアクセスできるようになると思います。

- ## 4-1 MySQLでデータベース作成
なんかデータベースって言葉かっこいいっすよね笑
まあ意外と使ってみると便利だと思うので勉強する価値ありです(俺は諦めたけど)
ってことでやっていきます。
```ruby:bash
mysql --user=root --password
```
これ実行してください。そしたらパスワード聞かれるので前設定したパスワードを入力してmysqlのプロンプトに入ってください。

その次にこれを実行してデータベースを作成します。
```ruby:MySQL
CREATE DATABASE ampache_account;
```
ampache-accountのところはデータベース名です。お好きなように変更してください。

:::note alert
注意
データベース名に-(ハイフン)を入れないでください。エラーの原因になります
:::

その次に、データベースにアクセスするためのユーザーを作成します。
```ruby:MySQL
CREATE USER 'Gretard'@'localhost' IDENTIFIED BY 'password';
```
Gretardのところはご自由なユーザー名に、passwordのところはその通り新しいパスワードを設定してください。

次に、このデータベースのアクセス権限を付与します。
```ruby:MySQL
GRANT ALL PRIVILEGES ON ampache_account.* TO 'Gretard'@'localhost';
```
これのampache_accountのところに先ほど作成されたデータベース名を入力し、Gretardのところに先ほどのユーザー名を入力してください。

データベースが正しく作成されているのかデータベースを表示し確認します。
```ruby:MySQL
SHOW DATABASES;
```
こんなふうに出てきて作成したデータベース名が表示されていたらうまく行っています。
```ruby:MySQL
+--------------------+
| Database           |
+--------------------+
| ampache_account    |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.05 sec)
```

私の場合はampache_accountというデータベース名なので正しく作成されていますね。
これが確認できたらexitします。
その次に、さっき作成したユーザー名としてMySQLのデータベースにログインします。
```ruby:bash
mysql --user=Gretard --password ampache_account
```
Gretardにはユーザー名を、ampache_accountにはデータベース名を入力してください。
ユーザー名のパスワードの入力が求められるのでユーザー名を作成したときのパスワードを入力します。間違えてデータベースのパスワードを入力しないでください。ここでの勘違い多いです。

mysql>と表示されたらできてます。これでMySQLの設定は完了です。

- ### 4-2 ampacheの方のセットアップ
localhoatか127.0.0.1でwebにアクセスしてください。OKとか書かれたやつはもう終わらせたので次行ってください。
Insert Ampache databaseとかあると思います。ここからは文字で説明するのめんどいので画像出しますね。


![Screenshot from 2024-07-27 19-04-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3742490/93e930b6-40b5-9fc9-305c-1f4894374541.png)


Desired Database Nameはさっき作成したデータベース名を入力してください。
MySQL Hostnameはそのままlocalhost
    MySQL Portはまあデフォルト(3306)でいいでしょう。
    MySQL MySQL Administrative Usernameはさっき作成したユーザー名
    MySQL Administrative Passwordはさっき作成したユーザーのパスワード
    Create Databaseはもうデータベースを作成したのでチェックを外しておいてください。
    Create Tableはまだ作ってないのでチェックをつけておいてください。
    Create Database Userはもう作ったのでチェックを外しておいてください
    こんな感じです。これでInsert Databaseを選択してください。少しスペックが低いと読み込みに時間がかかるかもしれません。正常なのでちょっとだけ待っといてください。
それが終わったらこんな感じになると思います。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3742490/3bde65bb-5d04-b7b5-3f8b-642b969d5742.png)

MySQL Usernameとかパスワードはもう前に入力したやつで自動的に入力されているので変える必要はないです。
installation typeについてですが私はデフォルトで行っています。標準機能はついてます。別に他のやつでもいいですが、まあ使いみちによって変わるので調べて自分で選んでください。

Allow Transcodingは対応していないコーデックを変換したり、opusをmp3に変換したりします。必要な方はffmpegを使ってやってみてください。あったほうがいいですが必須ではないです。
最後のPlayersについてですがUPnPとかDAAPとか使うなら有効化しといたほうが良いかもです。私はUPnP使うかもしれないので有効化しときました。
それが終わったらCreate Configを押します。管理者ユーザーの作成を求められるのでUsernameとPasswordを設定してCreate Accountを押してください。
これでようやく完了です！！！！終わりました！！！！
後はログインするだけです！
ユーザー名とパスワード入力してログインしてください！



![Screenshot from 2024-07-27 19-22-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3742490/b5e7e2a2-c01d-d093-d3dd-1cf8499dd229.png)

その次に設定の歯車マークに行ってOptions、一番下らへんにSubsonicがあると思うのでオンにする。これで完了です！！
いやあ長かった長かった！！！半日以上やってますよ！！！(2日またいで没頭してやってました)
まあそりゃこの記事も書いてるからね笑
ということで！終わりたいと思います！ありがとうございました！！