Server-Deploy

Nas Deploy: duckdns-cloudflare-CI/CD-portrainer

자무카 2025. 6. 2.

어렵다잉

1. Dynamic DNS 자동화 방안

추천 서비스: Duck DNS (무료, 안정적)

  • 설치 위치: QNAP NAS (24/7 운영)
  • 자동화 스크립트:
    #!/bin/bash
    # /share/docker/scripts/ddns-update.sh
    TOKEN="your-duckdns-token"
    DOMAIN="yourdomain.duckdns.org"
    curl "https://www.duckdns.org/update?domains=$DOMAIN&token=$TOKEN&ip="
  • Cron 설정: 5분마다 IP 체크 및 업데이트
    ```bash
  • /5 * * * * /share/docker/scripts/ddns-update.sh >> /share/docker/logs/ddns.log 2>&1

대안: Cloudflare DNS API

  • 무료 도메인과 연동 가능
  • API를 통한 자동 업데이트
  • 더 빠른 DNS 전파

2. CI/CD 파이프라인 구축

개발 → 배포 자동화 워크플로우

graph LR
    A[Proxmox 개발] --> B[Git Push]
    B --> C[GitHub Actions]
    C --> D{배포 대상 선택}
    D -->|QNAP| E[Docker Deploy to NAS]
    D -->|외부| F[Cloud Deploy]
    E --> G[Health Check]
    F --> G

GitHub Actions 설정 예시

# .github/workflows/deploy.yml
name: Deploy Application
on:
  push:
    branches: [main]
  workflow_dispatch:
    inputs:
      target:
        description: 'Deploy target'
        required: true
        default: 'qnap'
        type: choice
        options:
        - qnap
        - cloud

jobs:
  deploy-to-qnap:
    if: github.event.inputs.target == 'qnap' || github.event.inputs.target == ''
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Deploy to QNAP
        uses: appleboy/ssh-action@v0.1.5
        with:
          host: ${{ secrets.QNAP_HOST }}
          username: ${{ secrets.QNAP_USER }}
          key: ${{ secrets.QNAP_SSH_KEY }}
          script: |
            cd /share/docker/apps/${{ github.event.repository.name }}
            git pull origin main
            docker-compose down
            docker-compose up -d --build

3. 배포 환경 관리 도구

Portainer 설치 (QNAP)

# QNAP Container Station에서 실행
docker run -d \
  --name portainer \
  --restart always \
  -p 9443:9443 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

배포 스크립트 템플릿

#!/bin/bash
# deploy.sh - 범용 배포 스크립트
PROJECT_NAME=$1
TARGET_ENV=${2:-qnap}
GIT_BRANCH=${3:-main}

case $TARGET_ENV in
  "qnap")
    HOST="192.168.0.xxx"  # QNAP IP
    USER="admin"
    DEPLOY_PATH="/share/docker/apps"
    ;;
  "cloud")
    HOST="your-cloud-server.com"
    USER="ubuntu"
    DEPLOY_PATH="/opt/apps"
    ;;
esac

echo "Deploying $PROJECT_NAME to $TARGET_ENV..."
ssh $USER@$HOST "
  cd $DEPLOY_PATH/$PROJECT_NAME
  git pull origin $GIT_BRANCH
  docker-compose down
  docker-compose up -d --build
  docker-compose ps
"

4. 모니터링 및 백업

로그 모니터링 (Grafana + Loki)

# docker-compose.monitoring.yml
version: '3.8'
services:
  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=your-password

  loki:
    image: grafana/loki:latest
    ports:
      - "3100:3100"
    volumes:
      - loki-data:/loki

volumes:
  grafana-data:
  loki-data:

자동 백업 스크립트

#!/bin/bash
# backup.sh - 매일 자동 백업
BACKUP_DIR="/share/backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR

# Docker volumes 백업
docker run --rm -v /var/lib/docker/volumes:/volumes \
  -v $BACKUP_DIR:/backup alpine \
  tar czf /backup/docker-volumes.tar.gz /volumes

# 데이터베이스 백업 (예: PostgreSQL)
docker exec postgres-container pg_dumpall -U postgres > $BACKUP_DIR/postgres.sql

# 7일 이상 된 백업 삭제
find /share/backup -type d -mtime +7 -exec rm -rf {} \;

5. 보안 강화

Reverse Proxy 설정 (Nginx Proxy Manager)

# docker-compose.proxy.yml
version: '3.8'
services:
  nginx-proxy-manager:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - npm-data:/data
      - npm-ssl:/etc/letsencrypt

volumes:
  npm-data:
  npm-ssl:

방화벽 설정

# QNAP 방화벽 규칙
# 필요한 포트만 개방: 80, 443, 22 (SSH)
# 내부 네트워크에서만 관리 포트 접근 허용

6. 권장 디렉토리 구조

/share/docker/
├── apps/                 # 애플리케이션 배포
│   ├── project1/
│   ├── project2/
├── scripts/              # 배포/관리 스크립트
│   ├── deploy.sh
│   ├── backup.sh
│   └── ddns-update.sh
├── monitoring/           # 모니터링 도구
│   ├── grafana/
│   └── loki/
├── proxy/               # 리버스 프록시
└── logs/                # 로그 파일

7. 추가 고려사항

  • SSL 인증서: Let's Encrypt 자동 갱신
  • 환경 변수 관리: Docker secrets 또는 .env 파일
  • Rolling 배포: Blue-Green 또는 Canary 배포 고려
  • 알림 시스템: Slack/Discord webhook 연동

'Server-Deploy' 카테고리의 다른 글

웹서버 구축  (0) 2025.06.04
Qnap : 컨테이너 스테이션 - git + nginx 배포  (0) 2025.06.02
도커 관리 : Portainer 아키텍처  (0) 2025.06.02

댓글