diff --git a/README.md b/README.md index 692ceb1..c4160c4 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,15 @@ 백엔드는 **[CodeIgniter 4](https://codeigniter.com/)** 기반입니다. **저장소:** [wixon-associates/jongryangje](https://github.com/wixon-associates/jongryangje) -| **[구현 화면 스크린샷](./docs/SCREENSHOTS.md)** | **[Notion 진행상황](https://www.notion.so/31b42b987c3780baba32ded04a1d41bb)** | +| **[구현 화면 스크린샷](./docs/SCREENSHOTS.md)** | **[Notion 진행상황](https://www.notion.so/31b42b987c3780baba32ded04a1d41bb)** | **[서버/배포 가이드](./docs/server.md)** | + +### 운영 환경 + +| 서비스 | URL | +|--------|-----| +| 웹 서비스 | https://trash.wxn.co.kr | +| Gitea (Git) | https://gitea.wxn.co.kr | +| GitHub | https://github.com/wixon-associates/jongryangje | --- diff --git a/docs/SERVER_DEPLOY.md b/docs/SERVER_DEPLOY.md deleted file mode 100644 index 7dded94..0000000 --- a/docs/SERVER_DEPLOY.md +++ /dev/null @@ -1,166 +0,0 @@ -# 서버 배포 가이드 - -## 서버 정보 - -| 항목 | 값 | -|------|------| -| 서버 IP | `116.122.157.166` | -| OS | Ubuntu 22.04.5 LTS | -| SSH 접속 | `ssh wixon@116.122.157.166` (비밀번호: `1111`) | -| 웹 도메인 | `https://trash.wxn.co.kr` | -| Gitea 도메인 | `https://gitea.wxn.co.kr` | -| 호스팅 | 카페24 (qm391-0435.cafe24.com) | - -## Gitea (Git 서버) - -| 항목 | 값 | -|------|------| -| 외부 URL | `https://gitea.wxn.co.kr` | -| 내부 URL | `http://localhost:3001` | -| 컨테이너 | `gitea` (Docker) | -| 관리자 계정 | `wixon` / `wixon1234!` | -| 관리자 이메일 | `admin@wxn.co.kr` | -| 레포 URL (내부) | `http://localhost:3001/wixon/jongryangje` | -| SSH 포트 (내부) | `2222` | -| DB | SQLite (`/srv/gitea/data/gitea/gitea.db`) | -| 데이터 경로 | `/srv/gitea/data` | -| docker-compose | `/srv/gitea/docker-compose.yml` | - -### Gitea 관리 명령 - -```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 --password --email --admin -``` - -## 웹 서비스 구조 - -``` -[클라이언트] → [NPM (80/443)] → [nginx (8045)] → [PHP-FPM 8.2] → [CodeIgniter 4] - ↓ - [MySQL 3.36.27.239] -``` - -| 컴포넌트 | 포트 | 설명 | -|----------|------|------| -| Nginx Proxy Manager | 80/443 | 도메인 프록시 (Docker) | -| nginx | 8045 | PHP-FPM 연동 vhost | -| PHP-FPM 8.2 | unix socket | `/run/php/php8.2-fpm.sock` | -| Gitea | 3001 | Git 서버 (Docker) | -| MySQL | 3306 (원격 3.36.27.239) | 데이터베이스 | - -### 프로젝트 배포 경로 - -``` -/srv/jongryangje/ # 프로젝트 루트 (git clone) -/srv/jongryangje/public/ # nginx document root -/srv/jongryangje/.env # 환경 설정 (gitignore) -/srv/gitea/ # Gitea Docker 설정 -``` - -### nginx 설정 - -``` -/etc/nginx/sites-available/jongryangje # vhost 설정 -/etc/nginx/sites-enabled/jongryangje # symlink -``` - -### NPM 프록시 설정 - -NPM 컨테이너 내부에서 `trash.wxn.co.kr → 116.122.157.166:8045` 프록시: -``` -/data/nginx/proxy_host/7.conf -``` - -## 자동 배포 (CI/CD) - -### 플로우 - -``` -[로컬 git push] → [Gitea] → [Webhook (port 9000)] → [deploy.sh] → [git pull + composer install] -``` - -### 관련 파일 - -| 파일 | 용도 | -|------|------| -| `/srv/jongryangje/deploy.sh` | 배포 스크립트 (git pull + composer) | -| `/srv/jongryangje/webhook-server.sh` | Webhook 수신 서버 | -| `/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" - -# 자동 배포 (로컬에서 push만 하면 됨) -git push gitea main - -# 배포 로그 확인 -ssh wixon@116.122.157.166 "tail -20 /srv/jongryangje/writable/logs/deploy.log" - -# webhook 서비스 상태 -ssh wixon@116.122.157.166 "sudo systemctl status jongryangje-webhook" -``` - -## 로컬 Git 설정 - -### Remote 목록 - -| Remote | URL | 용도 | -|--------|-----|------| -| `origin` | `github.com/wixon-associates/jongryangje` | GitHub (메인) | -| `gitea` | `gitea.wxn.co.kr/wixon/jongryangje` | 서버 배포용 (HTTPS) | - -### push 방법 - -```bash -# GitHub + Gitea 동시 push (Gitea push 시 자동 배포) -git push origin main && git push gitea main -``` - -## DNS / SSL 설정 - -| 도메인 | A 레코드 | SSL | -|--------|----------|-----| -| `trash.wxn.co.kr` | `116.122.157.166` | Let's Encrypt (자동 갱신) | -| `gitea.wxn.co.kr` | `116.122.157.166` | Let's Encrypt (자동 갱신) | - -SSL 인증서 경로: -- `/etc/letsencrypt/live/trash.wxn.co.kr/` -- `/etc/letsencrypt/live/gitea.wxn.co.kr/` - -## 서비스 관리 - -```bash -# nginx 재시작 -sudo systemctl restart nginx - -# PHP-FPM 재시작 -sudo systemctl restart php8.2-fpm - -# Gitea 재시작 -cd /srv/gitea && sudo docker compose restart - -# NPM 재시작 -sudo docker restart nginx-proxy-manager - -# Webhook 재시작 -sudo systemctl restart jongryangje-webhook - -# 전체 상태 확인 -sudo systemctl status nginx php8.2-fpm jongryangje-webhook -sudo docker ps -``` diff --git a/docs/server.md b/docs/server.md new file mode 100644 index 0000000..6a77fc6 --- /dev/null +++ b/docs/server.md @@ -0,0 +1,261 @@ +# 서버 인프라 / 배포 가이드 + +## 접속 정보 요약 + +| 서비스 | 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 --password --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) | + +```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` | + +--- + +## 10. 트러블슈팅 + +### 사이트 접속 안 됨 +```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 +```