์ด ํํ ๋ฆฌ์ผ์ ์ปค๋ฎค๋ํฐ ๊ธฐ์ฌ์ด๋ฉฐ Open WebUI ํ์์ ์ง์ํ์ง ์์ต๋๋ค. ํน์ ์ฉ๋์ ๋ง๊ฒ Open WebUI๋ฅผ ์ปค์คํฐ๋ง์ด์งํ๋ ๋ฐ ๋์์ด ๋๋ ๋ฐ๋ชจ๋ก๋ง ์ฌ์ฉ๋ฉ๋๋ค. ๊ธฐ์ฌ๋ฅผ ์ํ์ญ๋๊น? ๊ธฐ์ฌ ํํ ๋ฆฌ์ผ์ ํ์ธํ์ธ์.
Nginx๋ฅผ ์ฌ์ฉํ HTTPS
์ฌ์ฉ์์ Open WebUI ๊ฐ์ ์์ ํ ํต์ ์ ๋ณด์ฅํ๋ ๊ฒ์ ์ค์ํฉ๋๋ค. HTTPS(ํ์ดํผํ ์คํธ ์ ์ก ํ๋กํ ์ฝ ๋ณด์)๋ ์ ์ก๋ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ์ฌ ๋์ฒญ ๋ฐ ๋ณ์กฐ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค. Nginx๋ฅผ ์ญ๋ฐฉํฅ ํ๋ก์๋ก ๊ตฌ์ฑํ์ฌ Open WebUI ๋ฐฐํฌ์ HTTPS๋ฅผ ์ํํ๊ฒ ์ถ๊ฐํ๋ฉด ๋ณด์์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ๋ชจ๋ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ด ์๋ด์๋ HTTPS๋ฅผ ์ค์ ํ๋ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค:
- ์์ฒด ์๋ช ์ธ์ฆ์: ๊ฐ๋ฐ ๋ฐ ๋ด๋ถ ์ฌ์ฉ์ ์ ํฉํ๋ฉฐ Docker๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- Lets Encrypt: ์ ๋ขฐํ ์ ์๋ SSL ์ธ์ฆ์๊ฐ ํ์ํ ํ๋ก๋์ ํ๊ฒฝ์ ์ ํฉํ๋ฉฐ Docker๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- Windows+์์ฒด ์๋ช : Windows์์ ๊ฐ๋ฐ ๋ฐ ๋ด๋ถ ์ฌ์ฉ์ ์ํ ๊ฐ๋จํ ์ง์นจ์ผ๋ก Docker๊ฐ ํ์ํ์ง ์์ต๋๋ค.
๋ฐฐํฌ ์๊ตฌ์ ๊ฐ์ฅ ์ ํฉํ ๋ฐฉ๋ฒ์ ์ ํํ์ธ์.
- Nginx Proxy Manager
- Lets Encrypt
- ์์ฒด ์๋ช
- Windows
Nginx Proxy Managerโ
Nginx Proxy Manager (NPM)์ Open WebUI์ ๊ฐ์ ๋ก์ปฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํจํ Lets Encrypt SSL ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ณดํธํ๊ณ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค. ์ด ์ค์ ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ํน์ ํฌํธ๋ฅผ ์ง์ ์ธํฐ๋ท์ ๋ ธ์ถํ์ง ์๊ณ ๋ HTTPS ์ก์ธ์ค๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ๋ง์ ๋ชจ๋ฐ์ผ ๋ธ๋ผ์ฐ์ ์์ ๋ณด์ ์๊ตฌ ์ฌํญ์ผ๋ก ์ธํด ์์ฑ ์ ๋ ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๋ฐ ํ์ํฉ๋๋ค.
์ฌ์ ์กฐ๊ฑดโ
- Docker ๋ฐ open-webui ์ปจํ ์ด๋๊ฐ ์คํ ์ค์ธ ํ ์๋ฒ.
- ๋๋ฉ์ธ ์ด๋ฆ (DuckDNS์ ๊ฐ์ ๋ฌด๋ฃ ์ต์ ๋๋ Namecheap/GoDaddy์ ๊ฐ์ ์ ๋ฃ ์ต์ ).
- Docker ๋ฐ DNS ๊ตฌ์ฑ์ ๋ํ ๊ธฐ๋ณธ ์ง์.
๋จ๊ณ๋ณ ์ค์ โ
-
Nginx ํ์ผ์ ์ํ ๋๋ ํ ๋ฆฌ ๋ง๋ค๊ธฐ:
mkdir ~/nginx_config
cd ~/nginx_config -
Docker๋ฅผ ์ฌ์ฉํ์ฌ Nginx Proxy Manager ์ค์ :
nano docker-compose.yml
services:
app:
image: jc21/nginx-proxy-manager:latest
restart: unless-stopped
ports:
- 80:80
- 81:81
- 443:443
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
์ปจํ ์ด๋ ์คํ:
docker-compose up -d
-
DNS ๋ฐ ๋๋ฉ์ธ ๊ตฌ์ฑ:
- ๋๋ฉ์ธ ์ ๊ณต์ ์ฒด์ ๋ก๊ทธ์ธํ์ฌ (์: DuckDNS) ๋๋ฉ์ธ์ ์์ฑํฉ๋๋ค.
- ๋๋ฉ์ธ์ ํ๋ก์์ ๋ก์ปฌ IP(์: 192.168.0.6)๋ก ํฌ์ธํธํฉ๋๋ค.
- DuckDNS๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋์๋ณด๋์์ API ํ ํฐ์ ๊ฐ์ ธ์ต๋๋ค.
https://www.duckdns.org/domains ์์ ์ค์ ๋ฐฉ๋ฒ์ ๋ํ ๊ฐ๋จํ ์:โ
- SSL ์ธ์ฆ์ ์ค์ :
- Nginx Proxy Manager์ http://server_ip:81๋ก ์ก์ธ์คํฉ๋๋ค. ์:
192.168.0.6:81
- ๊ธฐ๋ณธ ์๊ฒฉ ์ฆ๋ช ([email protected] / changeme)์ผ๋ก ๋ก๊ทธ์ธํฉ๋๋ค. ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ๋ณ๊ฒฝํฉ๋๋ค.
- SSL Certificates โ Add SSL Certificate โ Lets Encrypt๋ก ์ด๋ ํฉ๋๋ค.
- DuckDNS์์ ๋ฐ์ ์ด๋ฉ์ผ๊ณผ ๋๋ฉ์ธ ์ด๋ฆ์ ์์ฑํฉ๋๋ค. ๋๋ฉ์ธ ์ด๋ฆ ํ๋์๋ ๋ณํ๊ฐ ํฌํจ๋๊ณ ํ๋์๋ ํฌํจ๋์ง ์์ต๋๋ค. ์:
*.hello.duckdns.org
๋ฐhello.duckdns.org
. - DNS challenge๋ฅผ ์ฌ์ฉํ๊ณ DuckDNS๋ฅผ ์ ํํ ํ API ํ ํฐ์ ๋ถ์ฌ๋ฃ์ต๋๋ค. ์:
dns_duckdns_token=f4e2a1b9-c78d-e593-b0d7-67f2e1c9a5b8
- Letโs Encrypt ์ด์ฉ ์ฝ๊ด์ ๋์ํ๊ณ ์ ์ฅํ์ญ์์ค. ํ์์ ์ ํ ์๊ฐ ๋ณ๊ฒฝ(120์ด).
- ํ๋ก์ ํธ์คํธ ์์ฑ:
- ๊ฐ ์๋น์ค(e.g., openwebui, nextcloud)์ ๋ํด Hosts โ Proxy Hosts โ Add Proxy Host๋ก ์ด๋ํฉ๋๋ค.
- ๋๋ฉ์ธ ์ด๋ฆ ์ ๋ ฅ(e.g., openwebui.hello.duckdns.org).
- HTTP ์คํด์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ๊ณ ,
Websockets support
ํ์ฑํ ํ Docker IP๋ฅผ ์ง์ ํฉ๋๋ค(open-webui์ NGINX ๊ด๋ฆฌ์๊ฐ ๊ฐ์ ์ปดํจํฐ์์ ์คํ๋๋ ๊ฒฝ์ฐ, ์ด์ ๊ณผ ๋์ผํ IP ์์:192.168.0.6
). - ์ด์ ์ ์์ฑ๋ SSL ์ธ์ฆ์๋ฅผ ์ ํํ๊ณ SSL์ ๊ฐ์ ํ์ฑํํ๋ฉฐ HTTP/2๋ฅผ ํ์ฑํํฉ๋๋ค.
- open-webui์ URL ์ถ๊ฐ (๊ทธ๋ ์ง ์์ผ๋ฉด HTTPS ์ค๋ฅ ๋ฐ์):
- open-webui โ ๊ด๋ฆฌ ํจ๋ โ ์ค์ โ ์ผ๋ฐ์ผ๋ก ์ด๋ํฉ๋๋ค.
- Webhook URL ํ
์คํธ ํ๋์ Nginx ๋ฆฌ๋ฒ์ค ํ๋ก์๋ฅผ ํตํด open-webui์ ์ฐ๊ฒฐํ URL์ ์
๋ ฅํฉ๋๋ค. ์:
hello.duckdns.org
(ํ์ ์๋) ๋๋openwebui.hello.duckdns.org
(ํ์).
WebUI ์ก์ธ์ค:โ
Open WebUI์ HTTPS๋ฅผ ํตํด ์ก์ธ์ค ํฉ๋๋ค: hello.duckdns.org
๋๋ openwebui.hello.duckdns.org
(์ค์ ํ ๋ฐฉ์์ ๋ฐ๋ผ).
๋ฐฉํ๋ฒฝ ์ฐธ๊ณ : ๋ก์ปฌ ๋ฐฉํ๋ฒฝ ์ํํธ์จ์ด(์: Portmaster)๊ฐ ๋ด๋ถ Docker ๋คํธ์ํฌ ํธ๋ํฝ ๋๋ ํ์ํ ํฌํธ๋ฅผ ์ฐจ๋จํ ์ ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ด ์ค์ ์ ํ์ํ ํต์ ์ด ํ์ฉ๋๋์ง ํ์ธํ๊ธฐ ์ํด ๋ฐฉํ๋ฒฝ ๊ท์น์ ์ ๊ฒํ์ญ์์ค.โ
Lets Encryptโ
Lets Encrypt๋ ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ์์ ์ ๋ขฐ๋ฐ๋ ๋ฌด๋ฃ SSL ์ธ์ฆ์๋ฅผ ์ ๊ณตํ๋ฉฐ, ํ๋ก๋์ ํ๊ฒฝ์ ์ ํฉํฉ๋๋ค.
์ค๋น์ฌํญโ
- Certbot์ด ์์คํ ์ ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค.
- DNS ๋ ์ฝ๋๊ฐ ์๋ฒ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฐ๋ฆฌํค๋๋ก ๊ตฌ์ฑ๋์ด์ผ ํฉ๋๋ค.
๋จ๊ณโ
-
Nginx ํ์ผ์ ์ํ ๋๋ ํ ๋ฆฌ ์์ฑ:
mkdir -p conf.d ssl
-
Nginx ์ค์ ํ์ผ ์์ฑ:
conf.d/open-webui.conf
:server {
listen 80;
server_name your_domain_or_IP;
location / {
proxy_pass http://host.docker.internal:3000;
# WebSocket ์ง์ ์ถ๊ฐ (๋ฒ์ 0.5.0 ์ดํ ํ์)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# (์ ํ์ฌํญ) ๋ชจ๋ธ์ ์คํธ๋ฆฌ๋ฐ ์๋ต์ ์ํด ํ๋ก์ ๋ฒํผ๋ง ๋นํ์ฑํ
proxy_buffering off;
# (์ ํ์ฌํญ) ํฐ ์ฒจ๋ถํ์ผ๊ณผ ๊ธด ์ค๋์ค ๋ฉ์์ง ์ฒ๋ฆฌ ์ํ ์ต๋ ์์ฒญ ํฌ๊ธฐ ์ฆ๊ฐ
client_max_body_size 20M;
proxy_read_timeout 10m;
}
} -
๊ฐ์ํ๋ Lets Encrypt ์คํฌ๋ฆฝํธ:
enable_letsencrypt.sh
:#!/bin/bash
# ์ค๋ช : Certbot์ ์ฌ์ฉํ์ฌ Lets Encrypt SSL ์ธ์ฆ์๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ค์นํ๋ ๊ฐ๋จํ ์คํฌ๋ฆฝํธ.
DOMAIN="your_domain_or_IP"
EMAIL="[email protected]"
# Certbot ์ค์น ์๋ ๊ฒฝ์ฐ ์ค์น
if ! command -v certbot &> /dev/null; then
echo "Certbot์ ์ฐพ์ ์ ์์ต๋๋ค. ์ค์น ์ค..."
sudo apt-get update
sudo apt-get install -y certbot python3-certbot-nginx
fi
# SSL ์ธ์ฆ์ ๊ฐ์ ธ์ค๊ธฐ
sudo certbot --nginx -d "$DOMAIN" --non-interactive --agree-tos -m "$EMAIL"
# ๋ณ๊ฒฝ ์ฌํญ ์ ์ฉ์ ์ํด Nginx ์ฌ์์
sudo systemctl reload nginx
echo "Lets Encrypt SSL ์ธ์ฆ์๊ฐ ์ค์น๋๊ณ Nginx๊ฐ ๋ค์ ๋ก๋๋์์ต๋๋ค."์คํฌ๋ฆฝํธ์ ์คํ ๊ถํ ๋ถ์ฌ:
chmod +x enable_letsencrypt.sh
-
Docker Compose ๊ตฌ์ฑ ์ ๋ฐ์ดํธ:
docker-compose.yml
ํ์ผ์ Nginx ์๋น์ค๋ฅผ ์ถ๊ฐํ์ธ์:services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./conf.d:/etc/nginx/conf.d
- ./ssl:/etc/nginx/ssl
depends_on:
- open-webui -
Nginx ์๋น์ค ์์:
docker compose up -d nginx
-
Lets Encrypt ์คํฌ๋ฆฝํธ ์คํ:
์ธ์ฆ์๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ค์นํ๊ธฐ ์ํด ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ธ์:
./enable_letsencrypt.sh
WebUI์ ์ก์ธ์คโ
HTTPS๋ฅผ ํตํด Open WebUI์ ์ก์ธ์คํ์ธ์:
์์ฒด ์๋ช ์ธ์ฆ์โ
์์ฒด ์๋ช ์ธ์ฆ์๋ ์ ๋ขฐ๊ฐ ์ค์ํ ๋ฌธ์ ๊ฐ ๋์ง ์๋ ๊ฐ๋ฐ ๋๋ ๋ด๋ถ ์ฌ์ฉ์ ์ ํฉํฉ๋๋ค.
๋จ๊ณโ
-
Nginx ํ์ผ์ ์ํ ๋๋ ํ ๋ฆฌ ์์ฑ:
mkdir -p conf.d ssl
-
Nginx ๊ตฌ์ฑ ํ์ผ ์์ฑ:
conf.d/open-webui.conf
:server {
listen 443 ssl;
server_name your_domain_or_IP;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
proxy_pass http://host.docker.internal:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# (์ ํ ์ฌํญ) ๋ชจ๋ธ์ ์คํธ๋ฆฌ๋ฐ ์๋ต์ ํฅ์์ํค๊ธฐ ์ํด ํ๋ก์ ๋ฒํผ๋ง ๋นํ์ฑํ
proxy_buffering off;
# (์ ํ ์ฌํญ) ํฐ ์ฒจ๋ถ ํ์ผ ๋ฐ ๊ธด ์ค๋์ค ๋ฉ์์ง๋ฅผ ์ํ ์ต๋ ์์ฒญ ํฌ๊ธฐ ์ฆ๊ฐ
client_max_body_size 20M;
proxy_read_timeout 10m;
}
} -
์์ฒด ์๋ช SSL ์ธ์ฆ์ ์์ฑ:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout ssl/nginx.key \
-out ssl/nginx.crt \
-subj "/CN=your_domain_or_IP" -
Docker Compose ๊ตฌ์ฑ ์ ๋ฐ์ดํธ:
docker-compose.yml
์ Nginx ์๋น์ค๋ฅผ ์ถ๊ฐํฉ๋๋ค:services:
nginx:
image: nginx:alpine
ports:
- "443:443"
volumes:
- ./conf.d:/etc/nginx/conf.d
- ./ssl:/etc/nginx/ssl
depends_on:
- open-webui -
Nginx ์๋น์ค ์์:
docker compose up -d nginx