Op Valentijnsdag hadden we een cadeautje voor jullie: SSH-toegang op onze pakketten. Mogelijk heb je als een kind zo blij het cadeaupapier er gelijk afgescheurd en ben je er vol mee aan de slag gegaan. Wellicht ook niet, bijvoorbeeld omdat je niet goed weet wat voor mogelijkheden dit je biedt. Vandaar een aantal SSH tips, graag licht ik je een aantal situaties toe waar SSH goed van pas komt.
Zoals mijn collega Erik Jan twee weken geleden aangaf, was het plan dat ik nu wat zou vertellen over een aantal mogelijkheden die SSH je geeft. De onderwerpen die die ik aan bod wilde laten komen, had ik zelfs als klaarstaan. Het zou gaan over Composer, Magento, Git en SFTP.
Het is gebleken dat SSH een welkome toevoeging was. Er is zelfs een klant die nog dezelfde dag een handleiding schreef over hoe je Composer bij Antagonist gebruikt. Aangezien ik daar niets aan heb toe te voegen, schrap ik Composer hier van mijn lijstje. Daniël, bedankt! In plaats daarvan wil ik het graag met jullie ook over Drush hebben.
Het menu is daardoor als volgt:
Aan de slag met SSH
Wil jij ook een hostingpakket dat je in staat stelt om met SSH en deze tips aan de slag te gaan? Goed nieuws! SSH is nu beschikbaar op webhosting Slim, Plus, Pro en bij het Resellerpakket op aanvraag.
SSH tips voor Magento
We beginnen met de welbekende e-commerce-applicatie Magento. Het komt voor dat je graag de index van Magento opnieuw wilt bouwen. Met SSH is dit heel gemakkelijk te regelen. Je logt eerst in middels SSH:
$ ssh <username>@<mijnsite.nl>
Vervolgens ga je naar de map waar je Magento-installatie staat:
$ cd public_html
Of, als je Magento-installatie niet rechtstreeks in de /public_html/-map staat:
$ cd public_html/<magento_map>
Nu kun je afhankelijk van de Magento-versie je indexes beheren. Voor Magento 1 staan in de map /shell/ de verschillende bestanden. Voor het indexeren, gebruik je ‘indexer.php’ als volgt:
$ php shell/indexer.php --status
Product Attributes: Pending
Product Prices: Pending
Catalog URL Rewrites: Pending
Category Products: Pending
Catalog Search Index: Pending
Stock Status: Pending
Tag Aggregation Data: Pending
$ php shell/indexer.php --reindexall
Product Attributes index was rebuilt successfully in 00:00:01
Product Prices index was rebuilt successfully in 00:00:00
Catalog URL Rewrites index was rebuilt successfully in 00:00:07
Category Products index was rebuilt successfully in 00:00:00
Catalog Search Index index was rebuilt successfully in 00:00:01
Stock Status index was rebuilt successfully in 00:00:00
Tag Aggregation Data index was rebuilt successfully in 00:00:00
Voor Magento 2 is het vergelijkbaar, met het verschil dat daar een script genaamd ‘magento’ in de map /bin/ staat:
$ php bin/magento indexer:status
Customer Grid: Ready
Category Products: Reindex required
Product Categories: Reindex required
Product Price: Reindex required
Product EAV: Reindex required
Stock: Reindex required
Catalog Rule Product: Reindex required
Catalog Product Rule: Reindex required
Catalog Search: Ready
$ php bin/magento indexer:reindex
Customer Grid index has been rebuilt successfully in 00:00:01
Category Products index has been rebuilt successfully in 00:00:00
Product Categories index has been rebuilt successfully in 00:00:00
Product Price index has been rebuilt successfully in 00:00:00
Product EAV index has been rebuilt successfully in 00:00:00
Stock index has been rebuilt successfully in 00:00:00
Catalog Rule Product index has been rebuilt successfully in 00:00:01
Catalog Product Rule index has been rebuilt successfully in 00:00:00
Catalog Search index has been rebuilt successfully in 00:00:00
$ php bin/magento indexer:status
Customer Grid: Ready
Category Products: Ready
Product Categories: Ready
Product Price: Ready
Product EAV: Ready
Stock: Ready
Catalog Rule Product: Ready
Catalog Product Rule: Ready
Catalog Search: Ready
Natuurlijk kun je meer met Magento op de console. Als je de scripts zonder verdere argumenten aanroept, zul je de andere beschikbare opties zien.
Pro-tip: voeg in het bestand /home/.bashrc de volgende regel toe. Vervang hier ‘voorbeeld.nl’ met je eigen domeinnaam.
PATH=$PATH:$HOME/domains/voorbeeld.nl/public_html/bin/
Vanaf de volgende keer dat je op SSH inlogt, heb je het commando ‘magento’ tot je beschikking, zonder dat je het pad erbij hoeft te typen. Je kunt dan alle commando’s die Magento hier in de documentatie heeft beschreven aanroepen zonder dat je daarbij het pad hoeft te gebruiken.
Dus in plaats van:
$ php bin/magento indexer:status
Gebruik je dan:
$ magento indexer:status
Het maakt dan niet uit wat je huidige werkpad is.
Dit werkt natuurlijk vooral goed als je “maar” één Magento-installatie hebt. Wanneer je er meerdere hebt, zul je het iets anders moeten aanpakken. Je kunt dan bijvoorbeeld een symlink in $home/bin zetten voor elke installatie:
$ mkdir -p $HOME/bin
$ ln -s $HOME/domains/public_html/bin/magento $HOME/bin/magento1
$ ln -s $HOME/domains/public_html/bin/magento $HOME/bin/magento2
$ ln -s $HOME/domains/public_html/bin/magento $HOME/bin/magento3
Op die manier heb je de beschikking over de commando’s ‘magento1’, ‘magento2’ en ‘magento3’. Een andere manier om dat te bereiken is met ‘alias’. Je zet dan het volgende in $HOME/.bashrc:
alias magento2="$HOME/domains/public_html/bin/magento"
SSH tips voor Drupal met Drush
Voor Drupal is er Drush, de Drupal Shell. Deze kun je eenvoudig installeren. Drush heeft zelf een goede installatiehandleiding beschikbaar gesteld. Graag vat ik het voor je samen:
Begin met het downloaden van het Drush PHP-archief:
$ wget http://files.drush.org/drush.phar
Test of de PHP-configuratie in orde is:
$ php drush.phar core-status
Het is mogelijk dat je op dit punt tegen één van de volgende meldingen krijgt:
exec() has been disabled for security reasons preflight.inc:380
The following restricted PHP modes have non-empty values: disable_functions.
Is dat het geval, dan moet je ‘system,exec,shell_exec’ uit de ‘disable_functions’ halen. Je kunt dit doen bij de PHP-selector in DirectAdmin.
In de PHP-selector klik je op de knop ‘Show PHP Settings’. Daar haal je dan ‘system,exec,shell_exec’ bij de ‘disable_functions’ weg en klik je op ‘Apply’ om de wijziging te bevestigen. Maak vervolgens het bestand uitvoerbaar:
$ chmod +x drush.phar
Verplaats Drush naar de /bin/-directory, zodat je hem kunt uitvoeren zonder het pad te hoeven gebruiken.
$ mkdir -p $HOME/bin
$ mv drush.phar $HOME/bin/drush
Eventueel kun je nu ‘drush init’ typen voor tab-completion en handige aliassen:
$ drush init
Als je bij het opnieuw inloggen nu een melding krijgt die met “/usr/bin/which: no drush” begint, voeg dan in de file $HOME/.bashrc het volgende toe boven de Drush specifieke dingen die zojuist door “drush init” zijn toegevoegd:
PATH=$PATH:$HOME/bin
Je hebt nu een werkende Drush-installatie zodat je jouw Drupal-applicatie kunt beheren als een pro!
Je website updaten met Git
Leuk natuurlijk, die Magento en Drupal commando’s, maar wat als je zelf een website hebt gebouwd? Dit kan zoals ik lang geleden deed: de PHP-code die ik schreef, zette ik via FTP naar de webserver. Kleine wijzigingen deed ik snel lokaal, waarna ik via FTP de pagina weer ging uploaden.
Als ik een grotere wijziging wilde doen, dan maakte ik eerste een kopie van alles, zodat ik zeker wist dat ik terug kon als ik iets fout deed. Daarna weer de wijziging maken en uploaden met FTP.
Het werkte (redelijk). Echter, het gevolg was dat ik op mijn computer tientallen mapjes had die een kopie waren van de website, allemaal met net iets andere versies. Niet heel handig, maar ter verdediging: Git bestond toen niet.
Nu Git wel bestaat, zullen we eens kijken hoe we wat ik vroeger deed op een betere manier kunnen doen. Laten we beginnen met een lege Git-repository op de webhostingserver. Deze bevat uiteindelijk alle versies van je website.
Het aanmaken van een Git-repository op de hostingserver gaat als volgt:
$ ssh <username>@<mijnsite.nl>
$ git init --bare mijnsite.git
Dit doe je dus niet binnen je /public_html/-map, maar daarbuiten. In dit voorbeeld is ‘mijnsite.git’ een zogenaamde “bare repository”. Dit kun je zien als een soort van database waarin alle versies van je website-code staat.
Maak nu een post-receive-bestand aan met behulp van de twee commando’s die hieronder staan:
$ cat <<EOF > mijnsite.git/hooks/post-receive
#!/bin/sh
GIT_WORK_TREE=/home/<username>/domains/<mijnsite.nl>/public_html git checkout -f
EOF
$ chmod +x mijnsite.git/hooks/post-receive
Dit zorgt ervoor dat je naar je Git-repository pusht, wanneer je website in de /public_html/-map ook daadwerkelijk verandert.
Als je alleen een submap van /public_html/-map wilt beheren, dan kan dat natuurlijk ook. Je past dan het pad achter ‘GIT_WORK_TREE=’ erop aan.
Wat we nu hebben, is een lege Git-repository die elke keer als je de code er naartoe pusht de laatste versie in je /public_html/-map zet.
Nu kun je vanaf je eigen werkstation de repository clonen:
$ git clone <username>@<mijnsite.nl>:mijnsite.git
$ cd mijnsite
Je hebt nu een kopie van de lege Git repository lokaal op je werkstation. Stel, je creëert een bestand genaamd ‘git.html’ met de inhoud “Hello git!”:
$ cat <<EOF > git.html
Hello git!
EOF
Je kunt dat vervolgens toevoegen in Git en er een ‘commit’ van maken.
$ git add git.html
$ git commit -m “Mijn eerste commit”
Dit toevoegen en ‘commiten’ kun je ruwweg vergelijken met hoe ik vroeger een kopie van de hele map maakte.
Vervolgens moet de commit nog worden geüpload naar de webserver:
$ git push
Dit kun je vergelijken met via FTP je website uploaden, maar dan op een gave manier waarbij je alleen de wijzigingen uploadt en al je versies (commits) op de server (en lokaal) bewaard blijven. Als je nu http://<mijnsite.nl>/git.html bekijkt, zie je dat ook jij met Git kunt werken!
SFTP: veilig bestanden overzetten
In plaats van FTP kun je ook via SSH je bestanden naar de server kopiëren, wel zo veilig! Met Mac en Linux gaat dit makkelijk via de command-line met ‘scp’:
$ scp bestand.html <username>@<mijnsite.nl>:<pad>
Belangrijk is de dubbele punt tussen je domeinnaam en het pad. Je kunt ook het pad weglaten, je bestand zal dan in je ‘home-dir ‘ worden gezet. Dit is /home/<username>.
Wil je meerdere bestanden en/of een hele directory met inhoud kopiëren, dan kun je dat met ‘scp -r’ realiseren, bijvoorbeeld:
$ scp -r bestand1.html bestand2.php map1 <username>@<mijnsite.nl>:<pad>
Houd je niet zo van de command-line dan kun je bijvoorbeeld Cyberduck (Mac/Windows), WinSCP (Windows) of FileZilla (Linux/Mac/Windows) gebruiken om bestanden over te zetten. Bij WinSCP gebruik je standaard SFTP, bij Filezilla en Cyberduck moet je er zelf even goed op letten dat je voor SFTP kiest en niet voor gewoon FTP of FTPS.
En nog meer SSH tips!
Natuurlijk is er veel meer mogelijk met SSH. Denk aan bijvoorbeeld WordPress met WP-CLI. Daarnaast is rsync ook een goede optie om je website-bestanden veilig te synchroniseren tussen de webserver en je werkstation.
P.S. Op de hoogte blijven van alle artikelen, updates, tips en trucs die op ons blog verschijnen? Volg ons via Facebook, Twitter, Instagram, RSS en e-mail!
@SSH tips voor Magento
Volgens mij werkt de genoemde instelling niet, deze moet zijn:
PATH=$PATH:$HOME/domains/jouwdomein.nl/public_html/bin/
Indien short-cut aanwezig is:
PATH=$PATH:$HOME/public_html/bin/
Je hebt gelijk, Harold! Daar moet tussen /domains/ en /public_html/ nog ‘voorbeeld.nl’ komen te staan. Hier vervang je ‘voorbeeld.nl’ dan met je eigen domein. Bedankt voor het melden, we hebben het artikel geüpdatet.
Dank voor je blog Sander, maar is er iets veranderd in git bij jullie intussen:
Als ik $ git clone @:mijnsite.git uitvoer krijg ik een error. Ik denk dat ik dan via SSH de cloning moet doen aangezien ik de mijnsite.git niet kan. Maar dat levert een path error op.
Bedankt voor je reactie! Deze instructies zouden in feite nog moeten kloppen. Het handigst is om even een e-mail te sturen naar Support. Beschrijf daarin de gewenste situatie, welke stappen je neemt en de exacte error. We kijken dan graag gericht met je mee om het werkend te krijgen.