Split monolithic chat service into modular structure with Matrix client support, extract web server into per-resource route modules, introduce bootstrap/main-loop separation, and add comprehensive vitest coverage across services, repositories, and utilities. Adds project docs and CLAUDE.md agent instructions.
8.6 KiB
8.6 KiB
Deployment Guide
Complete guide for deploying RedditBot in various environments.
Table of Contents
- Prerequisites
- Local Development
- Docker Deployment
- Docker Compose
- Dokploy Deployment
- Production Considerations
- Monitoring & Maintenance
- Troubleshooting
Prerequisites
Required
| Requirement | Version | Notes |
|---|---|---|
| Node.js | 18+ | LTS recommended |
| npm | 9+ | Or yarn/pnpm |
| OpenRouter API Key | - | Sign up at openrouter.ai |
| Reddit Account | - | With DM permissions enabled |
Recommended
| Requirement | Notes |
|---|---|
| 1 GB RAM | Minimum for browser automation |
| 1 CPU core | More for higher message throughput |
| 5 GB disk | For database, media, and browser data |
Local Development
1. Clone and Install
git clone <repository-url>
cd RedditBot
npm install
2. Configure
Create config.yaml:
reddit:
subreddits:
- gonewild
pollInterval: 15
targetGender: "F"
sellerKeywords:
- seller
- onlyfans
openrouter:
apiKey: "sk-or-v1-your-key-here"
model: "meta-llama/llama-3.2-90b-vision-preview"
fallbackModels:
- "google/gemini-2.0-flash-001"
rateLimit:
minDelayMs: 30000
maxMessagesPerHour: 20
jitterMs: 15000
browser:
headless: true
userDataDir: "./data/browser"
database:
path: "./data/reddit-bot.db"
web:
port: 3000
dryRun: true # Start in dry run mode
Set environment variables:
export REDDIT_USERNAME="your-username"
export REDDIT_PASSWORD="your-password"
3. Initial Login
Run the login script to establish a browser session:
npm run login
This will:
- Open a browser window
- Navigate to Reddit login
- Wait for you to complete login (including 2FA if enabled)
- Save cookies to
data/browser/
4. Start the Bot
# Development (with TypeScript execution)
npm run dev
# Production (compiled JavaScript)
npm start
5. Access Dashboard
Open http://localhost:3000 in your browser.
Docker Deployment
Build the Image
docker build -t reddit-bot .
Run the Container
docker run -d \
--name reddit-bot \
-p 3000:3000 \
-v $(pwd)/data:/app/data \
-e OPENROUTER_API_KEY=sk-or-v1-your-key \
-e REDDIT_USERNAME=your-username \
-e REDDIT_PASSWORD=your-password \
-e BROWSER_HEADLESS=true \
reddit-bot:latest
Dockerfile Structure
# Build stage
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Production stage
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/config.yaml ./config.yaml
COPY --from=builder /app/package.json ./package.json
EXPOSE 3000
CMD ["node", "dist/index.js"]
Docker Compose
docker-compose.yml
version: '3.8'
services:
reddit-bot:
build: .
container_name: reddit-bot
ports:
- "3000:3000"
volumes:
- ./data:/app/data
environment:
- OPENROUTER_API_KEY=${OPENROUTER_API_KEY}
- REDDIT_USERNAME=${REDDIT_USERNAME}
- REDDIT_PASSWORD=${REDDIT_PASSWORD}
- BROWSER_HEADLESS=true
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "--spider", "http://localhost:3000/api/stats"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
Start with Compose
# Set environment variables
cp .env.example .env
# Edit .env with your credentials
# Build and start
docker compose up -d --build
# View logs
docker compose logs -f reddit-bot
# Stop
docker compose down
# Restart
docker compose restart
Dokploy Deployment
Dokploy is a self-hosted platform for deploying applications. See DOKPLOY_DEPLOY.md for detailed instructions.
Quick Start
- Create Application: In Dokploy dashboard, create a new Docker application
- Set Environment Variables:
OPENROUTER_API_KEYREDDIT_USERNAMEREDDIT_PASSWORDBROWSER_HEADLESS
- Mount Volume: Mount
./datafor persistent storage - Set Port: Map container port 3000 to host port
- Deploy: Push to repository and trigger deployment
Dokploy Configuration
# Dokploy-specific settings
app:
type: docker
repository: <your-repo>
branch: main
dockerfilePath: Dockerfile
environment:
OPENROUTER_API_KEY: $OPENROUTER_API_KEY
REDDIT_USERNAME: $REDDIT_USERNAME
REDDIT_PASSWORD: $REDDIT_PASSWORD
BROWSER_HEADLESS: "true"
ports:
- container: 3000
host: 3000
volumes:
- source: reddit-bot-data
target: /app/data
type: bind
restartPolicy: unless-stopped
Production Considerations
Security
- Network Isolation: Run behind a reverse proxy with authentication
- Environment Variables: Never commit credentials; use secrets management
- Dashboard Access: Restrict to internal network or add auth
- Browser Data: Protect
data/browser/directory
Performance
- Browser Headless: Always use headless mode in production
- WAL Mode: SQLite WAL mode is enabled by default for concurrent reads
- Rate Limiting: Adjust based on Reddit account age and trust level
- Message Volume: Start low (10-20/hour) and increase gradually
Reliability
- Auto-restart: Use
restart: unless-stoppedin Docker - Health Checks: Monitor
/api/statsendpoint - Logging: Review logs regularly for errors
- Backups: Regularly backup
data/reddit-bot.db
Monitoring
- Dashboard: Check web dashboard for real-time stats
- Response Rate: Monitor response rates per strategy/subreddit
- Error Rate: Watch for AI refusals, send failures
- Browser Health: Verify session isn't expired
Scaling
RedditBot is designed as a single-instance application. For scaling:
- Multiple Accounts: Run separate instances per Reddit account
- Subreddit Split: Distribute subreddits across instances
- Centralized DB: Consider moving to PostgreSQL for multi-instance
Monitoring & Maintenance
Daily Checks
- Dashboard shows bot is running
- Response rate is reasonable (>10%)
- No repeated errors in logs
- Browser session is active
Weekly Tasks
- Review analytics (strategy performance, subreddit performance)
- Check disk usage (media files, database)
- Verify backup is working
- Review successful messages for quality
Monthly Tasks
- Backup database
- Review and update strategy variants
- Check for OpenRouter model updates
- Review and update seller keywords
- Verify browser session is still valid
Backup Procedure
# Stop the bot
docker compose stop
# Backup database
cp data/reddit-bot.db data/reddit-bot.db.backup.$(date +%Y%m%d)
# Backup browser session (optional)
tar czf data/browser.backup.$(date +%Y%m%d).tar.gz data/browser/
# Restart the bot
docker compose start
Troubleshooting
Bot Won't Start
Symptom: Bot exits immediately on startup.
Steps:
- Check logs:
docker compose logs reddit-bot - Verify
config.yamlsyntax - Verify environment variables are set
- Check for Zod validation errors in logs
Browser Login Fails
Symptom: "Browser session expired" or login fails.
Steps:
- Delete browser data:
rm -rf data/browser/ - Re-run login:
npm run login - Check Reddit account is not locked
- Try
BROWSER_HEADLESS=falsefor debugging
AI Analysis Fails
Symptom: All messages show "AI refusal" or analysis errors.
Steps:
- Verify API key is valid and has balance
- Check model availability on OpenRouter
- Try changing to a different model
- Review logs for specific error messages
High Error Rate
Symptom: Many messages fail to send.
Steps:
- Check rate limiting (reduce maxMessagesPerHour)
- Increase minDelayMs and jitterMs
- Check for IP bans (try different network)
- Review Reddit account standing
Dashboard Not Accessible
Symptom: Cannot reach http://localhost:3000.
Steps:
- Verify bot is running (
docker compose ps) - Check port is not in use:
lsof -i :3000 - Verify firewall allows port 3000
- Check web.port in config.yaml
Database Issues
Symptom: Database errors or corruption.
Steps:
- Stop the bot
- Backup the database
- Try opening with SQLite viewer to check integrity
- If corrupted, restore from backup
- Consider enabling automatic backups