리눅스/리눅스 응용

NCP 마켓플레이스용 Application Image 만들기

easyfly 2025. 8. 10. 12:11
반응형

NCP 마켓플레이스용 Application Image 만들기

대상 환경: Ubuntu + NGINX + Django + (Cloud DB for) MySQL


1. 전체 흐름(한눈에 보기)

  1. 파트너 제휴 신청 → 2) 심사(사업성·기술력) → 3) PoC/구성 검증 → 4) 제휴 승인 → 5) 마켓플레이스 등록(설명/디자인/다국어) → 6) 계약 → 7) 출시. 네이버클라우드가 공개한 솔루션 파트너 자료의 정식 절차 요약입니다.

포인트: “이미지를 만드는 것”과 “마켓플레이스에 올려 판매/배포”는 별개입니다. 전자는 기술 작업, 후자는 파트너(솔루션 파트너) 계약과 심사·검증이 수반됩니다. (NAVER CLOUD PLATFORM)

 


2. 설계 원칙(통과가 쉬워지고 운영이 편해지는 기준)

  • DB 분리: 이미지 안에 로컬 MySQL을 고정 탑재하지 말고, Cloud DB for MySQL(관리형)을 기본 연결 대상으로 설계합니다. 배포가 간단하고 백업/복구·모니터링이 내장되어 심사·운영이 수월합니다. (Ncloud Docs Guide)
  • 무상태(Stateless) 서버: 도메인/DB 접속 정보·비밀키는 환경변수(.env) 로 외부 주입, 이미지에는 비밀정보를 절대 내장하지 않기.
  • 최초부팅 자동화: cloud-init 또는 1st-boot 스크립트로 “패키지 업데이트, SSH 호스트키 재생성, 관리자 계정 생성, Django SECRET_KEY 생성”을 자동 수행.
  • 보안 기본값: ACG(보안그룹)에서 22/80/443만 최소 허용, DB 포트(3306)는 VPC 내부에서만 허용. 접속 절차는 NCP 문서를 그대로 따릅니다. (Ncloud Docs Guide)
  • 이미지 생성/공유 전략: NCP는 서버 이미지 기능(콘솔/CLI)로 커스텀 이미지를 만들고, 리전 복제·공유·스냅샷을 지원합니다. IaC(예: Packer) 자동화도 가능합니다. (Ncloud Docs Guide, cli.ncloud-docs.com, HashiCorp Developer)

3. 베이스 서버 구축(실전 단계)

3-1. 서버 만들기

  • 콘솔 > Compute > Server > Ubuntu LTS 선택, VPC/서브넷/ACG 설정.
  • ACG 인바운드: 22, 80, 443(필요 시 80→443 리다이렉트).
  • 공인 IP 필요시 할당. 접속은 SSH(리눅스)·RDP(윈도우) 표준 절차 사용. (Ncloud Docs Guide)

3-2. 패키지/런타임 설치(예: Ubuntu 22.04)

sudo apt update && sudo apt -y upgrade
sudo apt -y install python3-pip python3-venv python3-dev build-essential \
                    nginx git ufw mysql-client
# 앱 디렉터리
sudo mkdir -p /opt/app && sudo chown $USER:$USER /opt/app
cd /opt/app && python3 -m venv venv && source venv/bin/activate
pip install --upgrade pip wheel gunicorn
pip install django mysqlclient  # 필요시 requirements.txt로 일괄 관리

3-3. Django 샘플 배치

# 예시: 프로젝트 생성/환경파일
django-admin startproject mysite .
cat > .env << 'EOF'
DJANGO_SETTINGS_MODULE=mysite.settings
DJANGO_SECRET_KEY=
DJANGO_DEBUG=False
DB_HOST=
DB_PORT=3306
DB_NAME=
DB_USER=
DB_PASSWORD=
ALLOWED_HOSTS=*
EOF

3-4. Gunicorn 서비스화(systemd)

sudo tee /etc/systemd/system/mysite.service >/dev/null <<'SERVICE'
[Unit]
Description=Gunicorn for Django mysite
After=network.target

[Service]
User=www-data
WorkingDirectory=/opt/app
EnvironmentFile=/opt/app/.env
ExecStart=/opt/app/venv/bin/gunicorn mysite.wsgi:application \
  --bind unix:/run/gunicorn-mysite.sock --workers 3
RuntimeDirectory=gunicorn
Restart=always

[Install]
WantedBy=multi-user.target
SERVICE

sudo systemctl daemon-reload
sudo systemctl enable --now mysite

3-5. NGINX 프록시 설정

sudo tee /etc/nginx/sites-available/mysite >/dev/null <<'NGINX'
server {
    listen 80;
    server_name _;

    location /static/ { alias /opt/app/static/; }
    location / {
        proxy_pass http://unix:/run/gunicorn-mysite.sock;
        include proxy_params;
    }
}
NGINX
sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

3-6. Cloud DB for MySQL 연결(권장)

  • 콘솔 > Database > Cloud DB for MySQL 인스턴스 생성 → VPC/ACG로 앱 서버와 통신 허용. 가이드의 절차에 따라 앱 서버에서 접속 테스트 후 본 인스턴스를 운영에 사용합니다. (Ncloud Docs Guide)
  • Django settings.py의 DB 항목은 .env 값으로 매핑.

4. 최초부팅 자동화(이미지용 필수)

4-1. cloud-init(또는 1st-boot) 예시

sudo tee /opt/app/firstboot.sh >/dev/null <<'BOOT'
#!/usr/bin/env bash
set -e
# SSH 호스트키 재생성(이미지 재배포 안전성)
rm -f /etc/ssh/ssh_host_* || true
dpkg-reconfigure openssh-server

# SECRET_KEY 자동 생성(없을 때만)
if ! grep -q '^DJANGO_SECRET_KEY=' /opt/app/.env; then
  KEY=$(python3 - <<'PY'
import secrets; print(secrets.token_urlsafe(50))
PY
)
  sed -i "s|^DJANGO_SECRET_KEY=.*|DJANGO_SECRET_KEY=$KEY|" /opt/app/.env
fi

# 마이그레이션/정적 파일
cd /opt/app
source venv/bin/activate
python manage.py migrate --noinput || true
python manage.py collectstatic --noinput || true

systemctl restart mysite
BOOT
sudo chmod +x /opt/app/firstboot.sh

# 최초 1회 실행용 서비스
sudo tee /etc/systemd/system/firstboot.service >/dev/null <<'UNIT'
[Unit]
Description=Run first boot tasks
After=network-online.target

[Service]
Type=oneshot
ExecStart=/opt/app/firstboot.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
UNIT

sudo systemctl enable firstboot.service

이 스크립트는 “이미지에서 새 서버를 만들 때”만 1회 실행되어, 보안키·SSH키 재생성 등 복제 안전성을 보장합니다.


5. 이미지 정리 및 커스텀 이미지 생성

5-1. 정리

# 로그/캐시 정리
sudo journalctl --rotate && sudo journalctl --vacuum-time=1s
sudo rm -rf /var/log/*.gz /var/log/*.[0-9] /root/.bash_history
sudo apt -y autoremove && sudo apt -y clean

5-2. 서버 이미지 생성

  • 콘솔 > Compute > Server > Server Image에서 현재 서버로 My Server Image 생성(리전 복제/공유/스냅샷 관리 가능). CLI로는 createServerImage 도구도 있습니다. (Ncloud Docs Guide, cli.ncloud-docs.com)

6. 사내 테스트·품질 검증(PoC) 체크리스트

  • 동일 이미지로 동일 결과 재현(새 인스턴스 N대)
  • Cloud DB 연결/권한/ACG 정상
  • HTTPS 적용 시 Let’s Encrypt 자동화(optional)
  • 대시보드/헬스체크 URL(예: /healthz) 제공
  • 취약점 점검(SSH 설정, 불필요 포트, 기본계정금지)
  • 사용/요금 지표(서버 사양·트래픽) 수집

7. 마켓플레이스 등록 절차(문서·심사 관점)

  1. 제휴제안 신청: 회사/제품·매출목표·요금/협업 모델 등 필수 제출 항목 기입.
  2. 담당자 검토: 사업성(시장성·안정성)·기술력(NCP 구성 가능성) 1차 평가.
  3. 솔루션 구성 검증(PoC): NCP 상에서 기능·성능 테스트.
  4. 제휴 승인/계약: 조건 협의 후 파트너 계약.
  5. 마켓플레이스 등록: 상품 페이지 디자인·다국어 번역, 민간/금융/공공 존 등록.
  6. 사업 개시.
    상세 단계와 요구자료는 공식 안내문을 따릅니다.

비용·정산: 마켓플레이스는 인프라 요금(NCP) + 솔루션 요금(귀사) 구조로 고객에게 과금되며, 정산 시 NCP 정책에 따른 수수료가 공제됩니다. 정확한 수수료·약관은 계약서 기준입니다. (NAVER CLOUD PLATFORM)


8. 운영/업데이트 전략

  • 버전 관리: 이미지 버전(예: v2025.08)과 변경 로그 공개.
  • 보안 패치 주기: 분기마다 새 이미지 발행 권장. 기존 인스턴스는 자동 갱신되지 않으므로 공지 필요(커스텀 이미지 재배포의 일반 원칙). (HashiCorp Developer)
  • 문서화: 설치/최초 설정, ACG 규칙, .env 샘플, 장애 FAQ, SLA/지원 정책 동봉. (Cloud DB for MySQL은 SLA 문서 참조) (Ncloud)

9. 보너스: 자동 빌드(IaC) 팁

  • Packer + NCP 플러그인으로 이미지 생성 과정을 코드화하면, 매번 “클릭” 대신 스크립트 한 번으로 동일 이미지를 빌드·검증·배포할 수 있습니다. CI 파이프라인에 연결하면 심사 대응도 수월합니다. (HashiCorp Developer)

마무리 체크리스트(요약)

  • Cloud DB 분리(접속정보 .env)
  • 1st-boot 자동화/비밀키 재생성
  • ACG 최소허용, 80/443, 22만
  • My Server Image 생성·복제 테스트
  • PoC 시나리오/성능지표 준비
  • 마켓플레이스 설명서·가격정책·지원정책 문서화
  • 파트너 제휴 절차 서류 제출