From 6997693769736fef88705c21f5a14aee5fe44764 Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Thu, 24 Nov 2022 21:50:34 +0100 Subject: [PATCH] app: add vikunja --- README.md | 9 ++-- apps/vikunja/config.json | 29 ++++++++++++ apps/vikunja/data/proxy/nginx.conf | 21 +++++++++ apps/vikunja/docker-compose.yml | 68 +++++++++++++++++++++++++++ apps/vikunja/metadata/description.md | 11 +++++ apps/vikunja/metadata/logo.jpg | Bin 0 -> 13623 bytes 6 files changed, 134 insertions(+), 4 deletions(-) create mode 100644 apps/vikunja/config.json create mode 100644 apps/vikunja/data/proxy/nginx.conf create mode 100644 apps/vikunja/docker-compose.yml create mode 100644 apps/vikunja/metadata/description.md create mode 100644 apps/vikunja/metadata/logo.jpg diff --git a/README.md b/README.md index 09b885e7..7441a74d 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,9 @@ This is the official repository for the Tipi App Store. It contains all the apps - [Booksonic](https://github.com/popeen) - A server for streaming your audiobooks - [Bookstack](https://github.com/BookStackApp/BookStack) - Simple, easy-to-use platform for organising and storing information. - [Calibre-Web](https://github.com/janeczku/calibre-web) - Web Ebook Reader -- [Code-Server](https://github.com/coder/code-server) - Web VS Code +- [Code-Server](https://github.com/coder/code-server) - Web VS Code - [Filebrowser](https://github.com/filebrowser/filebrowser) - Web File Browser -- [Firefly III](https://github.com/firefly-iii/firefly-iii) - A personal finances manager +- [Firefly III](https://github.com/firefly-iii/firefly-iii) - A personal finances manager - [Freshrss](https://github.com/FreshRSS/FreshRSS) - A free, self-hostable RSS aggregator - [gandi-livedns](https://github.com/jbbodart/gandi-livedns) - Update your Gandi DNS zone records with your WAN IP - [Ghost](https://github.com/TryGhost/Ghost) - Ghost - Turn your audience into a business @@ -49,7 +49,7 @@ This is the official repository for the Tipi App Store. It contains all the apps - [PrivateBin](https://github.com/PrivateBin/PrivateBin) - A minimalist, open source online pastebin where the server has zero knowledge of pasted data - [Prowlarr](https://github.com/Prowlarr/Prowlarr/) - A torrent/usenet indexer manager/proxy - [Proxitok](https://github.com/pablouser1/ProxiTok) - Open source alternative frontend for TikTok made using PHP -- [qBittorrent](https://github.com/qbittorrent/qBittorrent) - BitTorrent client +- [qBittorrent](https://github.com/qbittorrent/qBittorrent) - BitTorrent client - [Radarr](https://github.com/Radarr/Radarr) - Movie collection manager for Usenet and BitTorrent users - [Readarr](https://github.com/Readarr/Readarr) - Book Manager and Automation (Sonarr for Ebooks) - [Resilio Sync](https://github.com/bt-sync) - Fast, reliable, and simple file sync and share solution @@ -64,9 +64,10 @@ This is the official repository for the Tipi App Store. It contains all the apps - [Tube Archivist](https://github.com/tubearchivist/tubearchivist) - Your self-hosted YouTube media server - [Uptime Kuma](https://github.com/louislam/uptime-kuma) - A fancy self-hosted monitoring tool - [Vaultwarden](https://github.com/dani-garcia/vaultwarden) - Unofficial Bitwarden compatible server +- [Vikunja](https://kolaente.dev/vikunja/) - The open-source, self-hostable to-do app. Organize everything, on all platforms. - [Wireguard Easy](https://github.com/WeeJeWel/wg-easy) - WireGuard VPN + Web-based Admin UI - [Your Spotify](https://github.com/Yooooomi/your_spotify) - Self hosted Spotify tracking dashboard -- [ZeroTier](https://github.com/zerotier/ZeroTierOne) - Easy to use zero configuration VPN. +- [ZeroTier](https://github.com/zerotier/ZeroTierOne) - Easy to use zero configuration VPN. ## How to sumbit an app diff --git a/apps/vikunja/config.json b/apps/vikunja/config.json new file mode 100644 index 00000000..453fc9c2 --- /dev/null +++ b/apps/vikunja/config.json @@ -0,0 +1,29 @@ +{ + "$schema": "../schema.json", + "name": "Vikunja", + "available": true, + "exposable": true, + "port": 8135, + "id": "vikunja", + "tipi_version": 1, + "version": "0.20.1", + "categories": ["utilities"], + "description": "The Todo-app to organize your life.", + "short_desc": "The Todo-app to organize your life.", + "author": "kolaente", + "source": "https://kolaente.dev/vikunja", + "website": "https://vikunja.io", + "form_fields": [ + { + "type": "random", + "label": "Vikunja database password", + "random": true, + "env_variable": "VIKUNJA_DB_PASSWORD" + }, + { + "type": "random", + "label": "Vikunja jwt secret", + "env_variable": "VIKUNJA_SERVICE_JWTSECRET" + } + ] +} diff --git a/apps/vikunja/data/proxy/nginx.conf b/apps/vikunja/data/proxy/nginx.conf new file mode 100644 index 00000000..b28829f8 --- /dev/null +++ b/apps/vikunja/data/proxy/nginx.conf @@ -0,0 +1,21 @@ +worker_processes 1; + +error_log /var/log/nginx/error.log debug; + +events { + worker_connections 1024; +} + +http { + server { + listen 80; + + location / { + proxy_pass http://vikunja-frontend:80; + } + location ~* ^/(api|dav|\.well-known)/ { + proxy_pass http://vikunja-api:3456; + client_max_body_size 20M; + } + } +} \ No newline at end of file diff --git a/apps/vikunja/docker-compose.yml b/apps/vikunja/docker-compose.yml new file mode 100644 index 00000000..72aa11c7 --- /dev/null +++ b/apps/vikunja/docker-compose.yml @@ -0,0 +1,68 @@ +version: '3.7' + +services: + vikunja-frontend: + depends_on: + - vikunja-api + container_name: vikunja-frontend + image: vikunja/frontend:0.20.1 + restart: unless-stopped + networks: + - tipi_main_network + + vikunja-api: + container_name: vikunja-api + image: vikunja/api:0.20.1 + environment: + VIKUNJA_DATABASE_HOST: vikunja-db + VIKUNJA_DATABASE_PASSWORD: ${VIKUNJA_DB_PASSWORD} + VIKUNJA_DATABASE_TYPE: postgres + VIKUNJA_DATABASE_USER: tipi + VIKUNJA_SERVICE_JWTSECRET: ${VIKUNJA_SERVICE_JWTSECRET} + VIKUNJA_SERVICE_FRONTENDURL: ${APP_PROTOCOL:-http}://${APP_DOMAIN}/ + volumes: + - ${APP_DATA_DIR}/data/files:/app/vikunja/files + restart: unless-stopped + depends_on: + vikunja-db: + condition: service_healthy + networks: + - tipi_main_network + + vikunja-db: + container_name: vikunja-db + image: postgres:14 + environment: + POSTGRES_PASSWORD: ${VIKUNJA_DB_PASSWORD} + POSTGRES_USER: tipi + POSTGRES_DB: vikunja + volumes: + - ${APP_DATA_DIR}/data/db:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] + interval: 5s + timeout: 5s + retries: 5 + networks: + - tipi_main_network + + vikunja: + container_name: vikunja + image: nginx + ports: + - ${APP_PORT}:80 + volumes: + - ${APP_DATA_DIR}/data/proxy/nginx.conf:/etc/nginx/nginx.conf:ro + depends_on: + - vikunja-api + - vikunja-frontend + restart: unless-stopped + networks: + - tipi_main_network + labels: + traefik.enable: ${APP_EXPOSED} + traefik.http.routers.vikunja.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.vikunja.entrypoints: websecure + traefik.http.routers.vikunja.service: vikunja + traefik.http.routers.vikunja.tls.certresolver: myresolver + traefik.http.services.vikunja.loadbalancer.server.port: 80 \ No newline at end of file diff --git a/apps/vikunja/metadata/description.md b/apps/vikunja/metadata/description.md new file mode 100644 index 00000000..b95959e8 --- /dev/null +++ b/apps/vikunja/metadata/description.md @@ -0,0 +1,11 @@ +## The Todo-app to organize your life. + +- Create TODO lists with tasks +- Reminder for tasks +- Namespaces: A "group" which bundles multiple lists +- Share lists and namespaces with teams and users with granular permissions +- Plenty of details for tasks + +See the [features page](https://vikunja.cloud/features) on our website for a more exaustive list or try it on [try.vikunja.io](try.vikunja.io)! + +![](https://vikunja.io/images/vikunja/09-task-detail-dark.png) diff --git a/apps/vikunja/metadata/logo.jpg b/apps/vikunja/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0fedf2de662449c62d71093d44d2fc6d7c379f27 GIT binary patch literal 13623 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 J56JBH{|`EmTL%CD literal 0 HcmV?d00001