Zum Inhalt

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

# On Raspberry Pi 5 with Raspberry Pi OS
sudo ./scripts/install-pi.sh

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:

sudo systemctl restart dhcpcd

Port Forwarding (Optional - Remote Access)

If you want to access SolarLog from outside your local network:

  1. Router Configuration:
  2. Forward port 8080 β†’ Pi IP:80 (Dashboard)
  3. Forward port 3001 β†’ Pi IP:3001 (Grafana)

  4. DynDNS Setup (Optional):

  5. Use services like DuckDNS, No-IP for dynamic IP
  6. Example: solarlog.duckdns.org β†’ Your router IP

  7. Security Warning:

  8. Use strong passwords (auto-generated by installer)
  9. Consider VPN (WireGuard, Tailscale) instead of port forwarding
  10. 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:

hostname -I | awk '{print $1}'

πŸ› 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:

tmpfs /tmp tmpfs defaults,noatime,nosuid,size=100M 0 0

3. Disable Journal Logging to Disk

sudo nano /etc/systemd/journald.conf

# Change:
Storage=volatile
RuntimeMaxUse=50M

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:

  1. βœ… Access Dashboard at http://<Pi-IP>
  2. βœ… Login to Grafana at http://<Pi-IP>:3001
  3. βœ… Configure data sources (Wechselrichter, Battery)
  4. βœ… Test monitoring with demo data
  5. βœ… Setup automated backups
  6. βœ… Configure alerts (Grafana)
  7. βœ… Document your specific hardware configuration