Initial commit after re-install
This commit is contained in:
102
README.md
Normal file
102
README.md
Normal file
@@ -0,0 +1,102 @@
|
||||
# News Link
|
||||
|
||||
뉴스/아티클 URL을 저장하고, 제목/요약/대표 이미지를 추출해 카드 형태로 보여주는 Flask 웹앱입니다.
|
||||
|
||||
## 구성
|
||||
|
||||
- `app.py`: Flask 서버, DB 연결, 메타데이터 추출, API
|
||||
- `templates/index.html`: 초기 화면(SSR) + 모달 UI
|
||||
- `static/app.js`: 무한 스크롤(30개 단위), URL 붙여넣기 파싱, 추가/갱신
|
||||
- `static/styles.css`: 스타일
|
||||
- `static/placeholder.svg`: 이미지 없을 때 표시용
|
||||
|
||||
## 요구사항
|
||||
|
||||
- Python 3.x
|
||||
- PostgreSQL
|
||||
- (권장) 미니콘다 환경: `ncue`
|
||||
|
||||
## 설치
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
## 환경변수(.env)
|
||||
|
||||
프로젝트 루트에 `.env` 파일을 만들고 아래 값을 설정하세요. (`.env`는 git에 커밋되지 않습니다)
|
||||
|
||||
```dotenv
|
||||
DB_HOST=...
|
||||
DB_PORT=5432
|
||||
DB_NAME=...
|
||||
DB_USER=...
|
||||
DB_PASSWORD=...
|
||||
TABLE=news_link
|
||||
```
|
||||
|
||||
옵션(선택):
|
||||
|
||||
```dotenv
|
||||
PORT=8021
|
||||
DB_SCHEMA=public
|
||||
DEFAULT_AUTHOR_ID=1
|
||||
DEFAULT_PAGE_SIZE=30
|
||||
MAX_PAGE_SIZE=60
|
||||
CACHE_TTL_SECONDS=3600
|
||||
FAILED_TTL_SECONDS=300
|
||||
```
|
||||
|
||||
## DB 스키마
|
||||
|
||||
`TABLE`(기본 `news_link`) 테이블에 아래 컬럼이 필요합니다.
|
||||
|
||||
- `id`
|
||||
- `url`
|
||||
- `created_at`
|
||||
|
||||
예시(참고):
|
||||
|
||||
```sql
|
||||
CREATE TABLE IF NOT EXISTS news_link (
|
||||
id SERIAL PRIMARY KEY,
|
||||
url TEXT NOT NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
```
|
||||
|
||||
## 실행
|
||||
|
||||
```bash
|
||||
python app.py
|
||||
```
|
||||
|
||||
기본 접속 주소:
|
||||
|
||||
- `http://localhost:8021`
|
||||
|
||||
## API
|
||||
|
||||
- `GET /links?limit=30&offset=0`
|
||||
- 30개 단위로 링크를 가져옵니다(프론트 무한 스크롤).
|
||||
- 응답:
|
||||
- `items`: 링크 배열
|
||||
- `next_offset`: 다음 요청 offset
|
||||
- `has_more`: 다음 페이지 존재 여부
|
||||
- `POST /links`
|
||||
- body: `{ "url": "https://..." }`
|
||||
- URL을 DB에 저장하고 메타데이터를 추출해 반환합니다.
|
||||
|
||||
## 동작 메모
|
||||
|
||||
- 초기 화면은 DB에서 **첫 페이지(기본 30개)** 만 가져와 SSR로 즉시 렌더링합니다.
|
||||
- 메타데이터 추출은 캐시를 사용합니다(성공/실패 TTL 각각 적용).
|
||||
|
||||
## ncue.net 연동 (ref 전달)
|
||||
|
||||
`ncue.net`의 `/go`에서 아래와 같이 전달되는 값을 받아 `author_id(text)`에 저장합니다.
|
||||
|
||||
- 로그인 사용자: `ref_type=email&ref=<email>`
|
||||
- 비로그인 사용자: `ref_type=ip&ref=<ip>`
|
||||
|
||||
이 값은 최초 진입 시 쿼리스트링으로 들어오며, 이후 요청에서도 유지되도록 서버가 쿠키로 저장합니다.
|
||||
Reference in New Issue
Block a user