- ufw 불필요 규칙 8개 제거 (8088/9001/8082/8002/995/143/110/3001) - 최종 ufw 12개 규칙으로 정리 - 접속 URL https://zioinfo.co.kr 업데이트 - Manager/개방망 URL 추가 - SSL 인증서 및 방화벽 정책 섹션 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
16 KiB
16 KiB
zio-server 운영 가이드
서버: zio-server | IP: zioinfo.co.kr
작성일: 2026-05-30 | 대상: 서버 운영자 / 개발자
1. 서비스 접속 주소
| 서비스 | URL | 계정 |
|---|---|---|
| 지오정보기술 홈페이지 | https://zioinfo.co.kr | — |
| 홈페이지 관리자 | https://zioinfo.co.kr/admin | admin / Admin@2026! |
| GUARDiA ITSM | http://zioinfo.co.kr:8001 | admin / 1111 |
| GUARDiA Manager | http://zioinfo.co.kr:8090 | admin / Admin@zioinfo2026! |
| GUARDiA 개방망 | https://zioinfo.co.kr:8443 | API Key 인증 |
| Gitea (Git 서버) | http://zioinfo.co.kr:3000 | zio / Zio@Admin2026! |
| Jenkins (CI/CD) | http://zioinfo.co.kr:8080 | admin / (초기키) |
2. 서버 접속
# SSH 키 인증 (권장)
ssh -i "zio-server-key.pem" root@zioinfo.co.kr
# 비밀번호 인증
ssh root@zioinfo.co.kr
# 비밀번호: 1q2w3e!Q
3. 서비스 관리
3-1. 전체 상태 확인
# 모든 서비스 상태 한 번에 확인
for svc in nginx zioinfo zioinfo-deploy guardia gitea jenkins postgresql ollama; do
status=$(systemctl is-active $svc 2>/dev/null)
printf "%-22s %s\n" $svc $status
done
3-2. 개별 서비스 명령
# 서비스 시작 / 중지 / 재시작 / 상태
systemctl start <서비스명>
systemctl stop <서비스명>
systemctl restart <서비스명>
systemctl status <서비스명>
# 부팅 자동시작 설정 / 해제
systemctl enable <서비스명>
systemctl disable <서비스명>
서비스명 목록:
| 서비스명 | 설명 |
|---|---|
nginx |
웹 프록시 서버 |
zioinfo |
지오정보기술 홈페이지 (Spring Boot, 포트 8082) |
zioinfo-deploy |
CI/CD 웹훅 서버 (포트 9999) |
guardia |
GUARDiA ITSM (FastAPI, 포트 8001) |
gitea |
Git 서버 (포트 3000) |
jenkins |
CI/CD 파이프라인 (포트 8080) |
postgresql |
데이터베이스 (포트 5432) |
ollama |
LLM 엔진 (포트 11434) |
4. 로그 확인
# Spring Boot 홈페이지 로그
tail -f /var/log/zioinfo/spring.log
# CI/CD 배포 로그 (실시간)
tail -f /var/log/zioinfo/deploy.log
# GUARDiA ITSM 로그
tail -f /opt/guardia/logs/guardia.log
tail -f /opt/guardia/logs/error.log
# Nginx 접근 로그
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
# systemd 서비스 로그 (최근 50줄)
journalctl -u zioinfo -n 50 --no-pager
journalctl -u guardia -n 50 --no-pager
journalctl -u gitea -n 50 --no-pager
# 실시간 로그 스트리밍
journalctl -u zioinfo -f
5. 홈페이지 배포 (CI/CD)
5-1. 자동 배포 흐름
로컬 코드 수정
↓
git add . && git commit -m "메시지"
↓
git push gitea main:main ← Gitea에 push
↓
Gitea 웹훅 → localhost:9999 호출
↓
자동 빌드 파이프라인 실행:
① git pull (소스 갱신)
② npm build (React 빌드)
③ mvn package (Spring Boot JAR 빌드)
④ 파일 복사 (JAR → /opt/zioinfo/app, 정적 → /var/www/zioinfo)
⑤ systemctl restart zioinfo
↓
배포 완료 (약 2~4분 소요)
5-2. 로컬에서 Gitea push
# 최초 remote 설정 (1회)
cd workspace/zioinfo-web
git remote add gitea http://zio:Zio%40Admin2026%21@zioinfo.co.kr:3000/zio/zioinfo-web.git
# 이후 배포
git add .
git commit -m "feat: 변경 내용 설명"
git push gitea main:main
5-3. 배포 상태 모니터링
# 배포 로그 실시간 확인
ssh root@zioinfo.co.kr "tail -f /var/log/zioinfo/deploy.log"
# 배포 완료 후 서비스 상태
ssh root@zioinfo.co.kr "systemctl is-active zioinfo && curl -s -o /dev/null -w 'HTTP %{http_code}' http://localhost:8082/api/company"
5-4. 수동 배포 (긴급 시)
# 서버에서 직접 수동 배포
ssh root@zioinfo.co.kr
# 소스 갱신
cd /opt/zioinfo/src && git pull origin main
# React 빌드
cd frontend && npm ci && npm run build
# Spring Boot 빌드
cd ../backend && mvn clean package -DskipTests -q
# 배포
cp target/zioinfo-web-*.jar /opt/zioinfo/app/app.jar
cp -r src/main/resources/static/. /var/www/zioinfo/
systemctl restart zioinfo
6. GUARDiA ITSM 관리
6-1. 서비스 재시작
systemctl restart guardia
journalctl -u guardia -n 20 --no-pager
6-2. Python 패키지 업데이트
source /opt/guardia/venv/bin/activate
pip install -r /opt/guardia/app/requirements.txt
deactivate
systemctl restart guardia
6-3. 환경변수 설정
# .env 파일 편집
nano /opt/guardia/app/.env
# 주요 항목:
# DATABASE_URL=postgresql+asyncpg://guardia:G@urd1a_2026!@localhost:5432/guardia_db
# OLLAMA_BASE_URL=http://localhost:11434
# LLM_MODEL=llama3:8b
# SECRET_KEY=<JWT 시크릿>
7. 데이터베이스 관리
7-1. PostgreSQL 접속
# postgres 관리자로 접속
sudo -u postgres psql
# guardia DB 접속
psql -h 127.0.0.1 -U guardia -d guardia_db
비밀번호: G@urd1a_2026!
# gitea DB 접속
psql -h 127.0.0.1 -U gitea -d gitea_db
비밀번호: G1tea_2026!
7-2. 데이터베이스 백업
# 전체 백업
pg_dump -U guardia guardia_db > /opt/guardia/backups/guardia_$(date +%Y%m%d).sql
pg_dump -U gitea gitea_db > /opt/gitea/backup/gitea_$(date +%Y%m%d).sql
# 복원
psql -U guardia guardia_db < /opt/guardia/backups/guardia_20260530.sql
7-3. 홈페이지 SQLite 백업
# SQLite DB 파일 직접 복사
cp /opt/zioinfo/app/data/zioinfo.db /opt/zioinfo/app/data/zioinfo_$(date +%Y%m%d).db.bak
8. Nginx 관리
8-1. 설정 테스트 및 리로드
# 설정 문법 검사
nginx -t
# 무중단 리로드 (설정 변경 반영)
systemctl reload nginx
# 설정 파일 위치
ls /etc/nginx/sites-available/
8-2. 사이트 설정 파일
| 파일 | 역할 |
|---|---|
/etc/nginx/sites-available/zioinfo |
홈페이지 (포트 80 → 8082) |
/etc/nginx/sites-available/guardia |
GUARDiA (포트 9001 → 8001) |
/etc/nginx/sites-available/gitea |
Gitea (포트 3001 → 3000) |
/etc/nginx/sites-available/jenkins |
Jenkins (포트 8088 → 8080) |
8-3. Nginx 설정 변경 절차
# 1. 설정 파일 편집
nano /etc/nginx/sites-available/zioinfo
# 2. 문법 검사
nginx -t
# 3. 적용
systemctl reload nginx
9. Gitea 관리
9-1. 저장소 관리
# API로 저장소 목록 확인
curl -s http://localhost:3000/api/v1/repos/search -u "zio:Zio@Admin2026!" \
| python3 -c "import json,sys; [print(r['full_name']) for r in json.load(sys.stdin)['data']]"
# 저장소 직접 경로
ls /var/lib/gitea/data/repositories/zio/
9-2. 웹훅 확인
# zioinfo-web 웹훅 목록
curl -s http://localhost:3000/api/v1/repos/zio/zioinfo-web/hooks \
-u "zio:Zio@Admin2026!" | python3 -m json.tool
9-3. 설정 파일
# Gitea 설정 편집
nano /etc/gitea/app.ini
systemctl restart gitea
10. Jenkins 초기 설정 (최초 1회)
Jenkins는 브라우저에서 초기 설정을 완료해야 합니다.
10-1. 초기 설정 절차
- 브라우저에서
http://zioinfo.co.kr:8080접속 - 초기 비밀번호 입력:
cat /var/lib/jenkins/secrets/initialAdminPassword - "Install suggested plugins" 선택
- 추가 플러그인 설치:
- Pipeline (워크플로우 파이프라인)
- Git (Git 연동)
- Gitea (Gitea 웹훅 연동)
- 관리자 계정 생성:
admin / Admin@2026! - Jenkins URL 설정:
http://zioinfo.co.kr:8080
10-2. 파이프라인 Job 생성
초기 설정 완료 후:
Jenkins → New Item → "zioinfo-web" → Pipeline 선택
→ Pipeline 탭 → Definition: "Pipeline script from SCM"
→ SCM: Git
→ Repository URL: http://localhost:3000/zio/zioinfo-web.git
→ Branch: main
→ Script Path: Jenkinsfile
→ 저장
11. Ollama / LLM 관리
11-1. 모델 관리
# 설치된 모델 목록
ollama list
# 모델 다운로드 (4.7GB, 시간 소요)
ollama pull llama3:8b
# 모델 테스트
ollama run llama3:8b "안녕하세요, 간단한 테스트입니다."
# API 호출 테스트
curl http://localhost:11434/api/generate \
-d '{"model":"llama3:8b","prompt":"Hello","stream":false}'
11-2. 서비스 재시작
systemctl restart ollama
# 재시작 후 약 10~30초 대기 (모델 로딩)
12. 리소스 모니터링
12-1. 실시간 모니터링
# 전체 리소스 현황
htop
# 디스크 사용량
df -h
# 메모리 사용량
free -h
# 포트 사용 현황
ss -tlnp
# 프로세스별 리소스
ps aux --sort=-%cpu | head -15
ps aux --sort=-%mem | head -15
12-2. 서비스별 리소스 현황
| 서비스 | CPU | RAM |
|---|---|---|
| Nginx | ~0.1% | ~50 MB |
| Spring Boot (홈페이지) | ~0.5% | ~400 MB |
| GUARDiA ITSM (FastAPI) | ~0.5% | ~300 MB |
| PostgreSQL | ~0.3% | ~256 MB |
| Ollama + Llama3:8b | ~1.0% (유휴) | ~4.7 GB |
| Jenkins | ~0.2% | ~512 MB |
| Gitea | ~0.1% | ~150 MB |
| 합계 | ~2.7% | ~6.4 GB |
13. 보안 운영
13-1. SSH 보안 강화 (권장)
# root 비밀번호 로그인 비활성화 (키 인증만 허용)
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart sshd
13-2. 방화벽 규칙 관리
# 현재 규칙 확인
ufw status numbered
# 규칙 추가
ufw allow <포트>/tcp
# 규칙 삭제
ufw delete <번호>
# 특정 IP만 허용 (예: 관리자 IP)
ufw allow from 203.xxx.xxx.xxx to any port 8080
13-3. SSL/HTTPS 설정 (도메인 보유 시)
# Let's Encrypt 인증서 발급
apt install certbot python3-certbot-nginx
certbot --nginx -d zioinfo.co.kr -d www.zioinfo.co.kr
# 자동 갱신 확인
certbot renew --dry-run
14. 장애 대응
14-1. 홈페이지 접속 불가
# 1. Nginx 상태 확인
systemctl status nginx
nginx -t
# 2. Spring Boot 상태 확인
systemctl status zioinfo
curl -s http://localhost:8082/api/company
# 3. 로그 확인
tail -50 /var/log/zioinfo/spring.log
# 4. 재시작
systemctl restart zioinfo
systemctl restart nginx
14-2. 배포 실패
# 1. 배포 로그 확인
tail -50 /var/log/zioinfo/deploy.log
# 2. CI/CD 서버 상태
systemctl status zioinfo-deploy
# 3. 소스 상태 확인
git -C /opt/zioinfo/src status
git -C /opt/zioinfo/src log --oneline -5
# 4. 수동 배포 실행 (5-4절 참고)
14-3. GUARDiA ITSM 오류
# 1. 서비스 상태
systemctl status guardia
tail -20 /opt/guardia/logs/error.log
# 2. PostgreSQL 연결 확인
psql -h 127.0.0.1 -U guardia -d guardia_db -c "SELECT 1"
# 3. 재시작
systemctl restart guardia
14-4. 데이터베이스 연결 오류
# PostgreSQL 상태
systemctl status postgresql
sudo -u postgres psql -c "\l"
# 재시작
systemctl restart postgresql
# 연결 확인
psql -h 127.0.0.1 -U guardia -d guardia_db -c "SELECT count(*) FROM pg_tables"
14-5. 메모리 부족
# 메모리 사용량 확인
free -h
ps aux --sort=-%mem | head -10
# 가장 많이 사용하는 서비스 재시작 (Ollama가 대부분 점유)
systemctl restart ollama
# Swap 임시 설정 (재부팅 시 사라짐)
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
15. 백업 및 복구
15-1. 정기 백업 스크립트
#!/bin/bash
# /opt/backup/daily_backup.sh
DATE=$(date +%Y%m%d_%H%M)
BACKUP_DIR="/opt/backup/${DATE}"
mkdir -p "$BACKUP_DIR"
# DB 백업
sudo -u postgres pg_dump guardia_db > "$BACKUP_DIR/guardia_db.sql"
sudo -u postgres pg_dump gitea_db > "$BACKUP_DIR/gitea_db.sql"
# SQLite 백업
cp /opt/zioinfo/app/data/zioinfo.db "$BACKUP_DIR/zioinfo.db"
# 설정 파일 백업
cp -r /etc/nginx/sites-available "$BACKUP_DIR/nginx/"
cp -r /etc/gitea "$BACKUP_DIR/gitea/"
cp /opt/guardia/app/.env "$BACKUP_DIR/guardia.env"
# 30일 이전 백업 삭제
find /opt/backup -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
echo "백업 완료: $BACKUP_DIR"
# cron 등록 (매일 새벽 2시)
crontab -e
# 추가:
0 2 * * * /opt/backup/daily_backup.sh >> /var/log/backup.log 2>&1
16. 자주 쓰는 명령어 모음
# ── 전체 서비스 상태 ──────────────────────────────
for s in nginx zioinfo guardia gitea jenkins postgresql ollama; do
printf "%-15s %s\n" $s $(systemctl is-active $s)
done
# ── 포트 사용 현황 ────────────────────────────────
ss -tlnp | awk '{print $4}' | sort
# ── 디스크 / 메모리 ──────────────────────────────
df -h / && free -h
# ── 홈페이지 API 테스트 ───────────────────────────
curl -s http://localhost/api/company | python3 -m json.tool
# ── 홈페이지 관리자 로그인 테스트 ────────────────
curl -s -X POST http://localhost/api/admin/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"Admin@2026!"}' \
| python3 -c "import json,sys; d=json.load(sys.stdin); print('Token:', d.get('token','FAIL')[:20]+'...')"
# ── Gitea 저장소 목록 ─────────────────────────────
curl -s http://localhost:3000/api/v1/repos/search \
-u "zio:Zio@Admin2026!" | python3 -c \
"import json,sys; [print(r['full_name']) for r in json.load(sys.stdin)['data']]"
# ── 배포 수동 트리거 ─────────────────────────────
curl -s -X POST http://localhost:9999/ \
-H "Content-Type: application/json" -d '{}'
# ── Ollama 모델 확인 ─────────────────────────────
ollama list
# ── 최근 에러 로그 ───────────────────────────────
journalctl -p err --since "1 hour ago" --no-pager
17. 업데이트 및 유지보수
17-1. 시스템 패키지 업데이트
apt-get update && apt-get upgrade -y
# 주의: 업데이트 전 서비스 상태 확인 필수
# 커널 업데이트 시 재부팅 필요
17-2. 애플리케이션 업데이트
# Gitea 업데이트
wget -q https://dl.gitea.com/gitea/X.X.X/gitea-X.X.X-linux-amd64 \
-O /opt/gitea/bin/gitea
chmod +x /opt/gitea/bin/gitea
systemctl restart gitea
# Ollama 업데이트
curl -fsSL https://ollama.com/install.sh | sh
systemctl restart ollama
17-3. LLM 모델 업데이트
# 새 버전 모델 다운로드
ollama pull llama3:8b
# 구 버전 삭제
ollama rm llama3:7b
방화벽 (ufw + NCloud ACG) — 2026-05-31 정리 완료
현재 ufw 규칙 (12개)
| # | 포트 | 서비스 | 목적 |
|---|---|---|---|
| 1 | 22/tcp | SSH | 서버 관리 |
| 2 | 80/tcp | Nginx | HTTP → HTTPS 자동 리다이렉트 |
| 3 | 443/tcp | Nginx + Let's Encrypt | HTTPS 홈페이지 |
| 4 | 8080/tcp | Jenkins | CI/CD 파이프라인 |
| 5 | 8001/tcp | GUARDiA ITSM | ITSM API 서버 |
| 6 | 3000/tcp | Gitea | Git 저장소 |
| 7 | 9999/tcp | CI/CD Webhook | 자동 배포 수신 |
| 8 | 8443/tcp | Nginx 개방망 | GUARDiA 개방망 HTTPS |
| 9 | 8090/tcp | GUARDiA Manager | 관리자 포털 |
| 10 | 25/tcp | Postfix | SMTP 수신 |
| 11 | 587/tcp | Postfix | SMTP 인증 발신 |
| 12 | 993/tcp | Dovecot | IMAPS |
NCloud ACG 동일 규칙 적용 필요
NCloud Console → Server → Network ACG → 인바운드 규칙에 위 12개 포트(TCP, 0.0.0.0/0) 등록.
내부 전용 포트 (외부 차단)
| 포트 | 서비스 | 비고 |
|---|---|---|
| 5432 | PostgreSQL | 127.0.0.1 only |
| 11434 | Ollama | 127.0.0.1 only |
| 8002 | GUARDiA Manager Backend | 127.0.0.1 only |
| 8082 | Spring Boot | Nginx 뒤 내부 |
제거된 규칙 (2026-05-31)
8088, 9001, 8082, 8002, 995, 143, 110, 3001 — 중복·평문·미사용
ufw 상태 확인
ufw status numbered
SSL 인증서 (Let's Encrypt)
# 인증서 목록 확인
certbot certificates
# 갱신 테스트
certbot renew --dry-run
# 수동 갱신
certbot renew
| 항목 | 내용 |
|---|---|
| 도메인 | zioinfo.co.kr |
| 만료일 | 2026-08-29 |
| 자동갱신 | certbot.timer (하루 2회) |
문서 버전: 1.0 | 최종 수정: 2026-05-30