Переглянути джерело

Merge pull request #80 from meienberger/release/0.2.0

🚀 Release 0.2.0
Nicolas Meienberger 3 роки тому
батько
коміт
33c0f318b4
59 змінених файлів з 624 додано та 76 видалено
  1. 2 2
      .github/workflows/release-candidate.yml
  2. 8 11
      .gitignore
  3. 6 1
      README.md
  4. 1 1
      VERSION
  5. 3 3
      apps/adguard/config.json
  6. 1 2
      apps/adguard/docker-compose.yml
  7. 3 0
      apps/adguard/metadata/description.md
  8. BIN
      apps/adguard/metadata/logo.png
  9. 2 4
      apps/anonaddy/docker-compose.yml
  10. 3 3
      apps/calibre-web/docker-compose.yml
  11. 2 2
      apps/code-server/docker-compose.yml
  12. 1 0
      apps/filebrowser/docker-compose.yml
  13. 12 0
      apps/gitea/config.json
  14. 88 0
      apps/gitea/data/gitea/gitea/conf/app.ini
  15. 37 0
      apps/gitea/docker-compose.yml
  16. 2 2
      apps/homarr/docker-compose.yml
  17. 3 3
      apps/invidious/config.json
  18. 12 0
      apps/invidious/data/init/init-invidious-db.sh
  19. 12 0
      apps/invidious/data/init/sql/annotations.sql
  20. 30 0
      apps/invidious/data/init/sql/channel_videos.sql
  21. 25 0
      apps/invidious/data/init/sql/channels.sql
  22. 22 0
      apps/invidious/data/init/sql/nonces.sql
  23. 19 0
      apps/invidious/data/init/sql/playlist_videos.sql
  24. 29 0
      apps/invidious/data/init/sql/playlists.sql
  25. 23 0
      apps/invidious/data/init/sql/session_ids.sql
  26. 29 0
      apps/invidious/data/init/sql/users.sql
  27. 23 0
      apps/invidious/data/init/sql/videos.sql
  28. 3 3
      apps/invidious/docker-compose.arm.yml
  29. 3 3
      apps/invidious/docker-compose.yml
  30. 1 1
      apps/jackett/docker-compose.yml
  31. 4 4
      apps/jellyfin/config.json
  32. 1 1
      apps/jellyfin/docker-compose.yml
  33. 12 0
      apps/libreddit/config.json
  34. 12 0
      apps/libreddit/docker-compose.arm.yml
  35. 12 0
      apps/libreddit/docker-compose.yml
  36. 12 0
      apps/nitter/config.json
  37. 45 0
      apps/nitter/data/nitter.conf
  38. 24 0
      apps/nitter/docker-compose.yml
  39. 5 5
      apps/pihole/config.json
  40. 12 0
      apps/prowlarr/config.json
  41. 15 0
      apps/prowlarr/docker-compose.yml
  42. 4 4
      apps/radarr/config.json
  43. 2 2
      apps/radarr/docker-compose.yml
  44. 4 4
      apps/sonarr/config.json
  45. 2 2
      apps/sonarr/docker-compose.yml
  46. 3 3
      apps/tailscale/config.json
  47. 4 4
      apps/transmission/config.json
  48. 2 0
      apps/transmission/docker-compose.yml
  49. 21 0
      apps/vaultwarden/config.json
  50. 16 0
      apps/vaultwarden/docker-compose.yml
  51. BIN
      media/data/books/metadata.db
  52. 0 0
      media/torrents/complete/.gitkeep
  53. 0 0
      media/torrents/incomplete/.gitkeep
  54. 0 0
      media/torrents/watch/.gitkeep
  55. 1 1
      package.json
  56. 1 1
      packages/dashboard/package.json
  57. 1 0
      packages/dashboard/src/modules/Apps/containers/AppDetails.tsx
  58. 1 1
      packages/system-api/package.json
  59. 3 3
      scripts/start.sh

+ 2 - 2
.github/workflows/release-candidate.yml

@@ -1,9 +1,9 @@
 name: Release candidate
 name: Release candidate
 
 
 on:
 on:
-  pull_request:
+  push:
     branches:
     branches:
-      - master
+      - release/*
 
 
 jobs:
 jobs:
   # Build images and publish RCs to DockerHub
   # Build images and publish RCs to DockerHub

+ 8 - 11
.gitignore

@@ -1,28 +1,25 @@
 .pnpm-debug.log
 .pnpm-debug.log
-.env
 .env*
 .env*
 github.secrets
 github.secrets
 node_modules/
 node_modules/
-nginx/*
-letsencrypt/*
 app-data/*
 app-data/*
 traefik/ssl/*
 traefik/ssl/*
 !traefik/ssl/.gitkeep
 !traefik/ssl/.gitkeep
 !app-data/.gitkeep
 !app-data/.gitkeep
-!letsencrypt/mkcert/.gitkeep
 
 
 state/*
 state/*
 !state/.gitkeep
 !state/.gitkeep
 
 
-tipi.config.json
-
-# Commit empty directories
-!nignx/.gitkeep
-
 media/data/movies/*
 media/data/movies/*
 media/data/tv/*
 media/data/tv/*
+media/data/books/*
 !media/data/movies/.gitkeep
 !media/data/movies/.gitkeep
 !media/data/tv/.gitkeep
 !media/data/tv/.gitkeep
+!media/data/books/metadata.db
 
 
-media/torrents/*
-!media/torrents/.gitkeep
+media/torrents/complete/*
+!media/torrents/complete/.gitkeep
+media/torrents/incomplete/*
+!media/torrents/incomplete/.gitkeep
+media/torrents/watch/*
+!media/torrents/watch/.gitkeep

+ 6 - 1
README.md

@@ -14,7 +14,7 @@ Tipi is a personal homeserver orchestrator. It is running docker containers unde
 
 
 ## Apps available
 ## Apps available
 - [Calibre-Web](https://github.com/janeczku/calibre-web) - Web Ebook Reader
 - [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
 - [Filebrowser](https://github.com/filebrowser/filebrowser) - Web File Browser
 - [Freshrss](https://github.com/FreshRSS/FreshRSS) - A free, self-hostable RSS aggregator
 - [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
 - [Invidious](https://github.com/iv-org/invidious) - An alternative front-end to YouTube
@@ -32,6 +32,11 @@ Tipi is a personal homeserver orchestrator. It is running docker containers unde
 - [Transmission](https://github.com/transmission/transmission) - Fast, easy, and free BitTorrent client
 - [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
 - [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
 - [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
+- [Gitea](https://github.com/go-gitea/gitea) - Gitea - A painless self-hosted Git service.
 ## 🛠 Installation
 ## 🛠 Installation
 ### Installation Requirements
 ### Installation Requirements
 - Ubuntu 18.04 LTS or higher (or Debian 10)
 - Ubuntu 18.04 LTS or higher (or Debian 10)

+ 1 - 1
VERSION

@@ -1 +1 @@
-0.1.5
+0.2.0

+ 3 - 3
apps/adguard/config.json

@@ -6,11 +6,11 @@
   "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.",
   "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!",
   "short_desc": "World's most advanced adblocker!",
   "author": "ArneNaessens",
   "author": "ArneNaessens",
-  "source": "https://github:com/AdguardTeam",
+  "source": "https://github.com/AdguardTeam",
   "image": "https://avatars.githubusercontent.com/u/8361145?s=200&v=4",
   "image": "https://avatars.githubusercontent.com/u/8361145?s=200&v=4",
+  "cagegories": ["network", "security"],
   "requirements": {
   "requirements": {
     "ports": [53]
     "ports": [53]
   },
   },
-  "form_fields": {
-  }
+  "form_fields": {}
 }
 }

+ 1 - 2
apps/adguard/docker-compose.yml

@@ -1,6 +1,5 @@
 
 
-version: "3.5"
-
+version: "3.7"
 services:
 services:
   adguardhome:
   adguardhome:
     image: adguard/adguardhome:v0.107.6
     image: adguard/adguardhome:v0.107.6

+ 3 - 0
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.

BIN
apps/adguard/metadata/logo.png


+ 2 - 4
apps/anonaddy/docker-compose.yml

@@ -1,6 +1,4 @@
-
-version: "3.5"
-
+version: "3.7"
 services:
 services:
   db:
   db:
     image: mariadb:10.5
     image: mariadb:10.5
@@ -80,4 +78,4 @@ services:
 
 
     #     traefik.http.routers.anonaddy.entrypoints: http
     #     traefik.http.routers.anonaddy.entrypoints: http
     #     traefik.http.routers.anonaddy.service: anonaddy
     #     traefik.http.routers.anonaddy.service: anonaddy
-    #     traefik.http.services.anonaddy.loadbalancer.server.port: 8000
+    #     traefik.http.services.anonaddy.loadbalancer.server.port: 8000

+ 3 - 3
apps/calibre-web/docker-compose.yml

@@ -1,4 +1,4 @@
-version: "2.1"
+version: "3.7"
 services:
 services:
   calibre-web:
   calibre-web:
     image: lscr.io/linuxserver/calibre-web:latest
     image: lscr.io/linuxserver/calibre-web:latest
@@ -9,9 +9,9 @@ services:
       - TZ=${TZ}
       - TZ=${TZ}
     volumes:
     volumes:
       - ${APP_DATA_DIR}/data/config:/config
       - ${APP_DATA_DIR}/data/config:/config
-      - ${APP_DATA_DIR}/data/books:/books
+      - ${ROOT_FOLDER_HOST}/media/data/books:/books
     ports:
     ports:
       - ${APP_PORT}:8083
       - ${APP_PORT}:8083
     restart: unless-stopped
     restart: unless-stopped
     networks:
     networks:
-      - tipi_main_network
+      - tipi_main_network

+ 2 - 2
apps/code-server/docker-compose.yml

@@ -1,4 +1,4 @@
-version: "2.1"
+version: "3.7"
 services:
 services:
   code-server:
   code-server:
     image: lscr.io/linuxserver/code-server:latest
     image: lscr.io/linuxserver/code-server:latest
@@ -16,4 +16,4 @@ services:
       - ${APP_PORT}:8443
       - ${APP_PORT}:8443
     restart: unless-stopped
     restart: unless-stopped
     networks:
     networks:
-      - tipi_main_network
+      - tipi_main_network

+ 1 - 0
apps/filebrowser/docker-compose.yml

@@ -1,3 +1,4 @@
+version: "3.7"
 services:
 services:
   filebrowser:
   filebrowser:
     container_name: filebrowser
     container_name: filebrowser

+ 12 - 0
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": "go-gitea",
+  "source": "https://github.com/go-gitea/gitea",
+  "image": "https://avatars.githubusercontent.com/u/12724356?s=200&v=4",
+  "form_fields": {}
+}

+ 88 - 0
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
+

+ 37 - 0
apps/gitea/docker-compose.yml

@@ -0,0 +1,37 @@
+version: "3.7"
+
+services:
+  gitea:
+    image: gitea/gitea:1.16.8
+    container_name: gitea
+    environment:
+      - USER_UID=1000
+      - USER_GID=1000
+      - 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}/data/gitea:/data
+    ports:
+      - ${APP_PORT}:3000
+      - "222:22"
+    depends_on:
+      - gitea-db
+
+  gitea-db:
+    container_name: gitea-db
+    image: postgres:14
+    restart: unless-stopped
+    environment:
+      - POSTGRES_USER=gitea
+      - POSTGRES_PASSWORD=gitea
+      - POSTGRES_DB=gitea
+    volumes:
+      - ${APP_DATA_DIR}/data/postgres:/var/lib/postgresql/data
+    networks:
+      - tipi_main_network

+ 2 - 2
apps/homarr/docker-compose.yml

@@ -1,4 +1,4 @@
-version: '3'
+version: "3.7"
 services:
 services:
   homarr:
   homarr:
     container_name: homarr
     container_name: homarr
@@ -9,4 +9,4 @@ services:
     ports:
     ports:
       - ${APP_PORT}:7575
       - ${APP_PORT}:7575
     networks:
     networks:
-      - tipi_main_network
+      - tipi_main_network

+ 3 - 3
apps/invidious/config.json

@@ -3,9 +3,9 @@
   "available": true,
   "available": true,
   "port": 8095,
   "port": 8095,
   "id": "invidious",
   "id": "invidious",
-  "description": "",
-  "short_desc": "",
-  "author": "",
+  "description": "Invidious is an open source alternative front-end to YouTube.",
+  "short_desc": "An alternative front-end to YouTube",
+  "author": "iv-org",
   "source": "https://github.com/iv-org/invidious",
   "source": "https://github.com/iv-org/invidious",
   "image": "https://raw.githubusercontent.com/iv-org/invidious/master/assets/invidious-colored-vector.svg",
   "image": "https://raw.githubusercontent.com/iv-org/invidious/master/assets/invidious-colored-vector.svg",
   "form_fields": {}
   "form_fields": {}

+ 12 - 0
apps/invidious/data/init/init-invidious-db.sh

@@ -0,0 +1,12 @@
+#!/bin/bash
+set -eou pipefail
+
+psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <config/sql/channels.sql
+psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <config/sql/videos.sql
+psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <config/sql/channel_videos.sql
+psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <config/sql/users.sql
+psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <config/sql/session_ids.sql
+psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <config/sql/nonces.sql
+psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <config/sql/annotations.sql
+psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <config/sql/playlists.sql
+psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <config/sql/playlist_videos.sql

+ 12 - 0
apps/invidious/data/init/sql/annotations.sql

@@ -0,0 +1,12 @@
+-- Table: public.annotations
+
+-- DROP TABLE public.annotations;
+
+CREATE TABLE IF NOT EXISTS public.annotations
+(
+  id text NOT NULL,
+  annotations xml,
+  CONSTRAINT annotations_id_key UNIQUE (id)
+);
+
+GRANT ALL ON TABLE public.annotations TO current_user;

+ 30 - 0
apps/invidious/data/init/sql/channel_videos.sql

@@ -0,0 +1,30 @@
+-- Table: public.channel_videos
+
+-- DROP TABLE public.channel_videos;
+
+CREATE TABLE IF NOT EXISTS public.channel_videos
+(
+  id text NOT NULL,
+  title text,
+  published timestamp with time zone,
+  updated timestamp with time zone,
+  ucid text,
+  author text,
+  length_seconds integer,
+  live_now boolean,
+  premiere_timestamp timestamp with time zone,
+  views bigint,
+  CONSTRAINT channel_videos_id_key UNIQUE (id)
+);
+
+GRANT ALL ON TABLE public.channel_videos TO current_user;
+
+-- Index: public.channel_videos_ucid_idx
+
+-- DROP INDEX public.channel_videos_ucid_idx;
+
+CREATE INDEX IF NOT EXISTS channel_videos_ucid_idx
+  ON public.channel_videos
+  USING btree
+  (ucid COLLATE pg_catalog."default");
+

+ 25 - 0
apps/invidious/data/init/sql/channels.sql

@@ -0,0 +1,25 @@
+-- Table: public.channels
+
+-- DROP TABLE public.channels;
+
+CREATE TABLE IF NOT EXISTS public.channels
+(
+  id text NOT NULL,
+  author text,
+  updated timestamp with time zone,
+  deleted boolean,
+  subscribed timestamp with time zone,
+  CONSTRAINT channels_id_key UNIQUE (id)
+);
+
+GRANT ALL ON TABLE public.channels TO current_user;
+
+-- Index: public.channels_id_idx
+
+-- DROP INDEX public.channels_id_idx;
+
+CREATE INDEX IF NOT EXISTS channels_id_idx
+  ON public.channels
+  USING btree
+  (id COLLATE pg_catalog."default");
+

+ 22 - 0
apps/invidious/data/init/sql/nonces.sql

@@ -0,0 +1,22 @@
+-- Table: public.nonces
+
+-- DROP TABLE public.nonces;
+
+CREATE TABLE IF NOT EXISTS public.nonces
+(
+  nonce text,
+  expire timestamp with time zone,
+  CONSTRAINT nonces_id_key UNIQUE (nonce)
+);
+
+GRANT ALL ON TABLE public.nonces TO current_user;
+
+-- Index: public.nonces_nonce_idx
+
+-- DROP INDEX public.nonces_nonce_idx;
+
+CREATE INDEX IF NOT EXISTS nonces_nonce_idx
+  ON public.nonces
+  USING btree
+  (nonce COLLATE pg_catalog."default");
+

+ 19 - 0
apps/invidious/data/init/sql/playlist_videos.sql

@@ -0,0 +1,19 @@
+-- Table: public.playlist_videos
+
+-- DROP TABLE public.playlist_videos;
+
+CREATE TABLE IF NOT EXISTS public.playlist_videos
+(
+    title text,
+    id text,
+    author text,
+    ucid text,
+    length_seconds integer,
+    published timestamptz,
+    plid text references playlists(id),
+    index int8,
+    live_now boolean,
+    PRIMARY KEY (index,plid)
+);
+
+GRANT ALL ON TABLE public.playlist_videos TO current_user;

+ 29 - 0
apps/invidious/data/init/sql/playlists.sql

@@ -0,0 +1,29 @@
+-- Type: public.privacy
+
+-- DROP TYPE public.privacy;
+
+CREATE TYPE public.privacy AS ENUM
+(
+    'Public',
+    'Unlisted',
+    'Private'
+);
+
+-- Table: public.playlists
+
+-- DROP TABLE public.playlists;
+
+CREATE TABLE IF NOT EXISTS public.playlists
+(
+    title text,
+    id text primary key,
+    author text,
+    description text,
+    video_count integer,
+    created timestamptz,
+    updated timestamptz,
+    privacy privacy,
+    index int8[]
+);
+
+GRANT ALL ON public.playlists TO current_user;

+ 23 - 0
apps/invidious/data/init/sql/session_ids.sql

@@ -0,0 +1,23 @@
+-- Table: public.session_ids
+
+-- DROP TABLE public.session_ids;
+
+CREATE TABLE IF NOT EXISTS public.session_ids
+(
+  id text NOT NULL,
+  email text,
+  issued timestamp with time zone,
+  CONSTRAINT session_ids_pkey PRIMARY KEY (id)
+);
+
+GRANT ALL ON TABLE public.session_ids TO current_user;
+
+-- Index: public.session_ids_id_idx
+
+-- DROP INDEX public.session_ids_id_idx;
+
+CREATE INDEX IF NOT EXISTS session_ids_id_idx
+  ON public.session_ids
+  USING btree
+  (id COLLATE pg_catalog."default");
+

+ 29 - 0
apps/invidious/data/init/sql/users.sql

@@ -0,0 +1,29 @@
+-- Table: public.users
+
+-- DROP TABLE public.users;
+
+CREATE TABLE IF NOT EXISTS public.users
+(
+  updated timestamp with time zone,
+  notifications text[],
+  subscriptions text[],
+  email text NOT NULL,
+  preferences text,
+  password text,
+  token text,
+  watched text[],
+  feed_needs_update boolean,
+  CONSTRAINT users_email_key UNIQUE (email)
+);
+
+GRANT ALL ON TABLE public.users TO current_user;
+
+-- Index: public.email_unique_idx
+
+-- DROP INDEX public.email_unique_idx;
+
+CREATE UNIQUE INDEX IF NOT EXISTS email_unique_idx
+  ON public.users
+  USING btree
+  (lower(email) COLLATE pg_catalog."default");
+

+ 23 - 0
apps/invidious/data/init/sql/videos.sql

@@ -0,0 +1,23 @@
+-- Table: public.videos
+
+-- DROP TABLE public.videos;
+
+CREATE UNLOGGED TABLE IF NOT EXISTS public.videos
+(
+  id text NOT NULL,
+  info text,
+  updated timestamp with time zone,
+  CONSTRAINT videos_pkey PRIMARY KEY (id)
+);
+
+GRANT ALL ON TABLE public.videos TO current_user;
+
+-- Index: public.id_idx
+
+-- DROP INDEX public.id_idx;
+
+CREATE UNIQUE INDEX IF NOT EXISTS id_idx
+  ON public.videos
+  USING btree
+  (id COLLATE pg_catalog."default");
+

+ 3 - 3
apps/invidious/docker-compose.arm.yml

@@ -1,4 +1,4 @@
-version: "3"
+version: "3.7"
 services:
 services:
   invidious:
   invidious:
     user: 1000:1000
     user: 1000:1000
@@ -31,8 +31,8 @@ services:
     restart: unless-stopped
     restart: unless-stopped
     volumes:
     volumes:
       - ${APP_DATA_DIR}/data/postgres:/var/lib/postgresql/data
       - ${APP_DATA_DIR}/data/postgres:/var/lib/postgresql/data
-      - ${APP_DATA_DIR}/data/sql:/config/sql
-      - ./docker/init-invidious-db.sh:/docker-entrypoint-initdb.d/init-invidious-db.sh
+      - ${APP_DATA_DIR}/data/init/sql:/config/sql
+      - ${APP_DATA_DIR}/data/init/init-invidious-db.sh:/docker-entrypoint-initdb.d/init-invidious-db.sh
     environment:
     environment:
       POSTGRES_DB: invidious
       POSTGRES_DB: invidious
       POSTGRES_USER: tipi
       POSTGRES_USER: tipi

+ 3 - 3
apps/invidious/docker-compose.yml

@@ -1,4 +1,4 @@
-version: "3"
+version: "3.7"
 services:
 services:
   invidious:
   invidious:
     user: 1000:1000
     user: 1000:1000
@@ -34,8 +34,8 @@ services:
     restart: unless-stopped
     restart: unless-stopped
     volumes:
     volumes:
       - ${APP_DATA_DIR}/data/postgres:/var/lib/postgresql/data
       - ${APP_DATA_DIR}/data/postgres:/var/lib/postgresql/data
-      - ${APP_DATA_DIR}/data/sql:/config/sql
-      - ./docker/init-invidious-db.sh:/docker-entrypoint-initdb.d/init-invidious-db.sh
+      - ${APP_DATA_DIR}/data/init/sql:/config/sql
+      - ${APP_DATA_DIR}/data/init/init-invidious-db.sh:/docker-entrypoint-initdb.d/init-invidious-db.sh
     environment:
     environment:
       POSTGRES_DB: invidious
       POSTGRES_DB: invidious
       POSTGRES_USER: tipi
       POSTGRES_USER: tipi

+ 1 - 1
apps/jackett/docker-compose.yml

@@ -12,7 +12,7 @@ services:
       - ${DNS_IP}
       - ${DNS_IP}
     volumes:
     volumes:
       - ${APP_DATA_DIR}/data:/config
       - ${APP_DATA_DIR}/data:/config
-      - ${ROOT_FOLDER_HOST}/media/torrents:/downloads
+      - ${ROOT_FOLDER_HOST}/media/torrents:/media/torrents
     ports:
     ports:
       - ${APP_PORT}:9117
       - ${APP_PORT}:9117
     restart: unless-stopped
     restart: unless-stopped

+ 4 - 4
apps/jellyfin/config.json

@@ -3,10 +3,10 @@
   "available": true,
   "available": true,
   "port": 8091,
   "port": 8091,
   "id": "jellyfin",
   "id": "jellyfin",
-  "description": "",
-  "short_desc": "",
-  "author": "",
-  "source": "",
+  "description": "Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. It is an alternative to the proprietary Emby and Plex, to provide media from a dedicated server to end-user devices via multiple apps. Jellyfin is descended from Emby's 3.5.2 release and ported to the .NET Core framework to enable full cross-platform support. There are no strings attached, no premium licenses or features, and no hidden agendas: just a team who want to build something better and work together to achieve it. We welcome anyone who is interested in joining us in our quest!",
+  "short_desc": "A media server for your home collection",
+  "author": "jellyfin.org",
+  "source": "https://github.com/jellyfin/jellyfin",
   "image": "https://avatars.githubusercontent.com/u/45698031?s=200&v=4",
   "image": "https://avatars.githubusercontent.com/u/45698031?s=200&v=4",
   "form_fields": {}
   "form_fields": {}
 }
 }

+ 1 - 1
apps/jellyfin/docker-compose.yml

@@ -6,7 +6,7 @@ services:
     container_name: jellyfin
     container_name: jellyfin
     volumes:
     volumes:
       - ${APP_DATA_DIR}/data/config:/config
       - ${APP_DATA_DIR}/data/config:/config
-      - ${ROOT_FOLDER_HOST}/media/data:/data/media
+      - ${ROOT_FOLDER_HOST}/media/data:/media/data
     environment:
     environment:
       - PUID=1000
       - PUID=1000
       - PGID=1000
       - PGID=1000

+ 12 - 0
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": "spikecodes",
+  "source": "https://github.com/spikecodes/libreddit",
+  "image": "https://raw.githubusercontent.com/spikecodes/libreddit/master/static/logo.png",
+  "form_fields": {}
+}

+ 12 - 0
apps/libreddit/docker-compose.arm.yml

@@ -0,0 +1,12 @@
+version: "3.7"
+services:
+  libreddit:
+    container_name: libreddit
+    image: spikecodes/libreddit:arm
+    dns:
+      - ${DNS_IP}
+    ports:
+      - ${APP_PORT}:8080
+    restart: unless-stopped
+    networks:
+      - tipi_main_network

+ 12 - 0
apps/libreddit/docker-compose.yml

@@ -0,0 +1,12 @@
+version: "3.7"
+services:
+  libreddit:
+    container_name: libreddit
+    image: spikecodes/libreddit
+    dns:
+      - ${DNS_IP}
+    ports:
+      - ${APP_PORT}:8080
+    restart: unless-stopped
+    networks:
+      - tipi_main_network

+ 12 - 0
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": "zedeus",
+  "source": "https://github.com/zedeus/nitter",
+  "image": "https://raw.githubusercontent.com/zedeus/nitter/master/public/favicon.ico",
+  "form_fields": {}
+}

+ 45 - 0
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 

+ 24 - 0
apps/nitter/docker-compose.yml

@@ -0,0 +1,24 @@
+version: "3.7"
+
+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:
+      - "${APP_DATA_DIR}/data/redis:/data"
+    restart: unless-stopped

+ 5 - 5
apps/pihole/config.json

@@ -1,15 +1,15 @@
 {
 {
-  "name": "PiHole",
+  "name": "Pi-hole",
   "available": true,
   "available": true,
   "port": 8081,
   "port": 8081,
   "requirements": {
   "requirements": {
     "ports": [53]
     "ports": [53]
   },
   },
   "id": "pihole",
   "id": "pihole",
-  "description": "",
-  "short_desc": "",
-  "author": "",
-  "source": "",
+  "description": "The Pi-hole® is a DNS sinkhole that protects your devices from unwanted content without installing any client-side software.",
+  "short_desc": "A black hole for Internet advertisements",
+  "author": "pi-hole.net",
+  "source": "https://github.com/pi-hole/pi-hole",
   "image": "https://avatars.githubusercontent.com/u/16827203?s=200&v=4",
   "image": "https://avatars.githubusercontent.com/u/16827203?s=200&v=4",
   "form_fields": {
   "form_fields": {
     "password": {
     "password": {

+ 12 - 0
apps/prowlarr/config.json

@@ -0,0 +1,12 @@
+{
+  "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": {}
+}

+ 15 - 0
apps/prowlarr/docker-compose.yml

@@ -0,0 +1,15 @@
+version: "3.7"
+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
+      - 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:
+      - ${APP_PORT}:9696
+    restart: unless-stopped
+    networks:
+      - tipi_main_network

+ 4 - 4
apps/radarr/config.json

@@ -3,10 +3,10 @@
   "available": true,
   "available": true,
   "port": 8088,
   "port": 8088,
   "id": "radarr",
   "id": "radarr",
-  "description": "",
-  "short_desc": "",
-  "author": "",
-  "source": "",
+  "description": "Radarr is a movie collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new movies and will interface with clients and indexers to grab, sort, and rename them. It can also be configured to automatically upgrade the quality of existing files in the library when a better quality format becomes available. Note that only one type of a given movie is supported. If you want both an 4k version and 1080p version of a given movie you will need multiple instances.",
+  "short_desc": "Movie collection manager for Usenet and BitTorrent users.",
+  "author": "radarr.video",
+  "source": "https://github.com/Radarr/Radarr",
   "image": "https://avatars.githubusercontent.com/u/25025331?s=200&v=4",
   "image": "https://avatars.githubusercontent.com/u/25025331?s=200&v=4",
   "form_fields": {}
   "form_fields": {}
 }
 }

+ 2 - 2
apps/radarr/docker-compose.yml

@@ -10,9 +10,9 @@ services:
     dns:
     dns:
       - ${DNS_IP}
       - ${DNS_IP}
     volumes:
     volumes:
+      - /etc/localtime:/etc/localtime:ro
       - ${APP_DATA_DIR}/data:/config
       - ${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:
     ports:
       - ${APP_PORT}:7878
       - ${APP_PORT}:7878
     restart: unless-stopped
     restart: unless-stopped

+ 4 - 4
apps/sonarr/config.json

@@ -3,10 +3,10 @@
   "available": true,
   "available": true,
   "port": 8098,
   "port": 8098,
   "id": "sonarr",
   "id": "sonarr",
-  "description": "",
-  "short_desc": "",
-  "author": "",
-  "source": "",
+  "description": "Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.",
+  "short_desc": "TV show manager for Usenet and BitTorrent",
+  "author": "sonarr.tv",
+  "source": "https://github.com/Sonarr/Sonarr",
   "image": "https://avatars.githubusercontent.com/u/1082903?s=200&v=4",
   "image": "https://avatars.githubusercontent.com/u/1082903?s=200&v=4",
   "form_fields": {}
   "form_fields": {}
 }
 }

+ 2 - 2
apps/sonarr/docker-compose.yml

@@ -10,9 +10,9 @@ services:
     dns:
     dns:
       - ${DNS_IP}
       - ${DNS_IP}
     volumes:
     volumes:
+      - /etc/localtime:/etc/localtime:ro
       - ${APP_DATA_DIR}/data:/config
       - ${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:
     ports:
       - ${APP_PORT}:8989
       - ${APP_PORT}:8989
     restart: unless-stopped
     restart: unless-stopped

+ 3 - 3
apps/tailscale/config.json

@@ -3,9 +3,9 @@
   "available": true,
   "available": true,
   "port": 8093,
   "port": 8093,
   "id": "tailscale",
   "id": "tailscale",
-  "description": "",
-  "short_desc": "",
-  "author": "",
+  "description": "Zero config VPN. Installs on any device in minutes, manages firewall rules for you, and works from anywhere.",
+  "short_desc": "The easiest, most secure way to use WireGuard and 2FA.",
+  "author": "© Tailscale Inc.",
   "source": "https://github.com/tailscale/tailscale",
   "source": "https://github.com/tailscale/tailscale",
   "website": "https://tailscale.com/",
   "website": "https://tailscale.com/",
   "image": "https://avatars.githubusercontent.com/u/48932923?s=200&v=4",
   "image": "https://avatars.githubusercontent.com/u/48932923?s=200&v=4",

+ 4 - 4
apps/transmission/config.json

@@ -6,10 +6,10 @@
     "ports": [51413]
     "ports": [51413]
   },
   },
   "id": "transmission",
   "id": "transmission",
-  "description": "",
-  "short_desc": "",
-  "author": "",
-  "source": "https://transmissionbt.com",
+  "description": "Transmission is a fast, easy, and free BitTorrent client.",
+  "short_desc": "Fast, easy, and free BitTorrent client",
+  "author": "Transmission Project",
+  "source": "https://github.com/transmission/transmission",
   "image": "https://avatars.githubusercontent.com/u/223312?s=200&v=4",
   "image": "https://avatars.githubusercontent.com/u/223312?s=200&v=4",
   "form_fields": {
   "form_fields": {
     "username": {
     "username": {

+ 2 - 0
apps/transmission/docker-compose.yml

@@ -9,12 +9,14 @@ services:
       - TZ=${TZ}
       - TZ=${TZ}
       - USER=${TRANSMISSION_USERNAME}
       - USER=${TRANSMISSION_USERNAME}
       - PASS=${TRANSMISSION_PASSWORD}
       - PASS=${TRANSMISSION_PASSWORD}
+      - TRANSMISSION_WEB_HOME=/transmission-web-control/
       # - WHITELIST=iplist #optional
       # - WHITELIST=iplist #optional
       # - PEERPORT=peerport #optional
       # - PEERPORT=peerport #optional
       # - HOST_WHITELIST=dnsnane list #optional
       # - HOST_WHITELIST=dnsnane list #optional
     volumes:
     volumes:
       - ${APP_DATA_DIR}/data/config:/config
       - ${APP_DATA_DIR}/data/config:/config
       - ${ROOT_FOLDER_HOST}/media/torrents:/downloads
       - ${ROOT_FOLDER_HOST}/media/torrents:/downloads
+      - ${ROOT_FOLDER_HOST}/media/torrents/watch:/watch
     ports:
     ports:
       - ${APP_PORT}:9091
       - ${APP_PORT}:9091
       - 51413:51413
       - 51413:51413

+ 21 - 0
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": "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"
+    }
+  }
+}

+ 16 - 0
apps/vaultwarden/docker-compose.yml

@@ -0,0 +1,16 @@
+version: '3.7'
+
+services:
+  vaultwarden:
+    image: vaultwarden/server:1.24.0
+    container_name: vaultwarden
+    restart: unless-stopped
+    ports:
+      - ${APP_PORT}:80
+    environment:
+      - WEBSOCKET_ENABLED=true
+      - ADMIN_TOKEN=${VAULTWARDEN_ADMIN_PASSWORD}
+    volumes:
+      - ${APP_DATA_DIR}/data:/data
+    networks:
+      - tipi_main_network

BIN
media/data/books/metadata.db


+ 0 - 0
media/torrents/.gitkeep → media/torrents/complete/.gitkeep


+ 0 - 0
media/torrents/incomplete/.gitkeep


+ 0 - 0
media/torrents/watch/.gitkeep


+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "runtipi",
   "name": "runtipi",
-  "version": "0.1.5",
+  "version": "0.2.0",
   "description": "A homeserver for everyone",
   "description": "A homeserver for everyone",
   "scripts": {
   "scripts": {
     "prepare": "husky install",
     "prepare": "husky install",

+ 1 - 1
packages/dashboard/package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "dashboard",
   "name": "dashboard",
-  "version": "0.1.5",
+  "version": "0.2.0",
   "private": true,
   "private": true,
   "scripts": {
   "scripts": {
     "dev": "next dev",
     "dev": "next dev",

+ 1 - 0
packages/dashboard/src/modules/Apps/containers/AppDetails.tsx

@@ -103,6 +103,7 @@ const AppDetails: React.FC<IProps> = ({ app }) => {
               {app.source && (
               {app.source && (
                 <a target="_blank" rel="noreferrer" className="text-blue-500 text-xs" href={app?.source}>
                 <a target="_blank" rel="noreferrer" className="text-blue-500 text-xs" href={app?.source}>
                   <Flex className="mt-2 items-center">
                   <Flex className="mt-2 items-center">
+                    Source
                     <FiExternalLink className="ml-1" />
                     <FiExternalLink className="ml-1" />
                   </Flex>
                   </Flex>
                 </a>
                 </a>

+ 1 - 1
packages/system-api/package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "system-api",
   "name": "system-api",
-  "version": "0.1.5",
+  "version": "0.2.0",
   "description": "",
   "description": "",
   "exports": "./dist/server.js",
   "exports": "./dist/server.js",
   "type": "module",
   "type": "module",

+ 3 - 3
scripts/start.sh

@@ -121,9 +121,9 @@ fi
 str=$(get_json_field ${STATE_FOLDER}/apps.json installed)
 str=$(get_json_field ${STATE_FOLDER}/apps.json installed)
 
 
 # if pihole is present in str add it as DNS
 # if pihole is present in str add it as DNS
-if [[ $str = *"pihole"* ]]; then
-  DNS_IP=10.21.21.201
-fi
+# if [[ $str = *"pihole"* ]]; then
+#   DNS_IP=10.21.21.201
+# fi
 
 
 # Create seed file with cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1
 # Create seed file with cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1
 if [[ ! -f "${STATE_FOLDER}/seed" ]]; then
 if [[ ! -f "${STATE_FOLDER}/seed" ]]; then