Algemeen

Onderwerpen wat van toepassing zijn voor iedere gehoste applicatie.

De lokale e-mailserver

Op iedere beheerde applicatie-server is een SMTP mailserver geïnstalleerd waardoor de applicatie e-mails kan versturen (niet ontvangen). In dit artikel leggen we uit hoe je deze mailserver kan gebruiken.

Configuratie

In je gehoste applicatie kan je onderstaande configuratie gebruiken. De exacte locatie waar je dit in de applicatie doet, is afhankelijk van de applicatie. Kom je er niet uit, contacteer ons dan gerust.

E-mails worden geëncrypteerd verzonden

Je lokale mailserver verzend e-mails geëncrypteerd als de ontvangende mailserver dat toestaat. Als de ontvangende mailserver niet in staat is om geëncrypteerde e-mails te ontvangen, dan zal de e-mail niet geëncrypteerd verzonden worden.

SPF record aan je DNS toevoegen

SPF is een schakel in de strijd tegen spoofing. Voor meer informatie over SPF, zie Wikipedia. Afhankelijk hoe de SPF instellingen voor jouw domeinnaam ingesteld zijn, is het al dan niet noodzakelijk om je applicatie-server in je SPF record te vermelden. Wij raden aan om je applicatie-server steeds in je SPF record op te nemen.

Je applicatie is bereikbaar over zowel IPv4 als IPv6. Je lokale mailserver zal e-mails over beide protocollen versturen, dus het is noodzakelijk om zowel het IPv4 als het IPv6 adres in je SPF record op te nemen. Beide IP-adressen kan je eenvoudig achterhalen door een ping te sturen naar je applicatie-server. Bijvoorbeeld:

ping -4 clnXXX-prd-invoiceninja001.nexxwave.net
ping -6 clnXXX-prd-invoiceninja001.nexxwave.net

Beide IP-adressen voeg je aan je SPF record dan toe als ip4: en ip6:. Een geldig SPF record zou bijvoorbeeld kunnen zijn:

v=spf1 a ip4:49.12.218.40 ip6:2a01:4f8:c010:b8b3::1 include:_spf.google.com ~all

Een eigen SMTP server gebruiken

Wil je dat je applicatie e-mails via een eigen SMTP server verzend, dan kan je dat zelf in de applicatie aanpassen. Wanneer een applicatie niet toelaat om SMTP instellingen aan te passen, neem dan contact met ons op zodat we jouw mailserver als SMTP-relay kunnen instellen in de lokale mailserver.

Technische info

Reverse DNS

Voor een goede mailafhandeling is het noodzakelijk dat op DNS niveau 'reverse DNS' (rDNS) correct ingesteld is. Het rDNS record van jouw server verwijst steeds naar de hostname van je server, zoals bv clnXX-prd-invoiceninja001.nexxwave.net. Dit voor zowel het IPv4 A en het IPv6 AAAA record. Voor meer informatie over rDNS, zie Wikipedia. Dit stellen wij voor jou in, je hoeft hiervoor niets te ondernemen.

Gepland onderhoud en updates

Wij onderhouden de server waarop jouw applicatie draait. Daarvoor is het noodzakelijk dat we je server en de applicatie regelmatig updaten.

Updates van het besturingssysteem

Iedere week installeren we alle beschikbare updates van het besturingssysteem. Dit doen we steeds op maandagochtend tussen 05:00u en 07:00u. Wanneer de update een herstart van de server vereist, dan volgt deze herstart direct na het installeren van de updates. Een herstart is meestal enkel noodzakelijk wanneer bijvoorbeeld de Linux kernel geupdate werd.

Van deze updates merk je meestal niets; met uitzondering dat je applicatie enkele minuten niet bereikbaar zal zijn wanneer de server herstart moet worden.

Updates van de applicatie

De ontwikkelaar van je applicatie brengt ook regelmatig updates uit met als doel het toevoegen van nieuwe functionaliteit of het oplossen van bugs. We installeren deze applicatie updates steeds op maandagochtend tussen 07:00u en 09:00u.

Tijdens deze update zal je applicatie niet bereikbaar zijn. Meestal duurt dit slechts 5 tot 10 minuten.

Dringende veiligheidsupdates

Wanneer in een applicatie of in het besturingssysteem een kwetsbaarheid ontdekt wordt, dan moet die zo spoedig mogelijk gedicht worden. Dan zullen we daarvoor - onafhankelijk van de dag - een updatemoment voor inlassen. We trachten dit alsnog steeds in de vroege ochtend te plannen.

Meldingen van applicatie updates

Wanneer de ontwikkelaar een update uitbrengt van zijn applicatie wat jij gebruikt, dan installeren we deze zo spoedig mogelijk. Zie deze pagina met alle informatie over de updatemomenten van je server en applicatie.

Het versienummer ontleed

Alle applicaties hebben een versienummer. Dit versienummer bestaat uit drie elementen gescheiden door een punt, zoals bijvoorbeeld 24.8.13. Het eerste element geeft het 'major' level aan, het tweede element het 'minor' level en het derde element het 'patch' level, dus MAJOR.MINOR.PATCH.

Dit type van versienummering heet 'Semantic Versioning'. Wil je daar meer informatie over, neem dan een kijkje op semver.org.

Het updateproces

Wanneer van een applicatie een update wordt uitgebracht, dan installeren we deze eerst op een testserver. Als we geen problemen opmerken, dan installeren we de update tijdens een onderhoudsvenster op alle beheerde applicatie-servers.

Update meldingen via e-mail

Wanneer een applicatie een update krijgt waarbij het 'major' of het 'minor' element verhoogt wordt, dan sturen we jou een week op voorhand via e-mail als berichtgeving dat de applicatie op jouw server geupdate zal worden. We geven dan ook mee welke wijzigingen er van toepassing zijn en welke stappen jij eventueel moet ondernemen als voorbereiding op of na de update.

Wanneer de ontwikkelaar een 'patch' update uitbrengt, dan testen we de update maar we sturen hiervoor geen e-mail.

Technische specificaties van de servers

Onze applicaties bieden we aan in de pakketten 'standard' en 'plus'. De applicatie heeft in beide pakketten steeds exact dezelfde functionaliteit. Het verschil in beide pakketten zit in de hardware specificaties van de server.

Upgraden en downgraden

Upgraden

Wanneer je bij het bestelproces gekozen hebt voor een 'Standard' pakket, dan kan je dit steeds laten upgraden naar een 'Plus' pakket. Dit kan noodzakelijk zijn om bijvoorbeeld meer processor-kracht of meer RAM geheugen kunnen in te zetten, of om de opslagruimte te verhogen.

Downgraden

Als een server van het 'Standard' naar het 'Plus' pakket wordt geupgrade, dan heb je de keuze om enkel de processor (CPU) en het RAM-geheugen te upgraden, of ook de opslagruimte. Wanneer enkel processor en het RAM-geheugen geupgrade wordt, dan kan in de toekomst steeds een downgrade naar het 'Standard' pakket gebeuren. Wanneer ook de opslagruimte geupgrade werd, dan is een downgrade niet meer mogelijk.

Algemene specificaties

Onze virtuele machines worden gehost op servers waarbij de processor en het RAM-geheugen gedeeld worden met andere virtuele machines. Op aanvraag is het mogelijk om dedicated vCPU's en lokale NVMe SSD's te gebruiken.

Applicaties

In onderstaand overzicht volgt een beschrijving van de exacte server specificaties per applicatie en per pakket. De servers zijn steeds virtuele servers.

BookStack

Standard

Plus

Invoice Ninja

Standard

Plus

Mattermost

Standard

Plus

Snipe-IT

Standard

Plus

UniFi Network Application

Standard

Plus

Benchmarks

Onderstaande benchmarks werden uitgevoerd op een server met 2 vCPU's en 4 GB RAM-geheugen. Als opslagruimte werd Ceph gebruikt (wat zorgt voor 3x replicatie voor een uitstekende redundantie).

Opslagruimte

Om benchmarks op de opslagruimte uit te voeren, gebruikte we fio versie 3.25.

Write

We schreven 2GB (4 jobs van 512MB):

sudo fio --name=randwrite --ioengine=libaio --iodepth=1 --rw=randwrite --bs=4k --direct=0 --size=512M --numjobs=4 --runtime=240 --group_reporting

Dat gaf dit resultaat:

randwrite: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
...
fio-3.25
Starting 4 processes
randwrite: Laying out IO file (1 file / 512MiB)
randwrite: Laying out IO file (1 file / 512MiB)
randwrite: Laying out IO file (1 file / 512MiB)
randwrite: Laying out IO file (1 file / 512MiB)
Jobs: 1 (f=1): [_(2),w(1),_(1)][100.0%][w=6024KiB/s][w=1506 IOPS][eta 00m:00s]
randwrite: (groupid=0, jobs=4): err= 0: pid=590583: Sun Oct  3 10:48:09 2021
  write: IOPS=2829, BW=11.1MiB/s (11.6MB/s)(2048MiB/185261msec); 0 zone resets
    slat (usec): min=3, max=668211, avg=1395.72, stdev=9463.50
    clat (nsec): min=676, max=12025k, avg=1943.49, stdev=24278.50
     lat (usec): min=4, max=668224, avg=1397.97, stdev=9465.38
    clat percentiles (nsec):
     |  1.00th=[   700],  5.00th=[   716], 10.00th=[   724], 20.00th=[   884],
     | 30.00th=[   972], 40.00th=[  1224], 50.00th=[  1480], 60.00th=[  1896],
     | 70.00th=[  1976], 80.00th=[  2064], 90.00th=[  2576], 95.00th=[  3056],
     | 99.00th=[ 11072], 99.50th=[ 12736], 99.90th=[ 33536], 99.95th=[ 50944],
     | 99.99th=[112128]
   bw (  KiB/s): min= 1996, max=544976, per=100.00%, avg=11448.16, stdev=7035.72, samples=1461
   iops        : min=  498, max=136244, avg=2861.88, stdev=1758.93, samples=1461
  lat (nsec)   : 750=13.04%, 1000=19.11%
  lat (usec)   : 2=41.36%, 4=22.98%, 10=1.98%, 20=1.36%, 50=0.13%
  lat (usec)   : 100=0.04%, 250=0.01%, 500=0.01%, 750=0.01%, 1000=0.01%
  lat (msec)   : 2=0.01%, 10=0.01%, 20=0.01%
  cpu          : usr=0.32%, sys=1.18%, ctx=15379, majf=0, minf=48
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,524288,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: bw=11.1MiB/s (11.6MB/s), 11.1MiB/s-11.1MiB/s (11.6MB/s-11.6MB/s), io=2048MiB (2147MB), run=185261-185261msec

Disk stats (read/write):
  sda: ios=2/309414, merge=0/15921, ticks=4/6052273, in_queue=6053606, util=99.96%

Read

We lazen 2GB (4 jobs van 512MB):

sudo fio --name=randread --ioengine=libaio --iodepth=16 --rw=randread --bs=4k --direct=0 --size=512M --numjobs=4 --runtime=240 --group_reporting

Dat gaf dit resultaat:

randread: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=16
...
fio-3.25
Starting 4 processes
randread: Laying out IO file (1 file / 512MiB)
randread: Laying out IO file (1 file / 512MiB)
randread: Laying out IO file (1 file / 512MiB)
randread: Laying out IO file (1 file / 512MiB)
Jobs: 1 (f=1): [_(2),r(1),_(1)][100.0%][r=9.92MiB/s][r=2538 IOPS][eta 00m:00s]
randread: (groupid=0, jobs=4): err= 0: pid=590607: Sun Oct  3 10:53:37 2021
  read: IOPS=2873, BW=11.2MiB/s (11.8MB/s)(2048MiB/182482msec)
    slat (usec): min=419, max=634150, avg=1375.53, stdev=3978.29
    clat (usec): min=4, max=695277, avg=20788.95, stdev=16323.28
     lat (usec): min=666, max=696360, avg=22165.82, stdev=16912.00
    clat percentiles (msec):
     |  1.00th=[   13],  5.00th=[   14], 10.00th=[   14], 20.00th=[   15],
     | 30.00th=[   16], 40.00th=[   17], 50.00th=[   18], 60.00th=[   19],
     | 70.00th=[   20], 80.00th=[   22], 90.00th=[   28], 95.00th=[   40],
     | 99.00th=[   91], 99.50th=[  126], 99.90th=[  194], 99.95th=[  255],
     | 99.99th=[  502]
   bw (  KiB/s): min= 3249, max=15859, per=100.00%, avg=11553.01, stdev=518.40, samples=1450
   iops        : min=  812, max= 3964, avg=2888.05, stdev=129.59, samples=1450
  lat (usec)   : 10=0.01%, 750=0.01%, 1000=0.01%
  lat (msec)   : 2=0.01%, 4=0.01%, 10=0.01%, 20=72.28%, 50=24.59%
  lat (msec)   : 100=2.32%, 250=0.74%, 500=0.04%, 750=0.01%
  cpu          : usr=1.21%, sys=5.62%, ctx=527293, majf=0, minf=120
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=100.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.1%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=524288,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=16

Run status group 0 (all jobs):
   READ: bw=11.2MiB/s (11.8MB/s), 11.2MiB/s-11.2MiB/s (11.8MB/s-11.8MB/s), io=2048MiB (2147MB), run=182482-182482msec

Disk stats (read/write):
  sda: ios=524172/389, merge=0/280, ticks=684886/3732, in_queue=690009, util=100.00%

Random read/write

sudo fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=random_read_write.fio --bs=4k --iodepth=64 --size=4G --readwrite=randrw --rwmixread=75

Dat gaf dit resultaat:

h=64 --size=4G --readwrite=randrw --rwmixread=75
test: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
fio-3.25
Starting 1 process
test: Laying out IO file (1 file / 4096MiB)
Jobs: 1 (f=1): [m(1)][100.0%][r=11.7MiB/s,w=4192KiB/s][r=3003,w=1048 IOPS][eta 00m:00s]
test: (groupid=0, jobs=1): err= 0: pid=590627: Sun Oct  3 10:59:52 2021
  read: IOPS=3000, BW=11.7MiB/s (12.3MB/s)(3070MiB/261937msec)
   bw (  KiB/s): min=11360, max=14376, per=100.00%, avg=12016.69, stdev=126.45, samples=523
   iops        : min= 2840, max= 3594, avg=3004.12, stdev=31.63, samples=523
  write: IOPS=1002, BW=4011KiB/s (4107kB/s)(1026MiB/261937msec); 0 zone resets
   bw (  KiB/s): min= 3416, max= 5104, per=100.00%, avg=4016.23, stdev=232.28, samples=523
   iops        : min=  854, max= 1276, avg=1003.96, stdev=58.14, samples=523
  cpu          : usr=4.74%, sys=19.91%, ctx=755757, majf=0, minf=8
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
     issued rwts: total=785920,262656,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: bw=11.7MiB/s (12.3MB/s), 11.7MiB/s-11.7MiB/s (12.3MB/s-12.3MB/s), io=3070MiB (3219MB), run=261937-261937msec
  WRITE: bw=4011KiB/s (4107kB/s), 4011KiB/s-4011KiB/s (4107kB/s-4107kB/s), io=1026MiB (1076MB), run=261937-261937msec

Disk stats (read/write):
  sda: ios=785846/263003, merge=0/369, ticks=14976854/1709153, in_queue=16694514, util=100.00%

Netwerk

We voerden een speedtest uit vanaf een server in Falkenstein naar een server in Frankfurt.

speedtest

Dat gaf dit resultaat:

Retrieving speedtest.net configuration...
Testing from Hetzner Online GmbH (23.88.112.79)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by RETN (Frankfurt) [0.31 km]: 6.031 ms
Testing download speed..................................................
Download: 2181.90 Mbit/s
Testing upload speed....................................................
Upload: 1923.87 Mbit/s

Processor

We voerden een sysbench test uit met versie 1.0.20.

sysbench cpu --threads=2 run

Dat gaf dit resultaat:

sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)

Running the test with following options:
Number of threads: 2
Initializing random number generator from current time


Prime numbers limit: 10000

Initializing worker threads...

Threads started!

CPU speed:
    events per second:  1792.00

General statistics:
    total time:                          10.0013s
    total number of events:              17927

Latency (ms):
         min:                                    1.04
         avg:                                    1.11
         max:                                    8.92
         95th percentile:                        1.30
         sum:                                19967.00

Threads fairness:
    events (avg/stddev):           8963.5000/22.50
    execution time (avg/stddev):   9.9835/0.01