This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
# Playwright Node.js API
|
||||
|
||||
A Node.js API service that uses Playwright to fetch webpage HTML with SQLite or PostgreSQL-based caching.
|
||||
|
||||
## Features
|
||||
|
||||
- Fetch full HTML of any webpage using Playwright
|
||||
- SQLite or PostgreSQL-based caching with configurable expiry (default: 24 hours)
|
||||
- API key authentication (optional, via `x-api-key` header)
|
||||
- Automatic cache cleanup and garbage collection
|
||||
- Proper browser/page cleanup on errors
|
||||
- Health check and cache statistics endpoints
|
||||
|
||||
## API Endpoints
|
||||
|
||||
### GET `/`
|
||||
|
||||
Fetch HTML content of a webpage.
|
||||
|
||||
**Query Parameters:**
|
||||
|
||||
- `url` (required): The URL to fetch
|
||||
- `skipCache` (optional): Set to `true`, `1`, or `yes` to bypass cache
|
||||
|
||||
**Headers:**
|
||||
|
||||
- `x-api-key` (required if `API_KEY` env var is set): API key for authentication
|
||||
|
||||
**Example:**
|
||||
|
||||
```bash
|
||||
# Without API key (if API_KEY env var is not set)
|
||||
curl "http://localhost:3000/?url=https://example.com"
|
||||
|
||||
# With API key
|
||||
curl -H "x-api-key: your-api-key" "http://localhost:3000/?url=https://example.com"
|
||||
curl -H "x-api-key: your-api-key" "http://localhost:3000/?url=https://example.com&skipCache=true"
|
||||
```
|
||||
|
||||
### GET `/health`
|
||||
|
||||
Health check endpoint. Returns API status and configuration.
|
||||
|
||||
**Note:** This endpoint is not protected by API key authentication.
|
||||
|
||||
### GET `/cache/stats`
|
||||
|
||||
Get cache statistics (total entries, valid entries).
|
||||
|
||||
### DELETE `/cache`
|
||||
|
||||
Clear cache entries.
|
||||
|
||||
**Query Parameters:**
|
||||
|
||||
- `url` (optional): Clear specific URL from cache. If omitted, clears all cache.
|
||||
|
||||
## Environment Variables
|
||||
|
||||
- `PORT`: Server port (default: `3000`)
|
||||
- `CACHE_EXPIRY_HOURS`: Cache expiry time in hours (default: `24`)
|
||||
- `API_KEY`: API key for authentication (optional). If set, all endpoints except `/health` require the `x-api-key` header
|
||||
- `DB_PATH`: Path to SQLite database file (default: `/db/cache.db`) - only used if PostgreSQL is not configured
|
||||
|
||||
### PostgreSQL Configuration (optional)
|
||||
|
||||
If the following environment variables are set, the API will use PostgreSQL instead of SQLite:
|
||||
|
||||
- `POSTGRES_HOST`: PostgreSQL host (e.g., `puppeteer-postgres`)
|
||||
- `POSTGRES_PORT`: PostgreSQL port (default: `5432`)
|
||||
- `POSTGRES_USER`: PostgreSQL username (e.g., `postgres`)
|
||||
- `POSTGRES_PASSWORD`: PostgreSQL password
|
||||
- `POSTGRES_DB`: PostgreSQL database name (e.g., `puppeteer`)
|
||||
|
||||
If any of these PostgreSQL variables are missing, the API will fall back to SQLite.
|
||||
|
||||
## Docker
|
||||
|
||||
Build the image:
|
||||
|
||||
```bash
|
||||
docker build -t playwright-node-api .
|
||||
```
|
||||
|
||||
Run the container with SQLite:
|
||||
|
||||
```bash
|
||||
docker run -d \
|
||||
-p 3000:3000 \
|
||||
-v /path/to/db:/db \
|
||||
-e CACHE_EXPIRY_HOURS=24 \
|
||||
-e API_KEY=your-secret-api-key \
|
||||
playwright-node-api
|
||||
```
|
||||
|
||||
Run the container with PostgreSQL:
|
||||
|
||||
```bash
|
||||
docker run -d \
|
||||
-p 3000:3000 \
|
||||
-e POSTGRES_HOST=puppeteer-postgres \
|
||||
-e POSTGRES_PORT=5432 \
|
||||
-e POSTGRES_USER=postgres \
|
||||
-e POSTGRES_PASSWORD=${PUPPETEER_DB_PASSWORD} \
|
||||
-e POSTGRES_DB=puppeteer \
|
||||
-e CACHE_EXPIRY_HOURS=24 \
|
||||
-e API_KEY=your-secret-api-key \
|
||||
playwright-node-api
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
- The service automatically cleans up expired cache entries every hour
|
||||
- Browser instances are reused for better performance
|
||||
- Pages are always closed after use, even on errors
|
||||
- Graceful shutdown is handled on SIGTERM/SIGINT
|
||||
- API key authentication is optional: if `API_KEY` is not set, all endpoints are publicly accessible (except `/health` which is always public)
|
||||
Reference in New Issue
Block a user