From 952454efdac658f0ee7c7c05eba2148b2a890431 Mon Sep 17 00:00:00 2001 From: Stavros Date: Wed, 27 Sep 2023 22:41:34 +0300 Subject: [PATCH] Add Notemark. (#1200) * Add notemark. * Fix error. * Fix nginx conf. * Update description.md --------- Co-authored-by: Nicolas Meienberger <47644445+meienberger@users.noreply.github.com> --- README.md | 1 + apps/notemark/config.json | 25 +++++++++++ apps/notemark/data/proxy/nginx.conf | 19 +++++++++ apps/notemark/docker-compose.yml | 58 ++++++++++++++++++++++++++ apps/notemark/metadata/description.md | 19 +++++++++ apps/notemark/metadata/logo.jpg | Bin 0 -> 17597 bytes 6 files changed, 122 insertions(+) create mode 100644 apps/notemark/config.json create mode 100644 apps/notemark/data/proxy/nginx.conf create mode 100644 apps/notemark/docker-compose.yml create mode 100644 apps/notemark/metadata/description.md create mode 100644 apps/notemark/metadata/logo.jpg diff --git a/README.md b/README.md index 2f42b025..931f4ddd 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,7 @@ This is the official repository for the Tipi App Store. It contains all the apps - [Nitter](https://github.com/zedeus/nitter) - Alternative Twitter front-end - [NocoDB](https://github.com/nocodb/nocodb) - Open Source Airtable Alternative - [Node-RED](https://github.com/node-red/node-red) - Low-code programming for event-driven applications +- [NoteMark](https://github.com/enchant97/note-mark/) - Note Mark is a lighting fast and minimal web-based Markdown notes app. - [Ntfy](https://github.com/binwiederhier/ntfy) - A Straightforward Notification service that operates over HTTP - [Obsidian LiveSync](https://github.com/vrtmrz/self-hosted-livesync-server) - LiveSync couchdb backend for Obsidian - [OneDev](https://code.onedev.io/onedev/server) - Self-hosted Git Server with Kanban and CI/CD diff --git a/apps/notemark/config.json b/apps/notemark/config.json new file mode 100644 index 00000000..5155661e --- /dev/null +++ b/apps/notemark/config.json @@ -0,0 +1,25 @@ +{ + "$schema": "../schema.json", + "name": "Notemark", + "available": true, + "exposable": true, + "port": 8567, + "id": "notemark", + "tipi_version": 1, + "version": "0.7.0", + "categories": [ + "utilities" + ], + "description": "Note Mark is a lighting fast and minimal web-based Markdown notes app.", + "short_desc": "Lighting fast web-based Markdown notes app.", + "author": "enchant97", + "source": "https://github.com/enchant97/note-mark/", + "website": "https://notemark.docs.enchantedcode.co.uk/", + "form_fields": [ + { + "type": "random", + "label": "Notemark secret", + "env_variable": "NOTEMARK_SERVICE_SECRET" + } + ] +} diff --git a/apps/notemark/data/proxy/nginx.conf b/apps/notemark/data/proxy/nginx.conf new file mode 100644 index 00000000..f0a1a31a --- /dev/null +++ b/apps/notemark/data/proxy/nginx.conf @@ -0,0 +1,19 @@ +upstream notemark-backend { + server notemark-backend:8000; +} + +upstream notemark { + server notemark:8000; +} + +server { + listen 80; + + location / { + proxy_pass http://notemark; + } + + location /api { + proxy_pass http://notemark-backend/api; + } +} \ No newline at end of file diff --git a/apps/notemark/docker-compose.yml b/apps/notemark/docker-compose.yml new file mode 100644 index 00000000..bd9eae01 --- /dev/null +++ b/apps/notemark/docker-compose.yml @@ -0,0 +1,58 @@ +version: "3.7" +services: + notemark-proxy: + container_name: notemark-proxy + image: nginx:alpine + ports: + - ${APP_PORT}:80 + volumes: + - ${APP_DATA_DIR}/data/proxy/nginx.conf:/etc/nginx/conf.d/default.conf:ro + restart: unless-stopped + networks: + - tipi_main_network + labels: + # Main + traefik.enable: true + traefik.http.middlewares.notemark-web-redirect.redirectscheme.scheme: https + traefik.http.services.notemark.loadbalancer.server.port: 80 + # Web + traefik.http.routers.notemark-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.notemark-insecure.entrypoints: web + traefik.http.routers.notemark-insecure.service: notemark + traefik.http.routers.notemark-insecure.middlewares: notemark-web-redirect + # Websecure + traefik.http.routers.notemark.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.notemark.entrypoints: websecure + traefik.http.routers.notemark.service: notemark + traefik.http.routers.notemark.tls.certresolver: myresolver + # Local domain + traefik.http.routers.notemark-local-insecure.rule: Host(`notemark.${LOCAL_DOMAIN}`) + traefik.http.routers.notemark-local-insecure.entrypoints: web + traefik.http.routers.notemark-local-insecure.service: notemark + traefik.http.routers.notemark-local-insecure.middlewares: notemark-web-redirect + # Local domain secure + traefik.http.routers.notemark-local.rule: Host(`notemark.${LOCAL_DOMAIN}`) + traefik.http.routers.notemark-local.entrypoints: websecure + traefik.http.routers.notemark-local.service: notemark + traefik.http.routers.notemark-local.tls: true + + notemark-backend: + image: ghcr.io/enchant97/note-mark-backend:0.7.0 + container_name: notemark-backend + restart: unless-stopped + networks: + - tipi_main_network + volumes: + - ${APP_DATA_DIR}/data:/data + environment: + JWT_SECRET: "${NOTEMARK_SERVICE_SECRET}" + CORS_ORIGINS: "*" + + notemark: + image: ghcr.io/enchant97/note-mark-frontend:0.7.0 + container_name: notemark + restart: unless-stopped + networks: + - tipi_main_network + + diff --git a/apps/notemark/metadata/description.md b/apps/notemark/metadata/description.md new file mode 100644 index 00000000..018bc4b2 --- /dev/null +++ b/apps/notemark/metadata/description.md @@ -0,0 +1,19 @@ +# Note Mark + +Note Mark is a lighting fast and minimal; web-based Markdown notes app. Featuring a sleek and responsive web UI. + +## Features +- Markdown (GitHub Flavored Markdown, see spec [here](https://github.github.com/gfm/)) +- HTML sanitisation, minimizing XSS attacks +- Mobile Friendly +- Friendly "Slug" based URLs for cleaner links +- Dark & Light Theme +- Notebook Sharing +- Custom flat-file based storage system (easy to backup and synchronize) +- Multiple views for a note (rendered, plain) +- Editor with shortcuts + +## Docs +Documentation is available here: [notemark.docs.enchantedcode.co.uk](https://notemark.docs.enchantedcode.co.uk/). + +> Checkout [here](https://github.com/enchant97/note-mark/issues/47) for the roadmap. diff --git a/apps/notemark/metadata/logo.jpg b/apps/notemark/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..51ef97099345b5d6c3ac0a45711aae45687df570 GIT binary patch literal 17597 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 B9)17- literal 0 HcmV?d00001