Files
prompt/docs/deploy-ubuntu-fastapi.md
dsyoon 27540269b7 Initial commit: add FastAPI MVP (모프) and existing web app
Includes FastAPI+Jinja2+HTMX+SQLite implementation with seed categories, plus deployment templates.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 17:17:22 +09:00

164 lines
3.5 KiB
Markdown

# Ubuntu 22.04(22.14가 아니라 보통 22.04입니다) + systemd + Caddy로 모프(FastAPI) 배포
목표:
- `https://prompt.ncue.net` → Caddy(자동 HTTPS) → `uvicorn(FastAPI)`(localhost:8000)
- DB는 기본 **SQLite 파일**(서버 로컬) 사용
> 기존 저장소에는 Next.js/도커 배포 문서(`docs/deploy-ubuntu-docker.md`)가 있습니다.
> 이 문서는 **루트의 `main.py`(FastAPI 버전 모프)** 를 서버에 올리는 방법입니다.
---
## 0) 전제
- DNS: `prompt.ncue.net` A 레코드가 서버 공인 IP를 가리킴
- 방화벽: TCP 80/443 오픈
---
## 1) 서버 패키지 설치
```bash
sudo apt update
sudo apt install -y python3 python3-venv python3-pip git
```
---
## 2) 코드 배치
```bash
sudo mkdir -p /opt/mopf
sudo mkdir -p /opt/mopf/data
sudo chown -R $USER:$USER /opt/mopf
cd /opt/mopf
git clone <YOUR_REPO_URL> .
```
---
## 3) 가상환경 + 의존성 설치
```bash
cd /opt/mopf
python3 -m venv venv
./venv/bin/pip install -r requirements.txt
```
---
## 4) systemd로 앱 상시 실행
1) 서비스 파일 복사
```bash
sudo cp /opt/mopf/ops/mopf.service /etc/systemd/system/mopf.service
```
2) 권한/유저 확인
- 기본 템플릿은 `www-data`로 실행합니다.
- `/opt/mopf``www-data`가 읽을 수 있어야 하고, DB 파일 디렉토리(`/opt/mopf/data`)는 쓰기가 가능해야 합니다.
```bash
sudo chown -R www-data:www-data /opt/mopf
sudo chmod -R 755 /opt/mopf
sudo chmod -R 775 /opt/mopf/data
```
3) 환경변수 수정(권장)
`/etc/systemd/system/mopf.service`에서 아래를 원하는 값으로 바꾸세요.
- `MOPF_DATABASE_URL=sqlite:////opt/mopf/data/all_prompt.db`
- `MOPF_SALT=CHANGE_ME_TO_RANDOM_STRING` ← 반드시 랜덤 문자열로 변경 권장
4) 실행/자동시작
```bash
sudo systemctl daemon-reload
sudo systemctl enable --now mopf
sudo systemctl status mopf --no-pager
```
로그 확인:
```bash
journalctl -u mopf -f
```
---
## 5) Caddy로 HTTPS 리버스 프록시
### 옵션 A) Caddy를 “호스트에 직접 설치”(가장 간단)
```bash
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install -y caddy
```
Caddy 설정:
```bash
sudo cp /opt/mopf/ops/Caddyfile.mopf /etc/caddy/Caddyfile
sudo mkdir -p /etc/caddy
sudo nano /etc/caddy/Caddyfile
```
`CADDY_EMAIL`은 보통 systemd 환경변수로 넣습니다:
```bash
sudo systemctl edit caddy
```
내용 예시:
```ini
[Service]
Environment="CADDY_EMAIL=you@example.com"
```
적용/재시작:
```bash
sudo systemctl daemon-reload
sudo systemctl restart caddy
sudo systemctl status caddy --no-pager
```
### 옵션 B) “기존 docker-compose의 Caddy”를 그대로 쓴다면
이미 `docker-compose.yml`에서 Caddy가 80/443을 점유 중이면,
`Caddyfile``reverse_proxy web:3000``reverse_proxy 127.0.0.1:8000`으로 바꿔야 합니다.
---
## 6) 동작 확인
- `https://prompt.ncue.net/` 접속
- 프롬프트 등록: `https://prompt.ncue.net/new`
- 검색: `https://prompt.ncue.net/search?q=...`
서버 로컬에서 빠른 체크:
```bash
curl -I http://127.0.0.1:8000/
```
---
## 7) 업데이트(코드 갱신)
```bash
cd /opt/mopf
sudo -u www-data git pull
sudo systemctl restart mopf
```