Beste mensen,
Voor mijzelf heb ik een handleiding geschreven hoe ik een (ontzettend simpel) Laravel project kan opzetten en op een Linux (Ubuntu) VPS kan plaatsen. Het gaat hierbij alleen om 2 pagina’s en een werkende databaseconnectie. De rest is goed bij te leren met de bestaande Laravel documentatie. Ik ervaarde dat er weinig volledige (en up-to-date) tutorials zijn m.b.t. het plaatsen/deployen van een Laravel project op een VPS vandaar o.a. ook dat ik deze zelf heb gemaakt.
Het grootste deel m.b.t. het plaatsen van de Laravel applicatie op een VPS heb ik in deze 4 delige serie geleerd:
Voor de rest veel in Google zoeken naar informatie en antwoorden natuurlijk.
Deze bovenstaande tutorial is wat verouderd (3 jaar oud), soms niet volledig, ik maak o.a. daarom voor mijzelf een tutorial die ik graag met de rest wil delen (ook mensen buiten FOK!) ook om wat terug te geven. Ik gebruik geen spoilers, als mensen spoilers willen lezen moeten ze zich registreren, dat gun ik FOK! best wel maar alle informatie die ik heb gekregen was ook zonder te registreren dus op die manier geef ik graag ook wat terug.
Deze tutorial is logischerwijs niet compleet. In het rood onderaan heb ik vragen neergezet die ik zelf nog heb en waarbij ik jullie hulp vraag om deze aan te vullen zodat de handleiding beter wordt. Als er verder aanvullingen/verbeteringen zijn dan hoor ik ze graag.
Dit gedeelte gaat over het deployen van een Laravel project naar een VPS. Als je graag wil weten hoe je een Laravel project opzet dan kan je hier kijken:
DIG / Een laravel project maken (de basis) Dit topic gaat over het overzetten van een Laravel (7+) applicatie naar een Ubuntu VPS.2. de VPS server Ik heb bij Strato een Ubuntu (18.04) VPS gehuurd.
Als je server gereed is krijg je een e-mail met je hostnaam (iets als h123456.stratoserver.net) en een wachtwoord via sms waarmee je in kan loggen op:
https://config.stratoserver.netBij mij stond het menu in het Duits in eerste instantie, ik heb de URL aangepast naar
https://config.stratoserver.net/?locale=nl en dat lost dat op.
Bij ‘Mijn server’ -> ‘Servergegevens’ zie je je initiele rootwachtwoord. Deze heb je nodig om in te kunnen loggen op je VPS. Het IP adres van je server is daar ook zichtbaar en heb je ook vaker nodig.
Inloggen op de server en een gebruiker aanmakenWe gaan nu voor het eerst inloggen op onze server via Putty. Je vult je hostnaam in en klikt op open. De eerste keer krijg je een pop-up, daar gewoon ‘yes’ selecteren. Je vult na ‘Login as:’ gewoon ‘root’ in. Het initiele rootwachtwoord moet je nu daar invullen. Terwijl je typt zie je niks, een beetje vertrouwen in je eigen typvaardigheid en je drukt op enter. (kopieren werkt niet trouwens dus je moet het echt zelf typen).
Nu gaan we eerst een user aanmaken met alle benodigde rechten.
Voor de duidelijkheid het volgende typen we in Putty, niet meer lokaal maar rechtstreeks op onze server.
quote:
adduser jouwusernaam
(geen hoofdletters, cijfers, speciale tekens etc. gebruiken)
Geef een sterk wachtwoord op en bevestig die daarna. De rest daarna (Full name etc.) kan je leeg laten, gewoon enter klikken een paar keer.
quote:
usermod -aG sudo jouwusernaam
Hiermee hebben we de nieuwe user sudo (superuser) rechten gegeven. Nu gaan we testen of dat gelukt is:
quote:
su - jouwusernaam
Nu zie je dat je typt onder je gekozen username (jouwusernaam@h123456 bijvoorbeeld).
quote:
sudo ls -la /root
De eerste keer moet je je wachtwoord invoeren
Vanaf nu gaan we niet meer als root inloggen (uit veiligheidsoverwegingen is dat verstandig).
De installaties uitvoeren en config aanpassingen makenWe gaan nu packages updaten. Vanaf nu moeten we bij veel commando’s sudo ervoor zetten zodat we de rechten hebben om deze uit te voeren.
quote:
sudo apt-get update
Nu gaan we nginx installeren, een webserver net zoals Apache maar geprefereerd binnen de Laravel gemeenschap.
quote:
Sudo apt-get install nginx
Je moet daarna altijd ‘J’ kiezen, de server vraagt voor de zekerheid of je het wil installeren en geeft aan hoeveel ruimte het programma in beslag gaat nemen.
Als je nu naar je IP adres gaat zie je ook dat nginx succesvol is geïnstalleerd.
Nu gaan we mysql installeren.
quote:
sudo apt-get install mysql-server
We gaan mysql veiliger maken (mysql is veilig maar sommige standaard gekozen instellingen zijn dat niet, dat gaan we nu rechtzetten).
quote:
sudo mysql_secure_installation
Bij ‘Validate password plugin’ kiezen voor ‘no’.
Nu moet je een wachtwoord geven en bevestigen waarmee je verbinding wil gaan maken met de database (dus niet zoals lokaal op je computer een rootuser zonder wachtwoord, hier moet echt een veilig wachtwoord op).
Op de rest daarna kan je alles ‘y’ typen.
Nu gaan we PHP installeren (van de LEMP stack hebben we nu de Linux, Enginx en Mysql geinstalleerd dus wat dat betreft alleen nog de P van PHP).
quote:
sudo apt-get install php-fpm php-mysql php-mbstring
Ik moet nano (een simpel tekstbewerkingsprogramma) nog installeren dus dat doe ik nu:
quote:
sudo apt-get install nano
Nu moeten we de php.ini aanpassen.
quote:
sudo nano /etc/php/7.2/fpm/php.ini
Ik had hier wat problemen mee in eerste instantie omdat ik de eerste / vergat. Ik kon daardoor niet bij de etc map komen. Dit is vrij logisch en los je op door de ‘/’ zoals hierboven voor ‘etc’ of door ‘cd /’ te typen zoals aangegeven in onderstaande afbeelding als leiddraad. Ook moet je denken om de PHP versie (in dit geval 7.2.24 maar de map heet 7.2), die kan je achterhalen door ‘dir’ in te typen als je in de juiste directory zit.
Het is een groot bestand en we hoeven maar 1 regel aan te passen dus we gaan zoeken naar deze regel. Gebruik: Control w (om te zoeken)
Zoek naar: ‘cgi.fix_pathinfo=1’
Verander de 1 in een 0 en vergeet niet om de ; weg te halen aan het begin van de zin (anders wordt het gezien als een comment en wordt er niks mee gedaan).
Control x (om af te sluiten) – ‘j’ kiezen om op te slaan - niks aanpassen daarna (gewoon enter)
Hierna moeten we PHP herstarten, denk hierbij ook om de juiste PHP versie in het commando te gebruiken.
quote:
sudo systemctl restart php7.2-fpm
Nginx configureren zodat deze naar de juiste map verwijstNginx, Mysql en PHP zijn geinstalleerd en de laatste 2 deels geconfigureerd. We gaan nu Nginx configureren.
quote:
sudo nano /etc/nginx/sites-available/default
Hier vervolgens index.php toevoegen onder root /var/www/html; (vlak na index maar voor index.html)
Dan in server_name _; Je IP adres invullen (gebruik niet de numpad van je toetsenbord, dat werkt niet).
Dan moet je nog wat punten aanpassen, zorg ervoor dat het eruit komt te zien zoals het volgende (denk om de PHP versie ook hier weer)
Control x (om af te sluiten) – ‘j’ kiezen om op te slaan - niks aanpassen daarna (gewoon enter)
quote:
sudo nginx -t
Om te testen of het bestand nog correct werkt.
Nu gaan we nginx herstarten.
quote:
sudo systemctl reload nginx
Nu staat op je IP adres 403 Forbidden, dat is prima.
De Laravel map aanmakenWe gaan nu de Laravel map aanmaken waar we ons project willen hebben:
quote:
sudo mkdir - p /var/www/laravel
Nu gaan we weer een aanpassing maken aan de config file van nginx (dat kon natuurlijk ook direct maar zo is de workflow duidelijker hoop ik).
quote:
sudo nano /etc/nginx/sites-available/default
We hebben nu een Laravel map aangemaakt en we weten dat Laravel in de public folder zoekt naar het index bestand dus we passen var/www/html aan naar het volgende:
quote:
var/www/laravel/public
Daarna moet je dit nog aanpassen:
quote:
location / { # First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ /index.php?$query_string; }
Control x (om af te sluiten) – ‘j’ kiezen om op te slaan - niks aanpassen daarna (gewoon enter)
quote:
sudo service nginx restart
Nu zie je op je IP adres 404 Not Found (we hebben nog geen index.php immers, dus dit is ook prima).
Composer en Gitquote:
sudo apt-get install curl
quote:
Hiervoor moet je echt vanuit root om te installeren vandaar cd ~ voor de zekerheid.
Om te testen:
quote:
php composer.phar
quote:
sudo mv composer.phar /usr/local/bin/composer
Om het te verplaatsen zodat je composer kan gebruiken als command en niet composer.phar.
Composer als commando zou nu moeten werken:
quote:
composer
Nu willen we weer uit de rootdirectory gaan
quote:
cd /var
We gaan een map genaamd ‘repo’ aanmaken om onze repository in te plaatsen (dus niet direct vanuit github naar onze laravel map maar eerst als tussenstation in een andere map, in dit geval een map genaamd ‘repo’ waar we ook Git gaan installeren.
quote:
sudo mkdir repo && cd repo
sudo mkdir site.git && cd site.git
sudo apt install git
sudo git init --bare (2 streepjes)
Nu gaan we een hook aanmaken. Deze plaatst in de Laravel map wat we ontvangen in de net aangemaakte repository. Even ter informatie, de flow is: lokaal -> commit/push naar git(hub) -> naar site.git op onze server -> automatisch daarna naar onze Laravel map.
We moeten daarvoor in de ‘hooks’ map zitten
Dus als je nog in de site.git directory zit kan je gewoon het volgende doen:
quote:
cd hooks
We gaan nu een (leeg) bestand aanmaken:
quote:
sudo nano post-receive
Vul dit bestand met het volgende (dit vertelt waar hij de bestanden moet plaatsen als hij deze heeft ontvangen):
quote:
#!/bin/bash
git --work-tree=/var/www/laravel --git-dir=/var/repo/site.git checkout -f
Control x (om af te sluiten) – ‘j’ kiezen om op te slaan - niks aanpassen daarna (gewoon enter)
We gaan op een later tijdstip vanuit github de bestanden doorsturen naar de /var/repo, deze heeft nu een ‘hook’ die aangeeft dat als hij bestanden ontvangt in deze repo hij deze moet verplaatsen naar de Laravel map. Op deze manier heb je bijna geen downtime.
We moeten nu nog de juiste rechten geven zodat deze repo de bestanden kan kopieren naar de Laravel map.
quote:
sudo chmod +x post-receive
We zijn nu eerst klaar met Putty en de server, je kan sluiten met
quote:
Exit
Github account en master repository aanmakenNu is het tijd om een github account aan te maken. Als je dat nog niet hebt gedaan, ga naar
https://github.com/ registreer je, maak een master repository aan en je kan aan de slag.
In VSC gaan we naar View -> Command palette...
We typen: Git clone (enter)
Dan gaan we de repository URL kopieren (
https://github.com/jouwnaam/master bijvoorbeeld)
Kies daarna voor ‘Open’ en je ziet je (lege) lokale repository.
Nu kopieren we alles naar die map vanuit onze www/jouwprojectnaam map en dan zien we dat we een git repository hebben met alle gemaakte code (binnen de master map).
Deze moet je commiten en pushen naar Github.
Zelf doe ik dat op de volgende manier:
1. ‘Stage all changes’
2. ‘Commit staged’ (en dan een naam geven voor de commit)
3. ‘Publish branch..’
Nu gaan we in VSC in GitBash het volgende commando uitvoeren (zorg ervoor dat je in de net aangemaakte depository map zit, dus niet in www/jouwproject maar zoals bij mij bijvoorbeeld /c/wamp64/repo/master).
Met onderstaande commando kan je controleren of je in de git map zit.
quote:
git status
quote:
git remote add production ssh://root@111.222.333.444/var/repo/site.git
Om te controleren of het verwerkt is (je hoort er 4 te zien)
quote:
git remote -v
Nu gaan we de bestanden vanuit github (master) naar production (onze server) brengen, waar de hook de code automatisch naar de Laravel map gaat verplaatsen.
quote:
git push production master
Ik kreeg hierbij het volgende bericht:
Dit is op te lossen met het volgende:
quote:
ssh-keygen -R "111.222.333.444"
Hierna kan je het push commando weer uitvoeren, ‘yes’ typen en het rootwachtwoord invullen. Nu is de code als het goed is geplaatst in je Laravel map op je server.
Op je IP adres krijg je nu de melding te zien ‘Deze pagina werkt niet’. Dat is ook prima, we moeten nog wat punten bijlangs gaan.
De laatste handelingenWe gaan weer naar Putty:
quote:
sudo apt-get install php-xml
Daarna binnen de Laravel map
quote:
sudo composer install --no-dev
(2 streepjes)
quote:
sudo chown -R :www-data /var/www/laravel
sudo chmod -R 775 /var/www/laravel/storage
sudo chmod -R 775 /var/www/laravel/bootstrap/cache
sudo cp .env.example .env
sudo nano .env
Zoals ook lokaal op de computer bevat het .env bestand belangrijke gegevens zoals bijvoorbeeld het databasewachtwoord. Deze wil je niet in Github hebben staan (daarom worden ze uitgesloten in het .gitignore bestand). Je moet daarom op je server zelf deze aanmaken en .env.example heeft daarvoor alvast een handige opzet dus die gebruik je als .env bestand.
Het .env bestand moeten we nu aanpassen zodat Laravel connectie kan maken met de database o.a.
We passen de volgende waardes aan:
APP_ENV=production
APP_DEBUG=false
DB_DATABASE=jedatabasenaam
DB_USERNAME=root
DB_PASSWORD=Jegekozenwachtwoord
Control x (om af te sluiten) – ‘j’ kiezen om op te slaan - niks aanpassen daarna (gewoon enter)
Nu moeten we nog een key genereren met het volgende commando:
quote:
sudo php artisan key:generate
Als je nu teruggaat naar je .env bestand zie je dat de APP_KEY nu gevuld is.
Nu gaan we nog de database aanmaken. Eerst inloggen op mysql.
quote:
sudo mysql -u root –p
Als je even wil controleren of de standaard databases bestaan:
quote:
show databases;
Nu gaan we de database maken:
quote:
create database jedatabasenaam
Nu moeten we eerst nog een andere config aanpassen:
quote:
sudo nano config/app.php
En pas de volgende 2 regels aan zodat ze overeenkomen met je IP adres en je tijdzone (in het algemeen zal je alleen je IP adres hier aan hoeven te passen).
quote:
'url' => env('APP_URL', 'http://111.222.333.444'),
'timezone' => 'Europe/Amsterdam',
Control x (om af te sluiten) – ‘j’ kiezen om op te slaan - niks aanpassen daarna (gewoon enter)
We zitten nu nog steeds in de Laravel map en moeten het volgende nog uitvoeren:
quote:
sudo php artisan config:cache
Nu gaan we de tabellen aanmaken met de migratie:
quote:
sudo php artisan migrate
Hierbij kreeg ik nog onderstaande melding:
Dit heb ik opgelost door de volgende stappen uit te voeren:
quote:
sudo mysql -u root -p
use mysql;
alter user 'root'@'localhost' identified with mysql_native_password by 'jenieuwewachtwoord';
exit;
Bij het gedeelte ‘jenieuwewachtwoord’ moet je dan het wachtwoord invullen dat je in het .env bestand hebt ingevuld.
Nu kan je de migratie weer uitvoeren en als het goed is worden ze nu wel uitgevoerd. Je ziet nu de Laravel applicatie op je IP adres, bij de about pagina staat alleen dat iets nog niet helemaal goed gaat.
Dit is prima, we hebben immers de database nog niet gevuld. Dit gaan we op dezelfde manier doen als dat we dat lokaal eerder deden bij het maken van onze Laravel Applicatie op de computer:
quote:
php artisan tinker
$page = new App\Page();
$page->tekst = 'Dit is de tekst voor de about pagina rechtstreeks uit de database';
$page->save();
Als je nu naar je IP adres gaat hoor je de website correct te zien, inclusief de tekst die uit de database gehaald moet worden.
Vragen die ik nog heb
1. Bij Git moet ik nu de map kopieren van mijn www/mijnproject map naar mijn repo map voordat ik deze kan committen. Dit kan vast wel beter. Iemand die mij kan vertellen wat ik daar verkeerd doe?
2. Is het verstandig om een gebruiker aan te maken voor de database login in plaats van de rootuser te gebruiken (ook al heeft die wel een wachtwoord nu)? Lijkt mij wel maar kwam hier niet zozeer iets over tegen (wel m.b.t. het inloggen als root op de server zelf).
3. Wat zijn nog beveiligingspunten die ik mis? Een firewall is bijvoorbeeld sowieso ook echt nodig? Is de server zelf en de database zo goed beveiligd of zijn er nog standaard commando’s/instellingen die ik niet uitgevoerd heb?
4. Hoe kan ik de database gemakkelijk inzichtelijk maken? Welke programma’s zijn daar geschikt voor, hoe stel ik dat in?
5. Ik kan ook ‘Plesk online’ installeren bij het besturingssysteem. Helpt dit veel om belangrijke instellingen goed te zetten? Iemand die daar wat vanaf weet en over wil vertellen?
6. SSH keys moet ik nog opzetten. Ik weet niet of dat moeilijk is of niet, iemand die daar iets over weet?
7. Alle andere opmerkingen zijn welkom. Vooral m.b.t. het opzetten van de server zelf.
[ Bericht 2% gewijzigd door #ANONIEM op 02-07-2020 18:19:19 ]