[Streamlit]4. Ubuntu 서버에서 연결하기, NGINX 도메인 및 보안 설정
이번 포스트에서는 Streamlit을 Ubuntu 서버에 연동해서 올려놓는 방법을 정리하고자 한다.
0. 환경 설정
우선, 로컬에서 만들어 둔 Streamlit 파일들을 원격 서버로 옮겨야 한다.
서버 권한을 가지고 있는 사람들은 로컬에서 직접 옮기는 등의 다른 방법을 써도 되지만,
나는 권한이 없기 때문에 깃허브를 이용해서 파일을 올렸다.
우선 서버에 필요한 패키지를 설치해준 뒤
sudo apt update && sudo apt upgrade -y
sudo apt install python3 python3-pip git -y
Streamlit 파일들이 저장된 리포지토리를 클론해준다.
git clone https://github.com/사용자이름/저장소이름.git
cd 저장소이름
참고로 내 원격 서버 내 디렉토리는 대충 이렇게 생겼다.
[directory]
asac_6_dataanalysis (리포지토리)
|--- project_streamlit
|--- ui
|--- utils
|--- app.py
나는 모든 작업을 project_streamlit 폴더 내에서 수행했다.
깃허브에 파일을 새로 올리고 서버에서 업데이트하고 싶다면 git pull origin main을 하면 된다.
근데 서버에서 수정한 내역과 충돌할 경우 골치가 아플 수도 있다.
거기까지는 포스트에서 언급하지 않겠다.
다음으로 가상 환경을 생성하여 의존성을 관리해 준다.
python3 -m venv venv
source venv/bin/activate
requirements.txt 파일이 있다면 다음 명령으로 패키지를 한꺼번에 설치할 수 있다.
웬만하면 깃허브에서부터 가지고 들어가고, 나중에 서버에서 직접 생성할 수도 있다.
pip install -r requirements.txt
여기까지는 기본이고, 다음은 Streamlit을 연결할 경우 주의 깊게 봐야할 사항들이다.
1. 서버 연결
우선, 서버의 Streamlit 디렉토리에서 다음 명령어를 통해 .streamlit 폴더가 있는지 확인한다.
ls -a
깃허브가 .streamlit 폴더를 인식하지 못해 클론이 되지 않았을 수 있다.
이 경우, .streamlit 폴더를 만들어 주고 그 안에 config.toml, 필요하다면 secrets.toml 파일까지 생성해 준다.
mkdir .streamlit
touch config.toml
touch secrets.toml
파일이 생성되었다면 로컬에서 만든 파일들의 내용을 복붙하거나 새로 써 주면 된다.
이 때, 서버 연결을 위해서는 config.toml에 필수적으로 들어가야 할 내용이 있으니 주의 깊게 봐야 한다.
에디터는 아무거나 써도 된다. 난 nano 에디터를 쓰겠다.
config.toml을 에디터에서 실행하고
sudo nano config.toml
다음과 같은 내용을 붙여 넣어 준다.
config.toml에 theme 설정을 해 놨다면 그 아래 이어서 써주면 된다.
포트는 기본값이 8501지만 실행만 된다면 바꿔 써도 상관은 없다.
[server]
headless = true
enableCORS = false
enableXsrfProtection = false
address = "0.0.0.0"
port = 8501
나가서 해당 포트의 방화벽을 열어준다.
sudo ufw allow 8501
sudo ufw reload
혹시 스트림릿 앱이 실행되고 있지는 않은지도 확인해 준다.
ps aux | grep streamlit
만약 run app.py가 실행되고 있다면 프로세스를 꺼준다.
kill 00000
이제 제대로 서버에서 스트림릿 앱을 열어보겠다.
다음 명령어를 실행해도 실행은 되지만, 서버가 꺼지면 프로세스도 같이 종료된다.
streamlit run app.py
(참고로 테스트한다고 이 명령어로 실행하다가 주소 복사한답시고 컨트롤 C를 누르면 프로세스가 바로 꺼지니 초보자들은 각별히 주의하자...)
그래서 서버가 꺼져도 프로세스를 유지하고 싶으면 다음 명령어로 백그라운드 실행해야 한다.
nohup streamlit run app.py > streamlit.log 2>&1 &
저 streamlit.log는 로그를 저장하는 파일명이다. 2025-02-27.log 등으로 이름을 바꿔서 설정해줄 수도 있다.
실행하자마자 뜨는 숫자는 프로세스 넘버이다.
어디 적어놓으면 나중에 프로세스 종료할 때 바로 kill 할 수 있다.
그렇지 않으면 그냥 ps aux | grep streamlit 해서 프로세스 넘버 확인하고 종료하면 된다.
2. 도메인 설정
서버 연결은 해 놨지만 어딘가 본새가 나지 않을 때,
무언가 심각한 문제가 있을 때(Databricks 대시보드 임베딩이 안 된다)
Streamlit으로 만든 웹사이트에도 도메인을 설정하고자 하는 생각이 들 것이다.
그 전에 도메인을 사고 서버랑 연동하는 것부터 잘 해야 한다.
생각보다 스트림릿이 아니라 도메인 쪽 문제인 경우가 많아서...
일단 잘 했다고 가정하고 넘어가도록 하겠다.
일단 NGINX 설치를 한다.
sudo apt update
sudo apt install nginx -y
설치하고 상태를 확인해준다.
sudo systemctl status nginx
NGINX의 포트를 열어준다.
sudo ufw allow 'Nginx Full'
sudo ufw reload
NGINX 설정 파일을 편집한다.
sudo nano /etc/nginx/sites-available/streamlit
server {
listen 80;
server_name asacurrency.co.kr;
location / {
proxy_pass http://127.0.0.1:8501; # Streamlit 앱 포트
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
config.toml에도 다음 내용을 추가해 준다.
[browser]
serverAddress = "asacurrency.co.kr"
serverPort = 80
3. 보안 설정(https)
여기서 멈출 수도 있지만... http 설정만 마친 상태라 보안 이슈를 피하기 위해서는 https도 설정해 주는 것이 좋다.
(난 Databricks 대시보드 임베딩도 여전히 안 돼서...)
이를 위해 Certbot를 설치해 준다.
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
다음 명령을 실행하여 SSL 인증서를 발급하고 NGINX 설정에 적용한다.
www 서브도메인도 같이 설정할 수 있지만 난 적용이 안 돼서 뺐다.
sudo certbot --nginx -d asacurrency.co.kr
NGINX 설정 파일로 들어가 내용이 적용됐는지 확인한다.
sudo nano /etc/nginx/sites-available/streamlit
server {
listen 443 ssl; # HTTPS를 처리
server_name asacurrency.co.kr;
# SSL 인증서 설정 (Certbot에 의해 관리됨)
ssl_certificate /etc/letsencrypt/live/asacurrency.co.kr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/asacurrency.co.kr/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf; # 추가 SSL 설정
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# 애플리케이션 프록시 설정
location / {
proxy_pass http://127.0.0.1:8501; # Streamlit 실행 주소
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
}
# 에러 페이지 설정 (Optional)
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 80; # HTTP를 처리
server_name asacurrency.co.kr;
# HTTP를 HTTPS로 리다이렉트
return 301 https://$host$request_uri;
}
변경된 설정을 적용한 후 NGINX를 재시작한다.
sudo nginx -t
sudo systemctl restart nginx
이제 다시 Streamlit을 실행하면 진짜같은 웹사이트를 볼 수 있다. 야호!