개발

Flask 앱 배포 체크리스트

화이트해커 Luna 🌙 2023. 9. 27. 04:46
728x90
반응형

Flask 앱 배포 체크리스트

 

 

1. 서버 호스팅 및 인프라스트럭처 설정

 

서버 호스팅 선택
  • Flask 애플리케이션을 호스팅할 환경을 선택하는 것은 중요한 결정입니다. 대표적인 옵션은 클라우드 서비스와 VPS입니다.
  • 클라우드 서비스 (AWS, Azure, Google Cloud)는 확장성이 뛰어나며 필요한 리소스를 동적으로 조절할 수 있습니다. 서버 크기와 리소스를 애플리케이션 요구 사항에 따라 선택하세요.
  • VPS (가상 사설 서버)는 물리적 서버에서 독립적인 환경을 제공하며 상대적으로 저렴합니다. 간단한 웹 앱을 호스팅하기에 적합할 수 있습니다.

 

SSH 접속 및 키 생성
  • 서버에 원격으로 접속하기 위해서는 SSH (Secure Shell) 키를 생성해야 합니다. 이를 통해 보안적으로 접속할 수 있습니다.
  • 로컬 컴퓨터에서 SSH 키를 생성하려면 터미널에서 다음 명령을 실행하세요:
ssh-keygen -t rsa -b 4096
  • 이 명령은 RSA 암호화 키를 4096 비트로 생성합니다.
  • 생성된 공개 키를 서버에 복사하고, 로컬에서 원격 서버로 SSH 접속을 설정하세요.

 

 

도메인 연결 및 DNS 구성
  • 도메인은 웹 앱을 식별하는 주소입니다. 도메인을 등록하려면 도메인 등록 업체를 선택하고, 원하는 도메인을 등록하세요.
  • 도메인 등록 후, 도메인 등록 업체에서 DNS (Domain Name System) 설정을 구성해야 합니다. DNS를 통해 도메인과 서버 IP 주소를 연결합니다.
  • DNS 설정에서는 필요한 DNS 레코드 (주로 A 레코드)를 추가하여 도메인을 원하는 서버로 연결하세요.

 

운영 체제 업데이트
  • 서버를 운영하는 운영 체제 (예: Ubuntu, CentOS)는 정기적으로 업데이트해야 합니다. 업데이트에는 보안 업데이트와 패키지 업데이트가 포함됩니다.
  • 운영 체제를 업데이트하려면 터미널에서 다음 명령을 실행하세요:
    • Ubuntu 기반 시스템: sudo apt update 및 sudo apt upgrade
    • CentOS 기반 시스템: sudo yum update
  • 보안 업데이트는 서버의 안정성을 유지하는 데 매우 중요하며, 주기적으로 업데이트를 수행하는 것이 좋습니다.

 

2. 웹 서버 및 WSGI 서버 설정

 

WSGI 서버 설치 및 설정
  • WSGI (Web Server Gateway Interface) 서버는 Flask 애플리케이션을 실행하고 웹 서버와 통신하는 역할을 합니다. Gunicorn 또는 uWSGI와 같은 WSGI 서버를 선택하여 설치하세요.
  • Gunicorn은 Python 웹 서버로서 Flask 애플리케이션을 실행하는 데 매우 일반적으로 사용됩니다.

uWSGI 설치 및 설정

# Gunicorn 설치 (가상환경 내에서 설치를 권장합니다.)
pip install gunicorn

Flask 애플리케이션을 실행하는 스크립트 (예: app.py)를 가정합니다.

# Gunicorn을 사용하여 Flask 애플리케이션 실행
gunicorn -w 4 -b 0.0.0.0:8000 app:app
  • -w 4: 4개의 worker 프로세스를 사용하여 병렬로 요청을 처리합니다. 워커 수는 서버의 CPU 코어 수에 따라 조정할 수 있습니다.
  • -b 0.0.0.0:8000: 서버가 0.0.0.0 주소와 8000 포트에서 요청을 수신하도록 설정합니다.
  • app:app: Flask 애플리케이션을 참조하는 방법입니다.

 

uWSGI 설치 및 설정 

 

# uWSGI 설치 (가상환경 내에서 설치를 권장합니다.)
pip install uwsgi

[uwsgi]
module = app:app
master = true
processes = 4
socket = 0.0.0.0:8000
  • module = app:app: Flask 애플리케이션을 참조합니다.
  • master = true: 마스터 프로세스를 사용하여 워커 프로세스를 관리합니다.
  • processes = 4: 4개의 워커 프로세스를 사용합니다.
  • socket = 0.0.0.0:8000: 서버가 0.0.0.0 주소와 8000 포트에서 요청을 수신하도록 설정합니다.

 

웹 서버 설치 및 설정
  • Nginx 또는 Apache와 같은 웹 서버를 설치하고 설정하세요.
  • 웹 서버를 역 프록시로 설정하여 WSGI 서버와 연결하세요.
  • SSL 인증서를 설치하고 HTTPS를 활성화하여 보안 통신을 설정하세요.
  • 웹 서버는 클라이언트 요청을 받아 WSGI 서버와 통신하며, 정적 파일 제공, 역 프록시 설정, SSL 암호화 등의 기능을 수행합니다.

 

Nginx 설치 및 설정

  • Nginx는 가벼우면서도 강력한 웹 서버로서 Flask 애플리케이션을 서빙하고 역 프록시로 설정할 수 있습니다.
# Nginx 설치
sudo apt-get update
sudo apt-get install nginx

 

Nginx 사이트 설정 파일 (예: myapp)을 생성하고 편집합니다.

sudo nano /etc/nginx/sites-available/myapp

 

Nginx 사이트 설정 파일 예제

server {
    listen 80;
    server_name your-domain.com www.your-domain.com;

    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8000;
    }
}
  • server_name: 사용할 도메인을 지정합니다.
  • location /: 모든 요청을 WSGI 서버로 전달합니다.

 

심볼릭링크 생성

sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled

#서버 다시시작
sudo nginx -t
sudo systemctl restart nginx

 

Apache 설치 및 설정

  • Apache는 또 다른 인기 있는 웹 서버로서 Flask 애플리케이션을 서빙하고 역 프록시로 설정할 수 있습니다.
# Apache 설치
sudo apt-get update
sudo apt-get install apache2

 

Apache VirtualHost 설정 파일 (예: myapp.conf)을 생성하고 편집합니다.

sudo nano /etc/apache2

 

SSL 인증서 설치 및 HTTPS 활성화

 

SSL 인증서 획득

SSL 인증서를 획득해야 합니다. 대표적으로 Let's Encrypt에서 무료로 SSL 인증서를 발급받을 수 있습니다. 아래 명령으로 Certbot을 설치합니다.

sudo apt update
sudo apt install certbot python3-certbot-nginx

Certbot을 사용하여 SSL 인증서 발급 및 설치

다음 명령으로 Certbot을 사용하여 SSL 인증서를 발급하고 자동으로 설정을 업데이트합니다. 도메인 및 경로를 실제 값으로 대체하세요.

Certbot은 Nginx 설정을 자동으로 업데이트하고 SSL 인증서를 설치합니다.

sudo certbot --nginx -d your-domain.com -d www.your-domain.com

 

HTTPS 설정 확인

Certbot이 SSL 인증서 설치와 Nginx 설정을 완료한 후, HTTPS가 활성화됩니다. 설정을 확인하려면:

sudo nginx -t
sudo systemctl restart nginx

 

HTTPS 사용 확인

웹 브라우저를 열고 https://your-domain.com 또는 https://www.your-domain.com으로 접속하여 HTTPS가 정상적으로 작동하는지 확인하세요.

 

3. 데이터베이스 관리

 

데이터베이스 시스템 선택 및 설치
  • 데이터베이스 시스템 (PostgreSQL, MySQL, SQLite 등)을 선택하고 서버에 설치하세요.

 

Flask SQLAlchemy를 통한 데이터베이스 연동
  • Flask SQLAlchemy를 사용하여 Flask 애플리케이션과 데이터베이스를 연동하세요.
  • SQLAlchemy 모델을 정의하고 데이터베이스 스키마를 생성하세요.

 

데이터베이스 백업 및 복원
  • 데이터베이스 백업을 자동화하고 주기적으로 백업 파일을 안전한 위치에 저장하세요.
  • 필요한 경우 데이터베이스를 복원하여 데이터 손실을 최소화하세요.

 

단계 1: 데이터베이스 시스템 선택 및 설치

데이터베이스 시스템을 선택하고 서버에 설치하는 것이 첫 번째 단계입니다. 이 예제에서는 PostgreSQL 데이터베이스를 선택하고 설치하는 방법을 안내합니다.

# Ubuntu에서 PostgreSQL 설치 명령어
sudo apt update
sudo apt install postgresql postgresql-contrib

 

단계 2: Flask SQLAlchemy를 통한 데이터베이스 연동

Flask 애플리케이션에서 데이터베이스를 사용하기 위해서는 Flask SQLAlchemy를 설치하고 초기화해야 합니다. 아래는 Flask SQLAlchemy를 설치하고 Flask 애플리케이션에서 데이터베이스 연동 설정을 하는 과정입니다.

# Flask SQLAlchemy 설치 명령어
pip install Flask-SQLAlchemy


# Flask 애플리케이션에서 SQLAlchemy 초기화 및 데이터베이스 연결 설정
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 데이터베이스 연결 설정
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://username:password@localhost/mydatabase'
db = SQLAlchemy(app)

 

단계 3: SQLAlchemy 모델 정의 및 데이터베이스 스키마 생성

SQLAlchemy 모델을 사용하여 데이터베이스 테이블을 정의하고 데이터베이스 스키마를 생성합니다. 아래는 간단한 User 모델의 예제와 스키마 생성 명령어입니다.

# SQLAlchemy 모델 정의
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __init__(self, username, email):
        self.username = username
        self.email = email

# 데이터베이스 스키마 생성 명령어
# 초기화 명령어: python
# from your_app import db
# db.create_all()

 

단계 4: 데이터베이스 백업 및 복원

데이터베이스 백업은 주기적으로 자동화하고 백업 파일을 안전한 위치에 저장해야 합니다. PostgreSQL을 사용하는 경우 pg_dump 명령어를 사용하여 백업할 수 있습니다. 또한 필요한 경우 백업 파일을 사용하여 데이터베이스를 복원할 수 있습니다.

 

# 데이터베이스 백업 명령어
pg_dump -U username -d mydatabase > backup.sql

# 데이터베이스 복원 명령어
# psql -U username -d mydatabase < backup.sql

 

4. 애플리케이션 환경 설정

 

환경 변수 사용
  • 중요한 설정 (데이터베이스 연결 정보, 시크릿 키 등)을 환경 변수로 저장하세요.
  • python-decouple 또는 python-dotenv와 같은 라이브러리를 사용하여 환경 변수를 읽어오세요.

 

환경별 설정 관리
  • 애플리케이션의 환경에 따라 다른 설정 파일 (development, production)을 관리하고 활용하세요.

 

 

4.1. 환경 변수 사용

중요한 설정 정보를 환경 변수로 저장하고 사용하는 것은 보안적인 측면에서 중요합니다. python-decouple 또는 python-dotenv와 같은 라이브러리를 사용하여 환경 변수를 읽어올 수 있습니다.

# python-decouple 설치 명령어
pip install python-decouple


# .env 파일 예제
# 아래와 같이 .env 파일을 생성하여 중요 설정 정보를 저장합니다.
DATABASE_URL=postgresql://username:password@localhost/mydatabase
SECRET_KEY=mysecretkey
DEBUG=True


# Python 코드에서 환경 변수 사용 예제
from decouple import config

# 데이터베이스 연결 정보 읽어오기
DATABASE_URL = config('DATABASE_URL')

# 시크릿 키 읽어오기
SECRET_KEY = config('SECRET_KEY')

# 디버그 모드 설정 읽어오기
DEBUG = config('DEBUG', default=False, cast=bool)

 

4.2. 환경별 설정 관리

애플리케이션은 다양한 환경에서 실행될 수 있습니다. 예를 들어, 개발 환경, 테스트 환경, 프로덕션 환경 등이 있을 수 있습니다. 이러한 환경에 따라 다른 설정 파일을 관리하고 활용할 수 있습니다.

# config.py 파일 예제
# 각 환경에 따른 설정을 다루는 config 파일을 생성합니다.
import os

class Config:
    SECRET_KEY = os.getenv('SECRET_KEY')
    SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URL')

class DevelopmentConfig(Config):
    DEBUG = True

class ProductionConfig(Config):
    DEBUG = False


# Flask 애플리케이션에서 환경에 따른 설정 불러오기
from flask import Flask

app = Flask(__name__)

# 환경 변수에 따라 설정 클래스 선택
if app.config['ENV'] == 'production':
    app.config.from_object('config.ProductionConfig')
else:
    app.config.from_object('config.DevelopmentConfig')

 

 

5. 보안 및 인증

 

사용자 인증 및 권한 부여
  • Flask-Login 또는 Flask-Security와 같은 확장을 사용하여 사용자 인증 및 권한 관리를 구현하세요.
  • 사용자 로그인과 로그아웃을 처리하세요.
# Flask-Login 설치 명령어
pip install Flask-Login

# Flask-Login을 초기화하고 사용자 세션을 관리하는 예제
from flask import Flask, render_template, redirect, url_for
from flask_login import LoginManager, login_user, login_required, logout_user, UserMixin

app = Flask(__name__)

# Flask-Login 초기화
login_manager = LoginManager(app)
login_manager.login_view = 'login'

# 사용자 모델 정의 (예제)
class User(UserMixin):
    def __init__(self, user_id):
        self.id = user_id

# 로그인 함수 (예제)
@app.route('/login')
def login():
    user = User('user_id')  # 실제로는 데이터베이스에서 사용자 정보를 가져와야 합니다.
    login_user(user)
    return redirect(url_for('dashboard'))

# 로그아웃 함수
@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('index'))

# 대시보드 (로그인한 사용자만 접근 가능)
@app.route('/dashboard')
@login_required
def dashboard():
    return render_template('dashboard.html')

 

비밀번호 보안
  • Werkzeug의 generate_password_hash와 check_password_hash 함수를 사용하여 사용자 비밀번호를 안전하게 저장하세요.
  • 비밀번호를 저장할 때 솔트(Salt)를 사용하여 보안성을 향상하세요.
# Werkzeug 설치 명령어
pip install Werkzeug

# 비밀번호 해싱과 검증 예제
from werkzeug.security import generate_password_hash, check_password_hash

# 비밀번호 해싱
password = 'mysecretpassword'
hashed_password = generate_password_hash(password, method='sha256')

# 비밀번호 검증
is_valid = check_password_hash(hashed_password, 'wrongpassword')  # False
is_valid = check_password_hash(hashed_password, 'mysecretpassword')  # True
보안 설정
  • Flask 확장을 사용하여 HTTP 헤더 보안 (Flask-SeaSurf, Flask-Talisman) 및 쿠키 보안을 설정하세요.
# Flask-SeaSurf 설치 명령어 (CSRF 보호)
pip install Flask-SeaSurf

# Flask-SeaSurf를 초기화하고 사용하는 예제
from flask import Flask
from flask_seasurf import SeaSurf

app = Flask(__name__)
csrf = SeaSurf(app)

# 라우트에 CSRF 보호 적용
@csrf.exempt
@app.route('/public_route', methods=['POST'])
def public_route():
    return 'This route is not protected by CSRF.'

 

HTTPS와 관련된 쿠키 보안을 설정하려면 securehttponly 옵션을 사용합니다. 이러한 옵션을 사용하면 쿠키가 안전하게 전송되고, JavaScript를 통한 액세스가 제한됩니다.

# 쿠키 보안 설정 예제
from flask import Flask, make_response

app = Flask(__name__)

@app.route('/set_secure_cookie')
def set_secure_cookie():
    response = make_response('Setting secure and http-only cookie')
    response.set_cookie('my_cookie', 'cookie_value', secure=True, httponly=True)
    return response

 

 

6. 애플리케이션 최적화

 

6.1. 프론트엔드 최적화

프론트엔드 최적화는 웹 페이지의 로딩 속도를 향상시키는 데 도움이 됩니다.

  • CSS 및 JavaScript 최소화: CSS 및 JavaScript 파일을 최소화(minify)하여 파일 크기를 줄이고 로딩 시간을 단축합니다. 이를 위해 트랜스파일러(Transpiler)와 미니파이(Minify) 도구를 사용할 수 있습니다.
  • 이미지 최적화: 이미지를 최적화하여 파일 크기를 줄이고 이미지 로딩 시간을 단축합니다. 이미지 압축 도구를 사용하여 최적화할 수 있습니다.
  • 웹 페이지 캐싱: 정적 리소스를 클라이언트 측 브라우저 캐시 또는 CDN(Content Delivery Network)를 통해 제공하여 웹 페이지 로딩 속도를 개선합니다.

6.2. 서버 사이드 최적화

서버 사이드 최적화는 데이터베이스 및 서버 성능을 향상시키는 데 중점을 둡니다.

  • 쿼리 최적화 및 인덱싱: 데이터베이스 쿼리의 성능을 향상시키기 위해 쿼리 최적화 및 인덱싱을 수행합니다. 쿼리 실행 계획을 확인하고 느린 쿼리를 최적화하세요.
  • 데이터베이스 연결 관리: 데이터베이스 연결을 효율적으로 관리하여 불필요한 연결을 방지하고 연결 풀링(Connection Pooling)을 사용하세요.

6.3. 비동기 처리 추가

비동기 처리는 웹 요청 및 데이터 수집을 효율적으로 처리하여 응답 시간을 최소화하는 데 도움이 됩니다.

  • asyncio 및 aiohttp 사용: Python에서 비동기 코드를 작성하기 위해 asyncio 및 aiohttp와 같은 라이브러리를 사용합니다. 이를 통해 동시에 여러 웹 요청을 처리하고 병렬로 데이터를 수집할 수 있습니다.

아래는 비동기 처리 예제입니다.

import asyncio
import aiohttp

async def fetch_url(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

async def main():
    urls = ['https://example.com', 'https://example.org']
    results = await asyncio.gather(*[fetch_url(url) for url in urls])
    for url, result in zip(urls, results):
        print(f'Response from {url}: {result}')

if __name__ == '__main__':
    asyncio.run(main())

 

7. 배포 및 모니터링

 

배포 스크립트 작성
  • 배포 스크립트를 작성하여 애플리케이션을 서버에 배포하세요.
  • 자동화된 배포 프로세스를 설정하세요.
#!/bin/bash

# 애플리케이션 코드와 설정 파일 복사
scp -r /path/to/your/app user@server:/path/to/destination

# 서버에 접속하여 필요한 작업 수행
ssh user@server << EOF
    cd /path/to/destination
    source venv/bin/activate
    pip install -r requirements.txt
    # 기타 설정 및 업데이트 작업
    flask db upgrade  # 데이터베이스 마이그레이션 등
    systemctl restart your-app.service
    exit
EOF
오류 및 로그 모니터링
  • 오류 로그와 애플리케이션 로그를 수집하고 모니터링 도구를 사용하여 실시간으로 모니터링하세요.
  • 오류 발생 시 즉각적으로 대응할 수 있는 경고 및 알림을 설정하세요.

 

스케일링 및 부하 분산
  • 서버 스케일링을 고려하고 로드 밸런서를 구성하여 트래픽을 균형 분산하세요.
  • 필요한 경우 캐싱을 사용하여 응답 시간을 단축하세요.

 

8. 백업 및 복원

 

데이터베이스 백업
  • 데이터베이스 백업을 주기적으로 실행하여 중요한 데이터를 안전하게 보호하세요.
  • 백업된 데이터를 안전한 위치에 저장하고 백업 주기를 설정하세요.
# PostgreSQL 데이터베이스 백업 예시 (일일 백업)
pg_dump -U username -d dbname -f /path/to/backup/db_backup_$(date +\%Y\%m\%d).sql

 

애플리케이션 코드 백업
  • 애플리케이션 코드와 설정 파일을 백업하여 비상 시 복원을 용이하게 하세요.

 

9. 보안 취약점 점검

 

보안 취약점 스캔
  • 보안 취약점을 검사하고 대응하기 위해 취약점 스캔 도구를 사용하세요.
  • OWASP Top Ten과 같은 보안 취약점 목록을 확인하여 대비하세요.

 

업데이트 관리
  • 서버 운영 체제, 웹 서버, 데이터베이스 및 Flask 및 확장 모듈을 최신 상태로 업데이트하세요.

 

10. 백업 및 복구 테스트

백업과 복구 테스트
  • 주기적으로 데이터베이스 백업과 애플리케이션 복구 테스트를 수행하여 데이터 손실 시나리오에 대비하세요.

 

위의 체크리스트는 Flask 앱을 안정적으로 배포하고 운영하기 위한 주요 단계와 고려해야 할 사항을 다룹니다. 각 단계에서 더 자세한 내용과 구체적인 설정 방법은 해당 주제에 대한 공식 문서와 온라인 자습서를 참조하는 것이 좋습니다. 이러한 체크리스트를 따르면 Flask 애플리케이션을 보안적이고 안정적인 상태로 운영할 수 있을 것입니다.

728x90
반응형

'개발' 카테고리의 다른 글

그누보드6 설치하기  (56) 2024.02.26
자주쓰는 정규표현식 예제 정리  (0) 2023.12.23
플라스크(Flask) 예제로 정리  (1) 2023.09.14
깃허브 명령어  (2) 2023.09.14