برنامه نویسی

ساده سازی استقرار زاویه ای با GitHub Actions، رجیستری کانتینر GitHub، Docker و Nginx

در توسعه وب مدرن، راه‌اندازی یک خط لوله CI/CD کارآمد برای استقرار برنامه‌های Angular می‌تواند گردش کار شما را به میزان قابل توجهی افزایش دهد. این پست وبلاگ شما را از طریق راه‌اندازی یک خط لوله GitHub Actions برای ساخت و استقرار یک برنامه Angular با استفاده از Docker، Nginx و اطمینان از تنظیمات اولیه گروه امنیتی در EC2 راهنمایی می‌کند.

پیش نیازها

  • یک مخزن GitHub حاوی برنامه Angular شما.
  • Docker روی دستگاه محلی شما نصب شده است.
  • GitHub Container Registry (GHCR) برای ذخیره تصاویر Docker.
  • یک نمونه EC2 یا هر سروری با Docker و Nginx نصب شده است.
  • تنظیمات گروه امنیتی مناسب در نمونه EC2 شما.

مرحله 1: Dockerfile را برای پذیرش آرگومان های ساخت تغییر دهید

ابتدا باید Dockerfile خود را به‌روزرسانی کنیم تا آرگومان‌های ساختی را بپذیریم که محیط Angular را مشخص می‌کنند. این تضمین می کند که فرآیند ساخت ما می تواند به صورت پویا بر اساس محیط تنظیم شود.

# Use the official Node.js image as a base
FROM node:14

# Create and set the working directory
WORKDIR /app

# Copy package.json and package-lock.json
COPY package*.json ./

# Install dependencies
RUN npm install

# Copy the rest of the application files
COPY . .

# Set the environment variable to increase memory limit
ENV NODE_OPTIONS=--max_old_space_size=4096

# Build the Angular application based on the provided environment
ARG ANGULAR_ENV=production
RUN npm run build -- --configuration=$ANGULAR_ENV

# Expose the port the app runs on
EXPOSE 80

# Command to run the application
CMD ["npm", "start"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 2: گردش کار GitHub Actions را تنظیم کنید

در مرحله بعد، یک گردش کار GitHub Actions را برای مدیریت فرآیند ساخت و استقرار پیکربندی می کنیم.

name: Build and Deploy Angular

on:
  push:
    branches:
      - main # Change this to your main branch name

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Code
        uses: actions/checkout@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Log in to GitHub Container Registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }} # Use GitHub token secret

      - name: Extract Git Commit Hash
        id: vars
        run: echo "COMMIT_HASH=$(git rev-parse --short HEAD)" >> $GITHUB_ENV

      - name: Build Docker Image
        run: |
          docker build --build-arg ANGULAR_ENV=production -t ghcr.io/yourusername/angular-docker:${{ env.COMMIT_HASH }} .

      - name: Push Docker Image to GitHub Container Registry
        run: |
          docker push ghcr.io/yourusername/angular-docker:${{ env.COMMIT_HASH }}

      - name: SSH and Deploy to Server
        env:
          PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} # This is the private key secret for SSH
          COMMIT_HASH: ${{ env.COMMIT_HASH }}
        run: |
          echo "$PRIVATE_KEY" > private_key.pem
          chmod 600 private_key.pem
          ssh -o StrictHostKeyChecking=no -i private_key.pem ubuntu@your-ec2-instance <
            echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
            docker pull ghcr.io/yourusername/angular-docker:${COMMIT_HASH}
            docker stop angular-app || true
            docker rm angular-app || true
            docker run -d --name angular-app -p 8080:80 ghcr.io/yourusername/angular-docker:${COMMIT_HASH}
            sudo systemctl restart nginx
            docker system prune -a -f --volumes
          EOF
          rm -f private_key.pem

    permissions:
      contents: read
      packages: write
      id-token: write
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 3: پیکربندی Nginx

پیکربندی Nginx خود را به‌روزرسانی کنید تا درخواست‌های پراکسی به‌درستی در ظرف Docker انجام شود.

server {
    if ($host = yourdomain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name yourdomain.com;
    return 404;
}

server {
    listen 443 ssl http2;
    server_name yourdomain.com;

    location / {
        proxy_pass http://localhost:8080/;
        proxy_set_header Host $host;
        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 $scheme;
    }

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # managed by Certbot
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 4: پیکربندی گروه امنیتی EC2

مطمئن شوید که گروه امنیتی نمونه EC2 شما اجازه ترافیک ورودی در پورت های 80 و 443 را می دهد.

  1. وارد کنسول مدیریت AWS شوید.
  2. به داشبورد EC2 بروید.
  3. گروه های امنیتی را انتخاب کنید در بخش “شبکه و امنیت”.
  4. گروه امنیتی خود را پیدا کرده و انتخاب کنید مرتبط با نمونه EC2 شما.
  5. قوانین ورودی را ویرایش کنید برای اجازه دادن به ترافیک در پورت های 80 (HTTP) و 443 (HTTPS):

    • HTTP (پورت 80):

      • نوع: HTTP
      • پروتکل: TCP
      • برد بندر: 80
      • منبع: 0.0.0.0/0
    • HTTPS (پورت 443):

      • نوع: HTTPS
      • پروتکل: TCP
      • برد بندر: 443
      • منبع: 0.0.0.0/0
    • وارد ghcr.io شوید برای بیرون کشیدن iamge ها از github خود
export CR_PAT=YOUR_TOKEN
echo $CR_PAT | docker login ghcr.io -u USERNAME --password-stdin
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خلاصه

این تنظیمات تضمین می کند که:

  • هر استقرار از یک تصویر Docker با برچسب هش commit خاص Git استفاده می کند.
  • تصاویر استفاده نشده Docker از سرور شما حذف می شوند تا فضا آزاد شود.
  • سرور شما آخرین تصویر Docker را بدون جمع آوری تصاویر قدیمی اجرا می کند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا