---
# System prepended metadata

title: Debian lauch a laravel project with Apache

---

# 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/) 將防火牆打開
![](https://i.imgur.com/qO078qH.png)

> 如果要刪除 `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`
    ```