Järjestelmäprojekti: Raspberry Pi 3:sta NextCloud pilvipalvelinalusta

Tämä projekti toteutettiin syksyllä 2018 Haaga-Helia ammattikorkeakoulun Järjestelmäprojekti-kurssilla. Projektia oli mukana toteuttamassa Laura Rajala (https://laurarajala.wordpress.com/) ja Iina Savela (https://liinuksi.wordpress.com/). Projektin tavoitteena oli rakentaa toimiva ja helppokäyttöinen henkilökohtainen pilvitallennuspalvelu, joka pohjautuu NextCloud-palveluun. Tavoitteenamme oli myös oppia Raspberry Pi:n käyttöä ja konfigurointia, sekä henkilökohtaisen pilvipalvelun rakentaminen. Halusimme myös tutustua korttitietokoneen rajoituksiin verrattuna tavalliseen tietokoneeseen.

Toteutimme projektin onnistuneesti, vaikka matkalla tulikin ongelmia. Kaikki ongelmat on kuitenkin kerrottu tässä postauksessa ilmestymisjärjestyksessä, joten koko kirjoitus kannattaa lukea läpi, mikäli tämän perusteella on tekemässä samankaltaista ratkaisua.

Esivalmistelut ja Raspberryn testaus

Kiinnitimme Raspberryn labraluokan videoprojektoriin, joka oli toistaiseksi ainut, josta saimme kuvan näkymään. Raspberry käynnistyi ensimmäiseen käyttöönottovaiheeseen, jossa määriteltiin kieliasetukset. Raspberry oli kiinni luokan kiinteässä verkossa, joten emme yhdistäneet langattomaan verkkoon. Raspberry alkoi päivittää ensimmäistä päivityskertaansa, joka ei kuitenkaan reilun tunninkaan jälkeen ollut valmistunut, joten irrotimme virtakaapelin laitteesta.

Siirryimme Servulaan (toinen koulun tila), jossa kiinnitimme Raspberryn Acerin näyttöön HDMI-kaapelilla. Raspberry käynnistyi samaan käyttöönottovaiheeseen kuin aiemminkin, tällä kertaa ohitimme automaattisen päivityksen. Tämän jälkeen mitään ei kuitenkaan tapahtunut eikä työpöytä ilmestynyt näytölle. Uudelleenkäynnistyksenkään jälkeen laite ei käynnistynyt. Päätimme asentaa Raspbianin uudelleen Raspberryn muistikortille ja yrittää käyttöönottoa seuraavalla viikolla.

Raspbianin uudelleenasennus

Poistin sd-kortilta kaiken sisällön ja uudelleenkirjoitin Win32DiskImager-ohjelmalla Raspbian-käyttöjärjestelmän kortille. Testasin toimivuutta BenQun näytöllä ja HDMI-kaapelilla ja Raspberry lähti käyntiin. Valitsin paikaksi Suomen ja ohitin verkkoasetukset (langallinen verkkoyhteys käytössä) sekä vaihdoin salasanan. Raspberry alkoi ladata ja asentaa päivityksiä. Nyt tähän meni noin kymmenen minuuttia ja tämän jälkeen käynnistin koneen uudelleen.

Menin komentoriville ja tarkistin, että ssh-paketti oli asennettu. Kirjoitin komentoriville sudo raspi-config ja valitsin kohdan 5 ja sieltä kävin ottamassa käyttöön ssh-yhteyden. Päätin vielä tehdä laitetta vähän turvallisemmaksi lataamalla palomuurin käyttöön: sudo apt-get –y install ufw. Tein ennen muurin käyttöönottoa reiät: sudo uwf allow 22/tcp (ssh-portti), sudo uwf allow 80/tcp (http-portti), sudo uwf allow 443/tcp (https-portti) ja otin sen käyttöön: sudo ufw enable.

NextCloudin asennus alkaa – LAMP

Ensimmäisenä muutimme näppäimistön suomenkieliseksi komennolla setxkbmap fi ja päivitimme paketit komennolla sudo apt-get update ja sudo apt-get upgrade. Tämän jälkeen yritimme asentaa suoraan ohjeiden mukaan LAMP-palvelinta komennolla sudo apt-get install lamp-server^, mutta saimme virheen “pakettia ei löytynyt”. Yritimme myös komennolla sudo apt-get install tasksel, joka oli jo asennettuna. Yritimme vielä sudo tasksel install lamp-server, mutta pakettia ei löytynyt.

Asensimme tähän väliin salasanageneraattorin, jota tarvittaisiin myöhemmin. Komento sudo apt-get install pwgen asentaa Pwgen-apuohjelman, jonka avulla voi generoida eripituisia salasanoja. Loimme salasanatiedoston “nano salasanat.txt” ja poistimme käyttöoikeudet kaikilta muilta kuin meidän käyttäjältä komennolla sudo nano salasanat.txtjolla luotiin salasanatiedosto sekä chmod og-rwx salasanat.txt, jolla evättiin muilta käyttäjiltä pääsy tuohon tiedostoon. Salasanatiedostoon luotiin salasana komennolla pwgen 25 1, joka luo yhden 25-merkkisen salasanan.

Asensimme LAMP-serverin (https://askubuntu.com/questions/785440/how-to-install-lamp-server-on-ubuntu) ohjeiden mukaan komennolla sudo tasksel, joka toi listan asennettavia ohjelmia. Valitsimme näistä web serverin. Tämä asensi kuitenkin pelkästään Apachen, sillä kansiossa /etc/init.d ei ollut mysql-tiedoston stop/start-kansiota ollenkaan.

Muokkasimme Apachen oletusetusivua poistamalla koko oletusarvoisen sisällön.

Asensimme seuraavaksi MySQL:n käsin komennolla sudo apt-get –y install mysql-server mysql-client. Salasanan vaihtokyselyä ei tullut, joten teimme sen käsin (https://support.rackspace.com/how-to/mysql-resetting-a-lost-mysql-root-password/).

sudo /etc/init.d/mysql stop

sudo mysqld_safe –skip-grant-tables &

mysql –uroot

use mysql;

update user set password=PASSWORD(“mynewpassword”) where User=’root’;

flush privileges;

quit

sudo /etc/init.d/mysql stop

sudo /etc/init.d/mysql start

mysql -u root –p

Tämä päättyi kuitenkin virheeseen käynnistyksessä, joten päätimme poistaa kaikki jo asennetut ohjelmat (Apachen ja MySQL:n) ja asentaa ne alusta uudelleen.

Asensimme Apache2:sen Raspberry Projectin (https://projects.raspberrypi.org/en/projects/lamp-web-server-with-wordpress) ohjeiden mukaan:

sudo apt-get install apache2 –y

sudo apt-get install php –y

sudo apt-get install mysql-server php-mysql -y

sudo systemctl restart apache2.service
Muokkasimme taas Apachen oletusetusivua poistamalla koko sisällön ja testasimme, että muutos näkyy. Loimme myös uuden PHP-testietusivun, johon lisäsimme lyhyen hello world –komennon PHP:llä ja poistimme index.html:n, jolloin index.php korvasi tämän.

Käytimme asennusten jälkeen komentoa vaihtaaksemme salasanan, koska MySQL:n asennus ei sitä kysynyt:

sudo mysql_secure_installation

Komentoa suoritettaessa vastattiin sen kysymiin prompteihin. Sen jälkeen kirjauduttiin komennolla sudo mysql –u root –p, käyttäen uutta salasanaa.

Emme asentaneet ohjeissa olevaa Wordpressiä, koska sitä ei tarvittu.

Moduulien käyttöönotto

Seuraavaksi asensimme PHP-moduuleita, joita NextCloud käyttäisi. Syötimme komennon

sudo apt install php-apcu php-zip php-dompdf php-xml php-mbstring php-gd php-curl unzip

Tämä komento kuitenkin lopulta päättyi virheisiin, joten tarkistimme PHP:n version, joka oli 7.0. Kokeilimme asennusta seuraavasti: sudo apt install php7.0-apcu, jolloin asennus onnistui. Teimme tämän yksitellen kaikille moduuleille. Kaikki muut asentuivat tällä tavalla, paitsi php7.0-dompdf.

Otimme käyttöön NextCloudin tarvitsemat Apache-moduulit:

sudo a2enmod rewrite headers env dir mime

Otimme käyttöön SSL:n komennolla:

sudo a2enmod ssl

Tietokannan luominen

Kirjauduimme komennolla sudo mysql –u root –p.

Loimme uuden tietokannan komennolla ”CREATE DATABASE nextcloud”;

Loimme uuden käyttäjän komennolla ”CREATE USER ‘munkki’@’localhost’ IDENTIFIED BY ‘salasana’;  ”

ja generoimme sille uuden salasanan pwgenillä.

“GRANT ALL ON nextcloud.* TO ‘munkki’@’localhost’ IDENTIFIED BY ’salasana’ WITH GRANT OPTION; ”

Tallensimme tietokannan.

Käyttöjärjestelmän vaihto ja asennus

Päätimme vaihtaa käyttöjärjestelmän projektiimme sopivammaksi Ubuntu Mateksi (16.04 LTS). Asennusmedia ladattiin Ubuntun nettisivuilta (https://ubuntu-mate.org/download/) ja valittiin Raspberrylle sopiva versio. Purin paketin tietokoneelle ja kirjoitin levykuvan Win32diskimager-ohjelmalla Raspberryn muistikortille.

Käynnistin Rasberryn ja asensin käyttöjärjestelmän asennusohjelman avulla. Asennuksen valmistuttua vaihdoin näppäimistön suomenkieliseksi komennolla setxkbmap fi ja päivitin paketinhallinnan sekä asennetut ohjelmistot komennoilla sudo apt-get update ja sudo apt-get upgrade.

Asensin SSH:n komennolla sudo apt-get –y install ssh. Komennolla sudo raspi-config pääsin muuttamaan Raspberryn asetuksia ja ottamaan SSH:n käyttöön. Testasin SSH:ta komennolla ssh jaana@localhost.

Valmiiksi asennettu Firefox ei toiminut vaan kaatui, joten yritin lisätä sen repositoriota. Poistin vanhan Firefoxin komennolla sudo apt-get –y purge firefox ja sudo apt autoremove. Sen jälkeen yritin lisätä toisen reponkomennolla sudo apt-add-repository ppa:jonathonf/firefox-esr-52 ja sudo apt-get –y install firefox-esr, mutta se ei asentunut. Asensin Chromiumin komennolla sudo apt-get –y install chromium-browser.

Asensin salasanageneraattorin komennolla sudo apt-get install pwgen. Loin salasanatiedoston “nano salasanat.txt” ja poistin käyttöoikeudet kaikilta muilta kuin nykyiseltä käyttäjältä “jaana” komennolla sudo nano chmod og-rwx salasanat.txt. Loin tiedostoon salasanan komennolla pwgen 25 1, joka luo yhden 25-merkkisen salasanan.

Seuraavaksi aloin asentaa LAMP-stackia komennolla sudo apt –y install lamp-server^. LAMP-stackin asennuksen yhteydessä Raspberry ylikuumeni liiallisten resurssienkäytön seurauksena liikaa ja hyytyi. Elvytin tietokoneen kylmällä metallipalikalla, jolloin Raspberry viileni sen verran, että sain suljettua ylimääräisiä ohjelmia. LAMPin asennuksen valmistuttua korvasin Apachen oletussivun yksinkertaisella testisivulla. Testasin vielä MySQL:n toiminnan komennolla mysql –u root –p.

Moduulien asennus

Asensimme tarvittavat PHP-moduulit komennolla:

sudo apt install php-apcu php-zip php-dompdf php-xml php-mbstring php-gd php-curl unzip

Asensimme Apachen moduulit:

sudo a2enmod rewrite headers env dir mime

Käynnistimme Apachen uudelleen komennolla sudo systemctl restart apache2.service

Tiedonsiirron suojaus SSL-yhteydellä

Aktivoimme Apachen SSL-moduulin komennolla sudo a2enmod ssl. Muokkasimme konfiguraatiotiedostoa komennolla sudo nano /etc/apache2/sites-available/nextcloud.conf.

Tiedostoon kirjoitettiin seuraava pitkä konfiguraatiomuutos:

 

    ServerAdmin sposti@sposti.fi

    ServerName localhost

    DocumentRoot /var/www/html

   

      Options +FollowSymlinks

      AllowOverride All

     

        Dav off

     

      SetEnv HOME /var/www/html

      SetEnv HTTP_HOME /var/www/html

   

   

      Header always set Strict-Transport-Security “max-age=15768000; preload”

   

    SSLEngine on

    SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem

    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

 

Otimme asetukset käyttöön sudo a2ensite nextcloud.conf. Uudelleenkäynnistimme Apachen komennolla sudo systemctl restart apache2.service.

Muokkasimme seuraavaksi tiedostoa komennolla sudo nano /etc/apache2/sites-available/nc-redir.conf. Tiedostoon liitettiin seuraava teksti:

 

  ServerName localhost

  ServerAdmin sposti@sposti.fi

  RewriteEngine On

  RewriteCond %{HTTPS} off

  RewriteRule ^(.*)$ <https://%{HTTP_HOST}%> [R=301,L]

 

Otimme asetukset käyttöön komennolla sudo a2ensite nc-redir.conf, poistimme oletusasetukset komennolla sudo a2endissite 000-default.conf ja käynnistimme Apachen uudelleen sudo systemctl restart apache2.service.

NextCloud ja tietokannan luominen

Latasimme NextCloudin asennuspaketin seuraavalla komentosarjalla:

cd /var/www/html

sudo wget https://download.nextcloud.com/server/releases.latest.zip

sudo unzip latest.zip

Annoimme Apachen www-datalle kirjoitusoikeudet NextCloudin asennuskansioon:

sudo chown –R www-data:www-data/var/www/html/nextcloud

Loimme tietokannan NextCloudille kirjautumalla ensin MySQL:ään komennolla mysql –u root –p. Tietokannan luominen tapahtui seuraavilla komennoilla:

CREATE DATABASE muumipilvi;

CREATE USER ‘tuutikki’@’localhost’ IDENTIFIED BY ‘salasana’;

GRANT ALL PRIVILEGES ON muumipilvi.* TO ‘tuutikki’@’localhost’;

Sen jälkeen suljimme MySQL-yhteyden komennolla quit.

Välimuistin lisääminen Redis-palvelimen avulla

Redis-palvelin parantaa pilvipalvelun nopeutta sellaisessa tilanteessa, kun tallennettavan datan määrä kasvaa. Tässä teoreettisessa projektissa tällaista tilannetta ei tule vastaan, ellei joku ryhmän jäsenistä ota tuotetta käyttöön. Teimme kuitenkin Redis-palvelimen käyttöönoton teorian vuoksi.

sudo apt install redis-server php-redis

Tämän jälkeen avasimme Redisin asetustiedoston komennolla:

sudo nano /etc/redis/redis.conf

Muutimme oletusportin 0:ksi kohdassa port.

Aktivoimme Redisin poistamalla kommenttimerkit seuraavien rivien edestä:

unixsocket /var/run/redis/redis.sock

unixsocketperm 700

Jälkimmäisellä rivillä muutimme vielä oikeudet luvuksi 770. Lisäsimme Redis-käyttäjän www-data-ryhmään komennolla:

sudo usermod –a –G redis www-data

Käynnistimme Redisin sekä Apachen uudelleen komennoilla:

sudo systemctl restart apache2.service

sudo systemctl restart redis-server.service

Seuraavaksi kirjoitimme välimuistittamisen asetukset NextCloudin konfiguraatiotiedostoon komennolla:

sudo nano /var/www/html/nextcloud/config/config.php

Tiedostoon lisättiin seuraava teksti:

‘memcache.local’ => ‘\OC\Memcache\APCu’,

‘memcache.locking’ => ‘\OC\Memcache\Redis’,

‘filelocking.enabled’ => ‘true’,

‘redis’ =>

array (

‘host’ => ‘/var/run/redis/redis.sock’,

‘port’ => 0,

‘timeout’ => 0.0,

),

Varmistimme, että Redisin asetukset otetaan käyttöön uudelleenkäynnistyksen yhteydessä komennolla sudo systemctl enable redis-server.

Tarkistimme Redis-palvelimen tilan komennolla ls –la /run/redis, jolloin näimme, että kaksi tiedostoa oli paikallaan: redis-server.pid ja redis.sock.

Muokkasimme Apachen konfiguraatiotiedostoa komennolla:

sudo /etc/apache2/apache2.conf

Muutimme -osion rivin

AllowOverride None => Allow Override All

Käynnistimme Apachen uudelleen komennolla sudo systemctl restart apache2.service

Tämän jälkeen menimme osoitteeseen localhost/nextcloud, jossa saimme kuitenkin virheilmoituksen:

nextcloudFAIL

Juuri kirjoittamamme tiedoston sisältö tulostui siis sivun ylälaitaan ja sivu antoi virheen. Hetken pohdittuamme havaitsimme, että tämä johtuu siitä, ettemme olleet ennen config.php-tiedoston luomista luoneet admin-tunnusta emmekä yhdistäneet tietokannan käyttäjää NextCloudiin. Poistimme config.php-tiedoston, jolloin pääsimme  oikeanlaiseen näkymään:

nextcloudPASS

Loimme admin-tunnuksen munkki, sekä lisäsimme database-kohtiin aiemmin luodun MySQL-käyttäjän tiedot. Finish setup kesti pari minuuttia, ja sen jälkeen olimme  kirjautuneina admin-tunnuksella NextCloudiin.

Lisäsimme aiemmin kirjoitetun config-tiedoston sisällön uudelleen config.php-tiedostoon, jossa oli nyt myös ohjelman itse luomaa sisältöä, jota se tarvitsee toimiakseen. Jouduimme siirtämään tekstipätkän sisältöä muutaman kerran tiedoston sisällä, oikea paikka oli config array –blokin jälkeen, viimeisen kaarisulun sisäpuolella.

Testasimme toiselta koneelta, emmekä päässeet kirjautumaan palveluun, kuten pitikin. Emme olleet määritelleet pääsyä muualta kuin localhostista.

Salauksen käyttöönotto

Viimeiseksi halusimme ottaa käyttöön palvelinpään salauksen NextCloudissa. Kirjauduimme admin-tunnuksilla ja menimme oikeasta yläkulmasta tunnuksen kohdalta valikkoon, josta valitsimme Apps. Niiden alta löytyi “Default encryption module”, jonka otimme käyttöön valitsemalla Enable. Sen jälkeen menimme oikean yläkulman valikosta kohtaan Settings -> Administration settings –otsikon alta Security -> Server-side encryption –otsikon alta valitaan Enable server-side encryption.

Pilvitallennuspalvelu Raspberrylla on valmis!

nextcloud

Lähteet

Ask Ubuntu 2016. How to install LAMP server on Ubuntu. Luettavissa: https://askubuntu.com/questions/785440/how-to-install-lamp-server-on-ubuntu. Luettu: 3.9.2018.

Bayton, J. 2018. Installing Nextcloud on Ubuntu with Redis, APCu, SSL & Apache. Luettavissa: https://bayton.org/docs/nextcloud/installing-nextcloud-on-ubuntu-16-04-lts-with-redis-apcu-ssl-apache/. Luettu: 10.9.2018.

DigitalOcean community 2015. Luettavissa: https://www.digitalocean.com/community/questions/mysql-installation-error-dpkg-error-processing-package-mysql-server-5-5-configure. Luettu: 3.9.2018.

Rackspace support 2018. Luettavissa: https://support.rackspace.com/how-to/mysql-resetting-a-lost-mysql-root-password/. Luettu: 3.9.2018.

Raspberry Pi. Luettavissa: https://projects.raspberrypi.org/en/projects/lamp-web-server-with-wordpress. Luettu: 3.9.2018.

Reddit community 2018. Luettavissa: https://www.reddit.com/r/NextCloud/comments/86o9js/no_configphp_file_after_install/. Luettu: 3.9.2018.

Räty, P. 2018. Seuraava pilvesi on ikioma. Mikrobitti, 35. vuosikerta, 4. numero, s. 64-67.

StackExchange community 2018. Luettavissa:  https://raspberrypi.stackexchange.com/questions/78751/mysql-initial-installation. Luettu: 3.9.2018.

Ubuntu Mate 2018. Luettavissa: https://ubuntu-mate.org/download/. Luettu: 9.9.2018.

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s