421 lines
8.0 KiB
Markdown
421 lines
8.0 KiB
Markdown
# Asset Pilot - Docker 설치 가이드
|
|
|
|
## 🐳 Docker 방식의 장점
|
|
|
|
- ✅ 독립된 컨테이너로 깔끔한 환경 관리
|
|
- ✅ PostgreSQL과 애플리케이션 분리
|
|
- ✅ 한 번의 명령으로 전체 시스템 실행
|
|
- ✅ 쉬운 백업 및 복구
|
|
- ✅ 포트 충돌 없음
|
|
- ✅ 업데이트 및 롤백 간편
|
|
|
|
---
|
|
|
|
## 📋 사전 준비
|
|
|
|
### 1. Docker 설치
|
|
|
|
#### Orange Pi (Ubuntu/Debian)
|
|
```bash
|
|
# Docker 설치 스크립트
|
|
curl -fsSL https://get.docker.com -o get-docker.sh
|
|
sudo sh get-docker.sh
|
|
|
|
# 현재 사용자를 docker 그룹에 추가
|
|
sudo usermod -aG docker $USER
|
|
|
|
# 로그아웃 후 재로그인 또는
|
|
newgrp docker
|
|
|
|
# Docker 서비스 시작
|
|
sudo systemctl start docker
|
|
sudo systemctl enable docker
|
|
```
|
|
|
|
#### Docker Compose 설치 (이미 포함되어 있을 수 있음)
|
|
```bash
|
|
# Docker Compose 버전 확인
|
|
docker compose version
|
|
|
|
# 없다면 설치
|
|
sudo apt-get update
|
|
sudo apt-get install docker-compose-plugin
|
|
```
|
|
|
|
### 2. 설치 확인
|
|
```bash
|
|
docker --version
|
|
docker compose version
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 설치 및 실행
|
|
|
|
### 1단계: 파일 업로드
|
|
|
|
Orange Pi에 `asset_pilot_docker.tar.gz` 파일을 전송:
|
|
|
|
```bash
|
|
# Windows에서 (PowerShell)
|
|
scp asset_pilot_docker.tar.gz orangepi@192.168.1.100:~/
|
|
|
|
# Linux/Mac에서
|
|
scp asset_pilot_docker.tar.gz orangepi@192.168.1.100:~/
|
|
```
|
|
|
|
### 2단계: 압축 해제
|
|
|
|
```bash
|
|
# SSH 접속
|
|
ssh orangepi@192.168.1.100
|
|
|
|
# 압축 해제
|
|
tar -xzf asset_pilot_docker.tar.gz
|
|
cd asset_pilot_docker
|
|
```
|
|
|
|
### 3단계: 환경 설정
|
|
|
|
```bash
|
|
# .env 파일 편집 (비밀번호 변경)
|
|
nano .env
|
|
```
|
|
|
|
`.env` 파일 내용:
|
|
```env
|
|
DB_PASSWORD=your_secure_password_here # 여기를 변경하세요!
|
|
```
|
|
|
|
저장: `Ctrl + X` → `Y` → `Enter`
|
|
|
|
### 4단계: Docker 컨테이너 실행
|
|
|
|
```bash
|
|
# 백그라운드에서 실행
|
|
docker compose up -d
|
|
|
|
# 실행 상태 확인
|
|
docker compose ps
|
|
```
|
|
|
|
출력 예시:
|
|
```
|
|
NAME IMAGE STATUS PORTS
|
|
asset_pilot_app asset_pilot_docker-app Up 30 seconds 0.0.0.0:8000->8000/tcp
|
|
asset_pilot_db postgres:16-alpine Up 30 seconds 0.0.0.0:5432->5432/tcp
|
|
```
|
|
|
|
### 5단계: 데이터베이스 초기화
|
|
|
|
```bash
|
|
# 앱 컨테이너 내부에서 초기화 스크립트 실행
|
|
docker compose exec app python init_db.py
|
|
```
|
|
|
|
### 6단계: 접속 확인
|
|
|
|
웹 브라우저에서:
|
|
```
|
|
http://[Orange_Pi_IP]:8000
|
|
```
|
|
|
|
예: `http://192.168.1.100:8000`
|
|
|
|
---
|
|
|
|
## 🔧 Docker 관리 명령어
|
|
|
|
### 컨테이너 관리
|
|
|
|
```bash
|
|
# 전체 시작
|
|
docker compose up -d
|
|
|
|
# 전체 중지
|
|
docker compose down
|
|
|
|
# 전체 재시작
|
|
docker compose restart
|
|
|
|
# 특정 서비스만 재시작
|
|
docker compose restart app # 앱만
|
|
docker compose restart postgres # DB만
|
|
|
|
# 상태 확인
|
|
docker compose ps
|
|
|
|
# 로그 확인 (실시간)
|
|
docker compose logs -f
|
|
|
|
# 특정 서비스 로그만
|
|
docker compose logs -f app
|
|
docker compose logs -f postgres
|
|
```
|
|
|
|
### 데이터베이스 관리
|
|
|
|
```bash
|
|
# PostgreSQL 컨테이너 접속
|
|
docker compose exec postgres psql -U asset_user -d asset_pilot
|
|
|
|
# SQL 쿼리 실행 예시
|
|
# \dt # 테이블 목록
|
|
# \d assets # assets 테이블 구조
|
|
# SELECT * FROM assets;
|
|
# \q # 종료
|
|
```
|
|
|
|
### 애플리케이션 관리
|
|
|
|
```bash
|
|
# 앱 컨테이너 내부 접속
|
|
docker compose exec app /bin/bash
|
|
|
|
# 컨테이너 내부에서 Python 스크립트 실행
|
|
docker compose exec app python init_db.py
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 데이터 관리
|
|
|
|
### 백업
|
|
|
|
#### 데이터베이스 백업
|
|
```bash
|
|
# 백업 생성
|
|
docker compose exec postgres pg_dump -U asset_user asset_pilot > backup_$(date +%Y%m%d).sql
|
|
|
|
# 또는
|
|
docker compose exec -T postgres pg_dump -U asset_user asset_pilot > backup.sql
|
|
```
|
|
|
|
#### 전체 볼륨 백업
|
|
```bash
|
|
# 볼륨 백업 (고급)
|
|
docker run --rm -v asset_pilot_docker_postgres_data:/data \
|
|
-v $(pwd):/backup alpine tar czf /backup/postgres_backup.tar.gz /data
|
|
```
|
|
|
|
### 복원
|
|
|
|
```bash
|
|
# 백업 파일 복원
|
|
cat backup.sql | docker compose exec -T postgres psql -U asset_user -d asset_pilot
|
|
```
|
|
|
|
### CSV 데이터 가져오기 (Windows 앱에서)
|
|
|
|
```bash
|
|
# 1. CSV 파일을 컨테이너로 복사
|
|
docker cp user_assets.csv asset_pilot_app:/app/
|
|
|
|
# 2. import_csv.py 생성 (아래 스크립트 참고)
|
|
docker compose exec app python import_csv.py user_assets.csv
|
|
```
|
|
|
|
---
|
|
|
|
## 🔄 업데이트
|
|
|
|
### 애플리케이션 업데이트
|
|
|
|
```bash
|
|
# 1. 새 코드 받기 (파일 업로드 또는 git pull)
|
|
|
|
# 2. 이미지 재빌드
|
|
docker compose build app
|
|
|
|
# 3. 재시작
|
|
docker compose up -d app
|
|
```
|
|
|
|
### PostgreSQL 업데이트
|
|
|
|
```bash
|
|
# 주의: 데이터 백업 필수!
|
|
# 1. 백업 생성
|
|
docker compose exec -T postgres pg_dump -U asset_user asset_pilot > backup.sql
|
|
|
|
# 2. docker-compose.yml에서 버전 변경 (예: postgres:17-alpine)
|
|
|
|
# 3. 컨테이너 재생성
|
|
docker compose down
|
|
docker compose up -d
|
|
```
|
|
|
|
---
|
|
|
|
## 🗑️ 완전 삭제
|
|
|
|
```bash
|
|
# 컨테이너 중지 및 삭제
|
|
docker compose down
|
|
|
|
# 볼륨까지 삭제 (데이터 완전 삭제!)
|
|
docker compose down -v
|
|
|
|
# 이미지도 삭제
|
|
docker rmi asset_pilot_docker-app postgres:16-alpine
|
|
```
|
|
|
|
---
|
|
|
|
## 🛠️ 문제 해결
|
|
|
|
### 컨테이너가 시작되지 않음
|
|
|
|
```bash
|
|
# 로그 확인
|
|
docker compose logs
|
|
|
|
# 특정 서비스 로그
|
|
docker compose logs app
|
|
docker compose logs postgres
|
|
|
|
# 컨테이너 상태 확인
|
|
docker compose ps -a
|
|
```
|
|
|
|
### 데이터베이스 연결 오류
|
|
|
|
```bash
|
|
# PostgreSQL 컨테이너 헬스체크
|
|
docker compose exec postgres pg_isready -U asset_user -d asset_pilot
|
|
|
|
# 연결 테스트
|
|
docker compose exec postgres psql -U asset_user -d asset_pilot -c "SELECT 1;"
|
|
```
|
|
|
|
### 포트 충돌
|
|
|
|
```bash
|
|
# 8000번 포트 사용 확인
|
|
sudo lsof -i :8000
|
|
|
|
# docker-compose.yml에서 포트 변경 (예: 8001:8000)
|
|
```
|
|
|
|
### 디스크 공간 부족
|
|
|
|
```bash
|
|
# 사용하지 않는 Docker 리소스 정리
|
|
docker system prune -a
|
|
|
|
# 볼륨 확인
|
|
docker volume ls
|
|
```
|
|
|
|
---
|
|
|
|
## 📱 원격 접근 설정
|
|
|
|
### Nginx 리버스 프록시 (선택적)
|
|
|
|
```bash
|
|
# Nginx 설치
|
|
sudo apt install nginx
|
|
|
|
# 설정 파일 생성
|
|
sudo nano /etc/nginx/sites-available/asset_pilot
|
|
```
|
|
|
|
설정 내용:
|
|
```nginx
|
|
server {
|
|
listen 80;
|
|
server_name your_domain.com; # 또는 IP 주소
|
|
|
|
location / {
|
|
proxy_pass http://localhost:8000;
|
|
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;
|
|
}
|
|
|
|
location /api/stream {
|
|
proxy_pass http://localhost:8000/api/stream;
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Connection "";
|
|
proxy_buffering off;
|
|
proxy_cache off;
|
|
}
|
|
}
|
|
```
|
|
|
|
활성화:
|
|
```bash
|
|
sudo ln -s /etc/nginx/sites-available/asset_pilot /etc/nginx/sites-enabled/
|
|
sudo nginx -t
|
|
sudo systemctl restart nginx
|
|
```
|
|
|
|
---
|
|
|
|
## 🔐 보안 권장사항
|
|
|
|
### 1. .env 파일 보호
|
|
```bash
|
|
chmod 600 .env
|
|
```
|
|
|
|
### 2. 방화벽 설정
|
|
```bash
|
|
# 8000번 포트만 허용 (외부 접근 시)
|
|
sudo ufw allow 8000/tcp
|
|
|
|
# PostgreSQL 포트는 외부 차단 (기본값)
|
|
sudo ufw deny 5432/tcp
|
|
```
|
|
|
|
### 3. 정기 백업
|
|
```bash
|
|
# cron으로 매일 자동 백업
|
|
crontab -e
|
|
|
|
# 추가 (매일 새벽 3시)
|
|
0 3 * * * cd /home/orangepi/asset_pilot_docker && docker compose exec -T postgres pg_dump -U asset_user asset_pilot > backup_$(date +\%Y\%m\%d).sql
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 시스템 리소스 모니터링
|
|
|
|
```bash
|
|
# 컨테이너 리소스 사용량
|
|
docker stats
|
|
|
|
# 특정 컨테이너만
|
|
docker stats asset_pilot_app asset_pilot_db
|
|
```
|
|
|
|
---
|
|
|
|
## ✅ 설치 체크리스트
|
|
|
|
- [ ] Docker 설치 완료
|
|
- [ ] Docker Compose 설치 완료
|
|
- [ ] 프로젝트 파일 압축 해제
|
|
- [ ] .env 파일 비밀번호 설정
|
|
- [ ] `docker compose up -d` 실행
|
|
- [ ] 컨테이너 상태 확인 (`docker compose ps`)
|
|
- [ ] 데이터베이스 초기화 (`docker compose exec app python init_db.py`)
|
|
- [ ] 웹 브라우저 접속 확인 (`http://[IP]:8000`)
|
|
- [ ] 데이터 수집 동작 확인
|
|
|
|
---
|
|
|
|
## 🎉 완료!
|
|
|
|
모든 과정이 완료되면 다음 URL로 접속하세요:
|
|
```
|
|
http://[Orange_Pi_IP]:8000
|
|
```
|
|
|
|
문제가 발생하면 로그를 확인하세요:
|
|
```bash
|
|
docker compose logs -f
|
|
```
|