over mij

Host server-side GTM voor een paar euro per maand

20 September 2022 | 6 minuten lezen | Deel dit blog viaFacebook,LinkedIn,Twitter,WhatsApp
Server-side Google Tag Manager (sGTM) geeft je meer controle over je interne en externe dataflows. Je kan sGTM bijvoorbeeld inzetten als 'filterserver' (zie mijn vorige blog) tussen je website en de servers van Google Analytics. Standaard draait sGTM op het Google Cloud Platform (GCP). In productie kost je dit al snel zo’n 120 tot 300 euro per maand. Dit is niet persé te duur voor een grotere organisatie, maar voor deze website is het echt te kostbaar. Gelukkig is er ook de mogelijkheid om sGTM zelf te hosten. Dit biedt kansen, want een eigen server heb je al voor 3 á 7 euro per maand. Lastig te configureren? Nee hoor, in dit blog help ik je op weg!
docker
Foto van Rubaitul Azad (Unsplash)

Grofweg zijn er drie opties voor sGTM

Het inrichten van een eigen sGTM In dit blog ga ik ervan uit dat je weet wat 'server-side GTM' is. Bekijk dit blog in geval je op zoek bent naar de mogelijkheden van sGTM. server is geen rocket science, maar laat ik vooropstellen dat er makkelijkere opties beschikbaar zijn. Hieronder een overzicht van de opties.

(1) De (semi) automatische oplossing van Google … of Stape

Je kan je server gewoon plug en play met Google instellen. Dit kan door de server-side container op tagmanager.google.com aan te maken, en dan te kiezen voor de ‘automatische configuratie’’. Google regelt dan alles van a tot z. Jij hoeft alleen te zorgen voor de juiste domeinnaam.Minstens zo eenvoudig is Stape. Stape doet eigenlijk hetzelfde als Google, maar dan voor een fractie van de prijs. Bovendien is de interface van Stape heerlijk minimaal en intuïtief. Het instellen van je domein en zelfs een content delivery network (CDN) is in een paar stappen geregeld.
stape.io homepage
Stape is een service waarmee je sGTM relatief eenvoudig kan configureren.

(2) De semi handmatige oplossing: Specifiek public clouddiensten, zoals AWS Beanstalk

Je kan ook gebruikmaken van specifieke public clouddiensten. Het gaat dan om diensten als Azure App Service, AWS ECS, AWS Fargate, AWS Beanstalk, Google App Engine Overigens draait de 'automatische' sGTM oplossing ook in Google App Engine, maar je kan het uiteraard ook zelf configureren. Meer informatie hier. en Google Cloud Run. Dit zijn in feite allemaal diensten die nog net iets eenvoudiger zijn dan een VPS. Simo Ahava legt in een aantal blogs uit hoe je dit kan doen (hier, hier en hier).

(3) De volledig handmatige oplossing: VPS (virtual private server)

Met de vorige optie ben je vaak nog steeds gebonden aan de de ‘dure’ public cloud diensten. Het kan vaak nog net iets goedkoper wanneer je kiest om sGTM op een VPS te hosten. Met prijzen als die van het Duitse Contabo valt bijna niet te concurreren: maandelijks 4,99 voor 4 vCPU en 8 GB RAM. Maar vergeet ook niet de ‘reserved instance’ achtige deals van Azure, AWS en Google.In dit blog geef ik je een stappenplan voor de laatste optie. Kennis van de shell en Docker is een aanrader, maar (in de onderstaande happyflow) geen must!

Stap 1) Creëer een aantal VPS servers

Er zijn honderden, zo niet duizenden, VPS aanbieders. Hoe maak je een keuze voor een partij? Er zijn veel dingen om te overwegen: van de hoeveelheid vCPU, geheugen, opslagruimte, IOPS, server locatie, beschikbare bandbreedte, integraties met andere clouddiensten en de prijs. In dit geval gaan we voor Digital Ocean, omdat het afrekenen per uur erg voordelig is. Je kan de servers na deze try out gelijk weer vernietigen.In Digital Ocean gaan we voor:
  • 5 servers van 1 GB / 1 intel vCPU / 25 GB (shared cpu optie). Dit komt qua rekenkracht en redundancy aardig overeen met het advies van Google Google zegt daarover het volgende: "Each server is an App Engine instance with 1 vCPU, 0.5 GB memory, 10 GB disk in the Flexible environment. We recommend running a minimum of 3 servers to reduce the risk of data loss in case of a server outage. However, you may choose to run fewer (or more) servers. We expect that autoscaling 3-6 servers (the default) will handle 50-200 requests per second, though the performance will vary with the number of tags, and what those tags do." . Je zou echter ook voor 2-3 servers met meer rekenkracht kunnen gaan.
  • Onder Marketplace selecteer het ‘Docker Image’.
  • Stel ook een Virtual Private Cloud (VPC) in, zodat je servers onderling niet via het openbare net hoeven te communiceren.
  • Voeg ook een SSH sleutel toe, zodat je eenvoudig en veilig kan inloggen op je servers. Niet elke provider biedt de mogelijkheid om de sleutel gelijk bij het aanmaken toe te voegen. Lees deze informatie ingeval je een dergelijke server wil configureren.

Stap 2) Stel je Docker Swarm ‘manager node’ in

Google stelt sGTM beschikbaar als een Docker container. Om deze reden hebben we bij stap 1 ook gelijk Docker geïnstalleerd. Nu moet je Docker bij de meeste VPS aanbieders wel zelf installeren.We maken binnen de 'Docker suite' gebruik van Swarm. Met Docker Swarm kan je een aantal servers als 'nodes' aan elkaar verbinden, zodat hier bepaalde 'services' op kunnen worden gedraaid. Binnen de Swarm is er minimaal één 'manager node' die de verdeling van de services over de nodes orchestreert. Deze gaan we nu eerst aanmaken.We beginnen door in één van de servers te SSH’en (vervang het public IP!):
$ ssh root@174.138.14.207
Vervolgens stellen we de firewall in. Voor de manager node zijn dit volgende commands:
$ ufw allow 22/tcp
$ ufw allow 2376/tcp
$ ufw allow 2377/tcp
$ ufw allow 7946/tcp
$ ufw allow 7946/udp
$ ufw allow 4789/udp
$ ufw reload
Daarna moet je het private IP adres van je server erbij zoeken. Dit is redelijk eenvoudig door in het Digital Ocean dashboard naar het ‘vpc’ tabblad onder ‘networking’ te gaan. Vervolgens kan je de IP adressen vinden onder de 'resources' van je VPC. Tot slot stellen we de server nu echt in als ‘manager node’:
$ docker swarm init --advertise-addr <private-ip-of-manager-node>
Er wordt dan een commando in de console geprint. Bewaar deze tekst in Notepad of open een nieuw tablad (⌘+T/ CTRL+T) in je terminal open, terwijl je de huidige open laat staan.

Stap 3) Maak van de andere servers worker nodes

De andere 4 servers zullen fungeren als zogenaamde worker nodes. Je zult de volgende stappen dus moeten herhalen voor elke server.We beginnen met het SSH’en in de server (vervang wederom het publieke IP adres!):
$ ssh root@206.189.98.48
Daarna stellen we de firewall in:
$ ufw allow 22/tcp
$ ufw allow 2376/tcp
$ ufw allow 7946/tcp
$ ufw allow 7946/udp
$ ufw allow 4789/udp
$ ufw reload
Kopieer nu het uit stap 2 bewaarde commando naar commandine, welke er ongeveer als volgt uitziet:
$ docker swarm join --token <your-join-token> <private-ip-of-manager-node>:2377

Stap 4) Instellen van DNS records

Nu moet je jouw DNS records aanpassen, zodat er twee A records naar het publieke IP adres van je ‘manager node’ uit stap 1 verwijzen. Om het meeste uit sGTM te halen, zullen dit twee subdomeinen van je website moeten zijn. Bijvoorbeeld: tags.example.com en preview.example.com in het geval je website example.com is.
TransIP DNS records - franksblog.nl
De DNS records van een website in het TransIP dashboard als voorbeeld van hoe de subdomeinen dienen te verwijzen naar je 'manager node'.

Stap 5) Configuratie .env

We zijn er bijna. In deze stap gaan we dit GitHub repository clonen. Doe dit als volgt, terwijl je bent ingelogd in jouw manager node:
$ git clone https://github.com/frankdevlabs/sgtm-manual-server.git
Dan moeten we nog de twee subdomeinen en de 'container configuration string' als ‘environment variables’ toevoegen. Dit doen doen we met Vim
Niet iedereen gebruikt Vim, daarom volgt hier een korte toelichting. Voor de wijzigingen in het ".env"-bestand moet je de volgende handelingen in Vim uitvoeren:
  • Je gaat in 'insert' mode door 'A' te klikken;
  • Je voert je wijzigingen door (domeinnamen en container configuratie vervangen);
  • Je drukt op 'ESC';
  • Je drukt op ":",
  • Er opent een dialoog onder in het scherm. Hier voer je "wq" in (opslaan en sluiten)en je drukt op "Enter";
  • Klaar!
.
$ cd sgtm-manual-server
$ cp .env.template .env
$ vim .env
Goed om te weten: Je kan je sGTM configuratie string vinden op de pagina van je sGTM container.
GTM CONTAINER_CONFIG string
De GTM 'CONTAINER_CONFIG' string kan je hier vinden.

Stap 6) Deploy

In het bestand ‘docker-compose.yml’ staan de exacte services (+configuratie) welke noodzakelijk zijn. Dit zijn: (1) de tag server; (2) de preview server om je sGTM clients, tags etc. te debuggen; en (3) een Caddy proxyserver die automatisch de juiste TLS certificaten aanmaakt. Zie ook het bestand:
version: '3.9'
services:
  tag-server:
    image: 'gcr.io/cloud-tagging-10302018/gtm-cloud-image:stable'
    deploy:
      replicas: 3
      placement:
        max_replicas_per_node: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
    environment:
      - CONTAINER_CONFIG=$CONTAINER_CONFIG
      - PREVIEW_SERVER_URL=https://${PREVIEW_SERVER_DOMAIN}
      - RUN_AS_PREVIEW_SERVER=false

  preview-server:
    image: 'gcr.io/cloud-tagging-10302018/gtm-cloud-image:stable'
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    environment:
      - CONTAINER_CONFIG=$CONTAINER_CONFIG
      - RUN_AS_PREVIEW_SERVER=true

  proxy:
    image: caddy:2
    deploy:
      replicas: 1
      placement:
        constraints:
          - "node.role==manager"
      restart_policy:
        condition: on-failure
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - $PWD/proxy/Caddyfile:/etc/caddy/Caddyfile
      - $PWD/proxy/logs:/etc/logs
      - caddy:/data
    environment:
      TAG_SERVER_DOMAIN: $TAG_SERVER_DOMAIN
      PREVIEW_SERVER_DOMAIN: $PREVIEW_SERVER_DOMAIN

volumes:
  caddy:
Vanuit de projectmap (normaal is dit de map ‘sgtm-manual-server’) kan je de services met het volgende command opstarten:
$ docker stack deploy -c <(docker-compose config) sGTM
Geef het een paar minuten en alles zou moeten werken. Je kan dit testen met het volgende command:
curl https://tags.example.com/healthz

Conclusie

Het zelf hosten van sGTM is één van de opties naast:
  • een (semi) automatische configuratie in Google App Engine of een platform als Stape; en
  • een meer manuele oplossing (zoals AWS Beanstalk) in de public cloud van Google, Microsoft en Amazon.
Waarom zou je dan voor een eigen VPS willen gaan? Als je meer controle wil over de exacte configuratie, maar ook als je wil letten op de kosten. Digital Ocean komt uit op zo'n 35 euro per maand. Om nog voordeliger uit te zijn kan je gebruikmaken van een partij als Contabo (5-15 euro per maand voor 1-3 servers). Heb je relatief veel traffic en/of behoefte aan meer redunancy? Dan zou ik deze setup in productie uitbreiden met een CDN (bijvoorbeeld die van Fastly of Cloudflare) en een load balancer in plaats van de Caddy proxy.Succes met het maken van de keuzes voor jouw sGTM setup (of niet)!

Bronnen

Meer lezen?

Bekijk mijn andere blogs.

© 2021 Frank de Vries. Alle rechten voorbehouden
Privacy
RSS Feed