Laravel op een Digital Ocean server zetten met Ploi en Bitbucket

Post hoe Laravel te releasen op Digital Ocean met Ploi en Bitbucket.
Voorheen gebruikte ik ‘gewoon’ een shared hosting of een managed server om applicaties te deployen voor klanten. Om alles aan de praat te krijgen moest ik altijd wel wat stappen zetten. Als het eenmaal stond dan had ik er geen omkijken meer naar door continuous integration / continuous delivery.

Met tools zoals laravel Forge of Ploi is het opzetten een stuk eenvoudiger. Dit is vooral een handleiding /stappenplan voor mijzelf maar wellicht dat anderen hier ook wat aan hebben.

Aanmelden bij Ploi en Digital Ocean

Dit heeft geen uitleg nodig (hoop ik). Ik heb gekozen voor Ploi en Digital Ocean. Daar gaat deze handleiding / dit artikel over.

API key aanmaken bij Digital Ocean

Spreekt ook voor zich, dit kan op https://cloud.digitalocean.com/account/api/tokens

Klik op de button ‘Generate New Token’

Verzin een ‘Token name’, bijvoorbeeld ‘DigitalOcean server’ en klik op ‘Generate token’.

Kopieer de token string en ga naar de volgende URL op Ploi, https://ploi.io/profile/server-providers

Vul hier de volgende opties in:

  • Add server provider: DigitalOcean
  • Label: mag je zelf weer iets voor verzinnen maar zou de naam van je site/project/droplet kunnen zijn
  • API key: kopieer hier de je net gekopieerde API key van Digital Ocean.

Server opzetten met Ploi

Ga naar https://ploi.io/panel/servers/create
Als het goed is kan je nu kiezen voor Digital Ocean, doe dit ook. Ik gebruik de volgende settings:

let op! Geen idee of het op dit moment ook nog is maar ik koos eerst voor ‘Amsterdam 2’ bij ‘Server region’ en kreeg toen de error ‘ams2 is unavailable.’ bij opzetten van de server en de build was failed.

Als alles goed is gegaan krijg je een e-mail dat de server is gemaakt (of een e-mail als build is mislukt).

Site toevoegen

Ga naar de server pagina, https://ploi.io/panel/servers
Klik op je aangemaakte server, voer op het volgende scherm je domeinnaam in , klik onderin op de button ‘Advanced settings’ en kies ‘Laravel’ bij ‘Project type’.

DNS instellen

Ga naar de ‘networking’ pagina op Digital Ocean, https://cloud.digitalocean.com/networking/domains
Klik daar op je domeinnaam. Voeg nu de nameserversers toe op de DNS pagina weer je je domeinnaam hebt geregistreerd.

@ en www record toevoegen

Voeg nu op de DNS/domein pagina op Digital Ocean 2 records toe, @ en www.

  • Hostname: @ of www
  • Will direct to: kies uit deze lijst de juiste droplet

Bitbucket linken met Ploi

Ga naar de source-control pagina, https://ploi.io/profile/source-control
Klik op de ‘link BitBucket’ button om Ploi toegang te geven tot je repositories.

Bitbucket repository opgeven

Ga weer naar je server op Ploi en klik daar op ‘GIT’

Kies bij ‘Provider’ Bitbucket en geef je repository, branch enz. op.
Ploi kan dan een checkout doen op je Digital Ocean server.

Als dat is gelukt krijg je de optie om een deployment script te maken.

Inloggen op de server met SSH

Ga naar de SSH key pagina op Ploi, https://ploi.io/profile/ssh-keys
Voeg daar je SSH key van je PC/Laptop toe.

Omdat we willen inloggen met SSH op de Digital Ocean server en niet op Ploi, moeten we dit nog doen door op de button ‘Deploy on servers’ te klikken.

Deployment script runnen vanaf Ploi

Ga de site weer in op Ploi op https://ploi.io/panel/sites, klik op je domeinnaam.
Rechtsboven staat nu een button om het release script te runnen.
Hiermee doen we een eerste pull op de server.

Database aanmaken

Op Ploi moeten we nu een database user en database aanmaken. Ga naar de server op Ploi en klik op ‘databases’. Maak daar een database, database user en wachtwoord aan en zet deze in het .env bestand voor deze site.

Env bestand maken/bijwerken

Op dezelfde pagina zie je naar de ‘Deploy now’ ook een button ‘Edit environment’, klik daar op.
Je krijgt nu een popup waar je het .env kan vullen / aanpassen.

Note: gebruikt 127.0.0.1 als database host i.p.v localhost

Na het aanpassen van de configuratie, draai weer een nieuwe deployment door op ‘Deploy now’ te klikken.

SSL certificaat

Je kan dit ook in Ploi regelen, in het menu op je site/server zie je SSL optie staan.

Deze pagina /optie spreekt voor zich.

Key en symlink maken

Ga naar Digital Ocean, klik op je droplet en log in op de console, met user ‘ploi’

Ga / cd in je domeinnaam waar Laravel staat.
Voer het volgende uit voor een applicatie key:

php artisan key:generate

En voor Symlink voor de storage:

php artisan storage:link

Sftp / Filezilla instellingen

Cronjob

Cronjob(s) instellen kan ook via Ploi.

Mysql remote access met SqlYog / TablePlus

Normaal gebruik ik SqlYog maar kreeg een timeout bij het verbinden. Met dezelfde settings gaat het wel goed in TablePlus dus vermoed dat het bij SqlYog ligt.

Continuous integration / continuous delivery

Ik gebruik Bitbucket pipelines (zal hier later nog een artikel over schrijven). Deze doet o.a. de unit test en voorheen ook een pull op de server via een SH script wat op de server stond.
Dit doe ik nog steeds maar dan via de ‘Deploy webhook URL’ in Ploi.
Deze webhook url kan je vinden in je server

Variable in Bitbucket Pipeline

Deze webhook URL willen we niet direct in het pipeline script plaatsen omdat deze dan in de repository te zien is.
We kunnen deze URL toevoegen als variable in Bitbucket, onder ‘deployments’ aan de rechterkant.

Kies als naam ‘PLOI_WEBHOOK’ en bij value de URL, in je script kan je dan $PLOI_WEBHOOK als variable gebruiken.
Hieronder een voorbeeld / stukje van mijn pipeline script waar ik een post request doe naar de Ploi webhook.


 script:
          - apt-get update && apt-get install -y zip unzip libfreetype6-dev libjpeg62-turbo-dev libpng-dev openssh-server openssh-client ssh
          - docker-php-ext-install gd
          - docker-php-ext-install pdo_mysql
          - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
          - composer install --prefer-dist --no-ansi --no-interaction --no-progress --no-scripts --ignore-platform-reqs
          - cp .env.pipeline .env
          - php artisan key:generate
          - php artisan migrate
          - php artisan db:seed
          - ./vendor/bin/phpunit --configuration phpunit_pipeline.xml
        # Deploy
          -  curl -X POST $PLOI_WEBHOOK
        services:
          - mysql
          - redis