創建一個部署正式環境用的production分支。
確認專案各項設定檔
專案根目錄的.env
# 修改轉案名稱
COMPOSE_PROJECT_NAME=project_name
WP_PORT=9000
WP_PORT_PHP_MY_ADMIN=9080
WP_MYSQL_DATABASE=esdata
WP_MYSQL_USERNAME=es_admin
WP_MYSQL_PASSWORD=es_admin
WP_MYSQL_ROOT_PASSWORD=aB77099890bbcc@
WP_DEBUG=true
# 正式環境的網址
WP_URL=https://clientdomain.com
專案根目錄的docker-compose.yaml
service區塊要加入nuxt-app設定
nuxt-app:
container_name: ${COMPOSE_PROJECT_NAME}_app
build: ./nuxt-app
image: ${COMPOSE_PROJECT_NAME}
depends_on:
- nginx
networks:
- nuxt-network
mysql的volumes要改成production用 ,並且要綁定資料夾來存DB
mysql:
container_name: ${COMPOSE_PROJECT_NAME}_mysql-maria
image: mariadb:10.5
volumes:
- ./db/production:/docker-entrypoint-initdb.d
- /db/${COMPOSE_PROJECT_NAME}/data:/var/lib/mysql
- /db/${COMPOSE_PROJECT_NAME}/log:/var/log/mysql
environment:
MYSQL_ROOT_PASSWORD: $WP_MYSQL_ROOT_PASSWORD
MYSQL_DATABASE: $WP_MYSQL_DATABASE
MYSQL_USER: $WP_MYSQL_USERNAME
MYSQL_PASSWORD: $WP_MYSQL_PASSWORD
networks:
- nuxt-network
nuxt-app資料夾中的.env
修改名稱與正式環境網址
APP_NAME = project_name
ENV = prod
SITE_URL = <https://clientdomain.com>
API_URL = <https://clientdomain.com>
nuxt-app資料夾中的Dockerfile
FROM node:18
# 安装 PM2
RUN yarn global add pm2
WORKDIR /app
# 將 package.json 和 yarn.lock 複製到容器中
COPY package.json yarn.lock ./
# 使用 yarn 安装依赖
RUN yarn install
# 將當前目錄複製到容器中
COPY . .
# build(可視情況是否要在server上build)
# RUN yarn build
# 設定對外端口
EXPOSE 4000
# 注意!!!因為pm2設定檔裡有指定port,所以這裡開的port要跟ecosystem.config.js中指定的port一樣
# 用pm2啟動
CMD pm2-runtime start ecosystem.config.js --env prod
nuxt-app資料夾中的ecosystem.config.js
module.exports = {
apps: [{
script: './.output/server/index.mjs', // Nuxt3 官網上面說的方式
instances: 'max', // 負載平衡模式下的 cpu 數量
exec_mode: 'cluster', // cpu 負載平衡模式
max_memory_restart: '1G', // 緩存了多少記憶體重新整理
env_prod: {
name: 'project_name', // 專案啟動記得改名字
PORT: 4000 // 專案啟動記得避開其他專案的 port
},
}]
}
nginx資料夾中的default.conf
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php;
client_max_body_size 64M;
location ~ \\.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PHP_VALUE "
upload_max_filesize=2M
post_max_size=2M
";
}
location ~ ^/(en|zh)/wp-json {
try_files $uri $uri/ /index.php?$args;
}
location ~ ^/(wp|bs)[a-z-_*] {
try_files $uri $uri/ /index.php?$args;
}
location / {
# 注意!!!因為pm2設定檔裡有指定port,所以這裡開的port要跟ecosystem.config.js中指定的port一樣
proxy_pass <http://nuxt-app:4000>;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
}
}
搬移資料庫(如不需搬移可略過)
從要搬移的環境匯出資料庫:
一般環境下:用mysqldump指令備份資料庫
sudo mysqldump -u username -p database_name > ~/wp.sql
Docker環境下:用docker exec來執行mysqldump
sudo docker exec mysql_container_name sh -c "MYSQL_PWD=root mysqldump -uroot esdata" > wp.sql
把匯出的wp.sql複製到專案環境下的db/production/資料夾
cp wp.sql /path/to/project/db/production/
commit以上變更
建置nuxt-app並上傳建置後的檔案(暫時維持原本方式)
ssh連到主機
設定ssh key
產生deploy用ssh key
ssh-keygen -t rsa -b 4096 -C "[email protected]" -N "" -f ~/.ssh/id_rsa

啟動ssh-agent代理
eval "$(ssh-agent -s)"

將ssh key添加到ssh-agent中
ssh-add ~/.ssh/id_rsa

用編輯器打開並複製所有內容
vim ~/.ssh/id_rsa.pub

前往Github的專案Repository ,進入settings頁面

點擊左方的Deploy Keys後再按右上方Add deploy key

貼上剛剛複製的 SSH Key 以及輸入標題後Add key儲存

Git clone 專案 repository
到/home/帳號資料夾
cd ~
git clone取得專案repository
git clone [email protected]:esdesignstudio/repository_name.git
進入專案資料夾
cd repository_name
取得remote branch資訊
git branch -r
確認後check out要deploy的branch(例如:production)
git checkout production
上傳wp-content/uploads的檔案
從本機端要上傳的專案資料夾下執行scp指令
scp -r ./wordpress/wp-content/uploads user@server_ip:/path/to/project/wordpress/wp-content/uploads
主機上進入專案資料夾執行環境安裝用script
sudo sh production_setting.sh
安裝SSL(參考:How To Secure Nginx with Let's Encrypt on Ubuntu 22.04)
更新snap
sudo snap install core; sudo snap refresh core
安裝cerbot
sudo snap install --classic certbot
設定系統直接使用cerbot指令
sudo ln -s /snap/bin/certbot /usr/bin/certbot
用cerbot修改nginx設定檔(會需要輸入email和問幾個問題)
sudo certbot --nginx -d clientdomain.com -d www.clientdomain.com
設定自動更新憑證
開啟Crontab設定
sudo crontab -e
加入一行指令
0 0 1 * * certbot renew
部署完成。
merge要更新的commitnuxt-app資料夾下建置專案commit建置的檔案後push上去