From 2c5ba3eed77482dd124894735e9c02918cffb917 Mon Sep 17 00:00:00 2001 From: Cooper Date: Fri, 20 May 2022 13:19:50 -0400 Subject: [PATCH 01/20] Update paths --- apps/jackett/docker-compose.yml | 2 +- apps/jellyfin/docker-compose.yml | 2 +- apps/radarr/docker-compose.yml | 3 +-- apps/sonarr/docker-compose.yml | 3 +-- apps/transmission/docker-compose.yml | 2 +- 5 files changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/jackett/docker-compose.yml b/apps/jackett/docker-compose.yml index 6552a706..3e314f89 100644 --- a/apps/jackett/docker-compose.yml +++ b/apps/jackett/docker-compose.yml @@ -12,7 +12,7 @@ services: - ${DNS_IP} volumes: - ${APP_DATA_DIR}/data:/config - - ${ROOT_FOLDER_HOST}/media/torrents:/downloads + - ${ROOT_FOLDER_HOST}/media/torrents:/media/torrents ports: - ${APP_PORT}:9117 restart: unless-stopped diff --git a/apps/jellyfin/docker-compose.yml b/apps/jellyfin/docker-compose.yml index 38d5eefb..41cd71c1 100644 --- a/apps/jellyfin/docker-compose.yml +++ b/apps/jellyfin/docker-compose.yml @@ -6,7 +6,7 @@ services: container_name: jellyfin volumes: - ${APP_DATA_DIR}/data/config:/config - - ${ROOT_FOLDER_HOST}/media/data:/data/media + - ${ROOT_FOLDER_HOST}/media/data:/media/data environment: - PUID=1000 - PGID=1000 diff --git a/apps/radarr/docker-compose.yml b/apps/radarr/docker-compose.yml index fe01e2cc..081c33ba 100644 --- a/apps/radarr/docker-compose.yml +++ b/apps/radarr/docker-compose.yml @@ -11,8 +11,7 @@ services: - ${DNS_IP} volumes: - ${APP_DATA_DIR}/data:/config - - ${ROOT_FOLDER_HOST}/media/data/movies:/movies #optional - - ${ROOT_FOLDER_HOST}/media/torrents:/downloads #optional + - ${ROOT_FOLDER_HOST}/media:/media ports: - ${APP_PORT}:7878 restart: unless-stopped diff --git a/apps/sonarr/docker-compose.yml b/apps/sonarr/docker-compose.yml index e6f404a9..702d315b 100644 --- a/apps/sonarr/docker-compose.yml +++ b/apps/sonarr/docker-compose.yml @@ -11,8 +11,7 @@ services: - ${DNS_IP} volumes: - ${APP_DATA_DIR}/data:/config - - ${ROOT_FOLDER_HOST}/media/data/tv:/tv #optional - - ${ROOT_FOLDER_HOST}/media/torrents:/downloads #optional + - ${ROOT_FOLDER_HOST}/media:/media ports: - ${APP_PORT}:8989 restart: unless-stopped diff --git a/apps/transmission/docker-compose.yml b/apps/transmission/docker-compose.yml index be01a879..3a75384c 100644 --- a/apps/transmission/docker-compose.yml +++ b/apps/transmission/docker-compose.yml @@ -14,7 +14,7 @@ services: # - HOST_WHITELIST=dnsnane list #optional volumes: - ${APP_DATA_DIR}/data/config:/config - - ${ROOT_FOLDER_HOST}/media/torrents:/downloads + - ${ROOT_FOLDER_HOST}/media/torrents:/media/torrents ports: - ${APP_PORT}:9091 - 51413:51413 From 843320250ceb94d370d17a93b5176b1e03c4be1f Mon Sep 17 00:00:00 2001 From: ArneNaessens Date: Fri, 20 May 2022 23:42:57 +0200 Subject: [PATCH 02/20] Fix adguard spelling mistake --- apps/adguard/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/adguard/config.json b/apps/adguard/config.json index f379ada6..325d7c58 100644 --- a/apps/adguard/config.json +++ b/apps/adguard/config.json @@ -6,7 +6,7 @@ "description": "Adguard is the best way to get rid of annoying ads and online tracking and protect your computer from malware. Make your web surfing fast, safe and ad-free.", "short_desc": "World's most advanced adblocker!", "author": "ArneNaessens", - "source": "https://github:com/AdguardTeam", + "source": "https://github.com/AdguardTeam", "image": "https://avatars.githubusercontent.com/u/8361145?s=200&v=4", "requirements": { "ports": [53] From ec7e5f932cfedb847ecf380e86f998e2589c0738 Mon Sep 17 00:00:00 2001 From: Stetsed Date: Sat, 21 May 2022 11:45:22 +0200 Subject: [PATCH 03/20] Add LibReddit App --- apps/libreddit/config.json | 12 ++++++++++++ apps/libreddit/docker-compose.yml | 10 ++++++++++ 2 files changed, 22 insertions(+) create mode 100644 apps/libreddit/config.json create mode 100644 apps/libreddit/docker-compose.yml diff --git a/apps/libreddit/config.json b/apps/libreddit/config.json new file mode 100644 index 00000000..389590a5 --- /dev/null +++ b/apps/libreddit/config.json @@ -0,0 +1,12 @@ +{ + "name": "LibReddit", + "available": true, + "port": 8105, + "id": "libreddit", + "description": "LibReddit is a bloat free reddit frontend written in Rust, no ads, no tracking and strong Content Security Policy prevents any request from going to reddit, everything is proxied.", + "short_desc": "Browse reddit without problems!", + "author": "Stetsed", + "source": "https://github.com/spikecodes/libreddit", + "image": "https://raw.githubusercontent.com/spikecodes/libreddit/master/static/favicon.ico", + "form_fields": {} + } diff --git a/apps/libreddit/docker-compose.yml b/apps/libreddit/docker-compose.yml new file mode 100644 index 00000000..90cc0b7a --- /dev/null +++ b/apps/libreddit/docker-compose.yml @@ -0,0 +1,10 @@ +version: "3.7" +services: + libreddit: + container_name: libreddit + image: spikecodes/libreddit + ports: + - ${APP_PORT}:8080 + restart: unless-stopped + networks: + - tipi_main_network \ No newline at end of file From b1c904e31b361fc073614c86eb82a1d1c50d27b9 Mon Sep 17 00:00:00 2001 From: Stetsed Date: Sat, 21 May 2022 11:48:12 +0200 Subject: [PATCH 04/20] Add Nitter App --- apps/nitter/config.json | 12 +++++++++ apps/nitter/data/nitter.conf | 45 ++++++++++++++++++++++++++++++++++ apps/nitter/docker-compose.yml | 28 +++++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 apps/nitter/config.json create mode 100644 apps/nitter/data/nitter.conf create mode 100644 apps/nitter/docker-compose.yml diff --git a/apps/nitter/config.json b/apps/nitter/config.json new file mode 100644 index 00000000..84bc147e --- /dev/null +++ b/apps/nitter/config.json @@ -0,0 +1,12 @@ +{ + "name": "Nitter", + "available": true, + "port": 8106, + "id": "nitter", + "description": "A free and open source alternative Twitter front-end focused on privacy and performance.", + "short_desc": "Twitter without annoyances!", + "author": "Stetsed", + "source": "https://github.com/zedeus/nitter", + "image": "https://raw.githubusercontent.com/zedeus/nitter/master/public/favicon.ico", + "form_fields": {} + } \ No newline at end of file diff --git a/apps/nitter/data/nitter.conf b/apps/nitter/data/nitter.conf new file mode 100644 index 00000000..5acc5be4 --- /dev/null +++ b/apps/nitter/data/nitter.conf @@ -0,0 +1,45 @@ +[Server] +address = "0.0.0.0" +port = 8080 +https = false # disable to enable cookies when not using https +httpMaxConnections = 100 +staticDir = "./public" +title = "nitter" +hostname = "" + +[Cache] +listMinutes = 240 # how long to cache list info (not the tweets, so keep it high) +rssMinutes = 10 # how long to cache rss queries +redisHost = "nitter-redis" # Change to "nitter-redis" if using docker-compose +redisPort = 6379 +redisPassword = "" +redisConnections = 20 # connection pool size +redisMaxConnections = 30 +# max, new connections are opened when none are available, but if the pool size +# goes above this, they're closed when released. don't worry about this unless +# you receive tons of requests per second + +[Config] +hmacKey = "secretkey" # random key for cryptographic signing of video urls +base64Media = false # use base64 encoding for proxied media urls +enableRSS = true # set this to false to disable RSS feeds +enableDebug = false # enable request logs and debug endpoints +proxy = "" # http/https url, SOCKS proxies are not supported +proxyAuth = "" +tokenCount = 10 +# minimum amount of usable tokens. tokens are used to authorize API requests, +# but they expire after ~1 hour, and have a limit of 187 requests. +# the limit gets reset every 15 minutes, and the pool is filled up so there's +# always at least $tokenCount usable tokens. again, only increase this if +# you receive major bursts all the time + +# Change default preferences here, see src/prefs_impl.nim for a complete list +[Preferences] +theme = "Nitter" +replaceTwitter = "" +replaceYouTube = "" +replaceReddit = "" +replaceInstagram = "" +proxyVideos = true +hlsPlayback = true +infiniteScroll = true \ No newline at end of file diff --git a/apps/nitter/docker-compose.yml b/apps/nitter/docker-compose.yml new file mode 100644 index 00000000..25c6fd70 --- /dev/null +++ b/apps/nitter/docker-compose.yml @@ -0,0 +1,28 @@ +version: "3" + +services: + + nitter: + image: zedeus/nitter:latest + container_name: nitter + networks: + - tipi_main_network + ports: + - ${APP_PORT}:8080 + volumes: + - "${APP_DATA_DIR}/data/nitter.conf:/src/nitter.conf:ro" + depends_on: + - nitter-redis + restart: unless-stopped + nitter-redis: + image: redis:6-alpine + container_name: nitter-redis + networks: + - tipi_main_network + command: redis-server --save 60 1 --loglevel warning + volumes: + - nitter-redis:/data + restart: unless-stopped + +volumes: + nitter-redis: \ No newline at end of file From 7791b8cdb93e6aab66002c928bc01dd49725af76 Mon Sep 17 00:00:00 2001 From: Stetsed Date: Sat, 21 May 2022 11:49:01 +0200 Subject: [PATCH 05/20] Add Vaultwarden App --- apps/vaultwarden/config.json | 21 +++++++++++++++++++++ apps/vaultwarden/docker-compose.yml | 16 ++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 apps/vaultwarden/config.json create mode 100644 apps/vaultwarden/docker-compose.yml diff --git a/apps/vaultwarden/config.json b/apps/vaultwarden/config.json new file mode 100644 index 00000000..029be6e0 --- /dev/null +++ b/apps/vaultwarden/config.json @@ -0,0 +1,21 @@ +{ + "name": "VaultWarden", + "available": true, + "port": 8107, + "id": "Vaultwarden", + "description": "Alternative implementation of the Bitwarden server API written in Rust and compatible with upstream Bitwarden clients, perfect for self-hosted deployment where running the official resource-heavy service might not be ideal.", + "short_desc": "All your passwords in your control!", + "author": "Stetsed", + "source": "https://github.com/dani-garcia/vaultwarden", + "image": "https://raw.githubusercontent.com/dani-garcia/vaultwarden/b636d20c6475bfb1b36561cb95812faee26ea7db/resources/vaultwarden-icon.svg", + "form_fields": { + "admin_password": { + "type": "password", + "label": "Admin Panel Password", + "max": 50, + "min": 10, + "required": true, + "env_variable": "VAULTWARDEN_ADMIN_PASSWORD" + } + } + } \ No newline at end of file diff --git a/apps/vaultwarden/docker-compose.yml b/apps/vaultwarden/docker-compose.yml new file mode 100644 index 00000000..187914f9 --- /dev/null +++ b/apps/vaultwarden/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3' + +services: + vaultwarden: + image: vaultwarden/server + container_name: vaultwarden + restart: unless-stopped + ports: + - ${APP_PORT}:80 + networks: + - tipi_main_network + environment: + - WEBSOCKET_ENABLED=true + - ADMIN_TOKEN=$VAULTWARDEN_ADMIN_PASSWORD + volumes: + - ${APP_DATA_DIR}/data:/data From 13bf081c9799dc9bbda1d96e42825baa981cc68f Mon Sep 17 00:00:00 2001 From: Michael <8832013+MichaelYochpaz@users.noreply.github.com> Date: Sat, 21 May 2022 17:19:29 +0300 Subject: [PATCH 06/20] Fix `Coder-Server` link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f66e8aa5..2663abe7 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Tipi is a personal homeserver orchestrator. It is running docker containers unde ## Apps available - [Calibre-Web](https://github.com/janeczku/calibre-web) - Web Ebook Reader -- [Code-Server](https://github.com/filebrowser/filebrowser) - Web VS Code +- [Code-Server](https://github.com/coder/code-server) - Web VS Code - [Filebrowser](https://github.com/filebrowser/filebrowser) - Web File Browser - [Freshrss](https://github.com/FreshRSS/FreshRSS) - A free, self-hostable RSS aggregator - [Invidious](https://github.com/iv-org/invidious) - An alternative front-end to YouTube From dd4161056ecb3f6f593af81c450c00db119f4225 Mon Sep 17 00:00:00 2001 From: Cobre Date: Sat, 21 May 2022 14:53:52 -0400 Subject: [PATCH 07/20] Add Prowlarr --- apps/prowlarr/config.json | 13 +++++++++++++ apps/prowlarr/docker-compose.yml | 14 ++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 apps/prowlarr/config.json create mode 100644 apps/prowlarr/docker-compose.yml diff --git a/apps/prowlarr/config.json b/apps/prowlarr/config.json new file mode 100644 index 00000000..898d272f --- /dev/null +++ b/apps/prowlarr/config.json @@ -0,0 +1,13 @@ +{ + "name": "Prowlarr", + "available": true, + "port": 9696, + "id": "prowlarr", + "description": "Prowlarr is an indexer manager/proxy built on the popular *arr .net/reactjs base stack to integrate with your various PVR apps. Prowlarr supports management of both Torrent Trackers and Usenet Indexers. It integrates seamlessly with Lidarr, Mylar3, Radarr, Readarr, and Sonarr offering complete management of your indexers with no per app Indexer setup required (we do it all).", + "short_desc": "A torrent/usenet indexer manager/proxy", + "author": "", + "source": "https://github.com/Prowlarr/Prowlarr/", + "image": "https://prowlarr.com/logo/256.png", + "form_fields": {} + } + \ No newline at end of file diff --git a/apps/prowlarr/docker-compose.yml b/apps/prowlarr/docker-compose.yml new file mode 100644 index 00000000..26bd2e00 --- /dev/null +++ b/apps/prowlarr/docker-compose.yml @@ -0,0 +1,14 @@ +version: "2.1" +services: + prowlarr: # Should be exact same name as "id" field in config.json + container_name: prowlarr # Should be exact same name as "id" field in config.json + image: ghcr.io/linuxserver/prowlarr:develop + environment: + - TZ=${TZ} # Can use any env variable. List in runtipi/templates/env-sample + volumes: + - ${APP_DATA_DIR}/data/config:/config #Always start the path with ${APP_DATA_DIR}. This will put all data inside app-data/my-app/data + ports: + - ${APP_PORT}:9696 + restart: unless-stopped + networks: + - tipi_main_network \ No newline at end of file From 40ac89f9f8e08e339eaf4e64a9eaaab76edfe3f0 Mon Sep 17 00:00:00 2001 From: Arne Naessens Date: Sun, 22 May 2022 12:03:02 +0200 Subject: [PATCH 08/20] Add gitea --- README.md | 1 + apps/gitea/config.json | 12 ++++++++++++ apps/gitea/docker-compose.yml | 37 +++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 apps/gitea/config.json create mode 100644 apps/gitea/docker-compose.yml diff --git a/README.md b/README.md index f66e8aa5..1b044fcb 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ Tipi is a personal homeserver orchestrator. It is running docker containers unde - [Transmission](https://github.com/transmission/transmission) - Fast, easy, and free BitTorrent client - [Wireguard Easy](https://github.com/WeeJeWel/wg-easy) - WireGuard VPN + Web-based Admin UI - [Adguard Home](https://github.com/AdguardTeam/AdGuardHome) - Adguard Home DNS adblocker +- [Gitea](https://github.com/go-gitea/gitea) - Gitea - A painless self-hosted Git service. ## 馃洜 Installation ### Installation Requirements - Ubuntu 18.04 LTS or higher (or Debian 10) diff --git a/apps/gitea/config.json b/apps/gitea/config.json new file mode 100644 index 00000000..6627ad4d --- /dev/null +++ b/apps/gitea/config.json @@ -0,0 +1,12 @@ +{ + "name": "Gitea", + "port": 8108, + "available": true, + "id": "gitea", + "description": "Gitea is a painless self-hosted Git service. It is similar to GitHub, Bitbucket, and GitLab. Gitea is a fork of Gogs. See the Gitea Announcement blog post to read about the justification for a fork.", + "short_desc": "Gitea - Git with a cup of tea 路 A painless self-hosted Git service. 路 Cross-platform 路 Easy to install 路 Lightweight 路 Open Source.", + "author": "ArneNaessens", + "source": "https://github.com/go-gitea/gitea", + "image": "https://avatars.githubusercontent.com/u/12724356?s=200&v=4", + "form_fields": {} +} diff --git a/apps/gitea/docker-compose.yml b/apps/gitea/docker-compose.yml new file mode 100644 index 00000000..9937b444 --- /dev/null +++ b/apps/gitea/docker-compose.yml @@ -0,0 +1,37 @@ +version: "3" + +services: + gitea: + image: gitea/gitea:1.16.8 + container_name: gitea + environment: + - USER_UID=1000 + - USER_GID=1000 + - GITEA__database__DB_TYPE=mysql + - GITEA__database__HOST=gitea_db:3306 + - GITEA__database__NAME=tipi_gitea + - GITEA__database__USER=tipi_gitea + - GITEA__database__PASSWD=tipi_gitea + restart: unless-stopped + networks: + - tipi_main_network + volumes: + - ${APP_DATA_DIR}/gitea/data:/data + ports: + - ${APP_PORT}:3000 + - "222:22" + depends_on: + - gitea_db + + gitea_db: + image: mysql:8 + restart: unless-stopped + environment: + - MYSQL_ROOT_PASSWORD=tipi_gitea + - MYSQL_USER=tipi_gitea + - MYSQL_PASSWORD=tipi_gitea + - MYSQL_DATABASE=tipi_gitea + networks: + - tipi_main_network + volumes: + - ${APP_DATA_DIR}/mysql/var/lib/mysql:/var/lib/mysql From c79500bf9c9c8163b38e3f3ae1485793e61fb593 Mon Sep 17 00:00:00 2001 From: Stetsed <33891782+Stetsed@users.noreply.github.com> Date: Sun, 22 May 2022 23:30:27 +0200 Subject: [PATCH 09/20] Fix brackets --- apps/vaultwarden/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/vaultwarden/docker-compose.yml b/apps/vaultwarden/docker-compose.yml index 187914f9..0d9d8b03 100644 --- a/apps/vaultwarden/docker-compose.yml +++ b/apps/vaultwarden/docker-compose.yml @@ -11,6 +11,6 @@ services: - tipi_main_network environment: - WEBSOCKET_ENABLED=true - - ADMIN_TOKEN=$VAULTWARDEN_ADMIN_PASSWORD + - ADMIN_TOKEN=${VAULTWARDEN_ADMIN_PASSWORD} volumes: - ${APP_DATA_DIR}/data:/data From 6ac28c21b9a59699a354e64063d845d8e4ffe190 Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Mon, 23 May 2022 06:49:05 +0200 Subject: [PATCH 10/20] Fix workflow trigger --- .github/workflows/release-candidate.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-candidate.yml b/.github/workflows/release-candidate.yml index 1f47ef3d..55cbf3b0 100644 --- a/.github/workflows/release-candidate.yml +++ b/.github/workflows/release-candidate.yml @@ -1,9 +1,9 @@ name: Release candidate on: - pull_request: + push: branches: - - master + - release/* jobs: # Build images and publish RCs to DockerHub From d286c7f6b59f72dc4e416908127c12dd3eb1c375 Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Mon, 23 May 2022 07:08:47 +0200 Subject: [PATCH 11/20] Adguard compose v3.7 --- apps/adguard/docker-compose.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/adguard/docker-compose.yml b/apps/adguard/docker-compose.yml index aeb0062a..1953149c 100644 --- a/apps/adguard/docker-compose.yml +++ b/apps/adguard/docker-compose.yml @@ -1,6 +1,5 @@ -version: "3.5" - +version: "3.7" services: adguardhome: image: adguard/adguardhome:v0.107.6 From 33aa6c48f5369d5b7a058507ee3510ac55ee1434 Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Mon, 23 May 2022 07:15:08 +0200 Subject: [PATCH 12/20] Edit author for libreddit --- apps/libreddit/config.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/apps/libreddit/config.json b/apps/libreddit/config.json index 389590a5..aa0a53f4 100644 --- a/apps/libreddit/config.json +++ b/apps/libreddit/config.json @@ -1,12 +1,12 @@ { - "name": "LibReddit", - "available": true, - "port": 8105, - "id": "libreddit", - "description": "LibReddit is a bloat free reddit frontend written in Rust, no ads, no tracking and strong Content Security Policy prevents any request from going to reddit, everything is proxied.", - "short_desc": "Browse reddit without problems!", - "author": "Stetsed", - "source": "https://github.com/spikecodes/libreddit", - "image": "https://raw.githubusercontent.com/spikecodes/libreddit/master/static/favicon.ico", - "form_fields": {} - } + "name": "LibReddit", + "available": true, + "port": 8105, + "id": "libreddit", + "description": "LibReddit is a bloat free reddit frontend written in Rust, no ads, no tracking and strong Content Security Policy prevents any request from going to reddit, everything is proxied.", + "short_desc": "Browse reddit without problems!", + "author": "spikecodes", + "source": "https://github.com/spikecodes/libreddit", + "image": "https://raw.githubusercontent.com/spikecodes/libreddit/master/static/logo.png", + "form_fields": {} +} From b37eae46b98bb0af39d4f71cd6fd6fd18af529a1 Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Mon, 23 May 2022 07:22:52 +0200 Subject: [PATCH 13/20] Update Nitter config --- apps/nitter/config.json | 22 +++++++++++----------- apps/nitter/docker-compose.yml | 10 +++------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/apps/nitter/config.json b/apps/nitter/config.json index 84bc147e..bcbd768a 100644 --- a/apps/nitter/config.json +++ b/apps/nitter/config.json @@ -1,12 +1,12 @@ { - "name": "Nitter", - "available": true, - "port": 8106, - "id": "nitter", - "description": "A free and open source alternative Twitter front-end focused on privacy and performance.", - "short_desc": "Twitter without annoyances!", - "author": "Stetsed", - "source": "https://github.com/zedeus/nitter", - "image": "https://raw.githubusercontent.com/zedeus/nitter/master/public/favicon.ico", - "form_fields": {} - } \ No newline at end of file + "name": "Nitter", + "available": true, + "port": 8106, + "id": "nitter", + "description": "A free and open source alternative Twitter front-end focused on privacy and performance.", + "short_desc": "Twitter without annoyances!", + "author": "zedeus", + "source": "https://github.com/zedeus/nitter", + "image": "https://raw.githubusercontent.com/zedeus/nitter/master/public/favicon.ico", + "form_fields": {} +} diff --git a/apps/nitter/docker-compose.yml b/apps/nitter/docker-compose.yml index 25c6fd70..479cc285 100644 --- a/apps/nitter/docker-compose.yml +++ b/apps/nitter/docker-compose.yml @@ -1,7 +1,6 @@ -version: "3" +version: "3.7" services: - nitter: image: zedeus/nitter:latest container_name: nitter @@ -21,8 +20,5 @@ services: - tipi_main_network command: redis-server --save 60 1 --loglevel warning volumes: - - nitter-redis:/data - restart: unless-stopped - -volumes: - nitter-redis: \ No newline at end of file + - "${APP_DATA_DIR}/data/redis:/data" + restart: unless-stopped \ No newline at end of file From 0f62ec4c783395e8e82b1b4bed0d9ee04efb5eeb Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Mon, 23 May 2022 07:33:22 +0200 Subject: [PATCH 14/20] Update VaultWarden config --- apps/vaultwarden/config.json | 38 ++++++++++++++--------------- apps/vaultwarden/docker-compose.yml | 8 +++--- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/apps/vaultwarden/config.json b/apps/vaultwarden/config.json index 029be6e0..c4eecdbc 100644 --- a/apps/vaultwarden/config.json +++ b/apps/vaultwarden/config.json @@ -1,21 +1,21 @@ { - "name": "VaultWarden", - "available": true, - "port": 8107, - "id": "Vaultwarden", - "description": "Alternative implementation of the Bitwarden server API written in Rust and compatible with upstream Bitwarden clients, perfect for self-hosted deployment where running the official resource-heavy service might not be ideal.", - "short_desc": "All your passwords in your control!", - "author": "Stetsed", - "source": "https://github.com/dani-garcia/vaultwarden", - "image": "https://raw.githubusercontent.com/dani-garcia/vaultwarden/b636d20c6475bfb1b36561cb95812faee26ea7db/resources/vaultwarden-icon.svg", - "form_fields": { - "admin_password": { - "type": "password", - "label": "Admin Panel Password", - "max": 50, - "min": 10, - "required": true, - "env_variable": "VAULTWARDEN_ADMIN_PASSWORD" - } + "name": "VaultWarden", + "available": true, + "port": 8107, + "id": "vaultwarden", + "description": "Alternative implementation of the Bitwarden server API written in Rust and compatible with upstream Bitwarden clients, perfect for self-hosted deployment where running the official resource-heavy service might not be ideal.", + "short_desc": "All your passwords in your control!", + "author": "Daniel Garc铆a", + "source": "https://github.com/dani-garcia/vaultwarden", + "image": "https://raw.githubusercontent.com/dani-garcia/vaultwarden/b636d20c6475bfb1b36561cb95812faee26ea7db/resources/vaultwarden-icon.svg", + "form_fields": { + "admin_password": { + "type": "password", + "label": "Admin Panel Password", + "max": 50, + "min": 10, + "required": true, + "env_variable": "VAULTWARDEN_ADMIN_PASSWORD" } - } \ No newline at end of file + } +} diff --git a/apps/vaultwarden/docker-compose.yml b/apps/vaultwarden/docker-compose.yml index 0d9d8b03..e7b698ee 100644 --- a/apps/vaultwarden/docker-compose.yml +++ b/apps/vaultwarden/docker-compose.yml @@ -1,16 +1,16 @@ -version: '3' +version: '3.7' services: vaultwarden: - image: vaultwarden/server + image: vaultwarden/server:1.24.0 container_name: vaultwarden restart: unless-stopped ports: - ${APP_PORT}:80 - networks: - - tipi_main_network environment: - WEBSOCKET_ENABLED=true - ADMIN_TOKEN=${VAULTWARDEN_ADMIN_PASSWORD} volumes: - ${APP_DATA_DIR}/data:/data + networks: + - tipi_main_network From ae95264d8109cc8be2de38b7a3a5c41a23bf7067 Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Mon, 23 May 2022 07:43:28 +0200 Subject: [PATCH 15/20] Update Prowlarr config --- apps/prowlarr/config.json | 23 +++++++++++------------ apps/prowlarr/docker-compose.yml | 1 + 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/prowlarr/config.json b/apps/prowlarr/config.json index 898d272f..fd5cdef0 100644 --- a/apps/prowlarr/config.json +++ b/apps/prowlarr/config.json @@ -1,13 +1,12 @@ { - "name": "Prowlarr", - "available": true, - "port": 9696, - "id": "prowlarr", - "description": "Prowlarr is an indexer manager/proxy built on the popular *arr .net/reactjs base stack to integrate with your various PVR apps. Prowlarr supports management of both Torrent Trackers and Usenet Indexers. It integrates seamlessly with Lidarr, Mylar3, Radarr, Readarr, and Sonarr offering complete management of your indexers with no per app Indexer setup required (we do it all).", - "short_desc": "A torrent/usenet indexer manager/proxy", - "author": "", - "source": "https://github.com/Prowlarr/Prowlarr/", - "image": "https://prowlarr.com/logo/256.png", - "form_fields": {} - } - \ No newline at end of file + "name": "Prowlarr", + "available": true, + "port": 8109, + "id": "prowlarr", + "description": "Prowlarr is an indexer manager/proxy built on the popular *arr .net/reactjs base stack to integrate with your various PVR apps. Prowlarr supports management of both Torrent Trackers and Usenet Indexers. It integrates seamlessly with Lidarr, Mylar3, Radarr, Readarr, and Sonarr offering complete management of your indexers with no per app Indexer setup required (we do it all).", + "short_desc": "A torrent/usenet indexer manager/proxy", + "author": "Prowlarr", + "source": "https://github.com/Prowlarr/Prowlarr/", + "image": "https://prowlarr.com/logo/256.png", + "form_fields": {} +} diff --git a/apps/prowlarr/docker-compose.yml b/apps/prowlarr/docker-compose.yml index 26bd2e00..19eb8445 100644 --- a/apps/prowlarr/docker-compose.yml +++ b/apps/prowlarr/docker-compose.yml @@ -5,6 +5,7 @@ services: image: ghcr.io/linuxserver/prowlarr:develop environment: - TZ=${TZ} # Can use any env variable. List in runtipi/templates/env-sample + - DNS_IP=${DNS_IP} volumes: - ${APP_DATA_DIR}/data/config:/config #Always start the path with ${APP_DATA_DIR}. This will put all data inside app-data/my-app/data ports: From 33857258bef146291cb436f7d6408b318296f981 Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Mon, 23 May 2022 07:47:58 +0200 Subject: [PATCH 16/20] Update README --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 2663abe7..db5cc63d 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,10 @@ Tipi is a personal homeserver orchestrator. It is running docker containers unde - [Transmission](https://github.com/transmission/transmission) - Fast, easy, and free BitTorrent client - [Wireguard Easy](https://github.com/WeeJeWel/wg-easy) - WireGuard VPN + Web-based Admin UI - [Adguard Home](https://github.com/AdguardTeam/AdGuardHome) - Adguard Home DNS adblocker +- [Libreddit](https://github.com/spikecodes/libreddit) - Private front-end for Reddit +- [Nitter](https://github.com/zedeus/nitter) - Alternative Twitter front-end +- [Vaultwarden](https://github.com/dani-garcia/vaultwarden) - Unofficial Bitwarden compatible server +- [Prowlarr](https://github.com/Prowlarr/Prowlarr/) - A torrent/usenet indexer manager/proxy ## 馃洜 Installation ### Installation Requirements - Ubuntu 18.04 LTS or higher (or Debian 10) From d188a5c79cf0a05a773bb2596877f0408043573d Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Mon, 23 May 2022 08:12:58 +0200 Subject: [PATCH 17/20] Update Gitea config --- apps/gitea/config.json | 2 +- apps/gitea/data/gitea/gitea/conf/app.ini | 88 ++++++++++++++++++++++++ apps/gitea/docker-compose.yml | 30 ++++---- 3 files changed, 104 insertions(+), 16 deletions(-) create mode 100644 apps/gitea/data/gitea/gitea/conf/app.ini diff --git a/apps/gitea/config.json b/apps/gitea/config.json index 6627ad4d..7abec2a6 100644 --- a/apps/gitea/config.json +++ b/apps/gitea/config.json @@ -5,7 +5,7 @@ "id": "gitea", "description": "Gitea is a painless self-hosted Git service. It is similar to GitHub, Bitbucket, and GitLab. Gitea is a fork of Gogs. See the Gitea Announcement blog post to read about the justification for a fork.", "short_desc": "Gitea - Git with a cup of tea 路 A painless self-hosted Git service. 路 Cross-platform 路 Easy to install 路 Lightweight 路 Open Source.", - "author": "ArneNaessens", + "author": "go-gitea", "source": "https://github.com/go-gitea/gitea", "image": "https://avatars.githubusercontent.com/u/12724356?s=200&v=4", "form_fields": {} diff --git a/apps/gitea/data/gitea/gitea/conf/app.ini b/apps/gitea/data/gitea/gitea/conf/app.ini new file mode 100644 index 00000000..8056f275 --- /dev/null +++ b/apps/gitea/data/gitea/gitea/conf/app.ini @@ -0,0 +1,88 @@ +APP_NAME = Gitea: Git with a cup of tea +RUN_MODE = prod +RUN_USER = git + +[repository] +ROOT = /data/git/repositories + +[repository.local] +LOCAL_COPY_PATH = /data/gitea/tmp/local-repo + +[repository.upload] +TEMP_PATH = /data/gitea/uploads + +[server] +APP_DATA_PATH = /data/gitea +DOMAIN = localhost +SSH_DOMAIN = localhost +HTTP_PORT = 3000 +ROOT_URL = http://localhost:8108/ +DISABLE_SSH = false +SSH_PORT = 22 +SSH_LISTEN_PORT = 22 +LFS_START_SERVER = true +LFS_CONTENT_PATH = /data/git/lfs +LFS_JWT_SECRET = wo2G20l0nGsspUp8xsLNSNF7H8U-GQUVth5gj_q5cDk +OFFLINE_MODE = false + +[database] +PATH = /data/gitea/gitea.db +DB_TYPE = postgres +HOST = gitea-db:5432 +NAME = gitea +USER = gitea +PASSWD = gitea +LOG_SQL = false +SCHEMA = +SSL_MODE = disable +CHARSET = utf8 + +[indexer] +ISSUE_INDEXER_PATH = /data/gitea/indexers/issues.bleve + +[session] +PROVIDER_CONFIG = /data/gitea/sessions +PROVIDER = file + +[picture] +AVATAR_UPLOAD_PATH = /data/gitea/avatars +REPOSITORY_AVATAR_UPLOAD_PATH = /data/gitea/repo-avatars +DISABLE_GRAVATAR = false +ENABLE_FEDERATED_AVATAR = true + +[attachment] +PATH = /data/gitea/attachments + +[log] +MODE = console +LEVEL = info +ROUTER = console +ROOT_PATH = /data/gitea/log + +[security] +INSTALL_LOCK = true +SECRET_KEY = +REVERSE_PROXY_LIMIT = 1 +REVERSE_PROXY_TRUSTED_PROXIES = * +INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE2NTMyODU5ODh9.l7fPuVA8LSHZvdBum8YDrH47RZjEx_cZLbswO5pMDk8 +PASSWORD_HASH_ALGO = pbkdf2 + +[service] +DISABLE_REGISTRATION = false +REQUIRE_SIGNIN_VIEW = false +REGISTER_EMAIL_CONFIRM = false +ENABLE_NOTIFY_MAIL = false +ALLOW_ONLY_EXTERNAL_REGISTRATION = false +ENABLE_CAPTCHA = false +DEFAULT_KEEP_EMAIL_PRIVATE = false +DEFAULT_ALLOW_CREATE_ORGANIZATION = true +DEFAULT_ENABLE_TIMETRACKING = true +NO_REPLY_ADDRESS = noreply.localhost + +[mailer] +ENABLED = false + +[openid] +ENABLE_OPENID_SIGNIN = true +ENABLE_OPENID_SIGNUP = true + diff --git a/apps/gitea/docker-compose.yml b/apps/gitea/docker-compose.yml index 9937b444..3bc4e9b9 100644 --- a/apps/gitea/docker-compose.yml +++ b/apps/gitea/docker-compose.yml @@ -7,31 +7,31 @@ services: environment: - USER_UID=1000 - USER_GID=1000 - - GITEA__database__DB_TYPE=mysql - - GITEA__database__HOST=gitea_db:3306 - - GITEA__database__NAME=tipi_gitea - - GITEA__database__USER=tipi_gitea - - GITEA__database__PASSWD=tipi_gitea + - GITEA__database__DB_TYPE=postgres + - GITEA__database__HOST=gitea-db:5432 + - GITEA__database__NAME=gitea + - GITEA__database__USER=gitea + - GITEA__database__PASSWD=gitea restart: unless-stopped networks: - tipi_main_network volumes: - - ${APP_DATA_DIR}/gitea/data:/data + - ${APP_DATA_DIR}/data/gitea:/data ports: - ${APP_PORT}:3000 - "222:22" depends_on: - - gitea_db + - gitea-db - gitea_db: - image: mysql:8 + gitea-db: + container_name: gitea-db + image: postgres:14 restart: unless-stopped environment: - - MYSQL_ROOT_PASSWORD=tipi_gitea - - MYSQL_USER=tipi_gitea - - MYSQL_PASSWORD=tipi_gitea - - MYSQL_DATABASE=tipi_gitea + - POSTGRES_USER=gitea + - POSTGRES_PASSWORD=gitea + - POSTGRES_DB=gitea + volumes: + - ${APP_DATA_DIR}/data/postgres:/var/lib/postgresql/data networks: - tipi_main_network - volumes: - - ${APP_DATA_DIR}/mysql/var/lib/mysql:/var/lib/mysql From 0a8f85c474190e6200bc95fbe8352648a225adeb Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Mon, 23 May 2022 08:15:40 +0200 Subject: [PATCH 18/20] Bump version --- VERSION | 2 +- package.json | 2 +- packages/dashboard/package.json | 2 +- packages/system-api/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index def9a015..341cf11f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.5 \ No newline at end of file +0.2.0 \ No newline at end of file diff --git a/package.json b/package.json index d7ca859b..6c725249 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "runtipi", - "version": "0.1.5", + "version": "0.2.0", "description": "A homeserver for everyone", "scripts": { "prepare": "husky install", diff --git a/packages/dashboard/package.json b/packages/dashboard/package.json index 5bb9b829..f499b283 100644 --- a/packages/dashboard/package.json +++ b/packages/dashboard/package.json @@ -1,6 +1,6 @@ { "name": "dashboard", - "version": "0.1.5", + "version": "0.2.0", "private": true, "scripts": { "dev": "next dev", diff --git a/packages/system-api/package.json b/packages/system-api/package.json index 625fc935..88c4788b 100644 --- a/packages/system-api/package.json +++ b/packages/system-api/package.json @@ -1,6 +1,6 @@ { "name": "system-api", - "version": "0.1.5", + "version": "0.2.0", "description": "", "exports": "./dist/server.js", "type": "module", From 403d52eb5d09657fc51a91eb8637d1d130a87afd Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Mon, 23 May 2022 18:13:42 +0000 Subject: [PATCH 19/20] Align app configs --- .gitignore | 19 ++++++++----------- apps/adguard/config.json | 4 ++-- apps/adguard/metadata/description.md | 3 +++ apps/adguard/metadata/logo.png | Bin 0 -> 6649 bytes apps/anonaddy/docker-compose.yml | 6 ++---- apps/calibre-web/docker-compose.yml | 6 +++--- apps/code-server/docker-compose.yml | 4 ++-- apps/filebrowser/docker-compose.yml | 1 + apps/gitea/docker-compose.yml | 4 ++-- apps/homarr/docker-compose.yml | 4 ++-- apps/invidious/config.json | 6 +++--- apps/invidious/docker-compose.arm.yml | 2 +- apps/invidious/docker-compose.yml | 2 +- apps/jellyfin/config.json | 8 ++++---- apps/libreddit/docker-compose.arm.yml | 12 ++++++++++++ apps/libreddit/docker-compose.yml | 4 +++- apps/pihole/config.json | 10 +++++----- apps/prowlarr/docker-compose.yml | 6 +++--- apps/radarr/config.json | 8 ++++---- apps/radarr/docker-compose.yml | 1 + apps/sonarr/config.json | 8 ++++---- apps/sonarr/docker-compose.yml | 1 + apps/tailscale/config.json | 6 +++--- apps/transmission/config.json | 8 ++++---- apps/transmission/docker-compose.yml | 4 +++- media/{torrents => data/books}/.gitkeep | 0 media/torrents/complete/.gitkeep | 0 media/torrents/incomplete/.gitkeep | 0 media/torrents/watch/.gitkeep | 0 29 files changed, 77 insertions(+), 60 deletions(-) create mode 100644 apps/adguard/metadata/description.md create mode 100644 apps/adguard/metadata/logo.png create mode 100644 apps/libreddit/docker-compose.arm.yml rename media/{torrents => data/books}/.gitkeep (100%) create mode 100644 media/torrents/complete/.gitkeep create mode 100644 media/torrents/incomplete/.gitkeep create mode 100644 media/torrents/watch/.gitkeep diff --git a/.gitignore b/.gitignore index 5cd5feea..dd644220 100644 --- a/.gitignore +++ b/.gitignore @@ -1,28 +1,25 @@ .pnpm-debug.log -.env .env* github.secrets node_modules/ -nginx/* -letsencrypt/* app-data/* traefik/ssl/* !traefik/ssl/.gitkeep !app-data/.gitkeep -!letsencrypt/mkcert/.gitkeep state/* !state/.gitkeep -tipi.config.json - -# Commit empty directories -!nignx/.gitkeep - media/data/movies/* media/data/tv/* +media/data/books/* !media/data/movies/.gitkeep !media/data/tv/.gitkeep +!media/data/books/.gitkeep -media/torrents/* -!media/torrents/.gitkeep \ No newline at end of file +media/torrents/complete/* +!media/torrents/complete/.gitkeep +media/torrents/incomplete/* +!media/torrents/incomplete/.gitkeep +media/torrents/watch/* +!media/torrents/watch/.gitkeep \ No newline at end of file diff --git a/apps/adguard/config.json b/apps/adguard/config.json index 325d7c58..d251ea57 100644 --- a/apps/adguard/config.json +++ b/apps/adguard/config.json @@ -8,9 +8,9 @@ "author": "ArneNaessens", "source": "https://github.com/AdguardTeam", "image": "https://avatars.githubusercontent.com/u/8361145?s=200&v=4", + "cagegories": ["network", "security"], "requirements": { "ports": [53] }, - "form_fields": { - } + "form_fields": {} } diff --git a/apps/adguard/metadata/description.md b/apps/adguard/metadata/description.md new file mode 100644 index 00000000..b88c68d3 --- /dev/null +++ b/apps/adguard/metadata/description.md @@ -0,0 +1,3 @@ +Network-wide ads & trackers blocking DNS server + +AdGuard Home is a network-wide software for blocking ads and tracking. After you set it up, it'll cover all your home devices, and you won't need any client-side software for that. Learn more on our official Github repository. diff --git a/apps/adguard/metadata/logo.png b/apps/adguard/metadata/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0bde6eda51b40d6af4cc53eec991c82f9d6d29de GIT binary patch literal 6649 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 D