---
# System prepended metadata

title: HedgeDoc
tags: [Review]

---

Die Webanwendung HedgeDoc ist ein Open-Source-Projekt, das als Version von CodiMD gestartet wurde. Sie ähnelt HackMD, wurde jedoch von der Community weiterentwickelt und verbessert. In dieser Dokumentation werden wir uns mit den Kernfunktionen von HedgeDoc befassen, darunter die Einführung in HedgeDoc selbst, die Verwendung von Markdown, das Arbeitsjournal-System sowie die Aufbereitung und Abgabe von Sidequests.

## Was ist HedgeDoc?
HedgeDoc ist eine kostenlose, Open-Source-Webanwendung, die es Benutzern ermöglicht, gemeinsam an Dokumenten zu arbeiten und diese zu bearbeiten. Ähnlich wie HackMD bietet HedgeDoc eine einfache und intuitive Schnittstelle, die speziell für die Zusammenarbeit entwickelt wurde. Durch die kontinuierliche Beteiligung der Community wurde HedgeDoc zu einer benutzerfreundlichen Plattform mit einer Vielzahl nützlicher Funktionen.

## Was ist Markdown?
Markdown ist eine leicht zu erlernende Markup-Sprache, die von HedgeDoc verwendet wird. Sie ermöglicht Benutzern das Schreiben von strukturierten Texten mit minimalem Aufwand. Mit Markdown können Benutzer Texte formatieren, Überschriften erstellen, Aufzählungen und nummerierte Listen verwenden sowie Links und Bilder einfügen. HedgeDoc erweitert Markdown um unglaubliche Tools für Diagramme, wie zum Beispiel Mermaid, was die Visualisierung von Informationen erleichtert.

## Arbeitsjournal-System:
Das leistungsstarke Arbeitsjournal-System von HedgeDoc ermöglicht es den Benutzern, ihre Lernfortschritte zu dokumentieren und ihre Gedanken strukturiert festzuhalten. Es bietet eine effektive Möglichkeit, Ideen, Erkenntnisse und Erfahrungen zu erfassen. Das Arbeitsjournal kann sowohl individuell genutzt werden, um das persönliche Lernen zu vertiefen, als auch in Gruppen, um den Wissensaustausch und die Zusammenarbeit zu fördern. Mit HedgeDoc können Benutzer ihre Fortschritte nachvollziehen und ihre Arbeitsprozesse optimieren.

## Zentrales File Management:
HedgeDoc bietet ein herausragendes zentrales File Management, das die Organisation und Verwaltung von Dokumenten erleichtert. Durch die Verwendung von Tags können Benutzer ihre Dokumente einfach kategorisieren und thematisch sortieren. Dies ermöglicht eine übersichtliche Strukturierung der Dateien und erleichtert das Auffinden von Inhalten. Darüber hinaus unterstützt HedgeDoc Gruppen, was es Benutzern ermöglicht, in Klassen oder Teams zusammenzuarbeiten. Durch diese Funktion können Projekte und Aufgaben effizient verwaltet werden, wodurch die Zusammenarbeit verbessert wird.

## HedgeDoc 2
**HedgeDoc2** stellt eine aufregende Weiterentwicklung der Webanwendung dar. Das gesamte System wurde komplett neu geschrieben und umprogrammiert, um den Benutzern eine noch bessere Erfahrung zu bieten. Sowohl Endnutzer als auch Programmierer profitieren von den zahlreichen Verbesserungen. HedgeDoc2 zeichnet sich durch eine verbesserte Benutzerfreundlichkeit, erweiterte Funktionen und die Möglichkeit der einfachen Erweiterung durch Plugins aus. Darüber hinaus verfügt es über ein integriertes, dynamisches Backend, das eine nahtlose Integration und effizientes Arbeiten ermöglicht. HedgeDoc2 setzt neue Maßstäbe für kollaborative Dokumentation und fördert die Zusammenarbeit in verschiedenen Umgebungen.
# HedgeDoc Aufsetzen
-> [Github](https://github.com/hedgedoc/hedgedoc)
-> [Config Dokumentation](https://docs.hedgedoc.org/configuration)
-> [Features von Hedgedoc](https://demo.hedgedoc.org/features)

## Setup HedgeDoc
### Docker Compose
HedgeDoc kann einfach in einem Dockercontainer gestarted werden. Dazu folgendes Compose File:

```dockerfile
version: '3'
services:
  database:
    image: postgres:13.4-alpine
    environment:
      - POSTGRES_USER=hedgedoc
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=hedgedoc
    volumes:
      - database:/var/lib/postgresql/data
    restart: always
  app:
    # Make sure to use the latest release from https://hedgedoc.org/latest-release
    image: quay.io/hedgedoc/hedgedoc:1.9.7
    environment:
      - CMD_DB_URL=postgres://hedgedoc:password@database:5432/hedgedoc
      - CMD_DOMAIN=localhost
      - CMD_URL_ADDPORT=true
      - allowEmailRegister=false
      - CMD_ALLOW_FREEURL=true
      - CMD_ALLOW_ANONYMOUS_EDITS=false
      - CMD_ALLOW_ANONYMOUS=false
      - CMD_AUTHENTICATION_PROVIDERS=oauth2
      - CMD_OAUTH2_PROVIDER_NAME=Office365
      - CMD_OAUTH2_AUTHORIZATION_URL=https://login.microsoftonline.com/'Directory (tenant) ID'/oauth2/v2.0/authorize
      - CMD_OAUTH2_TOKEN_URL=https://login.microsoftonline.com/'Directory (tenant) ID'/oauth2/v2.0/token
      - CMD_OAUTH2_CLIENT_ID='Application (client) ID'
      - CMD_OAUTH2_CLIENT_SECRET='Client Secret Value'
      - CMD_OAUTH2_SCOPE=openid profile email
      - CMD_OAUTH2_USER_PROFILE_URL=https://graph.microsoft.com/v1.0/me
      - CMD_OAUTH2_USER_PROFILE_USERNAME_ATTR=userPrincipalName
      - CMD_OAUTH2_USER_PROFILE_DISPLAY_NAME_ATTR=displayName
      - CMD_OAUTH2_USER_PROFILE_EMAIL_ATTR=mail
    volumes:
      - uploads:/hedgedoc/public/uploads
    ports:
      - "3000:3000"
    restart: always
    depends_on:
      - database
volumes:
  database:
  uploads:

```


## Setup OAuth2 for Microsoft using *AAD*
Für die Schüle soll es möglich sein mit der Schulmailadresse einzuloggen. Microsoft Azure ist ein OAuth2 Provider der dies ermöglicht.

#### 1. Setup Azure Active Directory

Voraussetzung: Anlegen eines Microsoft Account und einloggen unter portal.azure.com.

1. Im Menue auf "Azure Active Directory"![](https://hackmd.io/_uploads/ryv_XLJDn.png)

2. Navigiere auf "App registration"
![](https://hackmd.io/_uploads/B1WlE81vn.png)

3. Nun auf "+ New registration" 
![](https://hackmd.io/_uploads/BkAmEIJwh.png)

4. Die Benötigten felder ausfüllen und Supported account types entsprechend anpassen. Bei der App Registrierung muss folgende Redirect-URL als Callback angegeben werden: `https://{url}/auth/oauth2/callback)`
![](https://hackmd.io/_uploads/ryFTEIyP2.png)

5. Die Benötigten Informationen des **"Application (client) ID"** und **"Directory (tenant) ID"** findet man auf der darauf folgenden seite.
![](https://hackmd.io/_uploads/H1qyxQL83.png)

5. Nun muss noch das Secret erstellt werden unter "Certificates & secrets". **"Value"** muss hier für die Config files verwendet werden.
![](https://hackmd.io/_uploads/Bybj881P3.png)

![](https://hackmd.io/_uploads/B1LaUIkvh.png)

6. Zum Schluss muss nur noch die API permission angepasst werden.
    1. Dazu "Add persmission" -> "Microsoft Graph" -> "Delegated permissions" 
    Folgende permissions geben:
![](https://hackmd.io/_uploads/r1Tfu8kv3.png)


---

# Hedgedoc vom Source Code Builden
-> [Source Code V1.9.8](https://github.com/hedgedoc/hedgedoc/releases/tag/1.9.8)
-> [Manual Installation](https://docs.hedgedoc.org/setup/manual-setup/)

> Pre-Requirements:
> - node v16+, npm und yarn installiert

config.json:
```json
{
    "test": {
        "db": {
            "dialect": "sqlite",
            "storage": ":memory:"
        },
        "linkifyHeaderStyle": "gfm"
    },
    "development": {
        "loglevel": "debug",
        "db": {
            "dialect": "sqlite",
            "storage": "./db.hedgedoc.sqlite"
        },
        "domain": "localhost",
        "urlAddPort": true
    },
    "production": {
        "urlAddPort": true,
        "allowEmailRegister": false,
        "allowAnonymousEdits": false,
        "allowAnonymous": false,
        "allowFreeURL": true,
        "oauth2": {
                "providerName": "Office365",
                "authorizationURL": "https://login.microsoftonline.com/'Directory (tenant) ID'/oauth2/v2.0/authorize",
                "tokenURL": "https://login.microsoftonline.com/'Directory (tenant) ID'/oauth2/v2.0/token",
                "clientID": "'Application (client) ID'",
                "clientSecret": "'Client Secret Value'",
                "scope": "openid profile email",
                "userProfileURL": "https://graph.microsoft.com/v1.0/me",
                "userProfileUsernameAttr": "userPrincipalName",
                "userProfileDisplayNameAttr": "displayName",
                "userProfileEmailAttr": "mail"
        },
        "domain": "localhost",
        "loglevel": "info",
        "hsts": {
            "enable": true,
            "maxAgeSeconds": 31536000,
            "includeSubdomains": true,
            "preload": true
        },
        "csp": {

            "enable": true,
            "directives": {
            },
            "upgradeInsecureRequests": "auto",
            "addDefaults": true,
            "addDisqus": true,
            "addGoogleAnalytics": true
        },
        "cookiePolicy": "lax",
        "db": {
            "username": "hedgedoc",
            "password": "password",
            "database": "hedgedoc",
            "host": "localhost",
            "port": "5432",
            "dialect": "postgres"
        }
    }
}
```
Das Config File muss im root directory erstellt werden.

### Build Befehle:
1.`yarn install --immutable`
2. `yarn build`
3. `NODE_ENV=production yarn start`

## Datenbank

```dockerfile
version: '3'
services:
  database:
    image: postgres:13.4-alpine
    environment:
      - POSTGRES_USER=hedgedoc
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=hedgedoc
    volumes:
      - database:/var/lib/postgresql/data
    restart: always
    ports:
      - "5432:5432"
volumes:
  database:

```

# API calls and Hedgedoc
-> [API Dokumentation](https://docs.hedgedoc.org/dev/api/)

### API Call 

- /history :GET
- /new :POST
    Header:
    ```header
    Content-Type: text/markdown
    Data: {
            ---
            tags: {modul_name}
            ---
            }
    ```
    - redirect to (HTTP 302) Location Value + ?both
        - example:
```header
< HTTP/1.1 302 Found
< X-Powered-By: Express
< Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
< Referrer-Policy: same-origin
< Content-Security-Policy: default-src 'none';base-uri 'self';connect-src 'self' ws://localhost:3000;font-src 'self' https://*.disquscdn.com;manifest-src 'self';frame-src 'self' https://player.vimeo.com https://www.slideshare.net/slideshow/embed_code/key/ https://www.youtube.com *;img-src *;script-src http://localhost:3000/build/ http://localhost:3000/js/ http://localhost:3000/config https://gist.github.com/ https://vimeo.com/api/oembed.json https://www.slideshare.net/api/oembed/2 'unsafe-inline' https://disqus.com https://*.disqus.com https://*.disquscdn.com https://www.google-analytics.com 'nonce-c248cc5b-e150-4511-b067-ffd76203351a' 'sha256-81acLZNZISnyGYZrSuoYhpzwDTTxi7vC1YM4uNxqWaM=';style-src http://localhost:3000/build/ http://localhost:3000/css/ 'unsafe-inline' https://github.githubassets.com https://*.disquscdn.com;object-src * *;form-action 'self';media-src *
< HedgeDoc-Version: 1.9.8
< Location: http://localhost:3000/5fa7P9TaSIO1aAlESesdmw
< Vary: Accept, Accept-Encoding
< Content-Type: text/plain; charset=utf-8
< Content-Length: 66
```
`http://localhost:3000/5fa7P9TaSIO1aAlESesdmw?both`
(Redirect ist Wichtig damit neben dem laden auch die History erweitert wird). Ansonsten muss /history als POST verwendet werden wobei die komplette liste der Notizen als json mitgeliefert werden muss.
- /history/<NOTE_ID>:DELETE
