์ด ํํ ๋ฆฌ์ผ์ ์ปค๋ฎค๋ํฐ ๊ธฐ์ฌ๋ก ์ ๊ณต๋๋ฉฐ Open WebUI ํ์์ ์ง์ํ์ง ์์ต๋๋ค. ์ด๋ ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ง๊ฒ Open WebUI๋ฅผ ์ฌ์ฉ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ๋ง ํฉ๋๋ค. ๊ธฐ์ฌํ๊ณ ์ถ์ผ์ ๊ฐ์? ๊ธฐ์ฌ ํํ ๋ฆฌ์ผ์ ํ์ธํด๋ณด์ธ์.
Open WebUI๋ฅผ ์ํ HAProxy ์ค์
HAProxy (High Availability Proxy)๋ ์ ๋ฌธ์ ์ธ ๋ก๋ ๋ฐธ๋ฐ์ฑ ๋ฐ ๋ฆฌ๋ฒ์ค ํ๋ก ์ ์๋ฃจ์ ์ผ๋ก ๋์ ์์ค์ ์ค์ ๊ฐ๋ฅ์ฑ๊ณผ ์๋์ ์ผ๋ก ๋ฎ์ ๋ฆฌ์์ค ์๋ชจ๋์ผ๋ก ๋ง์ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ค์์ ์ฐธ์กฐํ์ธ์: https://www.haproxy.org/
HAProxy์ Lets Encrypt ์ค์นโ
๋จผ์ HAProxy์ Lets Encrypt์ certbot์ ์ค์นํ์ธ์:
Redhat derivativesโ
sudo dnf install haproxy certbot openssl -y
Debian derivativesโ
sudo apt install haproxy certbot openssl -y
HAProxy ๊ธฐ๋ณธ ์ค์ โ
HAProxy์ ์ค์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก /etc/haproxy/haproxy.cfg
์ ์ ์ฅ๋ฉ๋๋ค. ์ด ํ์ผ์ HAProxy์ ๋์์ ๊ฒฐ์ ํ๋ ๋ชจ๋ ์ค์ ์ง์์ด๋ฅผ ํฌํจํฉ๋๋ค.
Open WebUI์ ํจ๊ป ์๋ํ๋๋ก HAProxy์ ๊ธฐ๋ณธ ์ค์ ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
#---------------------------------------------------------------------
# ์ ์ญ ์ค์
#---------------------------------------------------------------------
global
# ์ด๋ฌํ ๋ฉ์์ง๊ฐ /var/log/haproxy.log์ ๊ธฐ๋ก๋๋๋ก ํ๋ ค๋ฉด:
# 1) syslog๊ฐ ๋คํธ์ํฌ ๋ก๊ทธ ์ด๋ฒคํธ๋ฅผ ์์ ํ๋๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
# ์ด๋ /etc/sysconfig/syslog์ SYSLOGD_OPTIONS์ -r ์ต์
์ ์ถ๊ฐํ์ฌ ์ํ๋ฉ๋๋ค.
# 2) local2 ์ด๋ฒคํธ๊ฐ /var/log/haproxy.log ํ์ผ๋ก ์ด๋ํ๋๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
# /etc/sysconfig/syslog์ ๋ค์๊ณผ ๊ฐ์ ๋ผ์ธ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
# local2.* /var/log/haproxy.log
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
#dh-param ๊ฐ ์กฐ์ (๋๋ฌด ๋ฎ์ ๊ฒฝ์ฐ)
tune.ssl.default-dh-param 2048
#---------------------------------------------------------------------
# listen ๋ฐ backend ์น์
์ด ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ผ๋ฐ ๊ธฐ๋ณธ๊ฐ
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor #except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 300s
timeout queue 2m
timeout connect 120s
timeout client 10m
timeout server 10m
timeout http-keep-alive 120s
timeout check 10s
maxconn 3000
#http
frontend web
#๋นSSL
bind 0.0.0.0:80
#SSL/TLS
bind 0.0.0.0:443 ssl crt /path/to/ssl/folder/
#Lets Encrypt SSL
acl letsencrypt-acl path_beg /.well-known/acme-challenge/
use_backend letsencrypt-backend if letsencrypt-acl
#์๋ธ๋๋ฉ์ธ ๋ฐฉ์
acl chat-acl hdr(host) -i subdomain.domain.tld
#๊ฒฝ๋ก ๋ฐฉ์
acl chat-acl path_beg /owui/
use_backend owui_chat if chat-acl
#SSL ์์ฒญ์ Lets Encrypt๋ก ์ ๋ฌ
backend letsencrypt-backend
server letsencrypt 127.0.0.1:8688
#OWUI Chat
backend owui_chat
# X-FORWARDED-FOR ์ถ๊ฐ
option forwardfor
# X-CLIENT-IP ์ถ๊ฐ
http-request add-header X-CLIENT-IP %[src]
http-request set-header X-Forwarded-Proto https if { ssl_fc }
server chat <ip>:3000
์ฐ๋ฆฌ๋ Open WebUI์ Lets Encrypt๋ฅผ ์ํ ACL ๊ธฐ๋ก(๋ผ์ฐํฐ)์ ์ค์ ํ์ต๋๋ค. OWUI์์ WebSocket์ ์ฌ์ฉํ๋ ค๋ฉด SSL์ด ๊ตฌ์ฑ๋์ด์ผ ํ๋ฉฐ, ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ Lets Encrypt๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
Open WebUI๋ก ํธ๋ํฝ์ ๋ผ์ฐํ ํ๋ ๋ฐ์๋ ์๋ธ๋๋ฉ์ธ ๋ฐฉ์ ๋๋ ๊ฒฝ๋ก ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ธ๋๋ฉ์ธ ๋ฐฉ์์ ์ ์ฉ ์๋ธ๋๋ฉ์ธ (์: chat.yourdomain.com)์ด ํ์ํ๋ฉฐ, ๊ฒฝ๋ก ๋ฐฉ์์ ํน์ ๋๋ฉ์ธ ๊ฒฝ๋ก (์: yourdomain.com/owui/)๋ฅผ ํตํด Open WebUI์ ์ก์ธ์คํ ์ ์๋๋ก ํฉ๋๋ค. ํ์์ ๋ฐ๋ผ ์ ์ ํ ๋ฐฉ๋ฒ์ ์ ํํ๊ณ ์ค์ ์ ์ ๋ฐ์ดํธํ์ธ์.
80๋ฒ ํฌํธ์ 443๋ฒ ํฌํธ๋ฅผ HAProxy ์๋ฒ๋ก ๋ ธ์ถ์์ผ์ผ ํฉ๋๋ค. ์ด ํฌํธ๋ Lets Encrypt๊ฐ ๋๋ฉ์ธ์ ์ธ์ฆํ๊ณ HTTPS ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์ํฉ๋๋ค. ๋ํ DNS ๊ธฐ๋ก์ด HAProxy ์๋ฒ๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ํ์์ HAProxy๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ, ๋ผ์ฐํฐ์์ 80๋ฒ ๋ฐ 443๋ฒ ํฌํธ๋ฅผ HAProxy ์๋ฒ๋ก ํฌ์๋ฉํด์ผ ํฉ๋๋ค.
Lets Encrypt๋ก SSL ์ธ์ฆ์ ๋ฐ๊ธโ
HAProxy๋ฅผ ์์ํ๊ธฐ ์ ์ Lets Encrypt๊ฐ ์ ํฉํ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ ๋๊น์ง ์๋ฆฌ ํ์์๋ก ์ฌ์ฉํ ์์ฒด ์๋ช ์ธ์ฆ์๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ์์ฒด ์๋ช ์ธ์ฆ์๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
openssl req -x509 -newkey rsa:2048 -keyout /tmp/haproxy.key -out /tmp/haproxy.crt -days 3650 -nodes -subj "/CN=localhost"
๊ทธ ๋ค์, ํค์ ์ธ์ฆ์๋ฅผ ๊ฒฐํฉํ์ฌ HAProxy๊ฐ ์ฌ์ฉํ ์ ์๋ PEM ํ์ผ์ ๋ง๋์ธ์:
cat /tmp/haproxy.crt /tmp/haproxy.key > /etc/haproxy/certs/haproxy.pem
ํ์์ ๊ตฌ์ฑ์ ๋ฐ๋ผ HAProxy ๊ตฌ์ฑ์ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
HAProxy ๊ตฌ์ฑ์ ์ค์ ํ ํ์๋ certbot์ ์ฌ์ฉํ์ฌ SSL ์ธ์ฆ์๋ฅผ ์ป๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. Certbot์ Lets Encrypt์์ ๊ฒ์ฆ ๊ณผ์ ์ ์ฒ๋ฆฌํ๊ณ ์๋ ๊ฐฑ์ ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ธ์ฆ์๊ฐ ๋ง๋ฃ๋๊ธฐ ์ ์ ์๋์ผ๋ก ๊ฐฑ์ ํฉ๋๋ค.
haproxy -c -f /etc/haproxy/haproxy.cfg
๋ช
๋ น์ด๋ฅผ ์คํํ์ฌ HAProxy ๊ตฌ์ฑ์ ๊ฒ์ฆํ ์ ์์ต๋๋ค. ์ค๋ฅ๊ฐ ์์ผ๋ฉด systemctl start haproxy
๋ฅผ ์คํํ์ฌ HAProxy๋ฅผ ์์ํ๊ณ systemctl status haproxy
๋ก ์คํ ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
HAProxy๊ฐ ์์คํ
๊ณผ ํจ๊ป ์์๋๋๋ก ํ๋ ค๋ฉด systemctl enable haproxy
๋ฅผ ์คํํ์ธ์.
HAProxy๋ฅผ ๊ตฌ์ฑํ ํ, Lets Encrypt๋ฅผ ์ฌ์ฉํ์ฌ ์ ํจํ SSL ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ๋ฐ์ผ์ธ์. ๋จผ์ , Lets Encrypt์ ๋ฑ๋กํด์ผ ํฉ๋๋ค. ์ด ์์ ์ ํ ๋ฒ๋ง ์ํํ๋ฉด ๋ฉ๋๋ค:
certbot register --agree-tos --email [email protected] --non-interactive
๊ทธ๋ค์, ์ธ์ฆ์๋ฅผ ์์ฒญํ ์ ์์ต๋๋ค:
certbot certonly -n --standalone --preferred-challenges http --http-01-port-8688 -d yourdomain.com
์ธ์ฆ์๊ฐ ๋ฐ๊ธ๋๋ฉด, ์ธ์ฆ์์ ๊ฐ์ธ ํค ํ์ผ์ HAProxy๊ฐ ์ฌ์ฉํ ์ ์๋ ํ๋์ PEM ํ์ผ๋ก ๋ณํฉํด์ผ ํฉ๋๋ค.
cat /etc/letsencrypt/live/{domain}/fullchain.pem /etc/letsencrypt/live/{domain}/privkey.pem > /etc/haproxy/certs/{domain}.pem
chmod 600 /etc/haproxy/certs/{domain}.pem
chown haproxy:haproxy /etc/haproxy/certs/{domain}.pem
๊ทธ๋ฐ ๋ค์ HAProxy๋ฅผ ์ฌ์์ํ์ฌ ์ ์ธ์ฆ์๋ฅผ ์ ์ฉํ์ธ์:
systemctl restart haproxy
HAProxy ๊ด๋ฆฌ์(๊ฐํธ ๋ฐฐํฌ ์ต์ )โ
HAProxy ๊ตฌ์ฑ๊ณผ Lets Encrypt SSL์ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ค๋ฉด, ์ ๊ฐ ์์ฑํ ๊ฐ๋จํ ํ์ด์ฌ ์คํฌ๋ฆฝํธ์ ๋์ปค ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด HAProxy ๊ตฌ์ฑ์ ์์ฑ ๋ฐ ๊ด๋ฆฌํ๊ณ Lets Encrypt ์ธ์ฆ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
https://github.com/shadowdao/haproxy-manager
์คํฌ๋ฆฝํธ ๋๋ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๋ฐ๋์ ํฌํธ 8000์ ๊ณต์ฉ์ผ๋ก ๋ ธ์ถํ์ง ๋ง์ธ์!