253 lines
6.0 KiB
Markdown
253 lines
6.0 KiB
Markdown
# Nostr Poster
|
|
|
|
An automated content posting bot for Nostr networks. This tool allows you to schedule regular posting of images and videos to Nostr relays, supporting both NIP-94 and Blossom upload services.
|
|
|
|
|
|
# Nostr Poster
|
|
|
|
## Table of Contents
|
|
- [Plan for Nostr Poster Improvements](#plan-for-nostr-poster-improvements)
|
|
- [To-Do List](#to-do-list)
|
|
|
|
### Priority Order
|
|
|
|
1. [ ] Add Bot post Feed.
|
|
2. [ ] Pull comments from posts and allow replying from app for each bot.
|
|
|
|
## To-Do List
|
|
|
|
### Bot Profile Management Enhancements
|
|
|
|
- [ ] Better Key managment.
|
|
|
|
|
|
### Relay Management Improvements
|
|
|
|
- [ ] Include relay testing functionality
|
|
- [ ] Add a "recommended relays" quick-add option
|
|
- [ ] Include relay status indicators
|
|
|
|
### Post Scheduling and Auto-Posting Testing
|
|
|
|
- [ ] Implement a post history view
|
|
- [ ] Add a "test now" button that triggers an immediate post attempt
|
|
|
|
## Features
|
|
|
|
- **Media Management**: Upload content to either NIP-94/96 compatible servers or Blossom storage servers
|
|
- **Scheduled Posting**: Configure posting intervals for automated content sharing
|
|
- **Multiple Bot Support**: Manage multiple bot identities, each with their own keypair
|
|
- **Keypair Management**: Create new keypairs or import existing ones
|
|
- **Relay Configuration**: Configure which relays to publish to for each bot
|
|
- **Profile Management**: Set up and publish bot profiles (name, bio, avatar, etc.)
|
|
- **Content Archiving**: Posted content gets archived to avoid duplicate posts
|
|
- **hybrid Posting mode**: Makes both kind 1 and kind 20 posts as well as doing a hybrid post that makes a post of each type.
|
|
|
|
## Installation
|
|
|
|
### Requirements
|
|
|
|
- Go 1.18 or higher
|
|
- SQLite 3
|
|
|
|
### Building from Source
|
|
|
|
1. Clone the repository:
|
|
```bash
|
|
git clone https://github.com/yourusername/nostr-poster.git
|
|
cd nostr-poster
|
|
```
|
|
|
|
2. Build the application:
|
|
```bash
|
|
make build
|
|
```
|
|
|
|
3. Run the application:
|
|
```bash
|
|
make run
|
|
```
|
|
|
|
## Configuration
|
|
|
|
The application can be configured via a YAML file or environment variables. By default, the config file is located at `/config.yaml`.
|
|
|
|
### Example Configuration
|
|
|
|
```yaml
|
|
app_name: "Nostr Poster"
|
|
server_port: 8080
|
|
log_level: "info"
|
|
|
|
bot:
|
|
keys_file: "./keys.json"
|
|
content_dir: "./content"
|
|
archive_dir: "./archive"
|
|
default_interval: 60 # minutes
|
|
|
|
db:
|
|
path: "./nostr-poster.db"
|
|
|
|
media:
|
|
default_service: "nip94"
|
|
nip94:
|
|
server_url: "https://nostr.build/api/upload/nostr"
|
|
require_auth: true
|
|
blossom:
|
|
server_url: "https://blossom.example.com"
|
|
|
|
relays:
|
|
- url: "wss://relay.damus.io"
|
|
read: true
|
|
write: true
|
|
- url: "wss://nostr.mutinywallet.com"
|
|
read: true
|
|
write: true
|
|
- url: "wss://relay.nostr.band"
|
|
read: true
|
|
write: true
|
|
```
|
|
|
|
## Usage
|
|
|
|
### Set up a Bot
|
|
|
|
1. Navigate to the web interface at `http://localhost:8765` (or your configured domain)
|
|
2. Log in with your Nostr extension (NIP-07)
|
|
3. Create a new bot by providing a name and optional keypair
|
|
4. Configure the posting schedule, media upload service, and relays
|
|
5. Add content to the bot's content directory
|
|
6. Enable the bot to start automated posting
|
|
|
|
### Manual Posting
|
|
|
|
You can also trigger a post manually through the web interface
|
|
|
|
## Production Deployment
|
|
|
|
### Nginx Configuration
|
|
|
|
To serve Nostr Poster behind an Nginx reverse proxy with HTTPS, use the following configuration:
|
|
|
|
```nginx
|
|
server {
|
|
listen 80;
|
|
server_name your-domain.com;
|
|
|
|
# Redirect HTTP to HTTPS
|
|
location / {
|
|
return 301 https://$host$request_uri;
|
|
}
|
|
}
|
|
|
|
server {
|
|
listen 443 ssl;
|
|
server_name your-domain.com;
|
|
|
|
# SSL configuration
|
|
ssl_certificate /path/to/your/fullchain.pem;
|
|
ssl_certificate_key /path/to/your/privkey.pem;
|
|
|
|
# Security headers
|
|
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
|
add_header X-Content-Type-Options nosniff;
|
|
add_header X-Frame-Options SAMEORIGIN;
|
|
|
|
# Proxy settings
|
|
location / {
|
|
proxy_pass http://localhost:8765;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
|
|
# WebSocket support (for Nostr connections)
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Upgrade $http_upgrade;
|
|
proxy_set_header Connection "upgrade";
|
|
|
|
# Timeout settings for long-lived connections
|
|
proxy_read_timeout 86400;
|
|
proxy_send_timeout 86400;
|
|
}
|
|
}
|
|
```
|
|
|
|
Make sure to replace `your-domain.com` with your actual domain name and update the SSL certificate paths accordingly.
|
|
|
|
### Systemd Service
|
|
|
|
To run Nostr Poster as a system service that starts automatically on boot, create a systemd service file:
|
|
|
|
1. Create a systemd service file:
|
|
|
|
```bash
|
|
sudo nano /etc/systemd/system/nostr-poster.service
|
|
```
|
|
|
|
2. Add the following content:
|
|
|
|
```ini
|
|
[Unit]
|
|
Description=Nostr Poster Bot Service
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=nostr
|
|
WorkingDirectory=/path/to/nostr-poster
|
|
ExecStart=/path/to/nostr-poster/build/bin/nostr-poster
|
|
Restart=on-failure
|
|
RestartSec=5
|
|
StandardOutput=journal
|
|
StandardError=journal
|
|
Environment=GIN_MODE=release
|
|
|
|
# Hardening measures
|
|
PrivateTmp=true
|
|
ProtectSystem=full
|
|
NoNewPrivileges=true
|
|
ProtectHome=true
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
```
|
|
|
|
Replace `/path/to/nostr-poster` with the actual path to your installation, and `nostr` with the user you want to run the service as.
|
|
|
|
3. Enable and start the service:
|
|
|
|
```bash
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable nostr-poster
|
|
sudo systemctl start nostr-poster
|
|
```
|
|
|
|
4. Check the status of the service:
|
|
|
|
```bash
|
|
sudo systemctl status nostr-poster
|
|
```
|
|
|
|
5. View logs:
|
|
|
|
```bash
|
|
sudo journalctl -u nostr-poster -f
|
|
```
|
|
|
|
## NIPs Supported
|
|
|
|
- NIP-01: Basic protocol flow
|
|
- NIP-07: Browser extension authentication
|
|
- NIP-55: Android signer application (soon TM)
|
|
- NIP-94: File metadata
|
|
- NIP-96: HTTP file storage
|
|
- NIP-98: HTTP authentication
|
|
|
|
## License
|
|
|
|
This project is licensed under the MIT License - see the LICENSE file for details.
|
|
|
|
## Contributing
|
|
|
|
Contributions are welcome! Please feel free to submit a Pull Request. |