Ylläpito

Palvelinpään tehtävät: missä mikäkin sijaitsee, miten sovellus käynnistetään uudelleen ja miten tehdään asiat, joita käyttöliittymästä ei voi tehdä. Komennot ajetaan SSH-yhteydellä palvelimelle.

Kokonaisuus

PalvelinTehtävä
Web-palvelinKUNTTARI, tämä ohjesivusto ja asiakkaiden WordPress-sivustot. nginx, PHP-FPM, MariaDB ja Node.js.
NS1Ensisijainen nimipalvelin (PowerDNS + MariaDB). KUNTTARI muokkaa vyöhykkeitä sen rajapinnan kautta sisäverkossa.
NS2Toissijainen nimipalvelin. Kopioi vyöhykkeet NS1:ltä automaattisesti.

KUNTTARI web-palvelimella

AsiaSijainti
Sovellus/var/www/kunttari
Asetukset ja salaisuudet/var/www/kunttari/.env (vain omistajan luettavissa)
TietokantaMariaDB-kanta kunttari
Prosessipm2-prosessi kunttari, käynnistyy palvelimen mukana
Web-palvelimen asetus/etc/nginx/sites-available/kunttari.fi
Sivuston luontiskripti/usr/local/sbin/kunttari-wp-create
AsiakasportaaliSama sovellus ja prosessi; nginx-asetus /etc/nginx/sites-available/portal.kunttari.fi. Portaalin isäntänimi on .env-arvossa PORTAL_HOST.
Ladatut laskut ja sopimukset/var/www/kunttari/storage/docs (PDF-tiedostot satunnaisilla nimillä, ei suoraan verkossa)
Ohjesivusto/var/www/docs.kunttari.fi (staattiset HTML-tiedostot)

Tila, lokit ja uudelleenkäynnistys

pm2 status                      # onko sovellus käynnissä
pm2 logs kunttari --lines 100   # sovelluksen loki
pm2 restart kunttari            # uudelleenkäynnistys
curl -s http://127.0.0.1:3200/healthz   # vastaa {"ok":true}, kun sovellus ja kanta toimivat

Jos .env-tiedostoa muutetaan, käynnistä sovellus uudelleen komennolla pm2 restart kunttari --update-env.

.env-tiedoston tärkeimmät arvot

MuuttujaMerkitys
SETTINGS_KEYAvain, jolla tenanttien, Workspacejen ja postilaatikon salaisuudet on salattu.
PDNS_API_URL, PDNS_API_KEYYhteys NS1:n PowerDNS-rajapintaan.
SERVER_PUBLIC_IPWeb-palvelimen julkinen IP, johon uusien WordPress-sivustojen A-tietueet osoitetaan.
DB_*KUNTTARIn tietokantayhteys.
Älä vaihda tai hukkaa SETTINGS_KEY-arvoa. Ilman sitä tallennettuja salaisuuksia ei voi purkaa, ja jokaisen tenantin secret, Workspacen avain ja postilaatikon secret pitää syöttää uudelleen. Säilytä avaimesta kopio salasanojen hallinnassa.

Varmuuskopiointi

KUNTTARIn oma data on pieni: organisaatiot, liitokset, portaalin käyttäjät ja pyynnöt, tikettien tilat, loki ja salatut salaisuudet sekä ladatut laskut ja sopimukset. Varmuuskopioon tarvitaan kolme asiaa:

sudo mariadb-dump --single-transaction kunttari | gzip > kunttari-$(date +%F).sql.gz
sudo cp /var/www/kunttari/.env kunttari-env-$(date +%F)
tar -czf kunttari-asiakirjat-$(date +%F).tar.gz -C /var/www/kunttari storage

Tietokantavedos on hyödytön ilman samaa SETTINGS_KEY-arvoa, joten säilytä ne yhdessä mutta suojattuna.

Asiakkaiden WordPress-sivustot (tiedostot kansiossa /var/www ja kunkin oma tietokanta) ja nimipalvelimen powerdns-kanta varmuuskopioidaan erikseen. KUNTTARI ei tee niistä kopioita.

Unohtunut salasana

Jos kukaan ei pääse kirjautumaan, aseta käyttäjälle uusi salasana palvelimella. Komento kysyy salasanan näyttämättä sitä:

cd /var/www/kunttari
read -rsp "Uusi salasana: " PW; echo
PW="$PW" node -e '
  process.loadEnvFile(".env");
  const { hashPassword } = require("./lib/crypto");
  const db = require("./lib/db");
  hashPassword(process.env.PW).then((h) =>
    db.q("UPDATE users SET pw_hash = ?, failed = 0, locked_until = NULL WHERE email = ?", [h, process.argv[1]])
  ).then((r) => { console.log("Päivitetty rivejä:", r.affectedRows); process.exit(0); });
' kayttaja@esimerkki.fi
unset PW

WordPress-sivuston poistaminen palvelimelta

KUNTTARIsta ei voi poistaa sivustoa palvelimelta. Ota ensin varmuuskopio ja poista sitten käsin. Esimerkissä verkkotunnus on esimerkki.fi; tietokannan nimi näkyy sivuston muistiinpanoissa KUNTTARIssa.

D=esimerkki.fi
DB=wp_esimerkki_fi

# 1. Varmuuskopio
sudo tar -czf ~/$D-tiedostot.tar.gz -C /var/www $D
sudo mariadb-dump --single-transaction $DB | gzip > ~/$D-kanta.sql.gz

# 2. Web-palvelin ja varmenne
sudo rm /etc/nginx/sites-enabled/$D /etc/nginx/sites-available/$D
sudo nginx -t && sudo systemctl reload nginx
sudo certbot delete --cert-name $D

# 3. Tietokanta ja tiedostot
sudo mariadb -e "DROP DATABASE \`$DB\`; DROP USER '$DB'@'localhost';"
sudo rm -rf /var/www/$D

Poista lopuksi sivusto KUNTTARIn seurannasta ja A-tietueet DNS:stä.

Varmenteet

sudo certbot certificates        # kaikki varmenteet ja vanhenemispäivät
sudo certbot renew --dry-run     # testaa, että automaattinen uusinta toimii

Jos sivuston luonnissa varmenteen haku epäonnistui, hae se myöhemmin komennolla sudo certbot --nginx -d esimerkki.fi -d www.esimerkki.fi. Se päivittää myös nginx-asetuksen.

Nimipalvelimet

Komennot ajetaan NS1:llä, ellei toisin mainita.

sudo pdnsutil list-all-zones             # kaikki vyöhykkeet
sudo pdnsutil list-zone esimerkki.fi     # vyöhykkeen tietueet
sudo pdnsutil check-zone esimerkki.fi    # tarkista virheet
sudo pdnsutil show-zone esimerkki.fi     # DNSSEC-avaimet ja DS-tietueet

DNSSEC uudelle vyöhykkeelle

  1. Allekirjoita vyöhyke: sudo pdnsutil secure-zone esimerkki.fi ja sudo pdnsutil rectify-zone esimerkki.fi.
  2. Hae DS-tietue: sudo pdnsutil show-zone esimerkki.fi.
  3. Vie DS-tietue rekisterinpitäjälle. Vasta sen jälkeen DNSSEC on voimassa.
Älä poista DNSSEC-avaimia tai vaihda nimipalvelimia allekirjoitetulta vyöhykkeeltä poistamatta ensin DS-tietuetta rekisterinpitäjältä. Muuten verkkotunnus lakkaa toimimasta validoivilla resolvereilla.

Vyöhykkeen poisto

Poista ensin delegointi rekisterinpitäjältä. Aja sitten sama komento sekä NS1:llä että NS2:lla:

sudo pdnsutil delete-zone esimerkki.fi

Jos NS2 ei päivity

Aja NS2:lla sudo pdns_control retrieve esimerkki.fi. Se hakee vyöhykkeen heti NS1:ltä.

KUNTTARIn kautta tehdyt muutokset siirtyvät NS2:lle itsestään. Jos muutat tietueita käsin pdnsutil-komennolla, aja NS1:llä muutoksen jälkeen sudo pdnsutil increase-serial esimerkki.fi, sudo pdns_control purge esimerkki.fi$ ja sudo pdns_control notify esimerkki.fi. Ilman välimuistin tyhjennystä NS2 voi saada vanhan sarjanumeron ja jättää muutoksen hakematta.

Ohjesivuston päivittäminen

Sivut ovat tavallisia HTML-tiedostoja kansiossa /var/www/docs.kunttari.fi. Yhteinen yläosa ja valikko ovat tiedostossa _head.html, jonka nginx liittää jokaiseen sivuun. Uusi sivu lisätään kopioimalla olemassa oleva sivu pohjaksi ja lisäämällä linkki valikkoon. Muutokset näkyvät heti.