# Docker Setup Handleiding – Coin-Trader

## Overzicht

De coin-trader applicatie draait in **drie Docker containers** die via een intern netwerk (`coin-network`) met elkaar communiceren:

| Container | Functie | Host Poort | Intern IP |
|---|---|---|---|
| `coin-trader-server-1` | Node.js API backend | `3015` → 3005 | `172.18.0.2` |
| `coin-trader-client-1` | Apache frontend (Vite build) | `8080` → 80 | `172.18.0.3` |
| `coin-trader-db-1` | MariaDB database | `3307` → 3306 | `172.18.0.4` |

> **Note:** Port 3306 en 3005 zijn al in gebruik door de host (PM2 / host MariaDB), vandaar de alternatieve host poorten.

---

## Benodigde bestanden

```
/var/www/html/coin-trader/
├── docker-compose.yml          # Koppelt alle 3 services samen
├── .env                        # DB credentials voor variabele-expansie
├── server/
│   └── Dockerfile              # Node.js backend container
└── client/
    └── Dockerfile              # Apache frontend container (multi-stage build)
```

---

## Installatie

### Stap 1: Docker & Docker Compose installeren (eenmalig)

```bash
echo '<sudo-wachtwoord>' | sudo -S apt-get update
echo '<sudo-wachtwoord>' | sudo -S apt-get install -y docker.io docker-compose docker-compose-v2
```

### Stap 2: Containers bouwen en starten (v2 plugin gebruiken)

```bash
cd /var/www/html/coin-trader
sudo docker compose up -d --build
```

### Stap 3: Status controleren

```bash
sudo docker compose ps
```

---

## Containers beheren

```bash
# Status overzicht
sudo docker compose ps

# Logs bekijken van een specifieke service
sudo docker compose logs server --tail=50
sudo docker compose logs db --tail=30

# Alle containers stoppen
sudo docker compose down

# Eén container herstarten
sudo docker compose restart server

# Shell openen in een container
sudo docker exec -it coin-trader-server-1 sh
sudo docker exec -it coin-trader-db-1 bash
```

---

## Verbinding maken met de containers

### A. Vanuit Antigravity / terminal (op de host)

Containers zijn bereikbaar via `localhost` + host poort:

```bash
# API aanroepen
curl http://localhost:3015/api/status

# Frontend bekijken
curl http://localhost:8080

# MariaDB verbinding (via alternatieve host poort 3307)
mysql -h 127.0.0.1 -P 3307 -u cointrader_user -p cointrader_live
```

### B. Vanuit een HTML/JavaScript frontend

De browser praat via de **host poort** van de server:

```javascript
// API base URL (gebruik het publieke IP of domein van de server)
const API_BASE = 'http://<server-ip>:3015';

// Voorbeeld fetch
fetch(`${API_BASE}/api/portfolio`)
  .then(res => res.json())
  .then(data => console.log(data));
```

> Zorg dat CORS geconfigureerd is in `index_live.js` voor het frontend-origin (bijv. `http://<ip>:8080`).

### C. Van container naar container (intern)

Containers binnen hetzelfde `docker-compose.yml` communiceren via de **servicenaam** als hostname:

| Van | Naar server | Naar database |
|---|---|---|
| `client` container | `http://server:3005` | – |
| `server` container | – | `db:3306` (vandaar `DB_HOST=db` in `.env`) |

### D. IP-adressen

| Container | Intern Docker IP | Host poort |
|---|---|---|
| `coin-trader-server-1` | `172.18.0.2` | `localhost:3015` |
| `coin-trader-client-1` | `172.18.0.3` | `localhost:8080` |
| `coin-trader-db-1` | `172.18.0.4` | `localhost:3307` |

> Interne IP-adressen kunnen wijzigen na `docker compose down/up`. Gebruik altijd de **servicenaam** (bv. `db`, `server`) voor container-tot-container communicatie. Gebruik **host poorten** voor externe toegang.

---

## Meerdere omgevingen (Test & Productie)

Maak aparte override-bestanden per omgeving naast de basis `docker-compose.yml`:

```
docker-compose.yml           ← Gedeelde basis
docker-compose.prod.yml      ← Productie overrides (live DB, poort 80)
docker-compose.test.yml      ← Test overrides (test DB, andere poort)
```

**Productieomgeving starten:**
```bash
sudo docker compose -p coin-prod -f docker-compose.yml -f docker-compose.prod.yml up -d
```

**Testomgeving starten:**
```bash
sudo docker compose -p coin-test -f docker-compose.yml -f docker-compose.test.yml up -d
```

Zie `multiple_environments_docker.md` voor het volledige uitwerking van de override bestanden.

---

## Probleemoplossing

| Fout | Oorzaak | Oplossing |
|---|---|---|
| `address already in use` op poort 3306 | Host MariaDB gebruikt 3306 | Gebruik poort 3307 in `docker-compose.yml` |
| `address already in use` op poort 3005 | PM2 gebruikt 3005 | Gebruik poort 3015 in `docker-compose.yml` |
| `ContainerConfig` KeyError | docker-compose v1.29 incompatibel met Docker Engine 28 | Gebruik `docker compose` (v2, zonder koppelteken) |
| MariaDB crasht (`password option not specified`) | `${DB_PASS}` leeg in compose | Zorg dat `.env` naast `docker-compose.yml` staat met DB-variabelen |
| npm install mislukt (`ERESOLVE`) in client build | Peer dependency conflict `@vitejs/plugin-basic-ssl` | `--legacy-peer-deps` vlag toegevoegd in client `Dockerfile` |
