36d2328eb4
README: - Added prominent live demo banner at the top with links to https://evershelfproject.dadaloop.it/demo and project website Wiki (docs/wiki/): - Home.md — overview, table of contents, what's new - Installation.md — Docker, Apache, Nginx, HTTPS, cron, backup - Configuration.md — full .env reference, settings UI, rate limits - Features.md — complete feature documentation - API-Reference.md — all REST endpoints with params/responses - Android-Kiosk.md — setup wizard, permissions, troubleshooting - Scale-Gateway.md — BLE protocol, setup, troubleshooting - Translations.md — how to add/edit language files - Contributing.md — dev workflow, branch strategy, CI, code style - FAQ.md — common issues and solutions
234 lines
5.1 KiB
Markdown
234 lines
5.1 KiB
Markdown
# 📦 Installation
|
||
|
||
EverShelf runs on any server with PHP 8.0+ and SQLite. Docker is the recommended approach for the fastest setup.
|
||
|
||
---
|
||
|
||
## Prerequisites
|
||
|
||
| Requirement | Minimum | Notes |
|
||
|-------------|---------|-------|
|
||
| PHP | 8.0+ | Extensions: `pdo_sqlite`, `curl`, `mbstring`, `json` |
|
||
| Web server | Apache 2.4+ or Nginx | Apache `.htaccess` included |
|
||
| SQLite | 3.x | Bundled with PHP on most distros |
|
||
| HTTPS | Recommended | Required for camera access on mobile browsers |
|
||
| RAM | 256 MB | 512 MB+ recommended if using AI features |
|
||
|
||
---
|
||
|
||
## Option A: Docker (recommended)
|
||
|
||
The fastest way to get started.
|
||
|
||
```bash
|
||
# 1. Clone the repository
|
||
git clone https://github.com/dadaloop82/EverShelf.git
|
||
cd EverShelf
|
||
|
||
# 2. Create your configuration
|
||
cp .env.example .env
|
||
nano .env # set GEMINI_API_KEY and other options
|
||
|
||
# 3. Start
|
||
docker compose up -d
|
||
|
||
# 4. Open in browser
|
||
# → http://localhost:8080
|
||
```
|
||
|
||
The Docker image:
|
||
- Uses PHP-Apache on Debian Bookworm slim
|
||
- Auto-creates the `data/` directory with correct permissions
|
||
- Exposes port `8080` by default (configurable in `docker-compose.yml`)
|
||
- Persists data in a named Docker volume
|
||
|
||
### Changing the port
|
||
|
||
Edit `docker-compose.yml`:
|
||
|
||
```yaml
|
||
ports:
|
||
- "8080:80" # change 8080 to your desired host port
|
||
```
|
||
|
||
### Using HTTPS with Docker
|
||
|
||
Add a reverse proxy (e.g. Traefik, Caddy, or Nginx Proxy Manager) in front of the container for automatic TLS.
|
||
|
||
---
|
||
|
||
## Option B: Manual (Apache)
|
||
|
||
```bash
|
||
# 1. Clone into your web root
|
||
git clone https://github.com/dadaloop82/EverShelf.git /var/www/html/dispensa
|
||
cd /var/www/html/dispensa
|
||
|
||
# 2. Create configuration
|
||
cp .env.example .env
|
||
nano .env
|
||
|
||
# 3. Set permissions on the data directory
|
||
chmod 755 data/
|
||
chown -R www-data:www-data data/
|
||
```
|
||
|
||
Make sure `mod_rewrite` is enabled:
|
||
|
||
```bash
|
||
sudo a2enmod rewrite
|
||
sudo systemctl restart apache2
|
||
```
|
||
|
||
Apache virtual host (or add to `.htaccess` which is already included):
|
||
|
||
```apache
|
||
<VirtualHost *:443>
|
||
ServerName evershelf.local
|
||
DocumentRoot /var/www/html/dispensa
|
||
|
||
<Directory /var/www/html/dispensa>
|
||
AllowOverride All
|
||
Require all granted
|
||
</Directory>
|
||
|
||
# Hide sensitive paths
|
||
<LocationMatch "^/(data|\.env|backup\.sh)">
|
||
Require all denied
|
||
</LocationMatch>
|
||
|
||
SSLEngine on
|
||
SSLCertificateFile /etc/ssl/certs/evershelf.crt
|
||
SSLCertificateKeyFile /etc/ssl/private/evershelf.key
|
||
</VirtualHost>
|
||
```
|
||
|
||
---
|
||
|
||
## Option C: Manual (Nginx)
|
||
|
||
```nginx
|
||
server {
|
||
listen 443 ssl;
|
||
server_name evershelf.local;
|
||
root /var/www/html/dispensa;
|
||
index index.html;
|
||
|
||
ssl_certificate /etc/ssl/certs/evershelf.crt;
|
||
ssl_certificate_key /etc/ssl/private/evershelf.key;
|
||
|
||
location /api/ {
|
||
try_files $uri $uri/ =404;
|
||
location ~ \.php$ {
|
||
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
|
||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||
include fastcgi_params;
|
||
}
|
||
}
|
||
|
||
# Block sensitive files
|
||
location ~ /\.env { deny all; }
|
||
location ~ /data/ { deny all; }
|
||
location ~ /backup\.sh { deny all; }
|
||
|
||
location / {
|
||
try_files $uri $uri/ /index.html;
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## HTTPS Setup
|
||
|
||
Camera and microphone access (barcode scanning, voice) **require HTTPS** on all modern mobile browsers.
|
||
|
||
### Self-signed certificate (local network)
|
||
|
||
```bash
|
||
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
|
||
-keyout /etc/ssl/private/evershelf.key \
|
||
-out /etc/ssl/certs/evershelf.crt \
|
||
-subj "/CN=evershelf.local" \
|
||
-addext "subjectAltName=IP:192.168.1.100,DNS:evershelf.local"
|
||
```
|
||
|
||
Android will show a certificate warning — tap "Advanced → Proceed" once. The kiosk app accepts self-signed certificates automatically.
|
||
|
||
### Let's Encrypt (public server)
|
||
|
||
```bash
|
||
sudo apt install certbot python3-certbot-apache
|
||
sudo certbot --apache -d evershelf.yourdomain.com
|
||
```
|
||
|
||
### Caddy (automatic TLS)
|
||
|
||
```
|
||
evershelf.yourdomain.com {
|
||
root * /var/www/html/dispensa
|
||
php_fastcgi unix//run/php/php8.2-fpm.sock
|
||
file_server
|
||
respond /data/* 403
|
||
respond /.env 403
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Cron Job (optional)
|
||
|
||
For smart shopping predictions to stay up to date:
|
||
|
||
```bash
|
||
# Edit crontab
|
||
crontab -e
|
||
|
||
# Add (runs every 5 minutes)
|
||
*/5 * * * * php /var/www/html/dispensa/api/cron_smart_shopping.php >> /var/www/html/dispensa/data/cron.log 2>&1
|
||
```
|
||
|
||
---
|
||
|
||
## Backup (optional)
|
||
|
||
```bash
|
||
# Edit crontab
|
||
crontab -e
|
||
|
||
# Daily backup at 3 AM
|
||
0 3 * * * /var/www/html/dispensa/backup.sh
|
||
```
|
||
|
||
The `backup.sh` script copies `data/evershelf.db` to `data/backups/` with a timestamp.
|
||
|
||
---
|
||
|
||
## Updating
|
||
|
||
```bash
|
||
cd /var/www/html/dispensa
|
||
git pull origin main
|
||
# Database migrations run automatically on next page load
|
||
```
|
||
|
||
With Docker:
|
||
|
||
```bash
|
||
docker compose pull
|
||
docker compose up -d
|
||
```
|
||
|
||
---
|
||
|
||
## Post-installation
|
||
|
||
Once the app is running, open it in your browser and:
|
||
|
||
1. Go to **Settings** (⚙️ icon in the header)
|
||
2. Enter your **Gemini API key** (get one free at [aistudio.google.com](https://aistudio.google.com/app/apikey))
|
||
3. Optionally configure Bring!, TTS, and scale settings
|
||
4. Add your first product via the ➕ button or barcode scan
|
||
|
||
See [Configuration](Configuration) for the full list of settings.
|