Server Setup & Workflow
Op mijn VPS host ik meerdere Django-projecten naast elkaar, elk in zijn eigen
Docker-container. Nginx fungeert als reverse proxy en zorgt dat inkomend
verkeer bij de juiste container terechtkomt.
Mijn workflow is bewust simpel gehouden: ik ontwikkel lokaal, push naar
GitHub, en verbind vervolgens via SSH met mijn server om de wijzigingen
door te voeren. Hiervoor gebruik ik het volgende bash-script:
#!/bin/bash
git fetch
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse @{u})
if [ "$LOCAL" != "$REMOTE" ]; then
echo "Found new version, updating..."
git pull
docker compose up -d --build
else
echo "Completed, project up-to-date."
fi
Docker containers
Elk project draait in zijn eigen Docker-container. Hieronder zie je de output van
docker ps, met alle containers die op dit moment actief zijn.

Nginx, SSL-certificaten en port forwarding
Twee projecten hebben ieder hun eigen domein en eigen server-configuratie
in nginx. De overige projecten draaien op sub-paden onder het domein
basschreurs.nl. Eén nginx-container regelt al het verkeer, met
voor elk domein een eigen SSL-certificaat via Let's Encrypt.
server {
listen 80;
server_name basschreurs.nl www.basschreurs.nl;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name basschreurs.nl www.basschreurs.nl;
ssl_certificate /etc/letsencrypt/live/basschreurs.nl/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/basschreurs.nl/privkey.pem;
location /static/ {
alias /app/staticfiles/;
}
location /littlelemon/static/ {
alias /app/littlelemon_staticfiles/;
}
location /littlelemon/ {
proxy_pass http://littlelemon-web-1:8001/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /home/static/ {
alias /app/dashboard_staticfiles/;
}
location /home/ {
proxy_pass http://dashboard-web-1:8004/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location / {
proxy_pass http://web:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name bassinga.com www.bassinga.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name bassinga.com www.bassinga.com;
ssl_certificate /etc/letsencrypt/live/bassinga.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/bassinga.com/privkey.pem;
location /static/ {
alias /app/bassinga_staticfiles/;
}
location / {
proxy_pass http://bassinga-web-1:8002;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name motomeet.nl www.motomeet.nl;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name motomeet.nl www.motomeet.nl;
ssl_certificate /etc/letsencrypt/live/motomeet.nl/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/motomeet.nl/privkey.pem;
location /static/ {
alias /app/motomeet_staticfiles/;
}
location /media/ {
alias /app/motomeet_media/;
}
location / {
proxy_pass http://motomeet-web-1:8003;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
De volledige README met alle stappen staat op GitHub.