專案設定

  1. 創建一個部署正式環境用的production分支。

  2. 確認專案各項設定檔

    1. 專案根目錄的.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
      
    2. 專案根目錄的docker-compose.yaml

      1. service區塊要加入nuxt-app設定

        nuxt-app:
                container_name: ${COMPOSE_PROJECT_NAME}_app
                build: ./nuxt-app
                image: ${COMPOSE_PROJECT_NAME}
                depends_on:
                    - nginx
                networks:
                    - nuxt-network
        
      2. 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
        
    3. nuxt-app資料夾中的.env

      1. 修改名稱與正式環境網址

        APP_NAME = project_name
        ENV = prod
        SITE_URL = <https://clientdomain.com>
        API_URL = <https://clientdomain.com>
        
    4. 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
      
    5. 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
      		},
      	}]
      }
      
    6. 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;
          }
      }
      
  3. 搬移資料庫(如不需搬移可略過)

    1. 從要搬移的環境匯出資料庫:

      1. 一般環境下:用mysqldump指令備份資料庫

        sudo mysqldump -u username -p database_name > ~/wp.sql
        
      2. Docker環境下:用docker exec來執行mysqldump

        sudo docker exec mysql_container_name sh -c "MYSQL_PWD=root mysqldump -uroot esdata" > wp.sql
        
    2. 把匯出的wp.sql複製到專案環境下的db/production/資料夾

      cp wp.sql /path/to/project/db/production/
      
  4. commit以上變更

  5. 建置nuxt-app並上傳建置後的檔案(暫時維持原本方式)

部署環境設定(ubuntu 22.04 LTS)

  1. ssh連到主機

  2. 設定ssh key

    1. 產生deploy用ssh key

      ssh-keygen -t rsa -b 4096 -C "[email protected]" -N "" -f ~/.ssh/id_rsa
      

      截圖 2023-12-06 下午12.07.34.png

    2. 啟動ssh-agent代理

      eval "$(ssh-agent -s)"
      

      截圖 2023-12-06 下午12.08.27.png

    3. 將ssh key添加到ssh-agent中

      ssh-add ~/.ssh/id_rsa
      

      截圖 2023-12-06 下午12.09.01.png

    4. 用編輯器打開並複製所有內容

      vim ~/.ssh/id_rsa.pub
      

      Untitled

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

      Untitled

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

      Untitled

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

      Untitled

  3. Git clone 專案 repository

    1. /home/帳號資料夾

      cd ~
      
    2. git clone取得專案repository

      git clone [email protected]:esdesignstudio/repository_name.git
      
    3. 進入專案資料夾

      cd repository_name
      
    4. 取得remote branch資訊

      git branch -r
      
    5. 確認後check out要deploy的branch(例如:production)

      git checkout production
      
  4. 上傳wp-content/uploads的檔案

    1. 從本機端要上傳的專案資料夾下執行scp指令

      scp -r ./wordpress/wp-content/uploads user@server_ip:/path/to/project/wordpress/wp-content/uploads
      
  5. 主機上進入專案資料夾執行環境安裝用script

    sudo sh production_setting.sh
    
  6. 安裝SSL(參考:How To Secure Nginx with Let's Encrypt on Ubuntu 22.04

    1. 更新snap

      sudo snap install core; sudo snap refresh core
      
    2. 安裝cerbot

      sudo snap install --classic certbot
      
    3. 設定系統直接使用cerbot指令

      sudo ln -s /snap/bin/certbot /usr/bin/certbot
      
    4. 用cerbot修改nginx設定檔(會需要輸入email和問幾個問題)

      sudo certbot --nginx -d clientdomain.com -d www.clientdomain.com
      
    5. 設定自動更新憑證

      1. 開啟Crontab設定

        sudo crontab -e
        
      2. 加入一行指令

        0 0 1 * * certbot renew
        
  7. 部署完成。

後續「手動更新」方式

  1. 本機建置
    1. 在本機專案環境下,git切到production分支
    2. merge要更新的commit
    3. Double Check各項專案設定檔!!
    4. nuxt-app資料夾下建置專案
    5. commit建置的檔案後push上去
  2. 更新Server
  3. 更新完成,檢查是否正確執行

其他注意事項