deze repo bevat alles om de server van scratch op te bouwen. Deze readme begint met het uitleggen van de setup van de certificaten en de docker compose, gevolgd door een stappenplan hoe je de server kan opbouwen van scratch.
De docker compose start 4 containers op inclusief een cache. de containers zijn alsvolgt:
- Laravel app dit is de hoofd container, het heeft een PHP base image en daarop staat alles ingesteld zodat de container juist werkt. De repo kan hier gevonden worden
- nginx De nginx container zorgt ervoor dat het web verkeer op de juiste manier geroute word, hierin staan dingen zoals dat de http requests naar https geforward worden.
- certbot De certbot container zorgt ervoor dat de certificaten van letsencrypt automatisch vervangen worden voordat deze vervallen.
- Mysql de Mysql container bevat de database, deze zit aan een volume vast die persistant is.
Certificaten komen van LetsEncrypt een project wat gratis ssl certificaten verstrekt om het internet veiliger te maken. Certificaten aanvragen kan best complex zijn, certificaten vernieuwen word door onze setup automatisch gedaan maar voordat certificaten vernieuwd kunnen worden moet je ze wel eerst hebben. Omdat certificaten niet openbaar mogen zijn zitten ze niet in deze repo, maar we hebben wel een script waarmee je automatisch de certificaten aanmaakt en in de juiste plek opslaat.
Deze stappen moet je uitvoeren voordat je aan de server setup kan beginnen
- creer een nieuwe docker droplet via digitalocean, of als je geen digitalocean gebruikt installeer dan docker + docker compose op je server
- maak een gebruiker "deploy" en geef deze toegang tot docker:
useradd -aG deploy && groupadd -aG docker deploy
- clone dit project in home folder met
git init && git remote add origin https://github.com/esac-ic/server_setup.git && git pull origin master
- kopieer de /storage map van de backup op de server samen met de mysql data dump en de .env file
- start
init.sh
om de rechten goed te zetten van de /storage map en de rest van de repository - run het script om certificaten te genereren. een vereist is dat het domein esac.nl naar de server verwijst waar je dit script op draait. dit script maakt 2 containers uit een andere docker compose file aan met de configuratie die een submap openzet voor validatie
init-letsenscript.sh
indien je niet esac.nl gebruikt maar een ander domein pas dan de waarde aan ininit-letsencrypt.sh
- start de server
start.sh
de eerste keer dat je de server draait zal hij de initiele versie pakken, het kan zijn dat deze niet meer werkt, kijk dan in de docker hub wat de laatste productie versie is en zet deze versie in/versions/website
- zet de mysql backup terug, hiervoor moet je eerst mariadb-client installeren op de laravel container en de backup in de /storage folder zetten.
docker exec -it ic-app-1 bash -c 'apt-get -y update; apt-get install -y mariadb-client; mysql -h "$DB_HOST" -u "$DB_USERNAME" -P "$DB_PORT" -p"$DB_PASSWORD" "$DB_DATABASE" < storage/20200125_esac_db.sql'
mariadb-client is er weer vanaf bij de eerstvolgende reboot. - goeie kans dat de nginx image nog geen tls 1.3 support, dan krijg je een error in gegenereerde files, om dit te fixen:
sed -i "s/ssl_protocols TLSv1.2 TLSv1.3/ssl_protocols TLSv1.2/g;" certs/conf/options-ssl-nginx.conf
- zet het startup script in de cronjobs:
crontab -e
, voeg toe:@reboot /home/ic/start.sh
- Tot slot, zorg dat de firewall goed staat
ufw enable
en dat de root login uit staat. That's it, nu zou alles moeten werken.
Om ervoor te zorgen dat travis kan deployment naar de productie server heeft travis een private key nodig waarvan de public key opgeslagen is op de productie server.
- maak de ssh key aan:
ssh-keygen -f prod_key
- sla de private key op in travis encoded met base64:
cat prod_key | base64
sla deze waarde op onderprivate_key_productie_server
in https://travis-ci.org/esac-ic/esac.nl/settings en zorg ervoor dat deze alleen in de master branch gebruikt kan worden - sla de public key op in de
authorized keys
op de server metcat prod_key.pub | ssh [email protected] 'cat >> .ssh/authorized_keys'