Internet & Applicaties

Google Cloud Shell


Als Nederlander ben ik dol op gratis dingen. En Google Cloud Shell is gratis. Als je een Google account hebt hoef je eigenlijk alleen maar akkoord te gaan met de voorwaarden en je kunt aan de slag met je eigen, gratis Virtual Private Server. Als je een Gmail adres hebt, dan heb je een Google account.
Laten we het meteen maar eens proberen:

Klaar Voor De Start


Ga met je favoriete browser naar shell.cloud.google.com. Als je nog niet ingelogd bent, kun je nu inloggen met je Google account. Daarvoor heb je dus je e-mailadres en wachtwoord nodig. En eventueel nog je 2 stap verificatie.

Opstarten

De eerste keer dat je inlogt duurt het even iets langer dan normaal. Op de achtergrond wordt een gloedje nieuwe virtuele machine voor je klaargemaakt. Op het moment van dit schrijven is het een Ubuntu 22.04 machine met een quad-core Intel Xeon processor, 16 GB aan RAM en 120 GB aan harde schijfruimte. En je hebt bijna volledige sudo rechten. Je kunt dus installeren wat je wilt.

Output van neofetch

Het scherm is opgedeeld in twee delen. Het bovenste deel bevat een editor die verdacht veel op Visual Studio Code lijkt. Daarmee kun je bestanden die in je home directory staan bewerken.
Het onderste deel van het scherm bevat de Linux terminal. Eigenlijk zit je meteen in een Tmux sessie. Als je weet wat dat is kun je daar dus meteen gebruik van maken. Weet je niet wat het is, dan zit het je op dit moment nog niet in de weg.

In het screenshot wat hier getoond wordt zie je de editor in het bovenste deel van de pagina, en de output van neofetch in de terminal. Neofetch is overigens standaard niet geïnstalleerd. Dus dat moet je zelf even doen als je dat ook wilt kunnen uitvoeren. Dat doe je door de volgende commando's uit te voeren:

sudo apt update
sudo apt install neofetch -y
neofetch

Overigens kun je de verdeling tussen de editor en de terminal zelf aanpassen door de drie puntjes in het midden onder aan de editor omhoog of omlaag te schuiven. Je kunt de editor of de terminal zelfs helemaal verbergen door op het blauw omcirkelde potloodje, of het terminal symbooltje bovenaan het scherm te klikken. Je kunt het verborgen deel daarna op dezelfde manier weer terug halen.
Het oogje, rechts naast het blauwe terminal symbool, kan gebruikt worden om een service, die je op je VPS gestart hebt, te bekijken in je browser. Het symbool rechts daarnaast kan gebruikt worden om te zien hoeveel tijd je deze week nog hebt om met je VPS te spelen.

Controle knoppen

De drie puntjes rechts bovenaan de pagina roepen een menu op waarmee je verschillende dingen kunt doen, zoals het herstarten van de machine, bestanden uploaden naar, of downloaden van je home directory, of opstarten in de veilige modus.

Beperkingen


Dit is een gratis virtuele server, bedoeld om van te leren en om de Google Cloud services mee te kunnen beheren. Die laatste kosten wel geld, dus dat gaan we niet doen. Maar leren is altijd leuk, en dat is geheel gratis. In het hele proces wordt nergens gerept over kosten of een creditcard of iets dergelijks. Een Google account is alles wat je nodig hebt.

Maar zoals altijd zit aan elk voordeel een nadeel. En het grootste nadeel is dat je de VPS niet eindeloos kunt laten draaien. Je krijgt 50 uur per week de tijd om er mee te spelen. Dat is meer dan 7 uur per dag, 7 dagen per week. Sluit je de pagina, dan wordt de server na ongeveer 20 minuten vernietigd, inclusief al je geïnstalleerde pakketten of containers.
Gelukkig krijg je wel een 5 GB grote home directory die niet vernietigd wordt. Dus als je de volgende keer terugkomt zijn al je instellingen en al je programmeerwerk nog gewoon beschikbaar. Tenzij je langer dan 120 dagen niets meer met je Google Cloud Shell gedaan hebt, want dan wordt ook de inhoud van je home directory weggegooid.
Kortom, alles wat op de 120 GB harde schijf van jouw VPS staat, wordt ongeveer 20 minuten nadat je je venster sluit weggegooid. Ook als je 20 minuten lang helemaal niets doet wordt de machine gereset.
Het leuke is dat bijvoorbeeld docker containers gedownload worden in de /opt directory. Die wordt weggegooid en telt dus niet mee in je 5 GB home directory opslag.

Een ander klein nadeel, vind ik, is dat de terminal in een webbrowser draait. Dat betekent dat sommige toetscombinaties niet werken. Bijvoorbeeld zoeken naar tekst in de editor nano doe je met Ctrl-W, maar die combinatie wordt door je browser afgevangen en tracht dan je pagina te sluiten. Voor nano kun je dan nog terugvallen op F6, wat hetzelfde doet als Ctrl-W. En zo zijn er nog meer beperkingen. Maar gelukkig heb je ook nog de editor in het bovenste deel van de pagina. Die werkt vele malen handiger dan nano. Maar ja, die kan alleen bestanden bewerken die in je home directory staan. Bestanden in bijvoorbeeld de /etc directory kunnen niet rechtstreeks bewerkt worden door deze editor.

Je kunt bijna alles doen wat je wilt met deze machine. Maar een ding kun je niet. Je kunt geen poorten openen/gebruiken/wijzigen onder de 2000. Bijvoorbeeld de ssh poort 22 kun je niet wijzigen. En het blijkt dat die ssh geen gebruik maakt van de echte ssh server op je VPS. Er zit een soort bastion server voor. Je kunt wel ssh-en naar je VPS, maar dan alleen met speciale Google cloud software, die je op je eigen computer moet installeren. Maar dat vind ik het doel van deze VPS voorbij gaan.
Ook kun je, als gratis gebruiker, geen poorten openen in de firewall. Maar er is wel een methode om bijvoorbeeld een webserver zichtbaar te maken, zodat je kunt spelen met webservers.

Het systeem is minimized. Dat wil zeggen dat de installatie compact gehouden is. Het nadeel daarvan is dat bijvoorbeeld de man pages niet geïnstalleerd zijn. De man pages zijn de gebruiksaanwijzing van de meeste linux commando's. Je kunt het commando unminize uitvoeren om de man pages alsnog te installeren, maar dat is een langdurig proces, wat dus na elke herstart van de machine herhaald moet worden. Als alternatief kun je de man pages ook via een webbrowser op het internet vinden op linux.die.net/man.

Wat Kun Je Er Allemaal Mee?


Het zal duidelijk zijn dat deze VPS geen vervanger kan zijn voor je home automation. Daarvoor zou hij 24/7 moeten kunnen draaien, en dat gaat niet lukken. Maar ik kan wel een aantal use-cases verzinnen, waar deze VPS heel erg handig voor kan zijn. Ik zal er hier een paar noemen, maar deze lijst is zeker niet beperkt tot deze toepassingen. Je eigen fantasie is de limiet, zoals altijd.

  • Leren omgaan met de Linux terminal. Het kunnen omgaan met, in ieder geval de meest basic commando's, is eigenlijk een must voor elke home automatiseerder. Hier heb je een mooie machine waar je op kunt oefenen. En het is moeilijk om deze machine (permanent) kapot te krijgen. (spoiler, mij is het wel gelukt.)
  • Leren programmeren. Als je een cursus programmeren volgt, online, uit een boek, vanaf Youtube, of hoe dan ook, dan kun je de oefeningen op deze VPS uitvoeren. Je hoeft niet bang te zijn dat je iets kapot maakt. Standaard zijn vele populaire programmeertalen al geïnstalleerd, zoals C, C++, Golang, Python en nog veel meer. Maar als jouw keuze er nog niet bij zit, dan heb je de vrijheid om deze zelf nog te installeren.
  • Experimenteren met web services. Ik kan me voorstellen dat je eerst even wil controleren of je zelf bedachte opzet werkelijk werkt, voordat je die gaat implementeren op je productieserver. Het is niet erg als je het op deze VPS verknoeit. Je kunt altijd met een schone lei opnieuw beginnen.
  • Experimenteren met Docker. De programma's docker en docker-compose zijn standaard al geïnstalleerd. Je kunt dus meteen beginnen.
  • Elke keer dat je de VPS opnieuw opstart is de kans groot dat je weer een ander publiek IP adres krijgt. Je hebt hiermee dus de beschikking over een willekeurig wegwerp IP adres. Je kunt via docker een webbrowser starten en dan gaan internetten vanaf je tijdelijke IP adres. In mijn geval draait mijn VPS steeds in Brussel. En bijvoorbeeld de domme Piraten Baai blokkade geldt niet voor deze VPS.
  • Installeer een VPN toepassing op deze server, en je kunt andere machines via deze machine laten internetten.
  • Installeer en experimenteer met Tailscale. Op die manier kun je elke andere machine in je Tailscale netwerk bereiken. Ook als je een keer niet thuis bent en bent aangewezen op iemand anders zijn/haar computer.
  • Je kunt je VPS ook als een bastion server gebruiken om op die manier je eigen servers op een veilige manier te kunnen bedienen via een webbrowser, waar je ook bent.

Google laat je bijna volledig vrij in wat je met de machine doet. Zo lang je er maar geen illegale dingen mee doet en er geen crypto mee gaat minen.

Hiermee ben ik aan het einde gekomen van de introductie. Het is nu aan jou om een toepassing voor je gloednieuwe VPS te verzinnen. Hierna komen nog een paar toepassingen waar ik regelmatig gebruik van maak.

Tailscale


Elders op mijn website probeer ik een lans te breken voor Tailscale. Tailscale heeft sinds 2023, toen ik Tailscale ontdekt heb, de manier waarmee ik met mijn computers en servers omga volledig veranderd.

Zou het niet mooi zijn wanneer we deze Google Shell server ook in ons eigen Tailscale netwerk kunnen integreren? Dan kunnen we wel via ssh inloggen naar die machine, zodat we geen last meer hebben van de ongemakken van de webbrowser. De webbrowser blijft nog wel nodig, anders wordt de machine na 20 minuten zonder pardon uitgeschakeld. Maar we kunnen de VPS gewoon gaan besturen via ssh.
Ook kunnen we op die manier services, waar we mee aan het experimenteren zijn, beschikbaar maken voor onszelf. En als we dat willen, zelfs voor de hele wereld.

Maar het installeren van Taislcale bleek iets ingewikkelder te zijn dan normaal. Een belangrijke oorzaak is dat de Google Cloud Shell geen gebruik maakt van Systemd, iets waar het Tailscale installatie script wel vanuit gaat. Het gevolg daarvan is dat de Tailscale daemon na de installatie niet automatisch in de achtergrond draait. Ik heb getracht dit via System V aan de gang te krijgen, maar om de een of andere reden blijft de start van de daemon hangen. Je kunt de daemon handmatig starten en in de achtergrond laten draaien. Maar dat is maar een lapmiddel.
Je moet ook bedenken dat de installatie van Tailscale volledig buiten de home directory om gaat. Dus na een systeem herstart is alles weer weg en moet je alles weer opnieuw installeren. Dat is natuurlijk te automatiseren met een script, maar makkelijk was het niet.

Toen ben ik maar de route van een Docker container gegaan. Met deze Docker container wordt dus Tailscale gestart en wordt automatisch ingelogd op mijn netwerk. De hele installatie is nu pijnloos. Alles wat ik nu moet doen als de machine start, is de docker-compose file starten en een paar seconden later is de machine beschikbaar in mijn netwerk.

Tip: Ik laat mijn Tailscale installatie ook als exit node fungeren. Op die manier kan ik met mijn telefoon net doen alsof ik in België ben.

Hieronder staat de stap voor stap uitleg hoe je Tailscale kunt gebruiken via Docker. Heb je nog nooit met Docker gewerkt? Geen nood, het is echt een fluitje van een cent.

We gaan Tailscale dus in een Docker container draaien. De opzet die ik hierbij gebruik is ietsje anders dan wat Tailscale voorstelt. In de originele versie wordt namelijk ook een service in de Tailscale container gestart, die dan dus bereikbaar wordt in je Tailscale netwerk. Mijn versie van de container heeft alleen maar als doel om de hele computer in mijn Tailscale netwerk toe te voegen.

Voorbereidingen

Normaal gesproken moet je een nieuw aangemelde computer handmatig aan je netwerk toevoegen en weer verwijderen. Omdat deze computer steeds maar kort leeft, is dat een beetje lastig. Daarom is er een andere methode bedacht die werkt met een OAUTH token. Laten we daar eerst maar mee beginnen.

Login op je Tailscale Admin Console. Klik op Acces controls bovenaan de pagina. Je krijgt dan een pagina te zien met een stukje json code. Niet schrikken, we gaan maar een klein stukje van die code aanpassen. Ongeveer bij regel 8 (ik kan niet garanderen dat dit regelnummer nooit zal wijzigen) staan een paar regels die uitgeschakeld zijn doordat er commentaarregels van gemaakt zijn door er // voor te zetten. Verander die regels als volgt:

    // Define the tags which can be applied to devices and by which users.
    "tagOwners": {
        "tag:container": ["autogroup:admin"],
    },

En klik dan onderaan de pagina op Save. We hebben nu een zogenaamde tag aangemaakt, met de naam container. De naam is niet zo spannend. Maar als je iets anders kiest, moet je dat verderop in deze beschrijving natuurlijk ook wijzigen.

Klik nu op Settings bovenaan de pagina. En kies dan in de linker kolom op OAuth clients. Klik dan op Generate OAuth client.

Je mag een beschrijving opgeven, maar dat hoeft niet. Maak er maar wat van. Selecteer nu het vakje Write op de regel Devices. Je krijgt dan wat extra opties te zien. Klik op Add tags en selecteer de tag naam die je daarnet hebt aangemaakt. In ons voorbeeld is dat dus container. Klik dan op Generate client.

Je krijgt nu een schermpje te zien met Client ID en Client secret erin. Wij zijn alleen geïnteresseerd in de Client secret. Kopieer deze naar je klembord. Let op! Zodra je op Done klikt wordt het token voor altijd onzichtbaar. Ben je hem kwijt, dan kun je de OAuth client gewoon wissen en weer een nieuwe aanmaken.

Sla het token tijdelijk even ergens op. Je hebt hem dadelijk nodig als we de Docker container gaan maken.

Tailscale Docker Container

Is dit je allereerste Docker container? Je zult versteld staan van het gemak waarmee dit werkt. Daar gaan we.

Ik zet mijn Docker beschrijvingen (docker-compose files) altijd in een verborgen directory in mijn home directory. Daarmee kan ik er heel gemakkelijk bij en staan ze me niet in de weg omdat de directory verborgen is. Heb je al ervaring met docker-compose, dan mag je jouw docker compose file zetten waar jij wil.
Maak twee nieuwe directories aan in je home directory. Dit doen we met een commando door middel van de -p optie.

mkdir -p .dc/tailscale

De .dc is dus de verborgen directory. Ik gebruik twee letters, dat is lekker kort. Hier staat dc dus voor docker compose. Dat moet gemakkelijk te onthouden zijn.

Ga nu in de zojuist gemaakte directory staan:

cd .dc/tailscale

Maak nu een bestand aan met de naam docker-compose.yml. Dit kun je met de grafische editor doen in de bovenste helft van het scherm natuurlijk. Je kunt het ook met nano of met vim doen. Of zelfs met emacs, als er nog iemand is die dat wil gebruiken. De inhoud die je in dat bestand moet plaatsen staat hieronder.

---
version: "3.7"
services:
 tailscale-nginx:
   image: tailscale/tailscale:latest
   hostname: gcs
   container_name: tailscale
   environment:
     - TS_AUTHKEY=${OAUTH_KEY}?ephemeral=false&preauthorized=true
     - TS_EXTRA_ARGS=--advertise-tags=tag:container --advertise-exit-node
     - TS_STATE_DIR=/var/lib/tailscale
     - TS_USERSPACE=false
   volumes:
     - ./state:/var/lib/tailscale
     - /dev/net/tun:/dev/net/tun
   network_mode: "host"
   cap_add:
     - net_admin
     - sys_module
   restart: unless-stopped

Het enige wat je misschien zou willen aanpassen is de hostname. Die heb ik gcs genoemd, van Google Cloud Shell. Maar je mag hier van maken wat je wil.
Sla dit bestand op. Onder vim doe je dat door op ESC te drukken en dan :wq in te typen.

Nu moeten we nog een bestand maken, met de naam .env. Dit is dus ook een verborgen bestand. Hierin komt je geheime token te staan, die we in de Tailscale Admin console gecreëerd hebben.
De inhoud van dit bestand ziet er zo uit:

OAUTH_KEY=tskey-client-blah-blah-blah-blah

Na het = teken komt dus jouw token. Daarna mag je dit bestand ook opslaan.

De container starten

Elke keer wanneer de machine uitgestaan heeft is de hele inhoud vernietigd. Alleen je home directory heeft dit overleefd. Dus gelukkig is ook je docker-compose file er nog. Voer de volgende twee commando's uit om de container te starten:

cd ~/.dc/tailscale
docker-compose up -d

Je ziet nu van alles gebeuren. In het kort komt het erop neer dat een aantal Docker images worden gedownload en uitgepakt. Als alles compleet is, wordt je container gestart. En dan zit je Google Cloud Shell machine in jouw netwerk.

Dus elke keer als de machine opnieuw is opgestart, hoef je alleen maar de bovenstaande twee commando's uit te voeren om de machine weer in je netwerk op te nemen.

Nabewerking

De Google Cloud Shell machine kan ook als exit node gebruikt worden. Maar dat moet je in de Tailscale Admin console nog wel even activeren.
Zoek in je machine overzicht naar je Google Cloud Shell machine en druk op de 3 puntjes aan de rechterkant van de regel. Selecteer daar Edit route settings. Zet dan een vinkje bij Use as exit node en klik op Save. Nu kun je de machine ook als exit node gebruiken door je andere machines. Daarmee kun je dus gebruikmaken van het wegwerp IP adres van je VPS.

Exit node

Opmerking: Je zult in de Edit route settings pagina een waarschuwing zien staan dat er wat instellingen niet kloppen, waardoor exit nodes wellicht niet werken. Maar dat mag je negeren. Het werkt gewoon wel.

Ssh naar de Google Cloud Shell machine


Je kunt de Google Cloud Shell machine nu dus gebruiken, net als elke andere machine in je Tailscale netwerk, waar ze zich ook mogen bevinden. Dat is heel fijn. Je kunt bijvoorbeeld vanaf je Google Cloud Shell machine op een andere machine in je netwerk inloggen via ssh. Maar andersom werkt het nog niet.
Dat komt door de ingebouwde firewall, die het vrije gebruik van poorten onder de 2000 beperkt.
De oplossing is dan ook de ssh server te verplaatsen naar bijvoorbeeld poort 2222, in plaats van de oorspronkelijke poort 22.

Bewerk het bestand /etc/ssh/sshd_config met het commando sudo vim /etc/ssh/sshd_config. Merk op dat je de mooie grafische editor in de bovenste helft van het scherm niet kunt gebruiken omdat die alleen bestanden in je home directory kan bereiken.

Ga nu een aantal regels naar beneden naar de regel waar Port 22 staat. Zodra je op die regel staat type dan de hoofdletter A. De cursor gaat daarmee aan het einde van regel staan en dan kun je 22 er achter typen, zodat er 2222 komt te staan. Druk vervolgens op ESC en type dan :wq om je wijziging op te slaan.

Nu moet je alleen de ssh server nog herstarten. Dat doe je als volgt:

sudo service ssh restart

De waarschuwingen die je dan te zien krijgt mag je negeren.

Nu zou je kunnen inloggen op je Google Cloud Server vanaf elke machine in je Tailscale netwerk. Maar voordat je dit echt kunt doen moet je de public ssh key van die machine nog wel even aan je ~/.ssh/authorized_keys bestand toevoegen, want inloggen met wachtwoord wordt niet ondersteund.
Inloggen doe je daarna alsvolgt:

ssh gebruikersnaam@gcs -p 2222

Opmerking: Omdat je nu een wijziging gemaakt hebt buiten je home directory, zal deze wijziging een machine herstart niet overleven. Dus elke keer als je de machine start zul je het poortnummer van de ssh server opnieuw moeten instellen. Maar dat kun je natuurlijk ook automatiseren.

Andere services


Je kunt ook andere services gaan draaien op je Google Cloud Server. Dat kunnen normale services zijn, zoals een nginx server. Maar dat kunnen ook Docker containers zijn.
Laten we als voorbeeld eens een Firefox browser in een container stoppen. Gewoon voor de lering en de vermaek.

Maak een nieuwe directory aan in je .dc directory

mkdir ~/.dc/firefox

Maak in die directory een bestand aan met de naam docker-compose.yml met de volgende inhoud:

---
version: "2.1"
services:
 firefox:
   image: lscr.io/linuxserver/firefox:latest
   container_name: firefox
   security_opt:
     - seccomp:unconfined #optional
   environment:
     - PUID=1000
     - PGID=1000
     - TZ=Europe/Amsterdam
     - CUSTOM_USER=x11
     - PASSWORD=1234


   volumes:
     - ./downloads:/config/Downloads
   ports:
     - 8000:3000   # HTTP
   shm_size: "1gb"


   restart: always

Je mag de CUSTOM_USER aanpassen naar wat je zelf wilt, in dit voorbeeld is de naam x11, ofwel ik zelf. Het wachtwoord mag je ook aanpassen. Maar dit hoeft niet uitermate geheim te zijn, want de server is alleen bereikbaar vanuit je eigen Tailscale netwerk, dus niet via het grote boze internet. Ook het poortnummer mag je aanpassen (het linker deel alleen!). Ik gebruik hier dus poort 8000.

En de container start je nu via de volgende twee regels:

cd ~/.dc/firefox
docker-compose up -d

Weer zul je van alles over je scherm zien schieten. En als alles klaar is, draait je Firefox als een webserver. Ga nu met je eigen browser naar http://gcs:8000 en na het invullen van je gebruikersnaam (x11) en je wachtwoord (1234) zit je in een webbrowser, in je webbrowser. Ga in die Firefox browser maar eens naar https://ip.me en je zult zien dat je ineens in Brussel bent (denk ik). In ieder geval is je IP adres heel anders dan je standaard IP adres.

Let op: doe dit dus in op een nieuw tabblad in je browser, zonder je Google Cloud Server tabblad te sluiten, anders wordt je machine na 20 minuten vernietigd.