This guide provides easy installation instructions for PicPeak on Linux servers with both Docker and non-Docker options.
# Download and run the unified setup script
curl -fsSL https://raw.githubusercontent.com/the-luap/picpeak/main/scripts/picpeak-setup.sh -o picpeak-setup.sh && \
chmod +x picpeak-setup.sh && \
sudo ./picpeak-setup.shThe script will automatically detect your environment and recommend the best installation method.
Best for: Most users, easy updates, isolated environment
sudo ./picpeak-setup.sh --dockerPros:
- ✅ Easier installation and updates
- ✅ Better isolation from system
- ✅ Consistent environment across platforms
- ✅ Built-in PostgreSQL and Redis
Cons:
- ❌ Requires more resources (~4GB RAM recommended)
- ❌ Additional Docker overhead
Best for: Resource-constrained systems, Raspberry Pi, direct control
sudo ./picpeak-setup.sh --nativePros:
- ✅ Lower resource usage (~1GB RAM minimum)
- ✅ Direct system control
- ✅ No Docker overhead
- ✅ Better for ARM devices
Cons:
- ❌ More complex setup
- ❌ System dependencies required
- ❌ Manual update process
- OS: Ubuntu 20.04+, Debian 11+, Fedora 38+, RHEL/CentOS 8+, Raspberry Pi OS
- RAM:
- Docker: 2GB minimum (4GB recommended)
- Native: 1GB minimum (2GB recommended)
- Storage: 2GB for application + space for photos
- Network: Port 3001 (or 80/443 with proxy)
- ✅ Ubuntu 20.04, 22.04, 24.04
- ✅ Debian 11, 12
- ✅ Raspberry Pi OS (32-bit and 64-bit)
- ✅ Fedora 38, 39, 40
- ✅ RHEL/CentOS/Rocky/AlmaLinux 8, 9
sudo ./picpeak-setup.shThe script will prompt you to choose:
- Installation method (Docker or Native)
- Admin email and password
- Domain configuration (optional)
- Email server settings (optional)
- SSL/HTTPS setup (optional)
sudo ./picpeak-setup.sh --docker --unattended \
--domain photos.example.com \
--email admin@example.com \
--admin-password SecurePass123 \
--smtp-host smtp.gmail.com \
--smtp-port 587 \
--smtp-user your-email@gmail.com \
--smtp-pass your-app-password \
--enable-sslsudo ./picpeak-setup.sh --native --unattended \
--email admin@example.com \
--admin-password SecurePass123| Option | Description | Example |
|---|---|---|
--docker |
Use Docker installation | --docker |
--native |
Use native installation | --native |
--unattended |
Run without prompts | --unattended |
--domain |
Domain for HTTPS setup | --domain photos.example.com |
--email |
Admin email address | --email admin@example.com |
--admin-password |
Set admin password | --admin-password MySecurePass |
--smtp-host |
SMTP server hostname | --smtp-host smtp.gmail.com |
--smtp-port |
SMTP server port | --smtp-port 587 |
--smtp-user |
SMTP username | --smtp-user user@gmail.com |
--smtp-pass |
SMTP password | --smtp-pass app-password |
--enable-ssl |
Enable HTTPS with Let's Encrypt | --enable-ssl |
--port |
Custom port (native only) | --port 8080 |
--update |
Update existing installation | --update |
--uninstall |
Remove installation | --uninstall |
--help |
Show help message | --help |
~/picpeak/ # Or custom directory
├── docker-compose.yml # Service definitions
├── .env # Configuration
├── storage/
│ └── events/ # Photo storage
│ ├── active/ # Current galleries
│ └── archived/ # Expired galleries
├── logs/ # Application logs
└── backup/ # Backup directory
Services:
- PicPeak Backend (Node.js application)
- PostgreSQL Database
- Redis Cache
- Nginx Reverse Proxy (optional)
- Background Workers
/opt/picpeak/ # Installation directory
├── backend/ # Application code
├── events/ # Photo storage
│ ├── active/ # Current galleries
│ └── archived/ # Expired galleries
├── logs/ # Application logs
└── config/ # Configuration files
Services (systemd):
picpeak-backend- Main applicationpicpeak-workers- Background workerscaddy- Web server (optional)
- Docker:
http://your-server:3000(frontend and admin at/admin) - Backend/API:
http://your-server:3001(API only; no UI routes)
For native installs, serve the built frontend (e.g., with nginx or Caddy) and access the admin at /admin on the frontend domain.
If configured during setup:
https://your-domain.com- Gallery frontendhttps://your-domain.com/admin- Admin panel
Add to your Nginx/Apache configuration (split frontend vs backend):
# Frontend (UI + /admin/*)
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
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;
}
# Backend API and protected resources
location /api {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
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;
client_max_body_size 100M;
}
location ~ ^/(photos|thumbnails|uploads) {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
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;
}- Login to admin panel
- Click "Create New Event"
- Configure settings and upload photos
# Docker installation
mkdir -p ~/picpeak/storage/events/active/wedding-smith-2024
cp /path/to/photos/* ~/picpeak/storage/events/active/wedding-smith-2024/
# Native installation
sudo mkdir -p /opt/picpeak/events/active/wedding-smith-2024
sudo cp /path/to/photos/* /opt/picpeak/events/active/wedding-smith-2024/
sudo chown -R picpeak:picpeak /opt/picpeak/events/active/wedding-smith-2024wedding-smith-2024/
├── collages/ # Group photos
├── individual/ # Individual photos
└── thumbnails/ # Auto-generated thumbnails
cd ~/picpeak
# Check status
docker compose ps
# View logs
docker compose logs -f
# Stop services
docker compose down
# Start services
docker compose up -d
# Restart services
docker compose restart
# Update PicPeak
docker compose pull
docker compose up -d# Check status
sudo systemctl status picpeak-backend
sudo systemctl status picpeak-workers
# View logs
sudo journalctl -u picpeak-backend -f
sudo journalctl -u picpeak-workers -f
# Start services
sudo systemctl start picpeak-backend picpeak-workers
# Stop services
sudo systemctl stop picpeak-backend picpeak-workers
# Restart services
sudo systemctl restart picpeak-backend picpeak-workers
# Update PicPeak
# (reruns migrations to pick up schema fixes for native installs)
sudo ./picpeak-setup.sh --updateEdit ~/picpeak/.env:
nano ~/picpeak/.env
docker compose restartEdit /opt/picpeak/app/backend/.env:
sudo nano /opt/picpeak/app/backend/.env
sudo systemctl restart picpeak-backend| Setting | Description | Default |
|---|---|---|
JWT_SECRET |
Token signing secret | Auto-generated |
ADMIN_EMAIL |
Admin email | admin@example.com |
ADMIN_PASSWORD |
Admin password | Auto-generated |
PHOTOS_DIR |
Photo storage path | Varies by method |
SMTP_ENABLED |
Email notifications | false |
DEFAULT_EXPIRY_DAYS |
Gallery expiration | 30 |
- Enable 2-Factor Authentication
- Generate App Password
- Configure:
SMTP_ENABLED=true
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-app-password
SMTP_FROM=noreply@yourdomain.com- Sign up at sendgrid.com (100 emails/day free)
- Create API key
- Configure:
SMTP_ENABLED=true
SMTP_HOST=smtp.sendgrid.net
SMTP_PORT=587
SMTP_USER=apikey
SMTP_PASS=your-sendgrid-api-key
SMTP_FROM=verified-sender@yourdomain.com# Backup script included
cd ~/picpeak
./backup.sh
# Manual backup
docker exec picpeak-postgres pg_dump -U picpeak picpeak > backup.sql
tar -czf photos-backup.tar.gz storage/events/# Database backup
sudo cp /opt/picpeak/app/backend/data/photo_sharing.db /backup/database-$(date +%Y%m%d).sqlite
# Photos backup
sudo tar -czf /backup/photos-$(date +%Y%m%d).tar.gz /opt/picpeak/events/# Docker
cd ~/picpeak
docker compose pull
docker compose up -d
# Native
sudo ./picpeak-setup.sh --update# Will prompt for confirmation and data removal options
sudo ./picpeak-setup.sh --uninstall# Docker
docker compose logs backend
docker compose down && docker compose up -d
# Native
sudo journalctl -u picpeak-backend -n 50
sudo systemctl restart picpeak-backend- Check firewall:
# Ubuntu/Debian
sudo ufw allow 3001
# RHEL/CentOS
sudo firewall-cmd --add-port=3001/tcp --permanent
sudo firewall-cmd --reload- Verify service:
# Docker
curl http://localhost:3001/api/health
# Native
sudo systemctl is-active picpeak-backend# Check permissions (Native)
sudo chown -R picpeak:picpeak /opt/picpeak/events/
sudo chmod -R 755 /opt/picpeak/events/
# Check permissions (Docker)
ls -la ~/picpeak/storage/events/# Docker
docker exec picpeak-backend node scripts/reset-admin-password.js
# Native
cd /opt/picpeak/app/backend
sudo -u picpeak node scripts/reset-admin-password.jsNote: The new password will be displayed in the console output and saved to
ADMIN_PASSWORD_RESET.txt. Save it immediately!
-
Check logs:
- Docker:
docker compose logs -f - Native:
sudo journalctl -u picpeak-backend -f - Installation:
/tmp/picpeak-setup-*.log
- Docker:
-
Documentation:
-
Support:
- GitHub Issues
- Include: Error messages, system info (
uname -a), installation method
- Change default admin password immediately
- Use HTTPS for production (Let's Encrypt included)
- Configure firewall (only open necessary ports)
- Regular updates (system and PicPeak)
- Automated backups (configure in admin panel)
- Use VPN for admin panel access
- Configure fail2ban for brute force protection
- Enable audit logging
- Regular security scans
- Implement IP whitelisting
# Adjust in docker-compose.yml
services:
backend:
deploy:
resources:
limits:
cpus: '2'
memory: 2G# Increase Node.js memory
echo "NODE_OPTIONS=--max-old-space-size=2048" >> /opt/picpeak/app/backend/.env
sudo systemctl restart picpeak-backend# Simple local setup without domain
sudo ./picpeak-setup.sh --native --email admin@local.com# Full production setup
sudo ./picpeak-setup.sh --docker \
--domain photos.company.com \
--email admin@company.com \
--enable-ssl# Optimized for ARM devices
sudo ./picpeak-setup.sh --native \
--port 8080 \
--email pi@local.com- Admin password changed
- Email configuration tested
- First test gallery created
- Backup schedule configured
- Firewall rules applied
- SSL certificate working (if applicable)
- Monitoring setup
- Documentation bookmarked
PicPeak Setup v1.0 | Documentation | Support