diff --git a/tdev-website/docs/dokku/drone-ci/drone-runner.mdx b/tdev-website/docs/dokku/drone-ci/drone-runner.mdx new file mode 100644 index 000000000..46108d420 --- /dev/null +++ b/tdev-website/docs/dokku/drone-ci/drone-runner.mdx @@ -0,0 +1,52 @@ +--- +page_id: 77aa276d-fed2-4ddb-9567-80e58fd4a48c +--- + +import { Val, TemplateCode, DynamicInput } from '@tdev-components/DynamicValues'; + +# Drone Runner + +[Drone Docker Runner](https://docs.drone.io/runner/docker/installation/linux/) auf Dokku deployen. + + + + + + + + + + ```bash title="root@dokku" + dokku apps:create {{APP}} + + # Umgebungsvariablen für die Verbindung zum Drone Server + dokku config:set --no-restart {{APP}} DRONE_RPC_SECRET="$(dokku config:get {{DRONE_SERVER_APP}} DRONE_RPC_SECRET)" + dokku config:set --no-restart {{APP}} DRONE_RPC_PROTO="{{DRONE_RPC_PROTO}}" + dokku config:set --no-restart {{APP}} DRONE_RPC_HOST="{{DRONE_RPC_HOST}}" + dokku config:set --no-restart {{APP}} DRONE_RUNNER_CAPACITY="{{DRONE_RUNNER_CAPACITY}}" + dokku config:set --no-restart {{APP}} DRONE_RUNNER_NAME="{{DRONE_RUNNER_NAME}}" + + # Docker Socket mounten, damit Builds/Container gestartet werden können + dokku storage:mount {{APP}} /var/run/docker.sock:/var/run/docker.sock + + # Port-Mapping (Runner lauscht auf 3000) + dokku ports:set {{APP}} http:3000:3000 + + # Deploy + dokku git:from-image {{APP}} drone/drone-runner-docker:latest + ``` + + +## Update + + + + + + ```bash title="root@dokku" + docker pull drone/drone-runner-docker:{{IMAGE_TAG}} + dokku git:from-image {{APP}} drone/drone-runner-docker:{{IMAGE_TAG}} + ``` + + +Verfügbare Tags: [drone/drone-runner-docker/tags](https://hub.docker.com/r/drone/drone-runner-docker/tags) diff --git a/tdev-website/docs/dokku/drone-ci/drone-server.mdx b/tdev-website/docs/dokku/drone-ci/drone-server.mdx new file mode 100644 index 000000000..052dc705d --- /dev/null +++ b/tdev-website/docs/dokku/drone-ci/drone-server.mdx @@ -0,0 +1,110 @@ +--- +page_id: 912ac919-b418-4b2a-bf6e-6ae875311ed9 +--- + +import { DynamicInput, TemplateCode } from '@tdev-components/DynamicValues'; + +# Drone Server + +Drone Server auf Dokku deployen. + +Referenz +: [docs.drone.io](https://docs.drone.io/server/provider/github/) +Dockerhub +: [hub.docker.com/r/drone/drone](https://hub.docker.com/r/drone/drone) + + + + + + + + + + +## Dokku vorbereiten und deployen + + + ```bash title="root@dokku" + # App erstellen + dokku apps:create {{APP}} + + # Domain und Port setzen + dokku domains:set {{APP}} {{DOMAIN}} + dokku ports:add {{APP}} http:80:80 + + # Persistentes Verzeichnis für die SQLite-Datenbank mounten + mkdir -p /var/lib/dokku/data/storage/{{APP}} + chown -R 1000:1000 /var/lib/dokku/data/storage/{{APP}} + dokku storage:mount {{APP}} /var/lib/dokku/data/storage/{{APP}}:/data + + # GitHub OAuth und Drone-Konfiguration + dokku config:set --no-restart {{APP}} DRONE_GITHUB_CLIENT_ID="{{DRONE_GITHUB_CLIENT_ID}}" + dokku config:set --no-restart {{APP}} DRONE_GITHUB_CLIENT_SECRET="{{DRONE_GITHUB_CLIENT_SECRET}}" + dokku config:set --no-restart {{APP}} DRONE_RPC_SECRET=$(openssl rand -hex 32) + dokku config:set --no-restart {{APP}} DRONE_SERVER_HOST="{{DOMAIN}}" + dokku config:set --no-restart {{APP}} DRONE_SERVER_PROTO="http" + + # Nur bekannte Benutzer zulassen + dokku config:set --no-restart {{APP}} DRONE_USER_FILTER="{{DRONE_USER_FILTER}}" + + # Admin-Benutzer definieren + dokku config:set --no-restart {{APP}} DRONE_USER_CREATE="{{DRONE_USER_CREATE}}" + + # Optional: E-Mail für Let's Encrypt setzen + dokku config:set --no-restart {{APP}} DOKKU_LETSENCRYPT_EMAIL="{{DOKKU_LETSENCRYPT_EMAIL}}" + + # Image deployen + dokku git:from-image {{APP}} {{DRONE_IMAGE}} + + # Optional: SSL aktivieren + dokku letsencrypt:enable {{APP}} + ``` + + +:::info[DRONE_RPC_SECRET] +Der Wert ist ein gemeinsames Secret zwischen Drone Server und Runnern. Server und Runner müssen exakt denselben Wert verwenden. + +Ein sicheres Secret kann so generiert werden: + + + ```bash title="root@dokku" + openssl rand -hex 32 + ``` + +::: + +:::warning[DRONE_SERVER_PROTO auf http lassen] +Bei Dokku wird TLS von Nginx terminiert. Intern wird die Anfrage per HTTP an den Container weitergeleitet. + +Wenn hier `https` gesetzt wird, kann es zu Redirect-Loops kommen. +::: + +:::warning[DRONE_USER_FILTER setzen] +Ohne `DRONE_USER_FILTER` kann sich standardmässig jeder authentifizieren, der über den konfigurierten Provider verfügt. + +Beispiel: + + + ```bash title="root@dokku" + dokku config:set --no-restart {{APP}} DRONE_USER_FILTER="{{DRONE_USER_FILTER}}" + ``` + +::: + +## Update + + + ```bash title="root@dokku" + docker pull {{DRONE_IMAGE}} + dokku ps:rebuild {{APP}} + ``` + + +Falls auf eine spezifische Version aktualisiert werden soll: + + + ```bash title="root@dokku" + dokku git:from-image {{APP}} drone/drone:2.7.3 + ``` + \ No newline at end of file diff --git a/tdev-website/docs/dokku/drone-ci/index.mdx b/tdev-website/docs/dokku/drone-ci/index.mdx new file mode 100644 index 000000000..05b0820ae --- /dev/null +++ b/tdev-website/docs/dokku/drone-ci/index.mdx @@ -0,0 +1,54 @@ +--- +page_id: 7dd02198-e086-4464-b803-71f4f5eb095e +--- + +# Drone CI + + +[Drone CI](https://www.drone.io/) kann einfach mit Github, *Bitbucket, Gitlab* usw. verwendet werden. Diese Beschreibung bezieht sich auf die Integration mit Github. + +Für das Deployment auf Dokku werden zwei Apps benötigt: [drone-server](./drone-server.mdx) und [drone-runner](./drone-runner.mdx). + +Eine `.drone.yml` im Root-Verzeichnis des Repositorys definiert die auszuführenden Schritte. + +Als Beispiel folgt hier das minimale Skript, das diese Seite baut und deployt, ohne Cache. + +```yml title=.drone.yml +--- +kind: pipeline +type: docker +name: default + +steps: + +- name: submodules + image: alpine/git + commands: + - git submodule update --init --recursive + +- name: website + image: node:16.11.1 + commands: + - mkdir -p $HOME/.ssh + - ssh-keyscan -t rsa github.com >> $HOME/.ssh/known_hosts + - echo "$GITHUB_PRIVATE_KEY" > "$HOME/.ssh/id_rsa" + - chmod 0600 $HOME/.ssh/id_rsa + - yarn install --frozen-lockfile + - npm run deploy + environment: + USE_SSH: true + GIT_USER: $DRONE_COMMIT_AUTHOR + GITHUB_PRIVATE_KEY: + from_secret: "git_deploy_private_key" + when: + event: + include: + - push + - pull_request + +trigger: + branch: + - main +``` + +Das Setup erwartet eine Umgebungsvariable mit dem Namen `git_deploy_private_key`, die den privaten Schlüssel enthält. Der zugehörige öffentliche Schlüssel muss beispielsweise in Github als Deploy Key hinterlegt sein. \ No newline at end of file