Host server-side GTM voor een paar euro per maand
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!
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.(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
$ 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
$ docker swarm init --advertise-addr <private-ip-of-manager-node>
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
$ ufw allow 22/tcp
$ ufw allow 2376/tcp
$ ufw allow 7946/tcp
$ ufw allow 7946/udp
$ ufw allow 4789/udp
$ ufw reload
$ 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.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
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
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:
$ docker stack deploy -c <(docker-compose config) sGTM
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.