Qiitaの様なサービス作成中 サーバーで公開する 連載(5)

## 基本情報

* [次に作りたいQiita、dev.toの様なサービスについて](http://alphabrend.hatenablog.com/entry/2018/05/07/090803) で書いたサービスを開発中です。
* [前回の記事](https://qiita.com/dala00/items/c003c7f3512a081a8f49)

Google Compute EngineのAlways Freeの説明もしていますが、あくまでも現時点の方法のため実際に利用される際には自分で確かめつつ操作を行ってください。

## 概要

とりあえず色々不足してはいますが、最低限の機能は作成したので実際にサーバーにデプロイして公開してみます。下記のような構成です。

* Google Compute Engine (f1-micro)
* PHP7.2
* Apache2.4
* MySQL8.0

## Google Compute Engine

まずは無料のf1-microのインスタンスを作成します。

Google Cloud Platformのコンソールに移動し、Compute EngineのVM インスタンスメニューにてインスタンスを作成します。気をつける点は下記です。それ以外はデフォルトでOKです。

不安な方は新規アカウントであれば１年以内の無料クレジットがついてくるため、多少課金が発生してしまっても相殺されて安心です。あとは課金アラートなども設定しておきましょう。

### リージョン

日本のリージョンは無料枠に対応していないので、usのどこかを選択しましょう。

### ブートディスク

適宜好きなOSを選択します。Always Freeの範囲なので、この中でディスク容量を30GBまではアップできます。

PHPの場合Debianだとインストール時に色々面倒なので、さくっとインストールできるUbuntuの最新バージョンを選択しました。

### ファイアウォール

HTTP, HTTPSともに許可します。

### 管理、ディスク、ネットワーク、SSH 認証鍵

クリックするとメニューが出てくるので、ここのネットワーキングタブにてネットワークインターフェースの編集をクリック。

外部IPがエフェメラルになっていますが、これはIPが固定されず突然アクセスできなくなるため、IPアドレスを作成します。botやスクリプト実行用サーバーとして使うなら不要だと思います。

注意点として、操作をやり直したりするとIPが複数作られてしまったりします。VMに割り当てられていないIPがあると、それは課金対象になってしまうので気をつけましょう。VPCネットワーク→外部IPアドレスメニューで削除できます。

ネットワーク サービス階層という項目があるので、適宜選択してください。今回は標準にしました。

## サーバーに接続

VM インスタンスが作成されましたので、一覧ページを見ると各インスタンスにsshボタンがあります。クリックするといくつか方法が表示されるので、適宜好きなものを選びましょう。

![Compute Engine   free.png](https://qiita-image-store.s3.amazonaws.com/0/136506/d41312fe-bb57-5853-7f04-6fc7439c84bc.png)

僕はgcloudをインストールしているので、gcloudコマンドでアクセスします。linuxやmacのシェルであればCtrl+Rしてプロジェクト名を数文字入力すればこのコマンドが補完されるので今後非常に楽にログインできるようになります。

## 色々インストール

細かい説明は省略しますがこんな感じで進めていきます。(/var/wwwあたりの所有者等は適宜調整してください）

```sh
sudo apt-get update
sudo apt-get install -y dbus git curl apache2
git config --global user.name "****"
git config --global user.email "****@****"
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install -y php7.2 php7.2-mbstring php7.2-mysql php7.2-xml php7.2-gd php7.2-zip php7.2-curl
cd /var/www
git clone リポジトリ app
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
cd app
composer install
wget https://dev.mysql.com/get/mysql-apt-config_0.8.10-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.10-1_all.deb
sudo apt-get update
sudo apt-get install -y mysql-server
sudo mysql_secure_installation
```

Apacheの設定で`/var/www/html`となっているところは`/var/www/app/public`としておきましょう。（apache2.confとかsites-available以下とか）

その後、

```sh
sudo a2enmod rewrite
sudo systemctl restart apache2
```

これであとはDBを設定して必要に応じてmigrate, seedを実行すれば動くと思います。MySQLは昔と違ってrootログインのデフォルトプラグインが違い、sshでログインしているユーザーでの認証となっているので、適宜変更するかパスワードでログインできるユーザーを作成するなどが必要です。とりあえず最初困ったら

```sh
sudo mysql
or
sudo mysql -u root
```

でrootログインできると思います。

## SSL

あとは必要に応じてSSL設定を行います。Let's Encryptはcertbotを使った方法がいくらでも紹介されているのでそちらを参考にしてください。

設定ファイル(default-ssl.conf)の変更箇所は下記だけです。
（フォルダが未設定ならこちらも`/var/www/app/public`にしておいてください）

```
SSLCertificateFile      /etc/letsencrypt/live/ホスト名/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ホスト名/privkey.pem
```

これで下記を実行すれば有効化されます。

```sh
sudo a2enmod ssl
sudo a2ensite default-ssl
```

思い出しつつのため抜けている部分もあるかもしれませんが、おおよそはこんな感じでSSLにて公開できる状態になっていると思います。うまくいかない場合は適宜エラーメッセージやログなどを見てみてください。

## 公開

ということで、機能不足のαααααバージョンですが公開しました。よろしければお試しください。記事削除機能は実装済みのため適当に投稿も試していただいて大丈夫です。

[Crieit - プログラマー、エンジニアのための気軽なコミュニティサイト](https://crieit.net)

今後、質問、議論などができるようにコメント機能もつけます。投稿、コメントともに匿名でできるようにもする予定です。

気になる方は公式Twitterアカウントのフォローをよろしくおねがいします。
[Crieit公式Twitterアカウント](https://twitter.com/crieitcommunity)

## 次回

機能を随時追加していくのは地味過ぎてここまでの記事以上に需要皆無？

何か誰かの参考になるようなことが見つかったら書くかもしれません。Crieit上ではこの連載に関係なく僕自身が色々今後も書いていったり企画していったりする予定です。

（ないとは思いますがリクエストいただければその内容で書きます）