어렵다잉
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 |
댓글