CI/CD sử dụng GitHub Actions

Phần này sẽ sử dụng GitHub Actions điều khiển DSM qua SSH và câp nhật file bằng rsync.

Cấu hình trên DSM

Tạo shared folder

Trên DSM

Tạo container web hosting

Trên DSM truy cập Container Manager. Tạo một project và sử dụng docker compose để cấu hình container mới.

Với web tĩnh chỉ có html thì sử dụng image nginx:alpine

services:
  web-cv:
    image: nginx:alpine
    container_name: web-cv  # Tên container
    volumes:
      - /volume1/docker/Web/cv:/usr/share/nginx/html:ro  # thư mục code # ro = readonly
    ports:
      - "9901:80" # port để truy cập. Trong trường hợp này là 192.168.1.88:9901
    restart: unless-stopped

Với web động sử dụng php thì sử dụng image php:8.3-apache

services:
  web-upkgs:
    image: php:8.3-apache
    container_name: web-upkgs
    volumes:
      - /volume1/docker/Web/upkgs:/var/www/html:rw # rw = read write
    ports:
      - "9902:80"
    restart: unless-stopped

Cần chú ý map đúng thư mục code.

Copy source code vào đúng thư mục đã mapping.

Chạy container mới tạo. Nếu truy cập được qua local (ex: 192.168.1.88:9902) là thành công là thành công.

Tạo user deploy và phân quyền

Trên DSM tạo một user mới là deploy để chùng cho việc deploy web

User này cần phải có quyền administrators để có thể sử dụng được ssh

Bật SSH

DSM > Control Panle > Terminal & SNMP > Enable SSH service > Apply

Tạo SSH key cho GitHub Actions

Thêm public key vào user deploy

Lưu ý

Lưu ý

Nếu đăng nhập vào vẫn yêu cần password

Lưu ý:

Để đảm bảo bảo mật hãy tắt PasswordAuthentication

Setup GitHub Secrets

Mở port

Trước tiên để GitHub có thể truy cập tới DSM thông qua SSH thì cần mở port 22 của máy chủ DSM. Có thể map bất kỳ cổng nào của router vào cổng 22 của DSM

image.png

Thêm secrets

Trên GitHub repo > Settings > Secrets and variables > Actions > New repository secret

Tạo GitHub Actions (Từ phần này chỉ bao gồm lý thuyết, chưa test)

Trong repo trên GitHub tạo file .github/workflows/deploy.yml

name: Deploy to DSM via SSH + rsync

on:
  push:
    branches: [ main ]    # đổi lại branch bạn dùng, ví dụ 'master' hoặc 'prod'
  workflow_dispatch:       # cho phép chạy tay từ tab Actions

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4 

      - name: Start SSH agent
        uses: webfactory/ssh-agent@v0.9.0
        with:
          ssh-private-key: ${{ secrets.DSM_SSH_KEY }}

      - name: Add DSM host to known_hosts
        run: |
          mkdir -p ~/.ssh
          ssh-keyscan -p ${{ secrets.DSM_PORT }} ${{ secrets.DSM_HOST }} >> ~/.ssh/known_hosts

      - name: Deploy via rsync
        run: |
          rsync -avz --delete \
            --exclude ".git" \
            --exclude ".github" \
            ./ \
            ${{ secrets.DSM_USER }}@${{ secrets.DSM_HOST }}:${{ secrets.DSM_PATH }}

      # (Tùy chọn) Set lại owner cho đúng user chạy web trên DSM
      # Nếu cần, bỏ comment đoạn này và chỉnh 'http:http' theo user của Synology/Container
      # - name: Fix permissions on DSM
      #   run: |
      #     ssh ${{ secrets.DSM_USER }}@${{ secrets.DSM_HOST }} -p ${{ secrets.DSM_PORT }} \
      #       "chown -R http:http ${DSM_PATH}"

      # Giải thích nhanh:
      # actions/checkout@v4: clone code từ repo vào runner.
      # webfactory/ssh-agent: load private key vào ssh-agent để rsync/ssh dùng.
      # ssh-keyscan: thêm host DSM vào known_hosts để tránh prompt tương tác.
      # rsync -avz --delete:
      #   -a: archive (giữ permission, symlink, v.v…)
      #   -v: verbose
      #   -z: nén khi truyền
      #   --delete: xóa file trên DSM nếu đã xóa trong repo
      #   --exclude: không đẩy .git, .github lên DSM.

Ok như vậy là đã xong. Hãy đảm bảo đã mount chính xác folder cho các container php, nginx như bước đầu tiên

Test

  1. Thực hiện commit trên repo
  2. Push lên main (hoặc branch đã chọn)
  3. Vào tab Actions của repo → chọn workflow Deploy to DSM via SSH + rsync:
    • Xem log:
      • Nếu lỗi SSH: check lại DSM_HOST, DSM_PORT, firewall/router.
      • Nếu lỗi quyền: check quyền user deploy với folder /volume1/docker/webapp.
  4. Nếu job xanh (success), SSH vào DSM:
    • Kiểm tra:
      • ls -l /volume1/docker/Web/cv
      • Dùng DSM web truy cập tới thư mục được mount và kiểm tra.
      • Truy cập và kiểm tra thực tế trên web




Revision #1
Created 2025-11-17 16:18:21 UTC by ThanhDV
Updated 2025-11-18 17:28:39 UTC by ThanhDV