From 0c237d1b6902f058c88b1ea4cb3598d78eb018b0 Mon Sep 17 00:00:00 2001 From: Stavros Iliopoulos Date: Wed, 19 Jul 2023 08:31:06 +0300 Subject: [PATCH] Add plank and sshwifty. (#858) --- README.md | 2 + apps/planka/config.json | 24 +++++++++ apps/planka/docker-compose.yml | 67 ++++++++++++++++++++++++++ apps/planka/metadata/description.md | 30 ++++++++++++ apps/planka/metadata/logo.jpg | Bin 0 -> 4744 bytes apps/sshwifty/config.json | 17 +++++++ apps/sshwifty/docker-compose.yml | 36 ++++++++++++++ apps/sshwifty/metadata/description.md | 8 +++ apps/sshwifty/metadata/logo.jpg | Bin 0 -> 21986 bytes 9 files changed, 184 insertions(+) create mode 100644 apps/planka/config.json create mode 100644 apps/planka/docker-compose.yml create mode 100644 apps/planka/metadata/description.md create mode 100644 apps/planka/metadata/logo.jpg create mode 100644 apps/sshwifty/config.json create mode 100644 apps/sshwifty/docker-compose.yml create mode 100644 apps/sshwifty/metadata/description.md create mode 100644 apps/sshwifty/metadata/logo.jpg diff --git a/README.md b/README.md index 5776c112..ecd0a85f 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,7 @@ This is the official repository for the Tipi App Store. It contains all the apps - [Peppermint](https://github.com/Peppermint-Lab/peppermint) - An open source ticket management & help desk solution. - [Photoprism](https://github.com/photoprism/photoprism) - AI-Powered Photos App for the Decentralized Web. We are on a mission to protect your freedom and privacy. - [Pihole](https://github.com/pi-hole/pi-hole) - A black hole for Internet advertisements +- [Planka](https://github.com/plankanban/planka) - Free open source kanban board for workgroups. - [Plausible](https://github.com/plausible/analytics) - Simple, open-source, lightweight (< 1 KB) and privacy-friendly web analytics alternative to Google Analytics. - [Plex](https://github.com/plexinc/pms-docker) - Stream Movies & TV Shows - [PodFetch](https://github.com/SamTV12345/PodFetch) - A sleek and efficient podcast downloader. @@ -115,6 +116,7 @@ This is the official repository for the Tipi App Store. It contains all the apps - [Send](https://gitlab.com/timvisee/send) - Simple, private file sharing - [SimpleX SMP](https://github.com/simplex-chat/simplexmq) - A reference implementation of the SimpleX Messaging Protocol for simplex queues over public networks. - [Sonarr](https://github.com/Sonarr/Sonarr) - TV show manager for Usenet and BitTorrent +- [Sshwifty](https://github.com/nirui/sshwifty/) - Web SSH & Telnet (WebSSH & WebTelnet client) - [Syncthing](https://github.com/syncthing/syncthing) - Continuous File Synchronization - [Tailscale](https://github.com/tailscale/tailscale) - The easiest, most secure way to use WireGuard and 2FA - [Tautulli](https://github.com/Tautulli/Tautulli) - A Python based monitoring and tracking tool for Plex Media Server diff --git a/apps/planka/config.json b/apps/planka/config.json new file mode 100644 index 00000000..8c459e22 --- /dev/null +++ b/apps/planka/config.json @@ -0,0 +1,24 @@ +{ + "$schema": "../schema.json", + "name": "Planka", + "port": 8016, + "available": true, + "exposable": true, + "id": "planka", + "tipi_version": 1, + "version": "1.12.0", + "categories": ["development"], + "description": "The realtime kanban board for workgroups built with React and Redux.", + "short_desc": "Free open source kanban board for workgroups.", + "author": "Planka", + "source": "https://github.com/plankanban/planka", + "website": "https://docs.planka.cloud/", + "form_fields": [ + { + "type": "random", + "label": "Planka Secret Key", + "min": 32, + "env_variable": "PLANKA_SECRET_KEY" + } + ] +} diff --git a/apps/planka/docker-compose.yml b/apps/planka/docker-compose.yml new file mode 100644 index 00000000..51b60b8e --- /dev/null +++ b/apps/planka/docker-compose.yml @@ -0,0 +1,67 @@ +version: '3' + +services: + planka: + image: ghcr.io/plankanban/planka:1.12.0 + container_name: planka + command: > + bash -c + "for i in `seq 1 30`; do + ./start.sh && + s=$$? && break || s=$$?; + echo \"Tried $$i times. Waiting 5 seconds...\"; + sleep 5; + done; (exit $$s)" + restart: unless-stopped + volumes: + - ${APP_DATA_DIR}/data/user-avatars:/app/public/user-avatars + - ${APP_DATA_DIR}/data/project-background-images:/app/public/project-background-images + - ${APP_DATA_DIR}/data/attachments:/app/private/attachments + ports: + - ${APP_PORT}:1337 + environment: + BASE_URL: ${APP_PROTOCOL:-http}://${APP_DOMAIN} + TRUST_PROXY: 1 + DATABASE_URL: "postgresql://postgres@postgres/planka" + SECRET_KEY: "${PLANKA_SECRET_KEY}" + networks: + - tipi_main_network + labels: + # Main + traefik.enable: true + traefik.http.middlewares.planka-web-redirect.redirectscheme.scheme: https + traefik.http.services.planka.loadbalancer.server.port: 8016 + # Web + traefik.http.routers.planka-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.planka-insecure.entrypoints: web + traefik.http.routers.planka-insecure.service: planka + traefik.http.routers.planka-insecure.middlewares: planka-web-redirect + # Websecure + traefik.http.routers.planka.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.planka.entrypoints: websecure + traefik.http.routers.planka.service: planka + traefik.http.routers.planka.tls.certresolver: myresolver + # Local domain + traefik.http.routers.planka-local-insecure.rule: Host(`planka.${LOCAL_DOMAIN}`) + traefik.http.routers.planka-local-insecure.entrypoints: web + traefik.http.routers.planka-local-insecure.service: planka + traefik.http.routers.planka-local-insecure.middlewares: planka-web-redirect + # Local domain secure + traefik.http.routers.planka-local.rule: Host(`planka.${LOCAL_DOMAIN}`) + traefik.http.routers.planka-local.entrypoints: websecure + traefik.http.routers.planka-local.service: planka + traefik.http.routers.planka-local.tls: true + depends_on: + - postgres + + postgres: + image: postgres:14-alpine + container_name: planka-db + restart: unless-stopped + volumes: + - ${APP_DATA_DIR}/data/postgres:/var/lib/postgresql/data + environment: + POSTGRES_DB: "planka" + POSTGRES_HOST_AUTH_METHOD: "trust" + networks: + - tipi_main_network diff --git a/apps/planka/metadata/description.md b/apps/planka/metadata/description.md new file mode 100644 index 00000000..ec3af399 --- /dev/null +++ b/apps/planka/metadata/description.md @@ -0,0 +1,30 @@ +# Planka +#### Elegant open source project tracking + +![](https://raw.githubusercontent.com/plankanban/planka/master/demo.gif) + +[**Client demo**](https://plankanban.github.io/planka) (without server features). + +## Features + +- Create projects, boards, lists, cards, labels and tasks +- Add card members, track time, set a due date, add attachments, write comments +- Markdown support in a card description and comment +- Filter by members and labels +- Customize project background +- Real-time updates +- User notifications +- Internationalization + +## Tech stack + +- React, Redux, Redux-Saga, Redux-ORM, Semantic UI React, react-beautiful-dnd +- Sails.js, Knex.js +- PostgreSQL + +## Username and Password + +After installing login with these credentials: + +- Username: demo@demo.demo +- Password: demo diff --git a/apps/planka/metadata/logo.jpg b/apps/planka/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f85013a4ac23ffe8e147254d7c79b807cc609a96 GIT binary patch literal 4744 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 IoSTXN0dZsohX4Qo literal 0 HcmV?d00001