Hur man kopplar ihop GitLab och Pantheon och optimerar arbetsflöden Drupal О WordPress

Hur man kopplar ihop GitLab och Pantheon och optimerar arbetsflöden Drupal О WordPress
VÄr gÀst, utvecklarverktygsskaparen Pantheon, pratar om hur man automatiserar implementeringar. WordPress med hjÀlp av GitLab CI/CD.

В Pantheon Jag arbetar med utvecklarrelationer, sĂ„ jag letar alltid efter nya sĂ€tt att hjĂ€lpa utvecklare. WordPress Đž Drupal Lös automatiseringsproblem i arbetsflöden. För att göra detta Ă€lskar jag att experimentera med nya verktyg och kombinera dem för att uppnĂ„ större effektivitet.

Jag ser ofta utvecklare som kÀmpar med en enda mellanlagringsserver.

Det Àr ett nöje att vÀnta pÄ din tur att anvÀnda en mellanliggande server eller skicka en webbadress till klienter med anteckningen: "Titta hÀr, men titta inte hÀr Ànnu."

Multidev-miljöer - ett av de coola Pantheon-verktygen - löser detta problem, för med dem kan du skapa miljöer för Git-grenar pĂ„ begĂ€ran. Varje multidev-miljö har sin egen URL och databas, sĂ„ utvecklare kan arbeta tyst, kontrollera kvalitet och fĂ„ godkĂ€nnande utan att trampa varandra pĂ„ tĂ„rna.

Men Pantheon har inga verktyg för versionskontroll eller kontinuerlig integration och distribution (CI/CD). Men det Àr en flexibel plattform med vilken du kan integrera alla verktyg.

Jag mÀrkte ocksÄ att team anvÀnder vissa verktyg för utveckling och olika för montering och driftsÀttning.

De har till exempel olika verktyg för versionskontroll och CI/CD. Du mÄste fiffla runt och vÀxla mellan verktyg för att redigera kod och diagnostisera problem.

PÄ GitLab det finns en komplett uppsÀttning utvecklingsverktyg: för versionskontroll, biljetter, sammanslagningsförfrÄgningar, en klassens bÀsta CI/CD-pipeline, ett containerregister och allt sÄdant. Jag har Ànnu inte stött pÄ en applikation som erbjuder sÄ mycket för att hantera ditt utvecklingsarbetsflöde.

Jag Àlskar automation, sÄ jag lÀrde mig hur man kopplar Pantheon till GitLab sÄ att commits till huvudgrenen pÄ GitLab distribueras till huvudutvecklingsmiljön i Pantheon. Och sammanslagningsförfrÄgningar pÄ GitLab kan skapa och distribuera kod till multidev-miljöer i Pantheon.

I den hÀr guiden visar jag hur du skapar en koppling mellan GitLab och Pantheon och optimerar ditt arbetsflöde. WordPress О Drupal.

Visst Àr det möjligt, spegel GitLab-förrÄdet, men vi kommer att göra allt med vÄra hÀnder för att fördjupa oss i GitLab CI och i framtiden anvÀnda detta verktyg inte bara för distribution.

Inledning

För det hÀr inlÀgget mÄste du förstÄ att Pantheon delar upp varje webbplats i tre element: kod, databas och filer.

Koden innehÄller CMS-filer som kÀrnan, plugins och teman. WordPressDessa filer hanteras i Git repositories, vÀrd av Pantheon, vilket betyder att vi kan distribuera kod frÄn GitLab till Pantheon med Git.
Filer i Pantheon Àr mediafiler, det vill sÀga bilder för webbplatsen. Vanligtvis laddas de upp av anvÀndare och Git ignorerar dem.

Skapa ett gratis konto, ta reda pÄ mer om Pantheon arbetsflöde eller registrera dig för en demo pÄ pantheon.io.

Antaganden

Mitt projekt om Pantheon och GitLab heter pantheon-gitlab-blog-demoProjektnamnet mÄste vara unikt. Vi kommer att arbeta med en webbplats hÀr. WordPressDu kan ta det ocksÄ Drupal, men vissa saker kommer att behöva Àndras.

jag kommer anvÀnda Git kommandoradoch du kan jobba i grafiskt grÀnssnitt, om du vill.

Skapa ett projekt

LÄt oss först skapa GitLab-projekt (vi Äterkommer till detta senare).

Nu vi skapar en webbplats WordPress pÄ PantheonSedan installerar vi det. WordPress för webbplatsens instrumentpanel.

Om dina hÀnder kliar efter att Àndra nÄgot, till exempel ta bort eller lÀgga till plugins, ha tÄlamod. Sajten Àr Ànnu inte ansluten till GitLab, och vi vill att alla kodÀndringar ska gÄ via GitLab.

NÀr ska vi installera det? WordPress, ÄtergÄ till Pantheons webbplats instrumentpanel och Àndra utvecklingslÀget till Git.

Hur man kopplar ihop GitLab och Pantheon och optimerar arbetsflöden Drupal О WordPress

Initial commit pÄ GitLab

Nu behöver du överföra den ursprungliga koden WordPress FrÄn Pantheons webbplats till GitLab. För att göra detta klonar vi koden frÄn Pantheons webbplats Git-repository lokalt och skickar den sedan till GitLab-repositoryt.

För att göra det enklare och sÀkrare, lÀgg till en SSH-nyckel till Pantheon och vi behöver inte ange ett lösenord varje gÄng vi klona ett Pantheon Git-förrÄd. Redan samtidigt lÀgg till en SSH-nyckel till GitLab.

För att göra detta, klona Pantheon-webbplatsen lokalt genom att kopiera kommandot frÄn fÀltet Clone with Git pÄ webbplatsens instrumentpanel.

Hur man kopplar ihop GitLab och Pantheon och optimerar arbetsflöden Drupal О WordPress
Om du behöver hjÀlp, lÀs dokumentationen komma igÄng med Git för Pantheon.

Nu ska vi Ă€ndra oss git remote originatt peka pĂ„ GitLab istĂ€llet för Pantheon. Det kan göras ĐșĐŸĐŒĐ°ĐœĐŽĐŸĐč git remote.

LÄt oss gÄ till GitLab-projektet och kopiera arkivets URL frÄn rullgardinsmenyn Clone pÄ sidan med projektdetaljer. LÄt oss vÀlja alternativet Clone with SSH, eftersom vi redan har konfigurerat SSH-nyckeln.

Hur man kopplar ihop GitLab och Pantheon och optimerar arbetsflöden Drupal О WordPress

Som standard git remote för en lokal kopia av kodförrĂ„det - origin. Detta kan Ă€ndras c git remote set-url origin [URL Ń€Đ”ĐżĐŸĐ·ĐžŃ‚ĐŸŃ€ĐžŃ GitLab], dĂ€r vi istĂ€llet för parenteser anger den faktiska URL:en.

Äntligen lanserar vi git push origin master --forceatt skicka koden WordPress frĂ„n Pantheons webbplats pĂ„ GitLab.

Alternativet –force behövs bara en gĂ„ng. Sedan i lag git push det kommer inte att finnas pĂ„ GitLab.

StÀlla in autentiseringsuppgifter och variabler

Kommer du ihÄg hur vi la till en SSH-nyckel lokalt för att logga in pÄ Pantheon och GitLab? SSH-token kan anvÀndas för att auktorisera GitLab och Pantheon.

GitLab har utmÀrkt dokumentation. LÄt oss se avsnitt om SSH-nycklar nÀr du anvÀnder Docker-exekutorn i dokumentet om anvÀndning av SSH-nycklar med GitLab CI/CD.

Vi kommer nu att slutföra de tvÄ första stegen: LÄt oss skapa ett nytt SSH-nyckelpar lokalt med ssh-keygen och lÀgga till den privata nyckeln som en variabel i projektet.

DĂ„ frĂ„gar vi SSH_PRIVATE_KEY ĐșаĐș GitLab CI/CD miljövariabel i projektinstĂ€llningarna.
I det tredje och fjÀrde steget kommer vi att skapa en fil .gitlab-ci.yml med innehÄll som detta:

before_script:
  # See https://docs.gitlab.com/ee/ci/ssh_keys/README.html
  - eval $(ssh-agent -s)
  - echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add - > /dev/null
  - mkdir -p $HOME/.ssh && echo "StrictHostKeyChecking no" >> "$HOME/.ssh/config"
  - git config --global user.email "$GITLAB_USER_EMAIL"
  - git config --global user.name "Gitlab CI"

LÄt oss inte begÄ filen Ànnu .gitlab-ci.yml, dÄ mÄste du lÀgga till nÄgot annat till den.

Nu utför vi det femte steget och lÀgg till den publika nyckeln som du skapade i det första steget till de tjÀnster som du behöver Ätkomst till i byggmiljön.

I vÄrt fall vill vi komma Ät Pantheon frÄn GitLab. Vi följer instruktionerna i Pantheon-dokumentet pÄ lÀgga till en SSH-nyckel till Pantheon och utför detta steg.

Kom ihÄg: privat SSH finns i GitLab, öppen SSH Àr i Pantheon.

LÄt oss stÀlla in nÄgra fler miljövariabler. Den första heter PANTHEON_SITE. Dess vÀrde Àr namnet pÄ Pantheon-webbplatsen pÄ din maskin.

Namnet pÄ maskinen Àr listat i slutet av kommandot Clone with Git. Du har redan klonat platsen lokalt, sÄ detta kommer att vara namnet pÄ den lokala arkivkatalogen.

Hur man kopplar ihop GitLab och Pantheon och optimerar arbetsflöden Drupal О WordPress

LÄt oss sedan stÀlla in miljövariabeln PANTHEON_GIT_URL. Detta Àr Git-repository URL för Pantheon-webbplatsen som vi redan har anvÀnt.

Ange endast SSH-förvarets URL, utan git clone och namnet pÄ platsen pÄ maskinen i slutet.

Puh. Det Àr klart, nu kan vi avsluta vÄr fil .gitlab-ci.yml.

Skapa en distributionsuppgift

Det vi till en början kommer att göra med GitLab CI Àr mycket likt det vi har gjort med Git-repositories tidigare. Men den hÀr gÄngen, lÄt oss lÀgga till Pantheon-förvaret som en andra fjÀrrstyrd Git-kÀlla och sedan skicka koden frÄn GitLab till Pantheon.

För att göra detta, lÄt oss konfigurera stadium deploy О uppgift deploy:dev, eftersom vi kommer att distribuera till utvecklingsmiljön pÄ Pantheon. Den resulterande filen .gitlab-ci.yml Det ser ut sÄ hÀr:

stages:
- deploy

before_script:
  # See https://docs.gitlab.com/ee/ci/ssh_keys/README.html
  - eval $(ssh-agent -s)
  - echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add - > /dev/null
  - mkdir -p $HOME/.ssh && echo "StrictHostKeyChecking no" >> "$HOME/.ssh/config"
  - git config --global user.email "$GITLAB_USER_EMAIL"
  - git config --global user.name "Gitlab CI"

deploy:dev:
  stage: deploy
  environment:
    name: dev
    url: https://dev-$PANTHEON_SITE.pantheonsite.io/
  script:
    - git remote add pantheon $PANTHEON_GIT_URL
    - git push pantheon master --force
  only:
    - master

variabler SSH_PRIVATE_KEY, PANTHEON_SITE О PANTHEON_GIT_URL borde se bekant ut - vi har stÀllt in dessa miljövariabler tidigare. Med dessa variabler kommer vi att kunna anvÀnda vÀrdena i filen .gitlab-ci.yml mÄnga gÄnger, och de behöver bara uppdateras pÄ ett stÀlle.

Slutligen, lÀgg till, commit och skicka filen .gitlab-ci.yml pÄ GitLab.

Kontrollerar distributionen

Om vi ​​gjorde allt rĂ€tt, uppgiften deploy:dev kommer att köras framgĂ„ngsrikt i GitLab CI/CD och skickar en commit .gitlab-ci.yml vid Pantheon. LĂ„t oss ta en titt.

Hur man kopplar ihop GitLab och Pantheon och optimerar arbetsflöden Drupal О WordPress

Hur man kopplar ihop GitLab och Pantheon och optimerar arbetsflöden Drupal О WordPress

Hur man kopplar ihop GitLab och Pantheon och optimerar arbetsflöden Drupal О WordPress

Skickar sammanslagningsförfrÄganstrÄdar till Pantheon

HĂ€r kommer vi att anvĂ€nda min favorit Pantheon-funktion − multidev, dĂ€r du kan skapa ytterligare Pantheon-miljöer för Git-grenar pĂ„ begĂ€ran.

TillgÄngen till multidev Àr begrÀnsad, sÄ det hÀr avsnittet kan hoppas över. Men om du har tillgÄng kan du pÄ allvar öka produktiviteten genom att stÀlla in automatiskt skapande av multidev-miljöer pÄ Pantheon frÄn GitLab sammanslagningsförfrÄgningar.

LÄt oss först skapa en ny Git-gren lokalt med hjÀlp av git checkout -b multidev-support. Nu ska vi Àndra nÄgot igen .gitlab-ci.yml.

Jag gillar att inkludera numret för sammanslagningsförfrÄgan i Pantheon-miljöns namn. Till exempel Àr den första sammanslagningsbegÀran mr-1, andra - mr-2 etc.

SammanslagningsbegÀran Àndras, sÄ vi mÄste dynamiskt bestÀmma Pantheon-grennamnen. Det Àr enkelt pÄ GitLab - du behöver bara anvÀnda fördefinierade miljövariabler.

Vi kan ta $CI_MERGE_REQUEST_IIDför att ange sammanslagningsbegÀrans nummer. LÄt oss tillÀmpa allt detta tillsammans med de globala miljövariablerna vi angav tidigare och lÀgga till en ny deploy:multidev-uppgift i slutet av filen .gitlab-ci.yml.

deploy:multidev:
  stage: deploy
  environment:
    name: multidev/mr-$CI_MERGE_REQUEST_IID
    url: https://mr-$CI_MERGE_REQUEST_IID-$PANTHEON_SITE.pantheonsite.io/
  script:
    # Checkout the merge request source branch
    - git checkout $CI_COMMIT_REF_NAME
    # Add the Pantheon git repository as an additional remote
    - git remote add pantheon $PANTHEON_GIT_URL
    # Push the merge request source branch to Pantheon
    - git push pantheon $CI_COMMIT_REF_NAME:mr-$CI_MERGE_REQUEST_IID --force
  only:
    - merge_requests

Det kommer att likna vÄr uppgift deploy:dev, bara grenen skickas till Pantheon, inte till master.

Vi har lagt till och överfört den uppdaterade filen .gitlab-ci.yml, och nu skjuter vi en ny gren till GitLab med git push -u origin multidev-support.

LÄt oss nu skapa en ny sammanfogningsförfrÄgan frÄn grenen multidev-supportgenom att trycka Skapa sammanslagningsförfrÄgan.

Hur man kopplar ihop GitLab och Pantheon och optimerar arbetsflöden Drupal О WordPress

Efter att ha skapat en sammanslagningsförfrÄgan tittar vi pÄ hur CI/CD-uppgiften exekveras deploy:multidev.

Hur man kopplar ihop GitLab och Pantheon och optimerar arbetsflöden Drupal О WordPress

Titta, en ny trÄd har skickats till Pantheon. Men om vi gÄr till multidev-sektionen pÄ Pantheon-webbplatsens instrumentpanel kommer vi inte att se den nya miljön dÀr

Hur man kopplar ihop GitLab och Pantheon och optimerar arbetsflöden Drupal О WordPress

LÄt oss titta pÄ Git Branches-sektionen.

Hur man kopplar ihop GitLab och Pantheon och optimerar arbetsflöden Drupal О WordPress

Som ett resultat, vÄr trÄd mr-1 kom till Pantheon. LÄt oss skapa en miljö frÄn en gren mr-1.

Hur man kopplar ihop GitLab och Pantheon och optimerar arbetsflöden Drupal О WordPress

Vi har skapat en multidev-miljö, lÄt oss nu gÄ tillbaka till GitLab och titta pÄ avsnittet Verksamhet > Miljöer. Vi kommer att se bidrag för dev О mr-1.

Det beror pĂ„ att vi har lagt till en post environment Med namn name Đž url till CI/CD-uppgifter. Om vi ​​klickar pĂ„ ikonen för öppen miljö kommer vi att tas till URL:en för multidev-miljön pĂ„ Pantheon.

Automatisera skapandet av multidev

I princip kan du stanna hÀr och bara komma ihÄg att skapa en multidev-miljö för varje sammanslagningsförfrÄgan, men denna process kan automatiseras.

Pantheon har ett kommandoradsverktyg Terminus, dÀr du kan arbeta med plattformen automatiskt. Terminus lÄter dig skapa multidev-miljöer frÄn kommandoraden - perfekt för GitLab CI.

Vi behöver en ny sammanslagningsförfrÄgan för att testa detta. LÄt oss skapa en ny gren med hjÀlp av git checkout -b auto-multidev-creation.

För att anvÀnda Terminus i GitLab CI/CD-uppgifter behöver du en maskintoken för autentisering med Terminus och en containerbild med Terminus.

Skapa en Pantheon Machine Token, spara den pÄ en sÀker plats och lÀgg till den som en global miljövariabel i GitLab med namnet PANTHEON_MACHINE_TOKEN.

Om du har glömt hur du lÀgger till GitLab-miljövariabler, gÄ tillbaka till dÀr vi definierade PANTHEON_SITE.

Skapa en Dockerfil med Terminus

Om du inte anvÀnder Docker eller inte gillar filer Dockerfile, ta min bild registry.gitlab.com/ataylorme/pantheon-gitlab-blog-demo:latest och hoppa över det hÀr avsnittet.

GitLab har ett containerregister, dÀr vi kan bygga och placera Dockerfilen för vÄrt projekt. LÄt oss skapa en Dockerfil med Terminus för att arbeta med Pantheon.

Terminus Àr ett PHP-kommandoradsverktyg, sÄ lÄt oss börja med PHP-bilden. Jag installerar Terminus genom Composer, sÄ jag anvÀnder officiell Docker Composer-bild. Vi skapar Dockerfile i den lokala arkivkatalogen med följande innehÄll:

# Use the official Composer image as a parent image
FROM composer:1.8

# Update/upgrade apk
RUN apk update
RUN apk upgrade

# Make the Terminus directory
RUN mkdir -p /usr/local/share/terminus

# Install Terminus 2.x with Composer
RUN /usr/bin/env COMPOSER_BIN_DIR=/usr/local/bin composer -n --working-dir=/usr/local/share/terminus require pantheon-systems/terminus:"^2"

Följ instruktionerna för att montera och skicka bilder frĂ„n avsnittet Bygg och skjut bilder ĐČ containerregisterdokumentationatt samla en bild frĂ„n Dockerfile och skjut den till GitLab.

Öppna avsnittet register i GitLab-projektet. Om allt gick enligt planerna kommer vĂ„r image att finnas dĂ€r. Skriv ner en lĂ€nk till bildtaggen - vi behöver den till filen .gitlab-ci.yml.

Hur man kopplar ihop GitLab och Pantheon och optimerar arbetsflöden Drupal О WordPress

Avsnitt script i problemet deploy:multidev börjar vÀxa, sÄ lÄt oss flytta den till en separat fil. Skapa en ny fil private/multidev-deploy.sh:

#!/bin/bash

# Store the mr- environment name
export PANTHEON_ENV=mr-$CI_MERGE_REQUEST_IID

# Authenticate with Terminus
terminus auth:login --machine-token=$PANTHEON_MACHINE_TOKEN

# Checkout the merge request source branch
git checkout $CI_COMMIT_REF_NAME

# Add the Pantheon Git repository as an additional remote
git remote add pantheon $PANTHEON_GIT_URL

# Push the merge request source branch to Pantheon
git push pantheon $CI_COMMIT_REF_NAME:$PANTHEON_ENV --force

# Create a function for determining if a multidev exists
TERMINUS_DOES_MULTIDEV_EXIST()
{
    # Stash a list of Pantheon multidev environments
    PANTHEON_MULTIDEV_LIST="$(terminus multidev:list ${PANTHEON_SITE} --format=list --field=id)"

    while read -r multiDev; do
        if [[ "${multiDev}" == "$1" ]]
        then
            return 0;
        fi
    done <<< "$PANTHEON_MULTIDEV_LIST"

    return 1;
}

# If the mutltidev doesn't exist
if ! TERMINUS_DOES_MULTIDEV_EXIST $PANTHEON_ENV
then
    # Create it with Terminus
    echo "No multidev for $PANTHEON_ENV found, creating one..."
    terminus multidev:create $PANTHEON_SITE.dev $PANTHEON_ENV
else
    echo "The multidev $PANTHEON_ENV already exists, skipping creating it..."
fi

Skriptet finns i en privat katalog och tillÄter inte webbÄtkomst till Pantheon. Vi har ett skript för vÄr multidev-logik. LÄt oss nu uppdatera avsnittet deploy:multidev fil .gitlab-ci.ymlsÄ att det blir sÄ hÀr:

deploy:multidev:
  stage: deploy
  environment:
    name: multidev/mr-$CI_MERGE_REQUEST_IID
    url: https://mr-$CI_MERGE_REQUEST_IID-$PANTHEON_SITE.pantheonsite.io/
  script:
    # Run the multidev deploy script
    - "/bin/bash ./private/multidev-deploy.sh"
  only:
    - merge_requests

Vi mÄste se till att vÄra uppgifter utförs i den skapade anpassade bilden, sÄ lÄt oss lÀgga till en definition image frÄn registeradressen till .gitlab-ci.yml. Som ett resultat fick vi en sÄdan hÀr fil .gitlab-ci.yml:

image: registry.gitlab.com/ataylorme/pantheon-gitlab-blog-demo:latest

stages:
- deploy

before_script:
  # See https://docs.gitlab.com/ee/ci/ssh_keys/README.html
  - eval $(ssh-agent -s)
  - echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add - > /dev/null
  - mkdir -p $HOME/.ssh && echo "StrictHostKeyChecking no" >> "$HOME/.ssh/config"
  - git config --global user.email "$GITLAB_USER_EMAIL"
  - git config --global user.name "Gitlab CI"

deploy:dev:
  stage: deploy
  environment:
    name: dev
    url: https://dev-$PANTHEON_SITE.pantheonsite.io/
  script:
    - git remote add pantheon $PANTHEON_GIT_URL
    - git push pantheon master --force
  only:
    - master

deploy:multidev:
  stage: deploy
  environment:
    name: multidev/mr-$CI_MERGE_REQUEST_IID
    url: https://mr-$CI_MERGE_REQUEST_IID-$PANTHEON_SITE.pantheonsite.io/
  script:
    # Run the multidev deploy script
    - "/bin/bash ./private/multidev-deploy.sh"
  only:
    - merge_requests

LÀgg till, begÄ och skicka private/multidev-deploy.sh О .gitlab-ci.yml. Nu ÄtervÀnder vi till GitLab och vÀntar pÄ att CI/CD-uppgiften ska slutföras. Ha tÄlamod: multidev kan ta flera minuter att skapa.

Sedan gĂ„r vi och tittar pĂ„ multidev-listan pĂ„ Pantheon. Åh mirakel! Multidev miljö mr-2 redan hĂ€r.

Hur man kopplar ihop GitLab och Pantheon och optimerar arbetsflöden Drupal О WordPress

Slutsats

Mitt team hade mycket roligare nÀr vi började öppna sammanslagningsförfrÄgningar och skapa miljöer automatiskt.

Med de kraftfulla verktygen frÄn GitLab och Pantheon kan du ansluta GitLab till Pantheon automatiskt.

Eftersom vi anvÀnder GitLab CI/CD kommer vÄrt arbetsflöde att ha utrymme att vÀxa. HÀr Àr ett par idéer för att komma igÄng:

LÄt oss veta vad du tycker om GitLab, Pantheon och automation.

PS Visste du att Terminus, Pantheons kommandoradsverktyg, kan utökas via plugins?

Vi pÄ Pantheon har gjort ett bra jobb med version 2 av vÄr plugin för Terminus byggverktyg med GitLab-stöd. Om du inte vill bry dig om instÀllningar för varje projekt, prova detta plugin och hjÀlp oss att testa v2 beta. För Terminus-teamet build:project:create Du behöver bara en Pantheon-token och en GitLab-token. Hon kommer att distribuera ett av exempelprojekten med Composer och automatiserad testning, skapa ett nytt projekt i GitLab, en ny Pantheon-sajt, och koppla ihop dem med hjÀlp av miljövariabler och SSH-nycklar.

Om författaren

Andrew Taylor skapar verktyg för utvecklare i Pantheon.

KĂ€lla: will.com

Köp pĂ„litlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster