# 서버 설정 가이드 ## 전제 - 서버: `178.104.200.7` (Ubuntu 26.04) - 접속: `ssh kjh2064@178.104.200.7` --- ## Step 1: PostgreSQL 데이터베이스 생성 및 마이그레이션 서버에 SSH로 접속한 후 다음을 실행하세요: ```bash # PostgreSQL에 접속 (로컬 unix socket, sudo 사용) sudo -i -u postgres # 그 다음 psql 프롬프트에서: psql # SQL 명령어 실행: CREATE DATABASE taxbaikdb; CREATE USER taxbaik WITH ENCRYPTED PASSWORD 'your_secure_password_here'; GRANT ALL PRIVILEGES ON DATABASE taxbaikdb TO taxbaik; \q exit # 이제 taxbaik 사용자로 마이그레이션 실행 psql -U taxbaik -d taxbaikdb -h localhost ``` 그러면 `taxbaik=#` 프롬프트가 나옵니다. 다음 SQL을 차례로 실행: ### V001__InitialSchema.sql 내용 (프롬프트에 복사): ```sql CREATE TABLE categories ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, slug VARCHAR(100) NOT NULL UNIQUE, sort_order INT NOT NULL DEFAULT 0 ); CREATE TABLE admin_users ( id SERIAL PRIMARY KEY, username VARCHAR(100) NOT NULL UNIQUE, password_hash VARCHAR(500) NOT NULL, last_login_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE TABLE blog_posts ( id SERIAL PRIMARY KEY, title VARCHAR(300) NOT NULL, content TEXT NOT NULL, slug VARCHAR(300) NOT NULL UNIQUE, category_id INT REFERENCES categories(id) ON DELETE SET NULL, tags TEXT, author_id INT REFERENCES admin_users(id) ON DELETE SET NULL, published_at TIMESTAMPTZ, view_count INT NOT NULL DEFAULT 0, seo_title VARCHAR(300), seo_description VARCHAR(500), thumbnail_url VARCHAR(500), is_published BOOLEAN NOT NULL DEFAULT FALSE, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX idx_blog_slug ON blog_posts(slug); CREATE INDEX idx_blog_published ON blog_posts(is_published, published_at DESC); CREATE INDEX idx_blog_category ON blog_posts(category_id); CREATE TABLE inquiries ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, phone VARCHAR(20) NOT NULL, email VARCHAR(200), service_type VARCHAR(100) NOT NULL, message TEXT NOT NULL, status VARCHAR(50) NOT NULL DEFAULT 'new', ip_address VARCHAR(50), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX idx_inquiry_status ON inquiries(status); CREATE INDEX idx_inquiry_created ON inquiries(created_at DESC); CREATE TABLE site_settings ( key VARCHAR(200) PRIMARY KEY, value TEXT NOT NULL, updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); INSERT INTO categories (name, slug, sort_order) VALUES ('사업자 세무', 'business-tax', 1), ('부동산 세금', 'real-estate-tax', 2), ('종합소득세', 'income-tax', 3), ('부가가치세', 'vat', 4), ('가족자산·증여', 'family-asset', 5); INSERT INTO site_settings (key, value) VALUES ('site.title', '백원숙 세무회계 | 성북구 세무사'), ('site.description', '사업자 세무, 부동산 양도세·증여세, 종합소득세 상담. 성북구 백원숙 세무사.'), ('kakao.channel.url', ''), ('phone.main', ''), ('consultation.fee.text','상담료 7만~20만 원, 계약 체결 시 일부 차감'); ``` ### 확인: ```sql \dt -- 6개 테이블 출력 (categories, admin_users, blog_posts, inquiries, site_settings, 그리고 schema_migrations) SELECT * FROM categories; -- 5개 카테고리 확인 \q ``` --- ## Step 2: systemd 서비스 파일 설치 로컬 컴퓨터에서 다음 파일을 서버에 복사: ```bash # 로컬에서: scp deploy/taxbaik.service kjh2064@178.104.200.7:~/ ``` 서버에서: ```bash # 파일 복사 sudo cp ~/taxbaik.service /etc/systemd/system/ # 환경 변수 추가 (DB 연결 문자열) sudo nano /etc/systemd/system/taxbaik.service # 아래 줄을 [Service] 섹션에서 주석 해제: # Environment=ConnectionStrings__Default=Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=your_password # systemd 재로드 sudo systemctl daemon-reload # 서비스 활성화 (부팅 시 자동 시작) sudo systemctl enable taxbaik ``` --- ## Step 3: Nginx 설정 추가 로컬에서 `deploy/nginx-taxbaik-locations.conf` 내용을 복사하여, 서버에서: ```bash # 현재 Nginx 설정 확인 cat /etc/nginx/sites-available/default # 또는 기존 Nginx 설정 파일 확인 ls -la /etc/nginx/sites-available/ ``` 기존 설정 파일의 `http` 또는 `server` 블록에 다음을 **추가**: ```nginx location /taxbaik { proxy_pass http://127.0.0.1:5001; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 120s; } ``` 설정 검증 및 재로드: ```bash sudo nginx -t sudo systemctl reload nginx ``` --- ## Step 4: Gitea 저장소 Secrets 추가 1. Gitea 웹UI (`http://178.104.200.7/`) 접속 2. `kjh2064/taxbaik` 저장소 이동 3. **Settings** → **Secrets** → **Add Secret** 다음 3개 secrets 추가: | Secret 이름 | 값 | |-----------|-----| | `DEPLOY_USER` | `kjh2064` | | `DEPLOY_HOST` | `178.104.200.7` | | `DEPLOY_SSH_KEY` | SSH 개인키 (매우 민감!) | SSH 개인키는: ```bash # 로컬에서 (.ssh/id_rsa 또는 현재 사용 중인 키) cat ~/.ssh/id_rsa # 전체 내용 복사 ``` Gitea Secret 창에 전체 붙여넣기. --- ## Step 5: 배포 디렉토리 생성 서버에서: ```bash mkdir -p ~/deployments mkdir -p ~/taxbaik_active # 권한 확인 ls -la ~/ | grep taxbaik ``` --- ## Step 6: 초기 배포 테스트 로컬에서: ```bash # 솔루션 빌드 dotnet build TaxBaik.sln -c Release # 배포는 Gitea Actions가 처리 # 수동 publish/rsync 절차는 사용하지 않음 ``` --- ## Step 7: 확인 체크리스트 ```bash # 로컬에서 또는 서버에서: # 1. DB 확인 psql -U taxbaik -d taxbaikdb -c "\dt" # 6개 테이블 출력 # 2. 서비스 상태 sudo systemctl status taxbaik # 3. Nginx 로그 확인 sudo tail -f /var/log/nginx/error.log # 4. 앱 로그 확인 journalctl -u taxbaik -n 50 # 5. 엔드포인트 테스트 curl -v http://127.0.0.1:5001/health curl -v http://127.0.0.1/taxbaik # 6. 문의 폼 E2E 테스트 curl -X POST http://178.104.200.7/taxbaik/contact \ -d "name=테스트&phone=010-1234-5678&service_type=기장&message=상담요청" ``` --- ## 문제 해결 | 증상 | 해결 | |------|------| | "Connection refused" | systemd 서비스 시작 안 됨: `sudo systemctl start taxbaik` | | "Permission denied" | systemd 서비스 파일 권한 확인: `sudo chmod 644 /etc/systemd/system/taxbaik.service` | | Nginx 404 | 설정 재로드: `sudo nginx -t && sudo systemctl reload nginx` | | DB 연결 오류 | 환경 변수 확인: `systemctl cat taxbaik \| grep ConnectionStrings` | --- ## 다음 단계 서버 설정 완료 후: - [ ] Git 저장소에 push: `git push -u origin main` - [ ] 초기 블로그 포스트 5개 작성 (W6.2) - [ ] 사이트 설정 입력 (전화번호, KakaoTalk URL) - [ ] Lighthouse 감사 실행