# 🚀 Deployment Guide: Hugo + Nostr Site ## Overview This guide covers deploying your Hugo site that fetches content from Nostr relays using nak. The system runs on a cron job that automatically updates content every 30 minutes. Architecture ``` Nostr Relays → nak → JSON files → Hugo → Static HTML → Web Server ``` ## 📦 Prerequisites ### 1. Install Hugo Hugo is Static Site Generator. It should be available in your packet manager. ### 2. Intall nak Download nak binary from https://github.com/fiatjaf/nak/releases/latest and put it in your path (the dirty way). Note that the example bellow downloads a version that migh be outdated at the time you are reading this. #### Example for Linux AMD64 ```bash wget https://github.com/fiatjaf/nak/releases/download/v0.20.2/nak-v0.20.2-linux-amd64 chmod +x nak-linux-amd64 sudo mv nak-linux-amd64 /usr/local/bin/nak nak --version # Verify installation ``` ### 3. Install jq (for JSON processing) This should be present in your system already, but who knows... It is definitely available from your packet manager. ## 🗂️ Directory Structure ``` /var/www/your-site/ ├── .git/ # Git repository ├── hugo.toml # Hugo configuration ├── data/ # JSON data from Nostr │ ├── longform/ │ ├── music/ │ ├── pictures/ │ ├── videos/ │ └── profile/ ├── fetch-and-convert.sh # Data fetching script ├── deploy.sh # Deployment script ├── themes/ │ └── one-pager/ └── public/ # Built site (rsynced to webroot) ``` ## 📝 Deployment Scripts First make a copy of the default files: ```bash cp example.fetch-and-convert.sh fetch-and-convert.sh cp example.deploy.sh deploy.sh cp example.hugo.toml hugo.toml ``` ### 1. fetch-and-convert.sh This script fetches data from Nostr and converts it to JSON for Hugo. You need to cusomize the top of the file yourself: ```bash #!/bin/bash # fetch-and-convert.sh # Configuration PUBKEY="your_pubkey_here" <---- enter your pubkey RELAY="wss://relay.damus.io" <---- enter your principal relay DATA_DIR="data" <--- leave as is, useful if you are using a different SSG ... ``` ### 2. deploy.sh This script handles the full deployment process. You can do this more elegantly, but yeah... this is what i got. Same here, customize the top of the file to match your setup ```bash #!/bin/sh # Configuration SITE_DIR="/path/to/your-cloned-git" WEBROOT="/probably/var/www/html" LOG_FILE="$HOME/nostr-site-deploy.log" ... ``` ### 3. Make scripts executable ```bash chmod +x fetch-and-convert.sh chmod +x deploy.sh ``` ## ⏰ Cron Job Setup Add to crontab (runs every 30 minutes) # Edit crontab ```bash crontab -e ``` # Add this line: ```bash */30 * * * * /path/to/your-cloned-git/deploy.sh ``` Alternative: Different intervals ```bash # Every 15 minutes */15 * * * * /path/to/your-cloned-git/deploy.sh # Every hour 0 * * * * /path/to/your-cloned-git/deploy.sh # Twice a day (at 6am and 6pm) 0 6,18 * * * /path/to/your-cloned-git/deploy.sh # Every 5 minutes (for testing) */5 * * * * /path/to/your-cloned-git/deploy.sh ``` ## 🔧 Configuration Hugo Configuration (hugo.toml) has some fallback values you might want to edit. These will take effect if something goes wrong with nostr data at fetch time. ```toml baseURL = "https://your-domain.com" locale = "en-us" title = "Your Site" theme = "one-pager" disableKinds = ["sitemap", "taxonomy", "term"] [params] sitename = "Your Site" description = "Your site description" headerImage = "/path/to/fallback/headerimage.jpg" [permalinks] page = "/:contentbasename/" ``` ## 📊 Monitoring & Debugging Verify the site was updated ```bash # Check the build time in the footer curl -s https://your-domain.com | grep "Last updated" ``` View the status of the cron job ```bash # Check if cron is running systemctl status cron # or systemctl status crond # View cron logs grep CRON /var/log/syslog ``` ## 🛠️ Manual Deployment To manually trigger a deployment: ```bash cd /path/to/your-cloned-git ./deploy.sh ``` To test fetching data without full deployment: ```bash cd /path/to/your-cloned-git ./fetch-and-convert.sh hugo server # Visit http://localhost:1313 to preview ``` ## 🔍 Troubleshooting Common Issues ### 1. Hugo build fails ```bash # Check the error hugo --verbose # Clear cache hugo --cleanDestinationDir # Check your data files ls -la data/*/*.json ``` ### 2. nak fetch fails ```bash # Test nak manually nak req -k 0 -p YOUR_PUBKEY wss://relay.damus.io | head -5 # Check relay connectivity nc -zv relay.damus.io 443 # Try a different relay nak req -k 0 -p YOUR_PUBKEY wss://nos.lol ``` ### 3. Rsync permissions issues ```bash # Check permissions ls -la /var/www/html # Fix ownership sudo chown -R www-data:www-data /var/www/html ``` ### 4. Cron job not running ```bash # Check cron syntax crontab -l # Check the cron log grep CRON /var/log/syslog # Test the script manually /path/to/your/clonedgit/deploy.sh ``` ### 5. Empty data files ```bash # Check if data was fetched cat data/profile/profile.json | jq '.[0]' # Check file size ls -lh data/*/*.json ``` ## 📈 Performance Tips - Use --minify in Hugo build (already in deploy.sh) - Enable gzip compression in your web server - Enable browser caching for CSS/JS (configured in Nginx/Apache) - Use --gc in Hugo to garbage collect unused resources - Consider using `rsync --delete` to remove old files 🔐 Security Tips Restrict access to the site directory: ```bash chmod 750 /var/www/your-site chmod 750 /var/www/your-site/deploy.sh ``` Regularly update Hugo and nak: ```bash # Check for updates hugo version nak --version ```