前言
Laradock 的學習筆記, 紀錄所學技術, 本篇專案環境為 GCP instance, OS 為 ubuntu 18.04
安裝
- 安裝 git (若無)
- clone 專案, 可參考 官方文件
專案配置
已經有一個專案
參考 官方文件
還沒有專案
參考 官方文件
多專案
參考 官方文件
env 檔設定
cp env-example .env |
MySQL 設定
修改驗證方式
為避免 MySQL 8 會有一些問題, 我們需要修改驗證方式
vim laradock/mysql/my.cnf |
貼上
[mysqld] |
如修改無法生效, 需把 MySQL 的檔案刪除重建
rm -rf ~/.laradock/data/mysql |
設定編碼為 utf8
my.cnf
my.cnf (與 create.sql 擇一即可)
vim laradock/mysql/my.cnf
加入以下設定
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
create.sql
create.sql (與 my.cnf 擇一即可)
vim laradock/mysql/docker-entrypoint-initdb.d/createdb.sql
加入以下設定
SET CHARACTER_SET_CLIENT=utf8mb4;
SET CHARACTER_SET_RESULTS=utf8mb4;
SET CHARACTER_SET_database= utf8;
SET COLLATION_CONNECTION=utf8_unicode_ci;
建立 Database
複製範例檔
cp laradock/mysql/docker-entrypoint-initdb.d/createdb.sql.example laradock/mysql/docker-entrypoint-initdb.d/createdb.sql
批量新增資料庫
uncomment 以下的設定檔, 並將dev_db_1
… 換成自己需要的資料庫名字#CREATE DATABASE IF NOT EXISTS `dev_db_1` COLLATE 'utf8_general_ci' ;
#GRANT ALL ON `dev_db_1`.* TO 'default'@'%' ;
#CREATE DATABASE IF NOT EXISTS `dev_db_2` COLLATE 'utf8_general_ci' ;
#GRANT ALL ON `dev_db_2`.* TO 'default'@'%' ;
#CREATE DATABASE IF NOT EXISTS `dev_db_3` COLLATE 'utf8_general_ci' ;
#GRANT ALL ON `dev_db_3`.* TO 'default'@'%' ;
更改帳號密碼
vim laradock/.env |
搜尋 MySQL
並將 default user 的密碼以及 root 的密碼更改
專案設置
.env
vim yourProject/.env |
- 更改 DB_HOST 為
mysql
- 更改 DB_DATABASE 為
上面步驟建立的資料庫
- 更改 DB_USERNAME 為
default
(可自定義) - 更改 DB_PASSWORD
修改 storage 權限
sudo chmod -R 777 storage bootstrap/cache |
Supervisor
當我們有使用 queue 或是 scheduler 的功能時, 會需要在背景起一個 process 用來監聽 queue job, 這時便需要使用程序管理器, 像是 supervisor 或 pm2
Laradock 以內建 supervisor 可以使用, 相當方便。
用法
- 切換到
Laradock/php-worker
目錄中, 可依據需求修改Dockerfile
以及supervisord.conf
, 若無需求不需修改 - 建立 config 檔,
cp *.conf.example *.conf
- 啟動
docker-compose up -d php-worker
設置 NGINX
如果有多專案的話, 需要特別設定 NGINX config 檔, 範例如下:
// 重導 HTTP 到 HTTPS |
啟動專案
視需求啟動容器
docker-compose up -d mysql nginx workspace redis php-worker |
執行專案前設置
docker-compose exec workspace php artisan key:generate |
Add Swap Space
當部署的機器 Memory 較低時, 常常會把 RAM 耗光, 這時我們可以通過切割一部分沒用到的硬碟給 RAM
作業系統
ubuntu 18.04確認目前 swap 大小, 如果沒有輸出, 代表目前 server 沒有劃分這一塊, 可以加了
sudo swapon --show
建立 Swap 檔案
- fallocate: 切割硬碟給檔案
- -l: length, 檔案大小
- /swapfile: 檔案
sudo fallocate -l 1G /swapfile
設定正確的權限
sudo chmod 600 /swapfile
設定 Swap Space
- mkswap: 建立 swap 區域, 可以是 disk partition, 也可以是一個檔案
sudo mkswap /swapfile
- mkswap: 建立 swap 區域, 可以是 disk partition, 也可以是一個檔案
輸出:
Output
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=f59595fb-754b-47ae-af6b-8dd6e98654d8啟用 Swap Space
sudo swapon /swapfile
確認 swap 是否已可被使用
sudo swapon --show
輸出
Output
NAME TYPE SIZE USED PRIO
/swapfile file 1024M 0B -2確認可用使用量
free -h
輸出
Output
total used free shared buff/cache available
Mem: 581M 275M 62M 103M 243M 110M
Swap: 1.0G 0B 1.0G使 Swap 永久有效
sudo vim /etc/fstab
增加以下代碼到檔案中
/swapfile swap swap defaults 0 0
設定 swappiness
swappiness 為 0 時, kernel 將不會將 data 換到 disk 除非真的有必要, 值越高時 kernel 會盡可能地將 data 放到 swap, 讓 RAM 更空一點
所以, 告訴系統盡量不要依賴 swap 可以讓系統運行的快一點
查看目前的 swappiness
cat /proc/sys/vm/swappiness
輸出
Output
60將 swappiness 設定為 10
sudo sysctl vm.swappiness=10
輸出
Output
vm.swappiness = 10持久化 swappiness
sudo vim /etc/sysctl.conf
加入下面這一行
vm.swappiness=10
移除 Swap Space
sudo swapoff -v /swapfile
從 /etc/fstab 移除上面加入的代碼
/swapfile swap swap defaults 0 0
最後, 刪除 swap 檔案
sudo rm /swapfile
Jenkins
設定
簡易個人 side project 用的 CD 可參考 這篇文章
Shell Script
- 從容器連到欲部署的 Server
ssh -i /var/jenkins_home/yourDeployKey root@yourServerIP \
"cd /yourProjectLocation/ && \\
git reset @^ --hard && git pull \\
&& cd /laradockProjectLocation/ \\
&& /usr/bin/docker-compose exec -T workspace php /var/www/yourProjectName/artisan migrate --force \\
&& /usr/bin/docker-compose exec -T workspace composer install -d /var/www/yourProjectName \\
&& /usr/bin/docker-compose exec -T workspace php /var/www/yourProjectName/artisan queue:restart \\
&& /usr/bin/docker-compose exec -T workspace php /var/www/yourProjectName/artisan db:seed"
非正規設置法
以下是個人配置, 旨在利用 Let’s Encrypt Certbot 自動每三個月續簽 SSL 憑證, 並自動套用到每個專案
所以會在 Host 處安裝 NGINX + CertBot, 因為自動續簽 SSL 憑證會用到 NGINX 80 port, 所以容器外的 NGINX 會監聽 80 port, 並把符合條件的請求都導向由容器直接監聽的 443 port, 所以會在容器內外都安裝 NGINX
NGINX 配置
因為 Let’s Encrypt 在自動續簽的過程中, CertBot 會 restart NGINX, 所以 NGINX 會分成容器內跟容器外
容器內 NGINX
// 容器外的 NGINX 會將指定 server_name 的流量導向 443 port, 所以這邊不需監聽 80 port |
容器外 NGINX
// 容器外相當簡單, 將來自 80 port 的請求導向 443 即可
server { |
Let’s Encrypt
安裝可參考 取得 wildcard SSL 憑證
其他配置檔
docker-compose.yaml
取拿掉 80 port 對應, 因為 80 port 會由容器外的 NGINX 監聽
ports: |
Laradock 的 .env
// 因為 80 port 沒開, 所以參數也不需設定 |
留言