From 24c1cce542d105dd5db2b65e8e6eae3fb2a53b54 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Wed, 1 Jul 2026 10:39:11 +0900 Subject: [PATCH] =?UTF-8?q?docs(cloud):=20=ED=81=B4=EB=9D=BC=EC=9A=B0?= =?UTF-8?q?=EB=93=9C=20=EC=84=9C=EB=B2=84=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EA=B8=B0=EB=B0=98=20=EA=B0=80=EC=83=81=20=ED=98=B8=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8(HTTPS)=20=EC=84=A4=EC=A0=95=20=EC=A7=80=EC=B9=A8=20?= =?UTF-8?q?=EC=B5=9C=EC=8B=A0=ED=99=94=20=EB=B0=8F=20Nginx=20=EB=B0=B1?= =?UTF-8?q?=EC=97=85=20=EC=B6=94=EA=B0=80=20(WBS-CLOUD-5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/nginx-taxbaik-domains.conf | 79 ++++++++++++++++++++++ docs/CLOUD_SERVER_SETUP.md | 109 +++++++++++++++--------------- 2 files changed, 135 insertions(+), 53 deletions(-) create mode 100644 deploy/nginx-taxbaik-domains.conf diff --git a/deploy/nginx-taxbaik-domains.conf b/deploy/nginx-taxbaik-domains.conf new file mode 100644 index 0000000..39921c9 --- /dev/null +++ b/deploy/nginx-taxbaik-domains.conf @@ -0,0 +1,79 @@ +# HTTP 80 ➜ HTTPS 443 Redirect +server { + listen 80; + listen [::]:80; + server_name taxbaik.com www.taxbaik.com gitea.taxbaik.com quant.taxbaik.com; + return 301 https://$host$request_uri; +} + +# TaxBaik 홈페이지 (통합 앱) +server { + listen 443 ssl; + listen [::]:443 ssl; + server_name taxbaik.com www.taxbaik.com; + + ssl_certificate /etc/letsencrypt/live/taxbaik.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/taxbaik.com/privkey.pem; + + client_max_body_size 512M; + + location / { + proxy_pass http://127.0.0.1:5001/taxbaik/; + 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; + 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; + } +} + +# Gitea (코드 저장소) +server { + listen 443 ssl; + listen [::]:443 ssl; + server_name gitea.taxbaik.com; + + ssl_certificate /etc/letsencrypt/live/taxbaik.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/taxbaik.com/privkey.pem; + + client_max_body_size 512M; + + location / { + proxy_pass http://127.0.0.1:3000; + proxy_http_version 1.1; + 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_read_timeout 300; + proxy_connect_timeout 300; + proxy_send_timeout 300; + } +} + +# QuantEngine (Blazor Admin) +server { + listen 443 ssl; + listen [::]:443 ssl; + server_name quant.taxbaik.com; + + ssl_certificate /etc/letsencrypt/live/taxbaik.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/taxbaik.com/privkey.pem; + + client_max_body_size 512M; + + location / { + proxy_pass http://127.0.0.1:5000/; + 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; + 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; + } +} diff --git a/docs/CLOUD_SERVER_SETUP.md b/docs/CLOUD_SERVER_SETUP.md index 842bbee..bd75f80 100644 --- a/docs/CLOUD_SERVER_SETUP.md +++ b/docs/CLOUD_SERVER_SETUP.md @@ -16,8 +16,8 @@ | 3.2 | [Python 가상 환경](#32-python-가상-환경) | `~/.venv`, `python3` 사용 규칙 | | 3.3 | [주요 Python 패키지](#33-주요-python-패키지-시스템) | 시스템/venv 패키지 구분 | | 4 | [서비스 아키텍처](#4-서비스-아키텍처) | 포트 맵, Nginx 리버스 프록시 | -| 4.1 | [포트 맵](#41-포트-맵) | 22, 80, 2222, 3000, 5000, 5432 | -| 4.2 | [Nginx 리버스 프록시](#42-nginx-리버스-프록시) | `/` → Gitea, `/quant/` → Blazor | +| 4.1 | [포트 맵](#41-포트-맵) | 22, 80, 443, 2222, 3000, 5000, 5001, 5432 | +| 4.2 | [Nginx 리버스 프록시](#42-nginx-리버스-프록시) | 도메인 가상 호스트 기반 분기 | | 5 | [Gitea](#5-gitea) | Docker Compose 설정, 시크릿, 데이터 경로 | | 5.1 | [Docker Compose](#51-docker-compose) | `gitea:1.26.4`, PG 연동 | | 5.2 | [시크릿 관리](#52-시크릿-관리) | `/opt/stacks/gitea/.env` | @@ -117,55 +117,30 @@ boto3, cryptography, Jinja2, jsonschema, fail2ban 등 시스템 레벨로 설치 | 포트 | 서비스 | 바인드 | 비고 | |---|---|---|---| | **22** | SSH | `0.0.0.0` | 공개키 전용 | -| **80** | Nginx (리버스 프록시) | `0.0.0.0` | 외부 진입점 | +| **80** | Nginx (HTTP) | `0.0.0.0` | 443 HTTPS로 리다이렉트 | +| **443** | Nginx (HTTPS) | `0.0.0.0` | SSL 가상 호스트 진입점 | | **2222** | Gitea SSH | `0.0.0.0` | Git SSH 접속 | -| **3000** | Gitea Web | `127.0.0.1` | Nginx 프록시 경유 | -| **5000** | QuantEngine Blazor | `127.0.0.1` | Nginx `/quant/` 경유 | +| **3000** | Gitea Web | `127.0.0.1` | Nginx 프록시 경유 (`gitea.taxbaik.com`) | +| **5000** | QuantEngine Blazor | `127.0.0.1` | Nginx 프록시 경유 (`quant.taxbaik.com`) | +| **5001** | TaxBaik 홈페이지 | `127.0.0.1` | Nginx 프록시 경유 (`taxbaik.com` / `www.taxbaik.com`) | | **5432** | PostgreSQL | `127.0.0.1` + `172.17.0.1` | 로컬 + Docker 네트워크 | ### 4.2. Nginx 리버스 프록시 -```nginx -# /etc/nginx/sites-enabled/gitea-ip.conf +도메인 기반 가상 호스트(Virtual Host) 방식을 사용하여 각 도메인 요청을 내부 서비스로 연결하고, SSL(HTTPS)을 필수로 적용합니다. HTTP(80) 포트 요청은 자동으로 HTTPS(443)로 리다이렉트됩니다. -server { - listen 80 default_server; - listen [::]:80 default_server; - server_name _; - client_max_body_size 512M; +상세 Nginx 설정 백업은 `deploy/nginx-taxbaik-domains.conf`에 위치합니다. - # QuantEngine Blazor Web App - location /quant/ { - proxy_pass http://127.0.0.1:5000/; - 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; - 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; - } - - # Gitea (기본) - location / { - proxy_pass http://127.0.0.1:3000; - proxy_http_version 1.1; - 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_read_timeout 300; - proxy_connect_timeout 300; - proxy_send_timeout 300; - } -} -``` +#### 가상 호스트 설정 개요 +- **TaxBaik 홈페이지** (`https://taxbaik.com`, `https://www.taxbaik.com`) ➜ `http://127.0.0.1:5001/taxbaik/` +- **Gitea (코드 저장소)** (`https://gitea.taxbaik.com`) ➜ `http://127.0.0.1:3000` +- **QuantEngine (Blazor Admin)** (`https://quant.taxbaik.com`) ➜ `http://127.0.0.1:5000/` **라우팅 요약**: -- `http://178.104.200.7/` → Gitea Web UI -- `http://178.104.200.7/quant/` → QuantEngine Blazor Admin -- `ssh://178.104.200.7:2222` → Gitea Git SSH +- `https://taxbaik.com` & `https://www.taxbaik.com` ➜ TaxBaik 홈페이지 (통합 앱) +- `https://gitea.taxbaik.com` ➜ Gitea Web UI +- `https://quant.taxbaik.com` ➜ QuantEngine Blazor Admin +- `ssh://git@gitea.taxbaik.com:2222` ➜ Gitea Git SSH ## 5. Gitea @@ -335,8 +310,8 @@ ClientAliveCountMax 2 - **상태**: `ENABLED=yes` (`/etc/ufw/ufw.conf`) - **로그 레벨**: `low` -- **외부 개방 포트**: 22 (SSH), 80 (HTTP/Nginx), 2222 (Gitea SSH) -- **내부 전용**: 3000 (Gitea Web), 5000 (QuantEngine), 5432 (PostgreSQL) +- **외부 개방 포트**: 22 (SSH), 80 (HTTP), 443 (HTTPS), 2222 (Gitea SSH) +- **내부 전용**: 3000 (Gitea Web), 5000 (QuantEngine), 5001 (TaxBaik Web), 5432 (PostgreSQL) > 상세 규칙 확인: `sudo ufw status numbered` (TTY + sudo 비밀번호 필요) @@ -349,8 +324,9 @@ ClientAliveCountMax 2 - Gitea Web: `127.0.0.1:3000` (로컬 전용) - QuantEngine: `127.0.0.1:5000` (로컬 전용) +- TaxBaik Web: `127.0.0.1:5001` (로컬 전용) - PostgreSQL: `127.0.0.1` + Docker bridge (`172.17.0.1`) -- 외부 노출: SSH(22), HTTP(80), Gitea SSH(2222)만 개방 +- 외부 노출: SSH(22), HTTP(80), HTTPS(443), Gitea SSH(2222)만 개방 ## 10. 디렉토리 맵 @@ -390,7 +366,7 @@ ClientAliveCountMax 2 | **CI Runner** | Synology Act Runner | 6× `act_runner:latest` (Docker) | | **DB** | SQLite (파일 기반) | PostgreSQL 18 + SQLite (하이브리드) | | **웹 Admin** | 없음 | QuantEngine Blazor (.NET 10, MudBlazor) | -| **리버스 프록시** | Synology 내장 | Nginx (`/` → Gitea, `/quant/` → Blazor) | +| **리버스 프록시** | Synology 내장 | Nginx 도메인 가상 호스트 및 SSL (HTTPS) 적용 (`deploy/nginx-taxbaik-domains.conf`) | | **보안** | DSM 방화벽 | fail2ban + SSH 공개키 + 서비스 로컬바인드 | | **시크릿 관리** | `.secrets/kis_real.env` | `/opt/stacks/gitea/.env` | | **OS** | Synology DSM 7.x | Ubuntu 26.04 LTS | @@ -452,14 +428,20 @@ docker run -d \ gitea/act_runner:latest ``` -### SSH 접속 +### SSH 접속 및 Git 원격 설정 ```bash -# Windows 로컬에서 +# Windows 로컬에서 서버 SSH 접속 ssh kjh2064@178.104.200.7 -# Gitea Git 접속 -git remote set-url origin ssh://git@178.104.200.7:2222/kjh2064/QuantEngineByItz.git +# 로컬 프로젝트의 Git Remote URL 변경 (Gitea 도메인 기반 HTTPS 적용) +# 1) 현재 설정된 remote url 확인 +git remote -v +# 2) 새로운 도메인 주소로 원격 URL 변경 +git remote set-url origin https://gitea.taxbaik.com/kjh2064/QuantEngineByItz.git + +# Gitea Git SSH 접속 (기존 2222 포트 유지) +git remote set-url origin ssh://git@gitea.taxbaik.com:2222/kjh2064/QuantEngineByItz.git ``` ## 13. 검증 하네스 @@ -514,6 +496,27 @@ ssh -T -p 2222 git@178.104.200.7 2>&1 | head -1 --- -> **수집 일시**: 2026-06-26 09:55 KST -> **수집 방법**: `ssh kjh2064@178.104.200.7` 라이브 명령 실행 -> **provenance**: 모든 값은 서버 실시간 명령 출력에서 추출. 임의 값 없음. +## 14. 트러블슈팅 (Troubleshooting) + +### 14.1. Certbot / APT 패키지 설치 시 Microsoft 리포지토리 404 오류 +- **증상**: `sudo apt-get update` 실행 시 Microsoft 패키지 저장소에서 `404 Not Found` 에러가 발생하며 패키지 목록 갱신이 중단되고, 이로 인해 `certbot` 설치가 `sudo: certbot: command not found` 에러로 실패하는 현상. +- **원인**: Ubuntu 26.04 (Resolute) 환경에서 Microsoft의 잘못된 리포지토리(26.04 경로에 focal/20.04 릴리스가 설정된 상태)를 참조하여 발생. +- **해결 방안**: + 1. 문제가 되는 Microsoft apt 소스 설정 파일을 삭제하거나 비활성화합니다. + ```bash + sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list + ``` + 2. APT 패키지 목록을 다시 업데이트하고 Certbot 및 Nginx 플러그인을 설치합니다. + ```bash + sudo apt-get update && sudo apt-get install -y certbot python3-certbot-nginx + ``` + 3. 인증서 발급 및 설정을 적용합니다. + ```bash + sudo certbot --nginx -d taxbaik.com -d www.taxbaik.com -d gitea.taxbaik.com -d quant.taxbaik.com --register-unsafely-without-email --agree-tos --non-interactive + ``` + +--- + +> **수집 일시**: 2026-06-26 09:55 KST (추가 업데이트: 2026-07-01) +> **수집 방법**: `ssh kjh2064@178.104.200.7` 라이브 명령 및 트러블슈팅 사례 수집 +> **provenance**: 모든 값은 서버 실시간 명령 출력 및 실제 오류 대처 조치 로그에서 추출. 임의 값 없음.