반응형
NCP 마켓플레이스용 Application Image 만들기
대상 환경: Ubuntu + NGINX + Django + (Cloud DB for) MySQL
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. 마켓플레이스 등록 절차(문서·심사 관점)
- 제휴제안 신청: 회사/제품·매출목표·요금/협업 모델 등 필수 제출 항목 기입.
- 담당자 검토: 사업성(시장성·안정성)·기술력(NCP 구성 가능성) 1차 평가.
- 솔루션 구성 검증(PoC): NCP 상에서 기능·성능 테스트.
- 제휴 승인/계약: 조건 협의 후 파트너 계약.
- 마켓플레이스 등록: 상품 페이지 디자인·다국어 번역, 민간/금융/공공 존 등록.
- 사업 개시.
상세 단계와 요구자료는 공식 안내문을 따릅니다.
비용·정산: 마켓플레이스는 인프라 요금(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 시나리오/성능지표 준비
- 마켓플레이스 설명서·가격정책·지원정책 문서화
- 파트너 제휴 절차 서류 제출
'리눅스 > 리눅스 응용' 카테고리의 다른 글
프로그램, 프로세스, 스레드의 개념 (3) | 2025.08.14 |
---|---|
셔뱅(Shebang, #!) 이란? (5) | 2025.08.13 |
Git 환경을 확인하는 방법 (0) | 2025.06.27 |
Git의 작업 메커니즘 (2) | 2025.06.26 |
[삼바서버] /srv 디렉터리의 의미와 역할 (7) | 2025.02.01 |