# 서버 인프라 / 배포 가이드

## 접속 정보 요약

| 서비스 | URL | 계정 |
|--------|-----|------|
| 웹 서비스 | https://trash.wxn.co.kr | (아래 테스트 계정 참조) |
| Gitea | https://gitea.wxn.co.kr | `wixon` / `wixon1234!` |
| SSH | `ssh wixon@116.122.157.166` | `wixon` / `1111` |

### 웹 테스트 계정 (비밀번호: `test1234!`)

| ID | 역할 | Level | 소속 |
|----|------|-------|------|
| `tester_admin` | Super Admin | 4 | 전체 (지자체 선택 필요) |
| `tester_local` | 지자체관리자 | 3 | 중구청 |
| `tester_shop` | 지정판매소 | 2 | - |
| `tester_user` | 일반 사용자 | 1 | - |

---

## 1. 서버 환경

| 항목 | 값 |
|------|------|
| IP | `116.122.157.166` |
| OS | Ubuntu 22.04.5 LTS |
| 호스팅 | 카페24 (`qm391-0435.cafe24.com`) |
| PHP | 8.2.30 (PHP-FPM) |
| nginx | 호스트 설치 (80/443/8045) |
| Docker | 28.5.1 |
| DB | MySQL (원격 `3.36.27.239`) |

---

## 2. 서비스 구조

```
                          ┌─── https://trash.wxn.co.kr
[클라이언트] ─── nginx ───┤
                (80/443)  └─── https://gitea.wxn.co.kr
                   │                    │
                   ▼                    ▼
            nginx (8045)          Gitea Docker (3001)
                   │
            PHP-FPM 8.2
                   │
            CodeIgniter 4
                   │
            MySQL 3.36.27.239
```

### 포트 구성

| 포트 | 서비스 | 설명 |
|------|--------|------|
| 80 | nginx | HTTP → HTTPS 리다이렉트 |
| 443 | nginx | HTTPS (Let's Encrypt) |
| 8045 | nginx | PHP-FPM vhost (내부) |
| 3001 | Gitea | Git 서버 (Docker, 내부) |
| 9000 | webhook | 배포 트리거 수신 (내부) |
| 3306 | MySQL | 원격 DB (`3.36.27.239`) |

---

## 3. Gitea (Git 서버)

| 항목 | 값 |
|------|------|
| 외부 URL | https://gitea.wxn.co.kr |
| 관리자 | `wixon` / `wixon1234!` (`admin@wxn.co.kr`) |
| 레포 | https://gitea.wxn.co.kr/wixon/jongryangje |
| 컨테이너 | `gitea` (Docker) |
| DB | SQLite (`/srv/gitea/data/gitea/gitea.db`) |
| docker-compose | `/srv/gitea/docker-compose.yml` |
| 데이터 | `/srv/gitea/data` |

### 관리 명령

```bash
# 상태 확인
sudo docker ps | grep gitea

# 재시작
cd /srv/gitea && sudo docker compose restart

# 로그
sudo docker logs gitea --tail 50

# 사용자 추가
sudo docker exec -u git gitea gitea admin user create \
  --username <name> --password <pass> --email <email> --admin
```

---

## 4. 자동 배포 (CI/CD)

### 플로우

```
로컬 git push → Gitea → Webhook (9000) → deploy.sh → 서버 반영
```

`git push gitea main` 한 번이면 서버에 자동 반영됩니다.

### 배포 스크립트 (`/srv/jongryangje/deploy.sh`)

```bash
#!/bin/bash
cd /srv/jongryangje
git fetch origin main && git reset --hard origin/main
composer install --no-dev --no-interaction | tail -3
chmod -R 777 writable/
echo "Deployed at $(date)"
```

### 관련 파일

| 파일 | 용도 |
|------|------|
| `/srv/jongryangje/deploy.sh` | 배포 실행 (git fetch + reset + composer) |
| `/srv/jongryangje/webhook-server.sh` | Webhook 수신 (nc 기반) |
| `/etc/systemd/system/jongryangje-webhook.service` | Webhook systemd 서비스 |
| `/srv/jongryangje/writable/logs/deploy.log` | 배포 로그 |

### 수동 배포

```bash
ssh wixon@116.122.157.166 "/srv/jongryangje/deploy.sh"
```

### 배포 로그 확인

```bash
ssh wixon@116.122.157.166 "tail -20 /srv/jongryangje/writable/logs/deploy.log"
```

---

## 5. 로컬 Git 설정

### Remote

| Remote | URL | 용도 |
|--------|-----|------|
| `origin` | `github.com/wixon-associates/jongryangje` | GitHub (소스 관리) |
| `gitea` | `gitea.wxn.co.kr/wixon/jongryangje` | 서버 배포 (auto-deploy) |

### Push 방법

```bash
# GitHub + 서버 동시 배포
git push origin main && git push gitea main
```

---

## 6. 서버 파일 구조

```
/srv/
├── jongryangje/               # 프로젝트 (git clone)
│   ├── public/                # nginx document root
│   ├── .env                   # 환경 설정 (gitignore)
│   ├── deploy.sh              # 배포 스크립트
│   └── webhook-server.sh      # Webhook 수신
└── gitea/                     # Gitea Docker
    ├── docker-compose.yml
    └── data/                  # Gitea 데이터

/etc/nginx/sites-available/
├── jongryangje                # PHP-FPM vhost (:8045)
├── jongryangje-ssl            # trash.wxn.co.kr (80→443, SSL)
└── gitea                      # gitea.wxn.co.kr (80→443, SSL → :3001)

/etc/letsencrypt/live/
├── trash.wxn.co.kr/           # 웹 SSL 인증서
└── gitea.wxn.co.kr/           # Gitea SSL 인증서
```

---

## 7. SSL 인증서 (Let's Encrypt)

| 도메인 | 인증서 경로 | 만료 |
|--------|-------------|------|
| `trash.wxn.co.kr` | `/etc/letsencrypt/live/trash.wxn.co.kr/` | 자동 갱신 (certbot) |
| `gitea.wxn.co.kr` | `/etc/letsencrypt/live/gitea.wxn.co.kr/` | 자동 갱신 (certbot) |
| `blog.wxn.co.kr` | `/etc/letsencrypt/live/blog.wxn.co.kr/` | 자동 갱신 (certbot) |

```bash
# 인증서 상태 확인
sudo certbot certificates

# 수동 갱신
sudo certbot renew
```

---

## 8. 서비스 관리

```bash
# nginx
sudo systemctl restart nginx
sudo nginx -t   # 설정 테스트

# PHP-FPM
sudo systemctl restart php8.2-fpm

# Gitea
cd /srv/gitea && sudo docker compose restart

# Webhook
sudo systemctl restart jongryangje-webhook

# 전체 상태
sudo systemctl status nginx php8.2-fpm jongryangje-webhook
sudo docker ps
```

---

## 9. DNS 설정

| 도메인 | 타입 | 값 |
|--------|------|------|
| `trash.wxn.co.kr` | A | `116.122.157.166` |
| `gitea.wxn.co.kr` | A | `116.122.157.166` |
| `blog.wxn.co.kr` | A | `116.122.157.166` |

---

## 10. 기타 서비스 — WIXON Blog

| 항목 | 값 |
|------|------|
| 도메인 | https://blog.wxn.co.kr |
| 앱 | Flask (Python3), port 8899 |
| 소스 경로 | `/srv/wixon_blog/` (배포용), `/var/lib/jenkins/workspace/wixon_blog/` (원본) |
| Gitea 레포 | https://gitea.wxn.co.kr/wixon/wixon_blog |
| SSL | Let's Encrypt (`/etc/letsencrypt/live/blog.wxn.co.kr/`) |
| nginx | `/etc/nginx/sites-available/blog` |
| 자동 배포 | Webhook (port 9001) → `/srv/wixon_blog/deploy.sh` |
| webhook 서비스 | `wixon-blog-webhook.service` |

```bash
# 배포 로그
tail -20 /srv/wixon_blog/log/deploy.log

# webhook 서비스 상태
sudo systemctl status wixon-blog-webhook
```

---

## 11. 트러블슈팅

### 사이트 접속 안 됨
```bash
# nginx 상태 확인
sudo systemctl status nginx
sudo tail -20 /var/log/nginx/error.log

# PHP-FPM 확인
sudo systemctl status php8.2-fpm
```

### 배포 안 됨
```bash
# webhook 서비스 확인
sudo systemctl status jongryangje-webhook

# 수동 배포로 테스트
/srv/jongryangje/deploy.sh

# 배포 로그
tail -30 /srv/jongryangje/writable/logs/deploy.log
```

### Gitea 접속 안 됨
```bash
sudo docker ps | grep gitea
sudo docker logs gitea --tail 30
```
