Raspberry Pi Installation & Deployment
π¦ Pi 5 Optimized Configuration
Resource Limits (Pi 5: 8GB RAM)
- PostgreSQL: 2GB limit, 512MB reservation
- Backend: 1GB limit, 512MB reservation
- Frontend: 512MB limit, 256MB reservation
- Grafana: 1GB limit, 512MB reservation
- Total: ~4.5GB (leaves 3.5GB for system + Docker overhead)
Directory Structure on Pi
/opt/solarlog/
βββ docker-compose.pi.yml # Pi-optimized Docker Compose
βββ .env # Generated secrets
βββ backend/ # Backend source
βββ frontend-web/ # Frontend source
βββ data/
β βββ postgres/ # PostgreSQL data
β βββ grafana/ # Grafana data
βββ logs/
βββ nginx/ # Nginx access logs
βββ backend.log # Backend logs
systemd Auto-Start
Service: /etc/systemd/system/solarlog.service
# Status
systemctl status solarlog
# Start
systemctl start solarlog
# Stop
systemctl stop solarlog
# Restart
systemctl restart solarlog
# Logs
journalctl -u solarlog -f
π Installation Methods
Method 1: One-Command Install (Recommended)
What it does:
1. Updates system packages
2. Installs Docker + Docker Compose
3. Creates /opt/solarlog/ directory structure
4. Copies application files
5. Generates random passwords (PostgreSQL, Grafana)
6. Installs systemd service
7. Starts all services
8. Displays access information
Installation Time: ~10-15 minutes (depending on internet speed)
Method 2: Manual Installation
# 1. Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo systemctl enable docker
sudo systemctl start docker
# 2. Install Docker Compose
sudo apt-get install -y docker-compose-plugin
# 3. Create directory structure
sudo mkdir -p /opt/solarlog/{data/{postgres,grafana},logs/nginx}
# 4. Copy application files
sudo cp -r . /opt/solarlog/
# 5. Generate secrets
cat > /opt/solarlog/.env <<EOF
POSTGRES_PASSWORD=$(openssl rand -base64 32)
GRAFANA_ADMIN_PASSWORD=$(openssl rand -base64 16)
TZ=Europe/Berlin
LOG_LEVEL=INFO
EOF
sudo chmod 600 /opt/solarlog/.env
# 6. Install systemd service
sudo cp deployment/pi/solarlog.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable solarlog
sudo systemctl start solarlog
# 7. Check status
sudo systemctl status solarlog
π§ Configuration
Environment Variables (.env)
# PostgreSQL
POSTGRES_PASSWORD=<auto-generated-32-chars>
# Grafana
GRAFANA_ADMIN_PASSWORD=<auto-generated-16-chars>
# Timezone (Unterfranken = Europe/Berlin)
TZ=Europe/Berlin
# Log Level (INFO | DEBUG | WARNING | ERROR)
LOG_LEVEL=INFO
Network Configuration
Static IP (Recommended for Production):
Edit /etc/dhcpcd.conf:
interface eth0
static ip_address=192.168.1.100/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1 8.8.8.8
Restart networking:
Port Forwarding (Optional - Remote Access)
If you want to access SolarLog from outside your local network:
- Router Configuration:
- Forward port
8080β Pi IP:80 (Dashboard) -
Forward port
3001β Pi IP:3001 (Grafana) -
DynDNS Setup (Optional):
- Use services like DuckDNS, No-IP for dynamic IP
-
Example:
solarlog.duckdns.orgβ Your router IP -
Security Warning:
- Use strong passwords (auto-generated by installer)
- Consider VPN (WireGuard, Tailscale) instead of port forwarding
- Enable HTTPS with Let's Encrypt for production
π Access Information
After installation completes:
π Dashboard: http://<Pi-IP>
π Grafana: http://<Pi-IP>:3001
Grafana Credentials:
Username: admin
Password: <see /opt/solarlog/.env>
Find Pi IP address:
π Troubleshooting
Services Not Starting
# Check service status
sudo systemctl status solarlog
# Check Docker logs
cd /opt/solarlog
sudo docker compose -f docker-compose.pi.yml logs -f
# Check individual service
sudo docker compose -f docker-compose.pi.yml ps
High Memory Usage
# Check Docker stats
sudo docker stats
# Check system memory
free -h
# Restart services to clear cache
sudo systemctl restart solarlog
Database Connection Errors
# Check PostgreSQL health
sudo docker compose -f docker-compose.pi.yml exec postgres pg_isready -U solarlog
# Reset database (β οΈ destroys all data!)
sudo systemctl stop solarlog
sudo rm -rf /opt/solarlog/data/postgres/*
sudo systemctl start solarlog
Frontend Not Loading
# Check Nginx logs
sudo tail -f /opt/solarlog/logs/nginx/access.log
sudo tail -f /opt/solarlog/logs/nginx/error.log
# Rebuild frontend
cd /opt/solarlog
sudo docker compose -f docker-compose.pi.yml build frontend
sudo systemctl restart solarlog
Grafana Not Accessible
# Check Grafana logs
sudo docker compose -f docker-compose.pi.yml logs grafana
# Reset Grafana admin password
sudo docker compose -f docker-compose.pi.yml exec grafana grafana-cli admin reset-admin-password <new-password>
Disk Space Issues
# Check disk usage
df -h
# Clean Docker images
sudo docker system prune -a --volumes
# Rotate logs
sudo truncate -s 0 /opt/solarlog/logs/*.log
π Updates
Update SolarLog
# Stop services
sudo systemctl stop solarlog
# Backup data
sudo tar -czf /home/pi/solarlog-backup-$(date +%Y%m%d).tar.gz /opt/solarlog/data/
# Pull new version (if using Git)
cd /opt/solarlog
sudo git pull
# Rebuild containers
sudo docker compose -f docker-compose.pi.yml build
# Start services
sudo systemctl start solarlog
π¦ Backup & Restore
Manual Backup
# Backup data directory
sudo tar -czf solarlog-backup-$(date +%Y%m%d).tar.gz \
/opt/solarlog/data/ \
/opt/solarlog/.env
# Copy to external storage
scp solarlog-backup-*.tar.gz user@backup-server:/backups/
Automated Daily Backup (Cron)
# Create backup script
sudo nano /opt/solarlog/scripts/backup-daily.sh
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/mnt/external-usb/backups"
tar -czf "$BACKUP_DIR/solarlog-$DATE.tar.gz" /opt/solarlog/data/ /opt/solarlog/.env
# Keep only last 7 days
find "$BACKUP_DIR" -name "solarlog-*.tar.gz" -mtime +7 -delete
# Make executable
sudo chmod +x /opt/solarlog/scripts/backup-daily.sh
# Add to crontab (run daily at 3 AM)
sudo crontab -e
0 3 * * * /opt/solarlog/scripts/backup-daily.sh
Restore from Backup
# Stop services
sudo systemctl stop solarlog
# Restore data
sudo tar -xzf solarlog-backup-20251026.tar.gz -C /
# Start services
sudo systemctl start solarlog
π Security Hardening
1. Firewall (ufw)
# Install ufw
sudo apt-get install -y ufw
# Allow SSH (important!)
sudo ufw allow 22/tcp
# Allow Dashboard (local network only)
sudo ufw allow from 192.168.1.0/24 to any port 80
# Allow Grafana (local network only)
sudo ufw allow from 192.168.1.0/24 to any port 3001
# Enable firewall
sudo ufw enable
2. Change Default Passwords
# Change Pi user password
passwd
# Change Grafana password (after first login)
# Settings β Users β admin β Change Password
3. Disable Unused Services
# Disable Bluetooth (if not needed)
sudo systemctl disable bluetooth
# Disable WiFi (if using Ethernet)
sudo rfkill block wifi
π Performance Optimization
1. Disable Swap (SD-Card Wear)
# Disable swap
sudo dphys-swapfile swapoff
sudo dphys-swapfile uninstall
sudo systemctl disable dphys-swapfile
2. Mount /tmp to RAM
Edit /etc/fstab:
3. Disable Journal Logging to Disk
4. PostgreSQL Tuning
Edit docker-compose.pi.yml:
postgres:
environment:
POSTGRES_INITDB_ARGS: "-E UTF8 --wal-buffers=256kB --checkpoint-timeout=15min"
π‘οΈ Temperature Monitoring
# Check CPU temperature
vcgencmd measure_temp
# Monitor continuously
watch -n 1 vcgencmd measure_temp
# Add to Dashboard (optional)
sudo apt-get install -y lm-sensors
sensors
Safe Operating Temperature: Below 80Β°C
Recommended: Add heatsink or fan if temperature > 70Β°C under load
π Logs Location
/opt/solarlog/logs/nginx/access.log # Frontend access logs
/opt/solarlog/logs/nginx/error.log # Frontend error logs
/opt/solarlog/logs/backend.log # Backend application logs
journalctl -u solarlog # Systemd service logs
docker logs solarlog-backend # Backend container logs
docker logs solarlog-frontend # Frontend container logs
docker logs solarlog-postgres # PostgreSQL logs
docker logs solarlog-grafana # Grafana logs
π― Next Steps
After successful installation:
- β
Access Dashboard at
http://<Pi-IP> - β
Login to Grafana at
http://<Pi-IP>:3001 - β Configure data sources (Wechselrichter, Battery)
- β Test monitoring with demo data
- β Setup automated backups
- β Configure alerts (Grafana)
- β Document your specific hardware configuration