ساده سازی استقرار زاویه ای با 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 را می دهد.
- وارد کنسول مدیریت AWS شوید.
- به داشبورد EC2 بروید.
- گروه های امنیتی را انتخاب کنید در بخش “شبکه و امنیت”.
- گروه امنیتی خود را پیدا کرده و انتخاب کنید مرتبط با نمونه EC2 شما.
-
قوانین ورودی را ویرایش کنید برای اجازه دادن به ترافیک در پورت های 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 خود
-
HTTP (پورت 80):
export CR_PAT=YOUR_TOKEN
echo $CR_PAT | docker login ghcr.io -u USERNAME --password-stdin
خلاصه
این تنظیمات تضمین می کند که:
- هر استقرار از یک تصویر Docker با برچسب هش commit خاص Git استفاده می کند.
- تصاویر استفاده نشده Docker از سرور شما حذف می شوند تا فضا آزاد شود.
- سرور شما آخرین تصویر Docker را بدون جمع آوری تصاویر قدیمی اجرا می کند.