Overzicht

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

Backend
coin-trader-server-1
✓ Up
Host: :3015 → container :3005
IP: 172.18.0.2
Frontend
coin-trader-client-1
✓ Up
Host: :8080 → container :80
IP: 172.18.0.3
Database
coin-trader-db-1
✓ Up
Host: :3307 → container :3306
IP: 172.18.0.4
â„šī¸ Poort 3306 en 3005 zijn al in gebruik door de host (PM2 / host MariaDB), vandaar de alternatieve host poorten 3307 en 3015.

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
│   â””── .env # Server configuratie (API keys, DB, mail)
└── client/
    â””── Dockerfile # Apache frontend (multi-stage Vite build)

Installatie

Stap 1 – Docker 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

âš ī¸ Gebruik docker compose (v2, zonder koppelteken), niet het oudere docker-compose. De v1 variant is niet compatibel met Docker Engine 28+.
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
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

Verbindingen

A – Vanuit de terminal / Antigravity

Containers zijn bereikbaar via localhost + host poort:

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

# MariaDB verbinding
mysql -h 127.0.0.1 -P 3307 -u cointrader_user -p cointrader_live

B – Vanuit een HTML / JavaScript frontend

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 communiceren via de servicenaam als hostname — niet via IP-adres:

VanNaar serverNaar database
client container http://server:3005 –
server container – db:3306
✅ Vandaar dat in docker-compose.yml staat: DB_HOST=db — de servicenaam, niet 127.0.0.1.

D – IP-adressen

ContainerIntern Docker IPHost poortBereikbaar via
coin-trader-server-1 172.18.0.2 :3015 localhost:3015
coin-trader-client-1 172.18.0.3 :8080 localhost:8080
coin-trader-db-1 172.18.0.4 :3307 localhost:3307
âš ī¸ Interne IP-adressen (172.18.x.x) kunnen wijzigen na docker compose down/up. Gebruik altijd de servicenaam voor container-tot-container communicatie en host poorten voor externe toegang.

Meerdere omgevingen (Test & Productie)

Gebruik 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)
bash
# Productieomgeving starten
sudo docker compose -p coin-prod -f docker-compose.yml -f docker-compose.prod.yml up -d

# Testomgeving starten
sudo docker compose -p coin-test -f docker-compose.yml -f docker-compose.test.yml up -d

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

Probleemoplossing

FoutOorzaakOplossing
address already in use :3306 Host MariaDB gebruikt 3306 Gebruik poort 3307 in docker-compose.yml
address already in use :3005 PM2 gebruikt 3005 Gebruik poort 3015 in docker-compose.yml
ContainerConfig KeyError docker-compose v1.29 incompatibel met Docker 28 Gebruik docker compose (v2, zonder koppelteken)
password option not specified ${DB_PASS} leeg in compose Maak .env naast docker-compose.yml met DB-variabelen
npm ERESOLVE in client build Peer dependency conflict @vitejs/plugin-basic-ssl --legacy-peer-deps in client Dockerfile