Files
fg-auto/README.md

5.8 KiB

퍼스트가든용 기상청 API를 활용해 공지사항 자동 등록 시스템

기상정보에 따른 이벤트 진행에 대한 정확한 기준 부여를 위해 기상청 API를 사용하여, 영업시간 내 강수정보를 파악하고 자동으로 공지를 올리기 위한 프로젝트.


📁 폴더 구조

project-root/
├── logs/                          # 크론 실행 로그 저장 경로
│   └── cron.log                   # Crontab 실행 로그
│
├── data/                          # SQLite DB, 캡처 이미지 저장 경로 (공용 볼륨)
│   ├── weather.sqlite             # 날씨 DB (precipitation, summary 테이블)
│   └── weather_capture_YYYYMMDD.png  # 일자별 날씨 캡처 이미지
│
├── app/                          # gnu-autouploader 앱 소스 (Dockerfile에서 복사)
│   ├── gnu_autoupload.py         # 메인 실행 스크립트 (Selenium → FTP → DB)
│   ├── weather_capture.py        # Selenium 기반 날씨 이미지 캡처
│   ├── weather.py                # 기상청 API 데이터 처리 및 sqlite 저장
│   ├── send_message.py           # Mattermost 알림 발송
│   ├── selenium_manager.py       # Selenium 브라우저 관리
│   ├── config.py                 # 설정값 로드 (DB, FTP, API KEY 등)
│   ├── requirements.txt          # Python 의존성
│   └── run.sh                    # 수동 실행용 셸 스크립트 (개발 시 사용)
│
├── webhook/                      # Synology Chat 웹훅 응답 서버
│   └── webhook.py                # Flask 기반 응답 서버
│
├── build/
│   ├── app/
│   │   ├── Dockerfile            # gnu-autouploader 컨테이너 이미지
│   │   └── run.sh                # (위의 app/run.sh와 동일)
│   └── webhook/
│       └── Dockerfile            # webhook 서버용 Dockerfile
│
├── .env.example                  # 환경 변수 템플릿 (.env로 복사하여 수정)
├── docker-compose.yml            # Docker Compose 서비스 정의
└── README.md                     # 프로젝트 문서

📋 주요 스크립트 설명

app/gnu_autoupload.py (메인)

  • 역할: 날씨 캡처 → FTP 업로드 → 그누보드 DB에 게시글 등록
  • 실행 방식:
    • 매일 09:00 Crontab 자동 실행
    • docker exec 또는 run.sh로 수동 실행 가능
  • 오류 발생 시: Mattermost으로 알림 발송

app/weather_capture.py

  • Selenium을 사용해 기상청 날씨누리 웹 페이지 캡처
  • '최근발표시각' 표시 (출처 명시)

app/weather.py

  • 기상청 API에서 시간별 강수량 데이터 수집
  • 10:00 ~ 22:00 영업시간 강수 데이터 HTML 테이블 생성
  • SQLite DB에 저장

app/config.py

  • 환경 변수 로드 (.env 또는 컨테이너 환경 변수)
  • 필수 변수 부재 시 즉시 오류 출력 후 종료

🚀 설치 & 실행

1. 환경 설정

# .env 파일 생성
cp .env.example .env

# 필수 정보 입력
vim .env

필수 환경 변수

# 게시판 정보
BOARD_ID=news
BOARD_CA_NAME=카테고리명
BOARD_CONTENT=글 내용
BOARD_MB_ID=user_id
BOARD_NICKNAME=닉네임

# MySQL 연결 (로컬: localhost, Docker: db 서비스명, Synology: 실제 호스트 IP/도메인)
DB_HOST=localhost
DB_USER=db_user
DB_PASSWORD=db_password
DB_NAME=database_name

# FTP 업로드
FTP_HOST=ftp.example.com
FTP_USER=ftp_user
FTP_PASSWORD=ftp_password
FTP_UPLOAD_DIR=/data/file/news/

# 기상청 API
SERVICE_KEY=your_api_key_here

# Mattermost 알림 (선택사항)
MATTERMOST_URL=https://mattermost.example.com
MATTERMOST_TOKEN=token
MATTERMOST_CHANNEL_ID=channel_id

2. Docker Compose 실행

# 빌드 및 실행
docker-compose up -d

# 로그 확인
docker-compose logs -f gnu-autouploader

# 크론 실행 로그 확인
docker exec gnu-autouploader tail -f /logs/cron.log

3. 수동 실행

# 컨테이너에서 직접 실행
docker exec -it gnu-autouploader /usr/bin/python /app/gnu_autoupload.py

# 또는 run.sh 사용
docker exec -it gnu-autouploader /app/run.sh

⚙️ 크론탭 설정

Docker 컨테이너 내부에서 매일 09:00에 자동 실행됩니다.

0 9 * * * /usr/bin/python /app/gnu_autoupload.py >> /logs/cron.log 2>&1

로그 확인:

docker exec gnu-autouploader tail -f /logs/cron.log

🔍 문제 해결

MySQL 연결 오류

  • 오류: Can't connect to MySQL server on 'localhost'
  • 원인: Docker 컨테이너에서 localhost는 컨테이너 자신을 가리킴
  • 해결:
    • Docker 환경: DB_HOST=db (docker-compose 서비스명)
    • Synology: DB_HOST=192.168.x.x (호스트 IP)

Mattermost 알림 실패

  • 오류: Invalid URL '/api/v4/posts': No scheme supplied
  • 원인: URL에 http:// 또는 https://가 없음
  • 해결: MATTERMOST_URL=https://mattermost.example.com 명시

크론탭에서 환경 변수 미로드

  • 원인: 기존 버전에서 crontab이 .env 파일 접근 불가
  • 해결: 현재는 docker-compose.yml에서 .env를 volume mount + env_file로 처리

📝 설정 변경 후 재배포

# 컨테이너 재시작
docker-compose restart gnu-autouploader

# 또는 재빌드
docker-compose up -d --build

🛠️ 개발 & 디버깅

로컬 테스트 (가상환경)

# 가상환경 생성
python -m venv .venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate

# 의존성 설치
pip install -r app/requirements.txt

# .env 파일 생성 후 직접 실행
python app/gnu_autoupload.py

Docker 내 직접 실행

docker exec -it gnu-autouploader bash
cd /app
python gnu_autoupload.py