From 26bae2853ff4639cdeb1cbe0d6b6afd23a9314e4 Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Fri, 30 Sep 2022 00:13:54 +0200 Subject: [PATCH] app: add haven --- apps/haven/config.json | 37 ++++++++++++++++++++++ apps/haven/docker-compose.yml | 49 +++++++++++++++++++++++++++++ apps/haven/metadata/description.md | 15 +++++++++ apps/haven/metadata/logo.jpg | Bin 0 -> 11508 bytes 4 files changed, 101 insertions(+) create mode 100644 apps/haven/config.json create mode 100644 apps/haven/docker-compose.yml create mode 100644 apps/haven/metadata/description.md create mode 100644 apps/haven/metadata/logo.jpg diff --git a/apps/haven/config.json b/apps/haven/config.json new file mode 100644 index 00000000..38085bc3 --- /dev/null +++ b/apps/haven/config.json @@ -0,0 +1,37 @@ +{ + "$schema": "../schema.json", + "name": "Haven", + "available": true, + "port": 8130, + "id": "haven", + "exposable": true, + "tipi_version": 1, + "version": "a0280ce", + "categories": ["social"], + "description": "Self-hostable private blogging", + "short_desc": "Self-hostable private blogging", + "author": "mawise", + "source": "https://github.com/havenweb/haven", + "website": "https://havenweb.org/index.html", + "form_fields": [ + { + "type": "text", + "label": "Email", + "required": true, + "env_variable": "HAVEN_USER_EMAIL" + }, + { + "type": "password", + "label": "Haven password", + "max": 50, + "min": 8, + "required": true, + "env_variable": "HAVEN_USER_PASSWORD" + }, + { + "type": "random", + "label": "DB password", + "env_variable": "HAVEN_DB_PASSWORD" + } + ] +} diff --git a/apps/haven/docker-compose.yml b/apps/haven/docker-compose.yml new file mode 100644 index 00000000..ce2b07ee --- /dev/null +++ b/apps/haven/docker-compose.yml @@ -0,0 +1,49 @@ +version: '3.7' +services: + haven: + image: ghcr.io/havenweb/haven:a0280ce + container_name: haven + depends_on: + - haven-db + ports: + - ${APP_PORT}:3000 + volumes: + - ${APP_DATA_DIR}/data/storage:/storage + environment: + - RAILS_ENV=production + - HAVEN_DB_HOST=haven-db + - HAVEN_DB_NAME=haven + - HAVEN_DB_ROLE=haven + - HAVEN_DB_PASSWORD=${HAVEN_DB_PASSWORD} + - HAVEN_USER_EMAIL=${HAVEN_USER_EMAIL} + - HAVEN_USER_PASS=${HAVEN_USER_PASSWORD} + networks: + - tipi_main_network + labels: + traefik.enable: ${APP_EXPOSED} + traefik.http.routers.haven.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.haven.entrypoints: websecure + traefik.http.routers.haven.service: haven + traefik.http.routers.haven.tls.certresolver: myresolver + traefik.http.services.haven.loadbalancer.server.port: 3000 + + haven-db: + image: postgres:13.2-alpine + container_name: haven-db + command: [ + "postgres", + "-c", "max_connections=1000", + "-c", "synchronous_commit=off", + "-c", "fsync=off", + "-c", "full_page_writes=off", + "-c", "max_wal_size=4GB", + "-c", "checkpoint_timeout=30min", + "-c", "wal_level=logical" + ] + environment: + POSTGRES_HOST_AUTH_METHOD: trust + POSTGRES_USER: haven + volumes: + - ${APP_DATA_DIR}/data/db:/var/lib/postgresql/data + networks: + - tipi_main_network diff --git a/apps/haven/metadata/description.md b/apps/haven/metadata/description.md new file mode 100644 index 00000000..6eb89053 --- /dev/null +++ b/apps/haven/metadata/description.md @@ -0,0 +1,15 @@ +[Haven](https://havenweb.org) is a private blog application built with Ruby on Rails. Write what you want, create accounts for people you want to share with, keep up with each other using built-in RSS. + +Try out a live demo at https://havenweb.org/demo.html + +The following are some motivating philosophies: + +* Open-source. MIT License +* Privacy-first. This is for sharing with friends and family, not commercial endevors. If you want a blog for your company, you probably want to use WordPress or Ghost instead. +* Easy to use. Built-in web interface for managing users, customizing the blog, and writing/editing posts with markdown and live-preview. +* Low-bandwidth friendly. Images get downscaled to reduce page load times. No javascript frameworks. No ads or trackers. +* Customizable. Add custom CSS or fonts. +* No spam. There is no self-signup for users so there is no place for unauthorized users to impact your life. +* Media support for images, videos, and audio. +* Private RSS feeds for your friends to follow you. +* Build-in RSS reader to follow your favorite blogs. \ No newline at end of file diff --git a/apps/haven/metadata/logo.jpg b/apps/haven/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91e7139b141b2f98821a8db92e7fa14e7840b33b GIT binary patch literal 11508 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 V+V;