# Debian lauch a laravel project with Apache
###### `GCP`, `Deployment`, `Apache`, `Laravel6`
# 事前
1. 在自己電腦上安裝 gcloud sdk
* [macOS](https://formulae.brew.sh/cask/google-cloud-sdk)
* [Ubuntu](https://cloud.google.com/sdk/docs/quickstart-debian-ubuntu?hl=zh-tw)
* [Windows](https://cloud.google.com/sdk/docs/quickstart-windows?hl=zh-tw)
3. `gcloud init`
4. `gcloud auth login`
5. 查看 project `gcloud config list project`
(`gcloud projects create`==PROJECT_ID==)
# Step 1 建立執行個體
1. 建立一個名稱為"test1023"的執行個體(GCE):
`gcloud compute instances create test1023 --image-project ubuntu-os-cloud --image-family ubuntu-1804-lts`
>若要指定網路區域可以下參數 `--zone asia-east1-b`,否則區域為 gcloud init 時設定的那個
>設定映像檔一定要這兩個參數:`--image-project` , `--image-family`
* 若全都用預設,就只要下指令: `gcloud compute instances create test1023`即可
* 查看[可用映像檔](https://cloud.google.com/compute/docs/images?hl=zh-tw)
查詢:`gcloud compute images list`
* 查看[可用區域](https://cloud.google.com/compute/docs/regions-zones/?hl=zh-tw#available)
查詢:`gcloud compute zones list`
* 查詢目前VM個體:`gcloud compute instances list`
2. 進入 `gcloud compute ssh "test1023"`
(`gcloud compute ssh --zone "asia-east1-b" "test1023"`)
3. 輸入SSH 鑰匙密碼`Enter passphrase for key '/Users/sarahcheng/.ssh/google_compute_engine':`
4. 開瀏覽器到 [gcloud console](https://console.cloud.google.com/) 將防火牆打開

> 如果要刪除 `gcloud compute instances delete test1023 --zone asia-east1-b`
# Step 2 安裝所需套件
* 看作業系統: `lsb_release -a` `cat /etc/*release`
## 2-1 安裝 php
1. 看 php 版本:`php -v`,更新到 7.4
```=
sudo apt upgrade
sudo apt -y install lsb-release apt-transport-https ca-certificates
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list
sudo apt update
sudo apt -y install php7.4
sudo apt-get install php7.4-{bcmath,bz2,intl,gd,mbstring,mysql,zip,xml}
```
* 再看一次確認安裝成功 `php -v`
* `echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php`
## 2-2 安裝 composer
* 安裝指令:`curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer`
* 查看是否安裝成功:`composer -v`
## 2-3 [安裝 mysql](https://blog.johnsonlu.org/install-mysql-on-ubuntu/)
1. `sudo apt-get install mysql-server`
> 若要安裝特定版本`sudo apt-get install mysql-server-5.7`
> 若要設密碼:`$sudo mysql_secure_installation`
7. 啟動 mysql-server:
`sudo systemctl start mysql`
8. 查看是否成功啟動:
`systemctl |grep mysql`
9. 進入 mysql server:
`sudo mysql -u root`
> 查看目前使用者及其身份驗證方式:
`SELECT User, Host, plugin FROM mysql.user;`
1. `CREATE USER 'sarah'@'localhost' IDENTIFIED BY '00000';`
2. 給予新建的使用者存取DB的權限:
`GRANT ALL PRIVILEGES ON *.* TO 'sarah'@'localhost';`
(*.* 代表所有DB的所有 table)
4. 查看目前 mysql server的使用者:
`select user,plugin,authentication_string from mysql.user;`
## 2-4 安裝 Apache
1. 查看Port 80 是否被佔用:`sudo netstat -utlnp | grep 80`
(參數意義 udp, tcp, listen, numeric, process)
> numeric 的意思是將名稱數字化(IP),例:原本的 localhost 會變成 127.0.0.1
2. `sudo apt install -y apache2`, `sudo systemctl status apache2`
3. 將專案建在 /var/www/html底下不用改任何東西 可直接運行
```
<!DOCTYPE html>
<html>
<h1>My First Heading</h1>
</html>
```
## 2-5 安裝 git
1. `sudo apt-get update`
2. `sudo apt-get upgrade -y --allow-unauthenticated`
3. `sudo apt-get install git`
# Step 3 部署 github 專案
## 3-1 專案下載
* `git clone https://github.com/laravel/laravel.git`
## 3-2 Apache 設定
3. 在檔案 /etc/apache2/apache2.conf 中註解
```
</Directory /var/www/>
#Options Indexes FollowSymLinks
#AllowOverride None
Require all granted
</Directory>
```
5. 在檔案 /etc/apache2/sites-available/000-default.conf 中修改伺服器指向路徑為我們要部署的專案
`DocumentRoot /var/www/html/專案路徑`
2. 讓 Apache 重新載入修改完的設定檔:
`sudo apache2ctl graceful`
4. 進入專案安裝套件和設定環境:
`cd laravel`
1. `sudo composer install`
2. `mv .env.example .env`
3. 產生 access key:
`sudo php artisan key:generate`
## 3-3 資料庫 Operation
1. 進入 `mysql -u sarah -p00000`
* `CREATE DATABASE testdb;`
* `show databases;`
* `use testdb;`
* `show tables;` (現在是空的)
2. 另外開一個 ssh 連線過去
2. 進到專案目錄下:`cd laravel`
3. 修改專案的環境設定 .env 檔: `vim .env`
```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=testdb
DB_USERNAME=sarah
DB_PASSWORD=00000
```
4. 執行指令建立 tabel: `php artisan migrate` (原本git clone 下來的專案就有寫好的 migration了)
3. 回到 mysql
* `show tables;` (現在多了三個 table)
* 離開 mysql `exit`
## 3-4 更改權限
在專案目錄下:
* 修改擁有群組為 www-data
`sudo chown -R sarahcheng.www-data .`
* "chown" change 擁有者
* "-R" 往下層所有目錄遞迴
* "sarahcheng.www-data" 擁有者.擁有群組
* "." 代表當前目錄
* `sudo chmod -R 2770 ./storage/`
* "chmod" change mode
* "-R" 往下層所有目錄遞迴
* "2770" 2代表 SGID [參考](http://www.vixual.net/blog/archives/224)
* 770分別代表:
* 擁有者的存取權限
* 擁有群組的存取權限
* 其他人的存取權限
* "." 代表當前目錄
到專案路徑下看擁有者是否更改成功 `ls -al`
* 如何讓路徑存取不用 index.php? http://35.234.18.116/index.php/api/register
# P.S.
- 目錄 /var/log/apache2 下有 access.log 和 error.log 可以查看 request
- GCP instance 的 IP,可在 GCP GUI 複製 `外部 IP`。
- 將舊資料備份 `mysqldump --opt -usarahcheng -p laravel_shop > test.sql`
- 透過 ssh 將檔案傳到 GCE instance `gcloud compute scp test.sql test1023: --zone asia-east1-b`
- 匯入資料:`mysql -u 使用者名稱 -p 資料庫名稱 < backup.sql`
- 查看目前機器中所有開放的 Port
```bash
$ sudo netstat -utlnp
```
* 基本上不用安裝[laravel](https://laravel.com/docs/6.x/installation)(不太可能在server上開發),不過還是提供參考指令:
```
2. `sudo composer global require laravel/installer`
2. `vi ~/.bash_profile`
* `export PATH="$HOME/.composer/vendor/bin:$PATH"`
3. `source ~/.bash_profile
4. `laravel -V`
```