docs:ops-manual 누락 항목 보강 — DB 동기화, PM2, MySQL 업그레이드
- 10-backup-recovery: 개발→운영 DB 동기화 절차 추가 - 05-deployment: Jenkins env-files에 APP_ENV 컬럼 및 접두사 설명 추가 - 11-server-setup: 개발서버 PM2 설정, MySQL 8.0→8.4 업그레이드 절차 추가 - 11-server-setup: 개발서버 MySQL 버전 8.0.45→8.4.8 반영 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -183,11 +183,13 @@ CI/CD Gitea push -> Webhook -> Jenkins
|
|||||||
|
|
||||||
**환경변수 파일 (CI/CD 서버):** /var/lib/jenkins/env-files/react/
|
**환경변수 파일 (CI/CD 서버):** /var/lib/jenkins/env-files/react/
|
||||||
|
|
||||||
| 파일 | API URL | Frontend URL |
|
| 파일 | API URL | Frontend URL | APP_ENV |
|
||||||
|------|---------|-------------|
|
|------|---------|-------------|---------|
|
||||||
| .env.develop | https://api.codebridge-x.com | https://dev.codebridge-x.com |
|
| .env.develop | https://api.codebridge-x.com | https://dev.codebridge-x.com | development |
|
||||||
| .env.stage | https://stage-api.sam.it.kr | https://stage.sam.it.kr |
|
| .env.stage | https://stage-api.sam.it.kr | https://stage.sam.it.kr | staging |
|
||||||
| .env.main | https://api.sam.it.kr | https://sam.it.kr |
|
| .env.main | https://api.sam.it.kr | https://sam.it.kr | production |
|
||||||
|
|
||||||
|
> `NEXT_PUBLIC_APP_ENV` 값으로 타이틀 접두사 결정: `development` → `[D]`, `local` → `[L]`, 그 외 → 없음
|
||||||
|
|
||||||
**rsync 주의:** trailing slash 사용 금지: `.next` (O), `.next/` (X)
|
**rsync 주의:** trailing slash 사용 금지: `.next` (O), `.next/` (X)
|
||||||
|
|
||||||
|
|||||||
@@ -322,6 +322,48 @@ cd /home/webservice/api-stage/current && php artisan config:cache && php artisan
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## [개발→운영] DB 동기화
|
||||||
|
|
||||||
|
개발서버(sam-dev)의 sam DB를 운영서버(sam-prod)의 sam DB로 복원하는 절차입니다.
|
||||||
|
|
||||||
|
> ⚠️ **운영 데이터가 덮어쓰기됩니다.** 반드시 운영 백업 후 진행하세요.
|
||||||
|
|
||||||
|
### 절차
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 운영 DB 백업 (안전용, 운영 서버)
|
||||||
|
ssh sam-prod "DB_PASS=\$(grep DB_PASSWORD /home/webservice/mng/shared/.env | head -1 | cut -d= -f2) && \
|
||||||
|
mysqldump -ucodebridge -p\$DB_PASS --no-tablespaces --skip-triggers --skip-routines sam | gzip > /home/webservice/backups/sam_prod_before_sync.sql.gz"
|
||||||
|
|
||||||
|
# 2. 개발 DB 덤프 (개발 서버)
|
||||||
|
ssh sam-dev "DB_PASS=\$(grep DB_PASSWORD /home/webservice/mng/.env | head -1 | cut -d= -f2) && \
|
||||||
|
mysqldump -ucodebridge -p\$DB_PASS --no-tablespaces --skip-triggers --skip-routines sam | gzip > /tmp/sam_dev.sql.gz"
|
||||||
|
|
||||||
|
# 3. 로컬 경유 전송 (dev→local→prod)
|
||||||
|
scp sam-dev:/tmp/sam_dev.sql.gz /tmp/sam_dev.sql.gz
|
||||||
|
scp /tmp/sam_dev.sql.gz sam-prod:/tmp/sam_dev.sql.gz
|
||||||
|
|
||||||
|
# 4. 운영 DB 복원
|
||||||
|
ssh sam-prod "DB_PASS=\$(grep DB_PASSWORD /home/webservice/mng/shared/.env | head -1 | cut -d= -f2) && \
|
||||||
|
gunzip -c /tmp/sam_dev.sql.gz | mysql -ucodebridge -p\$DB_PASS sam"
|
||||||
|
|
||||||
|
# 5. 검증
|
||||||
|
ssh sam-prod "DB_PASS=\$(grep DB_PASSWORD /home/webservice/mng/shared/.env | head -1 | cut -d= -f2) && \
|
||||||
|
mysql -ucodebridge -p\$DB_PASS -e \"SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='sam';\""
|
||||||
|
|
||||||
|
# 6. 임시 파일 정리
|
||||||
|
ssh sam-dev "rm -f /tmp/sam_dev.sql.gz"
|
||||||
|
ssh sam-prod "rm -f /tmp/sam_dev.sql.gz"
|
||||||
|
rm -f /tmp/sam_dev.sql.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
### 주의사항
|
||||||
|
- 개발↔운영 서버 간 직접 SCP 불가 → 로컬 경유 전송
|
||||||
|
- `codebridge` 유저 권한 제한으로 `--no-tablespaces --skip-triggers --skip-routines` 필수
|
||||||
|
- 롤백: `/home/webservice/backups/sam_prod_before_sync.sql.gz` 사용
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 전체 서버 복구 절차
|
## 전체 서버 복구 절차
|
||||||
|
|
||||||
### [운영] 복구 순서
|
### [운영] 복구 순서
|
||||||
|
|||||||
@@ -1188,7 +1188,7 @@ done
|
|||||||
| OS | Ubuntu 24.04.2 | Ubuntu 24.04 (kernel 6.8.0-100) |
|
| OS | Ubuntu 24.04.2 | Ubuntu 24.04 (kernel 6.8.0-100) |
|
||||||
| CPU/RAM | 2C / 3.8GB (스왑 없음) | 2C / 8GB + 스왑 4GB |
|
| CPU/RAM | 2C / 3.8GB (스왑 없음) | 2C / 8GB + 스왑 4GB |
|
||||||
| PHP | 8.4.15 (+ 5.6, 7.3) | 8.4.18 |
|
| PHP | 8.4.15 (+ 5.6, 7.3) | 8.4.18 |
|
||||||
| MySQL | **8.0.45** | **8.4.8** |
|
| MySQL | **8.4.8** | **8.4.8** |
|
||||||
| Node.js | 22.17.1 | 22.17.1 |
|
| Node.js | 22.17.1 | 22.17.1 |
|
||||||
| Nginx | 1.24.0 | 1.24.0 |
|
| Nginx | 1.24.0 | 1.24.0 |
|
||||||
| Redis | - | 7.0.15 (512mb) |
|
| Redis | - | 7.0.15 (512mb) |
|
||||||
@@ -1197,3 +1197,78 @@ done
|
|||||||
| Supervisor | - | queue worker ×2 |
|
| Supervisor | - | queue worker ×2 |
|
||||||
| UFW | **비활성** | 활성 |
|
| UFW | **비활성** | 활성 |
|
||||||
| fail2ban | - | ✅ |
|
| fail2ban | - | ✅ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [개발] PM2 설정
|
||||||
|
|
||||||
|
개발서버는 ecosystem.config.js 없이 PM2 CLI로 직접 관리합니다.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 실행 (포트 3001, Gitea가 3000 사용)
|
||||||
|
cd /home/webservice/react && pm2 start npm --name sam-react -- start -- -p 3001
|
||||||
|
|
||||||
|
# 재부팅 자동 시작 등록
|
||||||
|
pm2 save
|
||||||
|
sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u hskwon --hp /home/hskwon
|
||||||
|
```
|
||||||
|
|
||||||
|
| 이름 | 모드 | 포트 | 비고 |
|
||||||
|
|------|------|------|------|
|
||||||
|
| sam-react | fork | 3001 | Gitea가 3000 사용, Jenkins 배포 시 자동 restart |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [개발] MySQL 8.0 → 8.4 업그레이드 절차
|
||||||
|
|
||||||
|
Ubuntu 24.04 APT 기본은 MySQL 8.0입니다. 8.4로 업그레이드하는 절차:
|
||||||
|
|
||||||
|
### 사전 준비
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. DB 백업
|
||||||
|
DB_PASS=$(grep DB_PASSWORD /home/webservice/mng/.env | head -1 | cut -d= -f2)
|
||||||
|
for db in sam chandj sam_stat; do
|
||||||
|
mysqldump -ucodebridge -p$DB_PASS --no-tablespaces --skip-triggers --skip-routines $db | gzip > /tmp/${db}_backup.sql.gz
|
||||||
|
done
|
||||||
|
|
||||||
|
# 2. 인증 방식 변환 (mysql_native_password → caching_sha2_password)
|
||||||
|
# 8.4에서 mysql_native_password가 deprecated
|
||||||
|
mysql -u debian-sys-maint -p'<debian-sys-maint_비밀번호>' -e "
|
||||||
|
ALTER USER 'codebridge'@'localhost' IDENTIFIED WITH caching_sha2_password BY '<비밀번호>';
|
||||||
|
ALTER USER 'chandj'@'localhost' IDENTIFIED WITH caching_sha2_password BY '<비밀번호>';
|
||||||
|
FLUSH PRIVILEGES;"
|
||||||
|
```
|
||||||
|
|
||||||
|
> debian-sys-maint 비밀번호: `/etc/mysql/debian.cnf` 참조
|
||||||
|
|
||||||
|
### 업그레이드 실행
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 3. MySQL 중지
|
||||||
|
sudo systemctl stop mysql
|
||||||
|
|
||||||
|
# 4. MySQL APT 레포 추가
|
||||||
|
wget -q https://dev.mysql.com/get/mysql-apt-config_0.8.33-1_all.deb -O /tmp/mysql-apt-config.deb
|
||||||
|
sudo DEBIAN_FRONTEND=noninteractive dpkg -i /tmp/mysql-apt-config.deb
|
||||||
|
|
||||||
|
# 5. 레포를 8.4-lts로 변경
|
||||||
|
sudo sed -i 's/mysql-8.0/mysql-8.4-lts/g' /etc/apt/sources.list.d/mysql.list
|
||||||
|
sudo apt-get update
|
||||||
|
|
||||||
|
# 6. 업그레이드 (기존 설정 유지)
|
||||||
|
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -o Dpkg::Options::="--force-confold" mysql-server mysql-client
|
||||||
|
|
||||||
|
# 7. 시작 및 확인
|
||||||
|
sudo systemctl start mysql
|
||||||
|
mysql --version # → 8.4.x 확인
|
||||||
|
```
|
||||||
|
|
||||||
|
### GPG 키 만료 시
|
||||||
|
|
||||||
|
MySQL APT 레포의 GPG 키가 만료된 경우:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B7B3B788A8D3785C
|
||||||
|
# 또는 allow-insecure 임시 허용 후 설치
|
||||||
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user