tavis nörttimaailmassa

EksisONE - artikkeleita ja ohjeita nörttimaailmasta

Moodle ja uusi serveri

Moodle on verkkokurssien ja -koulutusten järjestämisessä ykkösohjelmisto. Lähes jokainen viimevuosina korkeakouluissa ollut on tutustunut siihen. Moodle on käytössä monissa muissakin kouluasteissa. Ja koska se on alunperin tehty isoille yliopistoille, niin siitä puuttuu täysin määrätty joustavuus ja helppous, joka on vaikka WordPressissä. Web-hotelliympäristössä Moodlea voi käyttää, mutta se on tuskaa. Ilman konsolia ja SSH-yhteyttä sen ylläpito on jo melkoisen tuskaa. Ei se herkkua ole muutenkaan. Mutta onneksi Moodle siirtyy uuteen paikkaan helposti. Kunhan käytössä on esimerkiksi PuTTY.

Käytännössä ei ole eroa siirtääkö Moodlen serveriltä toiselle ja domain pysyy samana, vai vaihtuuko myös domain. Jälkimmäisessä joudutaan tekemään kaksi vaihetta enemmän. Jos domain pysyy samana, niin siirto on kaikessa yksinkertaisuudessaan hyvin tyypillinen:

  • kopioidaan tietokanta
  • kopioidaan moodledata -hakemisto
  • kopioidaan varsinainen hakemisto

Esimerkit olettavat, että olet liikeellä root-tunnuksella. Jos et, niin muista sopivissa paikoissa sudo tai su.

Samaten example.com on syytä muuttaa oikeaksi domainiksi, /var/www/html on vaihdettava aidoksi Moodlen poluksi ja tietokannan nimenä tuskin on moodle, joten vaihda sekin.

Itsellä on Ubuntu, MySQL ja Apache2, joten niiden mukaan mennään. Jos sinulla on jotain muuta, niin osannet muokata.

Aseta uudessa paikassa domain ja sen vaatimat hakemistot. Muuta nimipalvelimet osoittamaan uuteen osoitteeseen.

Laita vanhalla serverillä huoltotila päälle.

Tietokanta

Tehdään ensimmäiseksi uudessa paikassa tietokanta ja käyttäjä.

Kirjaudutaan mysql:ään.

mysql -u root -p

Tehdään tietokanta:

CREATE DATABASE moodle DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Tehdään käyttäjä:

GRANT ALL ON moodle.* TO 'käyttäjä'@'localhost' IDENTIFIED BY 'salasana';

Tyhjennetään välimuistit ja poistutaan:

FLUSH PRIVILEGES;
EXIT;

Tietokannan siirto

Kirjaudu vanhalle serverille.

Siirretään tietokanta:

mysqldump --allow-keywords --opt -uroot -psalasana TIETOKANTA | ssh root@uuden-ip-osoite "mysql -uroot -psalasana TIETOKANTA"

Jos tämä on ensimmäinen kerta, kun sinulla on käytössä rsync ja SSH vanhan sekä uuden välillä, niin sinulta kysytään, että luotatko uuden serverin avaimeen. Vastaa yes.

Sinulta kysytään uuden serverin rootin salasanaa. Siirto alkaa ja sinua muistutetaan, että salasanojen siirtäminen komentorivillä voi olla turvatonta – ihan sama, siksi meillä on SSH käytössä.

Se oli siinä. Nyt tietokanta on siirretty uudelle serverille.

Specified key was too long; max key length is 767 bytes

Asensin aivan uuden ja tuliterän DigitalOceanin dropletin sivustojen uudelleenjärjestämista varten. Siirtelin hakemistoja ja tiedostoja uuteen paikkaan ja kaikki kävi todella näppärästi. Kahdeksan sivustoa siirtyi noin minuutissa ja suurin aika hukkaantui uusien tietokantojen tekemisessä, mutta ei siihenkään viittä minuuttia enempää mennyt.

Kun siirsin Moodlen tietokannat, kaksi kappaletta, niin ongelmat alkoivat. Sain virheilmoituksen:

ERROR 1071 (42000) at line 993: Specified key was too long; max key length is 767 bytes

Tuo virheilmoitus tarkoittaa sitä, että joku tai jotkut taulukon kentät ovat pidempiä kuin mitä järjestelmä sallii. Nopea googletus (ei mennyt kuin tunti…) paljasti, että kyseessä on versio-ongelma MySQL:n ja/tai MariaDB:n kanssa. Toki joskus ongelma on siinä, että tietokanta on ylipäätään rakennettu väärin rajoitukset ylittäen, mutta minä siirsin toimivasta tietokannasta aivan uuteen ja samassa Ubuntun versiossa.

Ehkä syy johtui siitä, että kyseessä oli joskus vuosia sitten tehty tietokanta, mutta minä olen siirrellyt sitä aivan ongelmitta monta kertaa, myös uusin dropleteihin. Ainoa ero tuli siitä, että nyt oli ensimmäisen kerran vastaanottajana tuore MariaDB-asennus. Mutta olin siirtänyt ennenkin MariaDB:lle, joten ainoaksi eroksi jäi tuoreus – aikaisemmin olen aina muuttanut MySQL:n Mariaksi, nyt olin asentanut suoraan MariaDB:n.

Virhe voi ilmaantua millä tahansa tietokannalla, mutta Moodlen kohdalla syy on merkistö. Jos seurataan Moodlen asennusohjeita, niin tietokantaa luotaessa löytyy kohta CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ja tuossa homma karahti kiville. Määrätyissä versioissa (missä ja miksi, en tiedä) enginenä käytetty InnoDB on sitä mieltä, että utf8mb4 vie liikaa tilaa – ja antaa max key length virheen.

Korjaustapoja on kolme.

Tehdään tietokantadumppi ja avataan se tekstieditorissa.

  • etsitään InnoDB ja korvataan sen MyISAM:lla. Se on vanha, eikä enää käytössä plus Moodle alkaa naputtamaan siitä. En pitäisi sitä aitona vaihtoehtona.
  • etsitään kaikki utf8mb4 tekstit ja vaihdetaan ne muotoon utf8 – eli vaihdetaan merkistö. Tämä toimi, ja sen ovat tehneet muualla maailmassa muutkin. Tuo kannattaa tehdä etsi&korvaa -toiminnolla, sillä minulla niitä oli yhdessä Moodlen tietokannassa jonkun matkaa yli 2000. Korvaamisella saadaan vaihdettua molemmat, character ja collate kohdat.
  • koska syypää näyttäisi ainakin Moodlen kohdalla olevan nimenomaan MariaDB, niin poistetaan se ja asennetaan MySQL. Sen voi sitten myöhemmin muuttaa takaisin Mariaksi ja homma toimii.

Itse kokeilin korvaamista ja uutta tietokanta-asennusta. Koska kyseessä oli tuore asennus, niin toteutin palaamisen MySQL:ään, koska halusin pitää Moodlen suosittaman merkistön – aidosti, Suomessa taitaisi kelvata utf8 myös. MariaDB:n poistamisen voi tehdä jo toimivallakin sivustolla, kunhan muistaa olla antamatta lupaa poistaa tietokantoja.

MariaDB korvautuu MySQL:llä helposti.

systemctl stop mariadb
apt remove --purge "mysql*"
apt update
apt install mysql-server
mysql_secure_installation
systemctl start mysql

Sivustot ovat poissa linjoilta noin minuutin, jos sinun ei tarvitse miettiä poistossa ja asennuksessa vastauksia kysymyksiin. Täältä löydät asennusohjeet MySQL:ään ja MariaDB:hen.

Hakemistojen siirto

Pysy vanhalla serverillä.

Poistetaan turhat välimuistit:

 rm -rf /var/www/moodledata/cache/
rm -rf /var/www/moodledata/localcache/

Ja kuten aina rm-komennon kanssa, niin ollaan huolellisia sen kanssa mitä poistetaan. Se ei varmistele haluatko vai etkö.

Ssiirretään Moodle. Ensimmäinen polku on se mistä kopioidaan (eli vanha) ja toinen polku mihin kopioidaan (eli uusi):

rsync -av -e ssh /var/www/html/ root@uuden-ip-osoite:/var/www/html/

Jos sinulla on moodledata-hakemisto jossain muualla kuin domainin juurihakemistossa, niin se siirretään aivan samalla tavalla:

rsync -av -e ssh /var/www/moodledata/ root@uuden-ip-osoite:/var/www/moodledata/

Ensimmäinen polku on se mistä kopioidaan (eli vanha) ja toinen polku mihin kopioidaan (eli uusi).

Kun nimipalvelimesi ovat päivittyneet, niin kirjaudu sisällä. Tarkasta, että kaikki toimii kuten suunnilleen pitäisi ja ota lopulta huoltila pois päältä.

Jos jokin ei toimi, niin useimmiten syynä ovat muuttuneet tiedosto-oikeudet. Rsyncin pitäisi tosin säilyttää alkuperäiset. Jos googletat Moodlen hakemistojen ja tiedostojen oikeuksia, niin löydät erilaisia vaihtoehtoja tuhottomasti. Osassa on turvallisuus niin korkealla, että lisäosien päivittäminenkään ei onnistu.

Siirto on valmis.

Moodle ja uusi domain

Jos domain muuttuu, tai asennat Moodlen toiseen hakemistoon, niin joudut tekemään hieman lisäsäätöjä.

Avaa ensin config.php:

nano /var/www/html/config.php

Muuta kohdat:

  • $CFG->wwwroot
  • $CFG->dataroot

oikeiksi.

Jos lisäksi muutit hakemistoa, niin kannattaa lisätä johonkin kohtaan:

$CFG->dirroot = '/polku/moodleen/';

Urlien muuttaminen

Lisäksi täytyy varmistua, että tietokannassa ei ole annettu suoria linkkejä. Muutetaan ne CLI:ssä.

cd /var/www/html/admin/tool/replace/cli/
php replace.php --search=//vanha-url --replace=//uusi-url --non-interactive

Jos saat virheilmoituksen, että nuo eivät ole samanmittaisia, niin lisää mukaan --shorten

Kirjaudu sisään, vilkaise ympärillesi ja ota huoltotila pois.

ERR_TOO_MANY_REDIRECTS

Jos saat tuon virheen, ja olet välimuistin takana, niin se johtuu siitä, että Moodle ei osaa käsitellä proxyyn tulevaa https-liikennettä. Se täytyy kertoa sille.

Avaa config.php ja lisää vaikka urlin asettamisen jälkeen tämä:

$CFG->sslproxy  = true;

Jos saat selaimeen urputuksen liian monista ohjauksista, eikä sinulla ole välimuisteja eikä proxyja asennettuna, niin sitten sinulla on ongelma serverissä – joko .htaccess tiedostossa on jotain asetettu pieleen tai virtual hostin conf-tiedosto tai siihen liittyvä SSL-sertifikaatin kertova conf-tiedosto on väärin asennettu.

Kirjautuminen ei onnistu

Jos Moodle näyttäisi latautuvan muutoin ilman ongelmia, mutta kirjautumisessa ei tapahdu mitään ja väärä tunnuskaan ei anna virhettä, niin syy löytyy kahdesta mahdollisesta.

Hakemiston moodledata oikeudet eivät ole 777:

chmod -R 0777 /var/www/moodledata

Moodle ei tiedä missä sen tiedostot ovat:

$CFG->dirroot = 'var/www/html/moodle';

Tyhjä sivu

Joskus voi siirron jälkeen saada näkyviin blancon sivun. Se johtuu usein siitä, että kaikesta huolimatta Moodle ei tiedä missä tiedostot sijaitsevat. Tämä tulee vastaan alidomainien kanssa tai jos olet siirtänyt Moodlen alihakemistoon. Se korjaantuu kertomalla Moodlelle missä tiedostot ovat.

Avaa config.php ja lisää tämä:

$CFG->dirroot  = '/var/www/html/moodle';

Jos tyhjä sivu tulee admin-puolella, niin sinulta todennäköisesti puuttuu yksi tai useampi PHP:n moduuli uudesta ympäristöstä. Uusasennuksessahan ei pääse eteenpäin ennen kuin kaikki moduulit ovat paikallaan, mutta serveriä vaihdettaessa mikään työkalu ei tarkista niitä.

Täällä on lueteltu Moodlen vaatimat PHP-moduulit. Jos serverisi on tuliterä, niin valtaosa puuttuu, ne eivät kuulu ns. perusasennukseen. Asenna ne komennolla

apt install php-moduulin_nimi

Muista viimeiseksi käynnistää Apache uudestaan.

systemctl restart apache2

Error 500

Error 500 on palvelimen virhe, ei niinkään Moodlen. Jokin tiedosto saattaa olla rikki, mutta ehdottomasti yleisin syy on niin yksinkertainen, että PHP:lta loppui muisti tai suoritusaika oli liian lyhyt. Tarkista php.ini tiedosto.

nano /etc/php/7.2/apache2/php.ini

Cron

Tämä on asia, jonka olen itse unohtanut säännöllisesti: laita cron päälle.

crontab -u www-data -e
* * * * * /usr/bin/php /var/www/html/admin/cli/cron.php >/dev/null