# Task-520: ThreadAuto 운영 인프라 구축 (Cron + Systemd + Tailscale)

## 목표
ThreadAuto 온디맨드 파이프라인이 매일 자동으로 돌아가도록 운영 인프라 구성.

## 배경
- task-516에서 배치20 → 온디맨드 단건 생성으로 전환 완료
- `scheduler/on_demand_runner.py` — 빈 큐 생성 + 단건 콘텐츠 생성
- `scheduler/publish_worker.py` — 15분 전 트리거 + 승인 후 발행
- 이제 이걸 자동으로 돌아가게 해야 함

## 작업 항목

### 1. 빈 큐 자동 생성 (매일 새벽)
- `on_demand_runner.py`의 `generate_empty_daily_queue(target_date)` 를 매일 05:00 KST에 실행
- systemd timer 또는 cokacdir --cron 사용
- 실행 스크립트: `/home/jay/projects/ThreadAuto/scripts/run_daily_queue.sh` (신규 작성)
  ```bash
  #!/bin/bash
  cd /home/jay/projects/ThreadAuto
  source /home/jay/workspace/.env.keys
  python3 -c "from scheduler.on_demand_runner import generate_empty_daily_queue; from datetime import date; generate_empty_daily_queue(date.today())"
  ```

### 2. publish_worker 데몬 상시 실행
- `publish_worker.py --daemon --interval 60` 를 systemd service로 등록
- 서비스 파일: `/etc/systemd/user/threadauto-publisher.service` 또는 `/home/jay/.config/systemd/user/`
- 자동 재시작: `Restart=on-failure`, `RestartSec=30`
- 환경변수: `.env.keys` source

### 3. Tailscale Funnel 상시 실행
- 카드뉴스 이미지를 Threads API에 전달하려면 public URL 필요
- `tailscale funnel` 이 상시 실행되어 이미지 서빙 필요
- 현재 설정 확인: `tailscale funnel status`
- 필요시 systemd service로 데몬화

### 4. OAuth 토큰 자동 갱신
- Threads API OAuth 토큰 만료 주기 확인
- token_refresher.py (있으면) 또는 신규 작성
- cron으로 만료 전 자동 갱신

### 5. 실행 스크립트 검증
- `scripts/run_daily.sh` — 존재 여부 확인, 없으면 생성
- `scripts/run_publisher.sh` — publish_worker 시작 스크립트
- 실행 권한 (`chmod +x`) + 경로 정확성 확인

## 프로젝트 경로
`/home/jay/projects/ThreadAuto/`

## 주의사항
- ⚠️ daily_runner.py의 기존 배치 cron이 있다면 비활성화 (on_demand로 대체됨)
- systemd user service 사용 (sudo 불필요 범위 내에서)
- sudo 필요한 작업은 명시적으로 기록 (제이회장님 확인용)
- .env.keys 경로 하드코딩 주의

## 테스트
1. `systemctl --user status threadauto-publisher` — 서비스 등록 확인
2. 빈 큐 생성 스크립트 수동 실행 → daily_queue/{date}.json 생성 확인
3. publish_worker 데몬 시작 → 로그 정상 출력 확인
4. Tailscale Funnel → 이미지 URL 외부 접근 가능 확인
5. 토큰 갱신 스크립트 → 정상 갱신 확인

## 작업 레벨: Lv.2 (기능 구현)
