From 04b47828a13d30c07bbfeec00661e1bbd94a3b58 Mon Sep 17 00:00:00 2001 From: Stavros Date: Wed, 27 Dec 2023 18:33:48 +0200 Subject: [PATCH] feat(apps): add penpot (#1882) * feat(apps): add penpot * fix(penpot): fix description --- README.md | 5 +- apps/penpot/config.json | 24 +++++++ apps/penpot/docker-compose.yml | 100 ++++++++++++++++++++++++++++ apps/penpot/metadata/description.md | 30 +++++++++ apps/penpot/metadata/logo.jpg | Bin 0 -> 18528 bytes 5 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 apps/penpot/config.json create mode 100644 apps/penpot/docker-compose.yml create mode 100644 apps/penpot/metadata/description.md create mode 100644 apps/penpot/metadata/logo.jpg diff --git a/README.md b/README.md index b13e355d..24d642ff 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ This is the official repository for the Tipi App Store. It contains all the apps - [Mixpost Pro](https://mixpost.app/pricing) - Self-hosted social media management. Schedule and organize your social content. - [MongoDB](https://github.com/mongodb/mongo)- MongoDB is an open-source NoSQL database - [Mongo Express](https://github.com/mongo-express/mongo-express) - A web-based MongoDB admin interface written with Node.js, Express, and Bootstrap3 -- [Movary](https://github.com/leepeuker/movary ) - Track and rate your watched movies +- [Movary](https://github.com/leepeuker/movary) - Track and rate your watched movies - [mStream](https://github.com/IrosTheBeggar/mStream) - The easiest music streaming server available - [Mylar3](https://github.com/mylar3/mylar3) - Mylar3 is an automated Comic Book downloader (cbr/cbz) for use with NZB and torrents written in python. - [n8n](https://github.com/n8n-io/n8n) - Workflow Automation Tool @@ -121,6 +121,7 @@ This is the official repository for the Tipi App Store. It contains all the apps - [Owncloud](https://github.com/owncloud/core) - A personal cloud which runs on your own server. - [PairDrop](https://github.com/schlagmichdoch/PairDrop) - Local file sharing in your browser. Inspired by Apple's AirDrop. - [Paperless-ngx](https://github.com/paperless-ngx/paperless-ngx) - Document Management System (DMS) +- [Penpot](https://github.com/penpot/penpot) - The Open-Source design & prototyping platform. - [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 @@ -141,7 +142,7 @@ This is the official repository for the Tipi App Store. It contains all the apps - [Sabnzbd](https://github.com/sabnzbd/sabnzbd) - Sabnzbd makes Usenet as simple and streamlined as possible by automating everything we can" - [SearXNG](https://github.com/searxng/searxng) - SearXNG is a free internet metasearch engine which aggregates results from various search services and databases. Users are neither tracked nor profiled - [Send](https://gitlab.com/timvisee/send) - Simple, private file sharing -- [Serge](https://github.com/serge-chat/serge) - A web interface for chatting with Alpaca through llama.cpp. +- [Serge](https://github.com/serge-chat/serge) - A web interface for chatting with Alpaca through llama.cpp. - [Shlink](https://shlink.io/) - API first URL shortener - [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 diff --git a/apps/penpot/config.json b/apps/penpot/config.json new file mode 100644 index 00000000..b52d97a1 --- /dev/null +++ b/apps/penpot/config.json @@ -0,0 +1,24 @@ +{ + "name": "Penpot", + "available": true, + "port": 8645, + "exposable": true, + "id": "penpot", + "description": "Penpot - The Open-Source design & prototyping platform.", + "tipi_version": 1, + "version": "latest", + "categories": ["utilities"], + "short_desc": "Open-Source design & prototyping platform.", + "author": "penpot", + "source": "https://github.com/penpot/penpot", + "website": "https://penpot.app", + "supported_architectures": ["arm64", "amd64"], + "form_fields": [ + { + "type": "random", + "label": "Penpot postgres password.", + "min": 32, + "env_variable": "PENPOT_POSTGRES_PASSWORD" + } + ] +} diff --git a/apps/penpot/docker-compose.yml b/apps/penpot/docker-compose.yml new file mode 100644 index 00000000..79138913 --- /dev/null +++ b/apps/penpot/docker-compose.yml @@ -0,0 +1,100 @@ +version: "3.9" +services: + penpot: + image: penpotapp/frontend:latest + container_name: penpot + restart: unless-stopped + ports: + - ${APP_PORT}:80 + volumes: + - ${APP_DATA_DIR}/data/assets:/opt/data/assets + depends_on: + - penpot-backend + - penpot-exporter + networks: + - tipi_main_network + labels: + # Main + traefik.enable: true + traefik.http.middlewares.penpot-web-redirect.redirectscheme.scheme: https + traefik.http.services.penpot.loadbalancer.server.port: + 80 + # Web + traefik.http.routers.penpot-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.penpot-insecure.entrypoints: web + traefik.http.routers.penpot-insecure.service: penpot + traefik.http.routers.penpot-insecure.middlewares: + penpot-web-redirect + # Websecure + traefik.http.routers.penpot.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.penpot.entrypoints: websecure + traefik.http.routers.penpot.service: penpot + traefik.http.routers.penpot.tls.certresolver: + myresolver + # Local domain + traefik.http.routers.penpot-local-insecure.rule: Host(`penpot.${LOCAL_DOMAIN}`) + traefik.http.routers.penpot-local-insecure.entrypoints: web + traefik.http.routers.penpot-local-insecure.service: penpot + traefik.http.routers.penpot-local-insecure.middlewares: + penpot-web-redirect + # Local domain secure + traefik.http.routers.penpot-local.rule: Host(`penpot.${LOCAL_DOMAIN}`) + traefik.http.routers.penpot-local.entrypoints: websecure + traefik.http.routers.penpot-local.service: penpot + traefik.http.routers.penpot-local.tls: true + environment: + - PENPOT_FLAGS=enable-registration enable-login-with-password + + penpot-backend: + image: penpotapp/backend:latest + container_name: penpot-backend + restart: unless-stopped + volumes: + - ${APP_DATA_DIR}/data/assets:/opt/data/assets + depends_on: + - penpot-postgres + - penpot-redis + networks: + - tipi_main_network + environment: + - PENPOT_FLAGS=enable-registration enable-login-with-password disable-email-verification + - PENPOT_PUBLIC_URI=${APP_PROTOCOL:-http}://${APP_DOMAIN}:${APP_PORT} + - PENPOT_DATABASE_URI=postgresql://penpot-postgres/penpot + - PENPOT_DATABASE_USERNAME=tipi + - PENPOT_DATABASE_PASSWORD=${PENPOT_POSTGRES_PASSWORD} + - PENPOT_REDIS_URI=redis://penpot-redis/0 + - PENPOT_ASSETS_STORAGE_BACKEND=assets-fs + - PENPOT_STORAGE_ASSETS_FS_DIRECTORY=/opt/data/assets + - PENPOT_TELEMETRY_ENABLED=false + + penpot-exporter: + image: penpotapp/exporter:latest + container_name: penpot-exporter + restart: unless-stopped + networks: + - tipi_main_network + environment: + - PENPOT_PUBLIC_URI=http://penpot + - PENPOT_REDIS_URI=redis://penpot-redis/0 + + penpot-postgres: + image: postgres:14 + restart: unless-stopped + container_name: penpot-postgres + stop_signal: SIGINT + volumes: + - ${APP_DATA_DIR}/data/postgres:/var/lib/postgresql/data + networks: + - tipi_main_network + environment: + - POSTGRES_INITDB_ARGS=--data-checksums + - POSTGRES_DB=penpot + - POSTGRES_USER=tipi + - POSTGRES_PASSWORD=${PENPOT_POSTGRES_PASSWORD} + + penpot-redis: + image: redis:7 + container_name: penpot-redis + restart: unless-stopped + networks: + - tipi_main_network diff --git a/apps/penpot/metadata/description.md b/apps/penpot/metadata/description.md new file mode 100644 index 00000000..83a528d2 --- /dev/null +++ b/apps/penpot/metadata/description.md @@ -0,0 +1,30 @@ +

+
+ PENPOT +

+ +🎇 **Penpot Fest exceeded all expectations - it was a complete success!** 🎇 Penpot Fest is our first Design event that brought designers and developers from the Open Source communities and beyond. Watch the replay of the talks on our [Youtube channel](https://www.youtube.com/playlist?list=PLgcCPfOv5v56-fghJo2dHNBqL9zlDTslh) or [Peertube channel](https://peertube.kaleidos.net/w/p/1tWgyJTt8sKbWwCEcBimZW) + +Penpot is the first **Open Source** design and prototyping platform meant for cross-domain teams. Non dependent on operating systems, Penpot is web based and works with open standards (SVG). Penpot invites designers all over the world to fall in love with open source while getting developers excited about the design process in return. + +![feature-readme](https://user-images.githubusercontent.com/1045247/189871786-0b44f7cf-3a0a-4445-a87b-9919ec398bf7.gif) + +## Why Penpot + +Penpot makes design and prototyping accessible to every team in the world. + +### For cross-domain teams + +We have a clear focus on design and code teams and our capabilities reflect exactly that. The less hand-off mindset, the more fun for everyone. + +### Multiplatform + +Being web based, Penpot is not dependent on operating systems or local installations, you will only need to run a modern browser. + +### Open Standards + +Using SVG as no other design and prototyping tool does, Penpot files sport compatibility with most of the vectorial tools, are tech friendly and extremely easy to use on the web. We make sure you will always own your work. + +

+ Open Source +

diff --git a/apps/penpot/metadata/logo.jpg b/apps/penpot/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5b0aaab525014add311b4adea1b6c6e3f5a399eb GIT binary patch literal 18528 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