# SMB3.fi — Asennusohjeet

## Vaatimukset

| Komponentti | Minimi | Suositeltu |
|-------------|--------|------------|
| PHP | 8.1 | 8.3+ |
| MySQL / MariaDB | 8.0 / 10.6 | 8.3 / 11 |
| Apache / Nginx | mikä tahansa moderni | Apache + mod_rewrite |
| Disk | 100 MB | 1 GB+ (mediafileet) |

PHP-laajennukset: `pdo`, `pdo_mysql`, `mbstring`, `json`, `session`, `fileinfo`, `gd`

---

## Vaihtoehto A: Webhotelli (shared hosting)

Näin projekti toimii esim. Zoner, Planeetta, Hostinger -tyyppisellä hostilla.

### 1. Tiedostorakenne palvelimella

```
/home/smb3fi/          ← kotihakemistosi
├── smb3fi/            ← TÄNNE projektin tiedostot (EI public-kansiota)
│   ├── app/
│   ├── config/
│   ├── database/
│   ├── bootstrap.php
│   ├── .env
│   └── ...
└── public_html/       ← vain nämä tiedostot tänne (tai domain root)
    ├── index.php      ← kopioi public/index.php tänne
    ├── .htaccess      ← kopioi public/.htaccess tänne
    ├── robots.txt
    └── assets/        ← kopioi public/assets/ tänne
```

**Tärkeää:** `app/`, `config/`, `database/`, `.env` eivät saa olla verkosta näkyvässä kansiossa.

Muokkaa `public/index.php`:n `require`-polku:
```php
// Muuta tämä
require_once __DIR__ . '/../bootstrap.php';
// Webhotellilla, jos rakenne on yllä kuvattu:
require_once '/home/smb3fi/smb3fi/bootstrap.php';
```

### 2. Tietokanta

phpMyAdminissa tai SSH:lla:
```sql
CREATE DATABASE smb3fi CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```
Aja sitten `database/schema.sql` (phpMyAdmin → Import).
Halutessasi myös `database/seed.sql` (demodata).

### 3. Konfiguraatio (.env)

```bash
cp .env.example .env
```

Täytä vähintään:
```
APP_ENV=production
APP_DEBUG=false
APP_URL=https://smb3.fi
APP_KEY=          # generoi alla olevalla PHP-komennolla

DB_HOST=localhost
DB_NAME=smb3fi
DB_USER=smb3fi_kayttaja
DB_PASS=vahva_salasana

SESSION_SECURE=true   # vain jos HTTPS on päällä
```

**APP_KEY:**
```bash
php -r "echo bin2hex(random_bytes(16)).PHP_EOL;"
```

### 4. Oikeudet

```bash
chmod 755 public/uploads
chmod 755 public/uploads/trackers
chmod 755 public/uploads/avatars
```

### 5. Testi

Avaa selaimella `https://smb3.fi` — etusivu näkyy. Jos tulee 500, katso `logs/app.log`.

**Admin-kirjautuminen** (seed-datalla): käyttäjä `admin`, salasana `password`.
Vaihda salasana heti Käyttäjät-sivulta!

---

## Vaihtoehto B: VPS (Nginx + PHP-FPM)

### Nginx virtual host

```nginx
server {
    listen 443 ssl http2;
    server_name smb3.fi www.smb3.fi;

    root /var/www/smb3fi/public;
    index index.php;

    # SSL (Let's Encrypt)
    ssl_certificate     /etc/letsencrypt/live/smb3.fi/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/smb3.fi/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    # Turvaheaderit
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # Estä pääsy arkaluonteisiin tiedostoihin
    location ~ /\. { deny all; }
    location ~ \.(env|sql|md|log)$ { deny all; }

    # Stattiset assetit
    location /assets/ {
        expires 7d;
        add_header Cache-Control "public, immutable";
    }

    # Kaikki muu PHP-FPM:lle
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

# HTTP → HTTPS redirect
server {
    listen 80;
    server_name smb3.fi www.smb3.fi;
    return 301 https://$host$request_uri;
}
```

### PHP-FPM pool (minimiviilailu)

`/etc/php/8.3/fpm/pool.d/smb3fi.conf`:
```ini
[smb3fi]
user = www-data
group = www-data
listen = /var/run/php/php8.3-fpm-smb3fi.sock
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
php_admin_value[display_errors] = Off
php_admin_value[error_log] = /var/log/php/smb3fi.log
```

### Let's Encrypt (HTTPS)

```bash
apt install certbot python3-certbot-nginx
certbot --nginx -d smb3.fi -d www.smb3.fi
```

### Systemd-timer automaattiseen varmuuskopioon

`/etc/systemd/system/smb3fi-backup.service`:
```ini
[Unit]
Description=SMB3.fi database backup

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'mysqldump smb3fi | gzip > /var/backups/smb3fi/db-$(date +%%Y%%m%%d).sql.gz'
```

`/etc/systemd/system/smb3fi-backup.timer`:
```ini
[Unit]
Description=Run SMB3.fi backup nightly

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
```

```bash
systemctl enable --now smb3fi-backup.timer
```

---

## Tuotantoon menemisen tarkistuslista

- [ ] `.env` löytyy ja `APP_KEY` on asetettu
- [ ] `APP_DEBUG=false`
- [ ] `SESSION_SECURE=true` (HTTPS päällä)
- [ ] Tietokanta-salasana on vahva (ei `password`)
- [ ] Admin-salasana vaihdettu
- [ ] `public/uploads/` kirjoitusoikeudet OK
- [ ] `logs/`-kansio olemassa ja kirjoitusoikeudet OK
- [ ] HTTPS toimii (selain ei näytä varoitusta)
- [ ] `robots.txt` estää `/hallinta/`
- [ ] Vanhat tiedostot (`kisat/`, `matti/`, `kalervo/`, `*.zip`) poistettu palvelimelta

---

## Päivitysohje (tulevat versiot)

```bash
# 1. Ota varmuuskopio
mysqldump smb3fi > backup-$(date +%Y%m%d).sql

# 2. Kopioi uudet tiedostot (paitsi .env ja public/uploads/)
rsync -av --exclude='.env' --exclude='public/uploads/' \
    smb3fi-vX.X/ /var/www/smb3fi/

# 3. Jos skeemassa muutoksia, aja migraatio:
mysql smb3fi < database/migrations/XXXX_XX_XX_muutos.sql

# 4. Tyhjennä PHP opcache (jos käytössä)
php -r "opcache_reset();"
```

---

## Yleisiä ongelmia

### 500 Internal Server Error

1. Katso `logs/app.log`
2. Tarkista `.env` — kaikki pakolliset kentät täytetty?
3. Tarkista tietokantayhteys (`DB_HOST`, `DB_NAME`, `DB_USER`, `DB_PASS`)
4. Onko `public/uploads/` kirjoitettavissa?

### Sivut eivät löydy (404 kaikille sivuille paitsi etusivulle)

Apache: `mod_rewrite` pitää olla päällä ja `AllowOverride All` asetettu:
```bash
a2enmod rewrite
# Lisää httpd.conf tai virtualhostiin:
# <Directory /var/www/smb3fi/public>
#     AllowOverride All
# </Directory>
systemctl restart apache2
```

Nginx: Tarkista `try_files $uri $uri/ /index.php?$query_string;`

### Tietokantavirhe "Table doesn't exist"

Et ole ajanut skeemaa:
```bash
mysql -u root -p smb3fi < database/schema.sql
```

### "CSRF-tarkistus epäonnistui"

Session ei toimi. Tarkista:
- `session.save_path` on kirjoitettavissa
- Ei yritä käyttää HTTPS-vain sessionia HTTP:n yli (aseta `SESSION_SECURE=false` kehityksessä)
