Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions tdev-website/docs/dokku/drone-ci/drone-runner.mdx
Original file line number Diff line number Diff line change
@@ -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.

<DynamicInput name="APP" default='drone-runner' monospace />
<DynamicInput name="DRONE_SERVER_APP" default='drone-server' monospace />
<DynamicInput name="DRONE_RPC_PROTO" default='https' monospace />
<DynamicInput name="DRONE_RPC_HOST" default='drone.domain.ch' monospace />
<DynamicInput name="DRONE_RUNNER_CAPACITY" default='2' monospace />
<DynamicInput name="DRONE_RUNNER_NAME" default='runner-01' monospace />

<TemplateCode>
```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
```
</TemplateCode>

## Update

<DynamicInput name="APP" default='drone-runner' monospace />
<DynamicInput name="IMAGE_TAG" default='latest' monospace />

<TemplateCode>
```bash title="root@dokku"
docker pull drone/drone-runner-docker:{{IMAGE_TAG}}
dokku git:from-image {{APP}} drone/drone-runner-docker:{{IMAGE_TAG}}
```
</TemplateCode>

Verfügbare Tags: [drone/drone-runner-docker/tags](https://hub.docker.com/r/drone/drone-runner-docker/tags)
110 changes: 110 additions & 0 deletions tdev-website/docs/dokku/drone-ci/drone-server.mdx
Original file line number Diff line number Diff line change
@@ -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)

<DynamicInput name="APP" default='drone-server' monospace />
<DynamicInput name="DOMAIN" default='drone.domain.ch' monospace />
<DynamicInput name="DRONE_IMAGE" default='drone/drone:latest' monospace />
<DynamicInput name="DRONE_GITHUB_CLIENT_ID" default='1234' monospace />
<DynamicInput name="DRONE_GITHUB_CLIENT_SECRET" default='abcdef' monospace />
<DynamicInput name="DRONE_USER_FILTER" default='alice,bob' monospace />
<DynamicInput name="DRONE_USER_CREATE" default='username:alice,admin:true' monospace />
<DynamicInput name="DOKKU_LETSENCRYPT_EMAIL" default='foo@bar.ch' monospace />

## Dokku vorbereiten und deployen

<TemplateCode>
```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}}
```
</TemplateCode>

:::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:

<TemplateCode>
```bash title="root@dokku"
openssl rand -hex 32
```
</TemplateCode>
:::

:::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:

<TemplateCode>
```bash title="root@dokku"
dokku config:set --no-restart {{APP}} DRONE_USER_FILTER="{{DRONE_USER_FILTER}}"
```
</TemplateCode>
:::

## Update

<TemplateCode>
```bash title="root@dokku"
docker pull {{DRONE_IMAGE}}
dokku ps:rebuild {{APP}}
```
</TemplateCode>

Falls auf eine spezifische Version aktualisiert werden soll:

<TemplateCode>
```bash title="root@dokku"
dokku git:from-image {{APP}} drone/drone:2.7.3
```
</TemplateCode>
54 changes: 54 additions & 0 deletions tdev-website/docs/dokku/drone-ci/index.mdx
Original file line number Diff line number Diff line change
@@ -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.
Loading