Maintenance Mode
7459

1 Mục Tiêu

  • Khi bật Maintenance Mode, hầu hết người dùng sẽ thấy trang bảo trì, nhưng một số IP có thể được whitelist để truy cập bình thường.
  • Khi tắt Maintenance Mode, toàn bộ người dùng truy cập bình thường.
  • Bật/tắt Maintenance Mode thông qua file flag trên server.
  • Cung cấp script để bật/tắt thủ công và hỗ trợ tích hợp CI/CD.

2 Kiến Trúc

  • File Flag:
    • Tạo một file đặc biệt (VD: /var/www/metax/maintenance.flag).
    • Nếu file tồn tạiBật Maintenance Mode.
    • Nếu file không tồn tạiTắt Maintenance Mode.
  • Nginx Config:
    • Nếu maintenance.flag tồn tại → Kiểm tra IP.
    • Nếu IP không trong whitelist → Trả về 503 + hiển thị trang bảo trì.
    • Nếu IP trong whitelist → Truy cập bình thường.
  • Trang Maintenance (maintenance.html):
    • File HTML tĩnh, có thể chứa ảnh từ S3/CDN.
  • Script bật/tắt Maintenance Mode (maintenance.sh):
    • ./maintenance.sh 1 → Bật maintenance (tạo file flag & reload Nginx).
    • ./maintenance.sh 0 → Tắt maintenance (xóa flag & reload Nginx).
  • CI/CD:
    • Tích hợp với GitHub Actions, bật/tắt maintenance bằng input workflow_dispatch.

3 Cách Cài Đặt

Bước 1: Tạo Trang Maintenance HTML

  • Tạo file /var/www/metax/maintenance.html:
    <!DOCTYPE html>
    <html lang="vi">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Bảo trì hệ thống</title>
        <style>
            body { text-align: center; font-family: Arial, sans-serif; background: #f4f4f4; }
            .container { margin-top: 10%; }
            h1 { color: #ff0000; }
        </style>
    </head>
    <body>
        <div class="container">
            <h1>🚧 Hệ thống đang bảo trì 🚧</h1>
            <p>Chúng tôi đang nâng cấp hệ thống. Vui lòng quay lại sau.</p>
        </div>
    </body>
    </html>
    

Bước 2: Cấu Hình Nginx

  • Mở file cấu hình Nginx (VD: /etc/nginx/conf.d/metax.conf) và cập nhật:
    server {
        listen 80;
        server_name myapp.com;
    
        set $maintenance 0;
        if (-f /var/www/metax/maintenance.flag) {
            set $maintenance 1;
        }
    
        location / {
            if ($maintenance = 1) {
                return 503;
            }
            proxy_pass http://backend_server;
        }
    
        error_page 503 @maintenance;
        location @maintenance {
            root /var/www/metax;
            index maintenance.html;
        }
    }
    
  • Giải thích:

    • Nếu /var/www/metax/maintenance.flag tồn tại → Trả về mã lỗi 503.
    • Người dùng sẽ thấy maintenance.html thay vì truy cập backend.
  • Reload Nginx để áp dụng cấu hình:

    sudo nginx -t
    sudo systemctl reload nginx
    

Bước 3: Tạo Script Bật/Tắt Maintenance Mode

  • Tạo file maintenance.sh:

    #!/bin/bash
    
    FLAG_PATH="/var/www/metax/maintenance.flag"
    
    if [ "$1" == "1" ]; then
        touch $FLAG_PATH
        echo "Maintenance mode ON"
    elif [ "$1" == "0" ]; then
        rm -f $FLAG_PATH
        echo "Maintenance mode OFF"
    else
        echo "Usage: $0 {1|0}"
        exit 1
    fi
    
    # Reload Nginx để áp dụng thay đổi
    sudo systemctl reload nginx
    
  • Cấp quyền thực thi:

    chmod +x maintenance.sh
    

Bước 4: Kiểm Tra Hoạt Động

  1. Bật Maintenance Mode:

    ./maintenance.sh 1
    
    • Tạo file flag /var/www/metax/maintenance.flag.
    • Reload Nginx → Trả về 503 Maintenance.
    • Kiểm tra bằng trình duyệt (myapp.com → thấy trang bảo trì).
  2. Tắt Maintenance Mode:

    ./maintenance.sh 0
    
    • Xóa file flag /var/www/metax/maintenance.flag.
    • Reload Nginx → Người dùng truy cập lại bình thường.

4 Tích Hợp CI/CD với GitHub Actions

  • Tạo workflow GitHub Actions (.github/workflows/maintenance.yml)
    name: Maintenance Mode Toggle
    
    on:
      workflow_dispatch:
        inputs:
          maintenance_mode:
            description: 'Bật (on) hoặc tắt (off) Maintenance Mode'
            required: true
            default: 'off'
    
    jobs:
      maintenance:
        runs-on: ubuntu-latest
    
        steps:
          - name: SSH vào Server và thay đổi trạng thái Maintenance Mode
            uses: appleboy/ssh-action@v0.1.7
            with:
              host: ${{ secrets.SERVER_HOST }}
              username: ${{ secrets.SERVER_USER }}
              key: ${{ secrets.SERVER_SSH_KEY }}
              script: |
                cd /var/www/metax
                if [ "${{ github.event.inputs.maintenance_mode }}" == "on" ]; then
                  ./maintenance.sh 1
                else
                  ./maintenance.sh 0
                fi
    
  • Giải thích:
    • Khi chạy workflow, chọn on hoặc off để bật/tắt maintenance mode.
    • GitHub Actions SSH vào server, thực thi script maintenance.sh.

Bước 5: Kiểm Tra CI/CD

  1. Vào GitHub Actions → Chạy workflow.
  2. Chọn "on" để bật Maintenance Mode, kiểm tra myapp.com.
  3. Chọn "off" để tắt Maintenance Mode, kiểm tra lại.

5 Tổng Kết

Bật/Tắt Maintenance Mode bằng file flag trên server.
Cấu hình Nginx để hiển thị trang bảo trì khi bật maintenance.
Dùng script thủ công (maintenance.sh) để quản lý Maintenance Mode.
Tích hợp GitHub Actions để bật/tắt tự động qua CI/CD.

Danh mục


  1. Khác
  2. ThreeJS
  3. Ubuntu/Linux
  4. HTML/CSS
  5. Git
  6. Amazon Web Services
  7. Javascript
  8. Docker
  9. Laravel

Bài viết liên quan


AWS S3

AWS S3

27.09.2024
Author: ADMIN
AWS S3 là một dịch vụ lưu trữ đối tượng mạnh mẽ và linh hoạt. Bài viết này sẽ giúp bạn hiểu rõ về S3, từ các khái niệm cơ bản đến cách cấu hình chi tiết. Cùng với đó là hướng dẫn từng bước để tạo bucket, upload object, phân quyền và tạo bucket policy. Giú
AWS Region

AWS Region

27.09.2024
Author: ADMIN
Bài viết này giải thích chi tiết về AWS Region, bao gồm đặc điểm, lợi ích và cách chọn Region phù hợp. Tìm hiểu về Availability Zones, tuân thủ quy định, tối ưu hóa chi phí và giảm độ trễ. Nắm vững kiến thức để triển khai ứng dụng đám mây hiệu quả.
Auto Trigger Notification to Discord/Teams/Slack

Auto Trigger Notification to Discord/Teams/Slack

05.02.2025
Author: ADMIN
Hướng dẫn chi tiết giám sát lỗi backend với AWS CloudWatch Logs, AWS Lambda, Discord. Phân loại lỗi, chống spam, thông báo lỗi nghiêm trọng. Cấu hình CloudWatch Logs, Lambda, S3.
CI/CD Pipeline

CI/CD Pipeline

05.02.2025
Author: ADMIN
Hướng dẫn chi tiết thiết lập CI/CD Pipeline tự động hóa build, test, deploy qua Bastion Host, dùng GitHub Actions/CodePipeline. Cấu hình SSH Proxy, triển khai staging & production an toàn, hiệu quả.

Bài viết khác

Routing

Routing

01.08.2024
Author: ADMIN
Hướng dẫn chi tiết về Basic Routing trong Laravel, từ cách định nghĩa route, sử dụng middleware, route caching đến route naming giúp tối ưu hóa ứng dụng.
Blade Basics

Blade Basics

01.08.2024
Author: ADMIN
Khám phá Blade trong Laravel: từ if-else, loops, kế thừa layout đến include sub-views. Giúp code gọn gàng, dễ quản lý và bảo trì hơn!
9 Mẹo Hữu Ích Khi Sử Dụng Blade Trong Laravel

9 Mẹo Hữu Ích Khi Sử Dụng Blade Trong Laravel

01.08.2024
Author: ADMIN
Khám phá 9 mẹo Blade giúp bạn viết code Laravel sạch, tối ưu và chuyên nghiệp hơn. Từ @forelse, @auth, @guest, đến format ngày, tối ưu SEO – tất cả trong một bài viết súc tích, dễ áp dụng!
Hiển thị giá trị trong Blade

Hiển thị giá trị trong Blade

01.08.2024
Author: ADMIN
Hướng dẫn hiển thị biến trong Laravel Blade: escape HTML tự động, hiển thị dữ liệu thô, giá trị mặc định và cách truy xuất mảng, đối tượng. Giúp bạn tối ưu hiển thị dữ liệu một cách an toàn!