Merge pull request #152 from meienberger/feature/repo-appstore
WIP: External App Store
This commit is contained in:
commit
ecd143b7db
261 changed files with 1936 additions and 4361 deletions
4
.github/workflows/ci.yml
vendored
4
.github/workflows/ci.yml
vendored
|
@ -6,6 +6,7 @@ env:
|
|||
ROOT_FOLDER: /test
|
||||
JWT_SECRET: "secret"
|
||||
ROOT_FOLDER_HOST: /tipi
|
||||
APPS_REPO_ID: repo-id
|
||||
|
||||
jobs:
|
||||
ci:
|
||||
|
@ -58,9 +59,6 @@ jobs:
|
|||
- name: Build packages
|
||||
run: pnpm -r build
|
||||
|
||||
- name: Run global tests
|
||||
run: pnpm test
|
||||
|
||||
- name: Run linter
|
||||
run: pnpm -r lint
|
||||
|
||||
|
|
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -7,6 +7,10 @@ data/postgres
|
|||
traefik/ssl/*
|
||||
!traefik/ssl/.gitkeep
|
||||
!app-data/.gitkeep
|
||||
repos/*
|
||||
!repos/.gitkeep
|
||||
apps/*
|
||||
!apps/.gitkeep
|
||||
|
||||
scripts/pacapt
|
||||
|
||||
|
|
|
@ -1,11 +1,2 @@
|
|||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
# If test-db is not running with docker
|
||||
if ! docker ps | grep -q test-db; then
|
||||
npm run start:pg
|
||||
fi
|
||||
|
||||
pnpm test
|
||||
pnpm -r test
|
||||
pnpm -r lint:fix
|
||||
|
|
10
.husky/pre-push
Executable file
10
.husky/pre-push
Executable file
|
@ -0,0 +1,10 @@
|
|||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
# If test-db is not running with docker
|
||||
if ! docker ps | grep -q test-db; then
|
||||
npm run start:pg
|
||||
fi
|
||||
|
||||
pnpm -r test
|
||||
pnpm -r lint:fix
|
|
@ -24,7 +24,7 @@ FROM alpine:3.16.0 as app
|
|||
WORKDIR /
|
||||
|
||||
# Install dependencies
|
||||
RUN apk --no-cache add docker-compose nodejs npm bash g++ make
|
||||
RUN apk --no-cache add docker-compose nodejs npm bash g++ make git
|
||||
|
||||
RUN npm install node-gyp -g
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ FROM alpine:3.16.0 as app
|
|||
WORKDIR /
|
||||
|
||||
# Install docker
|
||||
RUN apk --no-cache add docker-compose nodejs npm bash g++ make
|
||||
RUN apk --no-cache add docker-compose nodejs npm bash g++ make git
|
||||
|
||||
RUN npm install node-gyp -g
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
[![Docker Pulls](https://badgen.net/docker/pulls/meienberger/runtipi?icon=docker&label=pulls)](https://hub.docker.com/r/meienberger/runtipi/)
|
||||
[![Docker Image Size](https://badgen.net/docker/size/meienberger/runtipi?icon=docker&label=image%20size)](https://hub.docker.com/r/meienberger/runtipi/)
|
||||
![Build](https://github.com/meienberger/runtipi/workflows/Tipi%20CI/badge.svg)
|
||||
[![codecov](https://codecov.io/gh/meienberger/runtipi/branch/master/graph/badge.svg?token=FZGO7ZOPSF)](https://codecov.io/gh/meienberger/runtipi)
|
||||
#### Join the discussion
|
||||
[![Discord](https://img.shields.io/discord/976934649643294750?label=discord&logo=discord)](https://discord.gg/Bu9qEPnHsc)
|
||||
[![Matrix](https://img.shields.io/matrix/runtipi:matrix.org?label=matrix&logo=matrix)](https://matrix.to/#/#runtipi:matrix.org)
|
||||
|
|
|
@ -1,176 +0,0 @@
|
|||
import fs from "fs";
|
||||
import jsyaml from "js-yaml";
|
||||
|
||||
interface AppConfig {
|
||||
id: string;
|
||||
port: number;
|
||||
categories: string[];
|
||||
requirements?: {
|
||||
ports?: number[];
|
||||
};
|
||||
name: string;
|
||||
description: string;
|
||||
version: string;
|
||||
image: string;
|
||||
short_desc: string;
|
||||
author: string;
|
||||
source: string;
|
||||
available: boolean;
|
||||
}
|
||||
|
||||
const networkExceptions = ["pihole", "tailscale", "homeassistant", "plex"];
|
||||
const getAppConfigs = (): AppConfig[] => {
|
||||
const apps: AppConfig[] = [];
|
||||
|
||||
const appsDir = fs.readdirSync("./apps");
|
||||
|
||||
appsDir.forEach((app) => {
|
||||
const path = `./apps/${app}/config.json`;
|
||||
|
||||
if (fs.existsSync(path)) {
|
||||
const configFile = fs.readFileSync(path).toString();
|
||||
|
||||
try {
|
||||
const config: AppConfig = JSON.parse(configFile);
|
||||
if (config.available) {
|
||||
apps.push(config);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error("Error parsing config file", app);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return apps;
|
||||
};
|
||||
|
||||
describe("App configs", () => {
|
||||
it("Get app config should return at least one app", () => {
|
||||
const apps = getAppConfigs();
|
||||
|
||||
expect(apps.length).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
it("Each app should have an id", () => {
|
||||
const apps = getAppConfigs();
|
||||
|
||||
apps.forEach((app) => {
|
||||
expect(app.id).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
it("Each app should have a md description", () => {
|
||||
const apps = getAppConfigs();
|
||||
|
||||
apps.forEach((app) => {
|
||||
const path = `./apps/${app.id}/metadata/description.md`;
|
||||
|
||||
if (fs.existsSync(path)) {
|
||||
const description = fs.readFileSync(path).toString();
|
||||
expect(description).toBeDefined();
|
||||
} else {
|
||||
console.error(`Missing description for app ${app.id}`);
|
||||
expect(true).toBe(false);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
it("Each app should have categories defined as an array", () => {
|
||||
const apps = getAppConfigs();
|
||||
|
||||
apps.forEach((app) => {
|
||||
expect(app.categories).toBeDefined();
|
||||
expect(app.categories).toBeInstanceOf(Array);
|
||||
});
|
||||
});
|
||||
|
||||
it("Each app should have a name", () => {
|
||||
const apps = getAppConfigs();
|
||||
|
||||
apps.forEach((app) => {
|
||||
expect(app.name).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
it("Each app should have a description", () => {
|
||||
const apps = getAppConfigs();
|
||||
|
||||
apps.forEach((app) => {
|
||||
expect(app.description).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
it("Each app should have a port", () => {
|
||||
const apps = getAppConfigs();
|
||||
|
||||
apps.forEach((app) => {
|
||||
expect(app.port).toBeDefined();
|
||||
expect(app.port).toBeGreaterThan(999);
|
||||
expect(app.port).toBeLessThan(65535);
|
||||
});
|
||||
});
|
||||
|
||||
it("Each app should have a different port", () => {
|
||||
const appConfigs = getAppConfigs();
|
||||
const ports = appConfigs.map((app) => app.port);
|
||||
expect(new Set(ports).size).toBe(appConfigs.length);
|
||||
});
|
||||
|
||||
it("Each app should have a unique id", () => {
|
||||
const appConfigs = getAppConfigs();
|
||||
const ids = appConfigs.map((app) => app.id);
|
||||
expect(new Set(ids).size).toBe(appConfigs.length);
|
||||
});
|
||||
|
||||
it("Each app should have a docker-compose file beside it", () => {
|
||||
const apps = getAppConfigs();
|
||||
|
||||
apps.forEach((app) => {
|
||||
expect(fs.existsSync(`./apps/${app.id}/docker-compose.yml`)).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
it("Each app should have a container name equals to its id", () => {
|
||||
const apps = getAppConfigs();
|
||||
|
||||
apps.forEach((app) => {
|
||||
const dockerComposeFile = fs
|
||||
.readFileSync(`./apps/${app.id}/docker-compose.yml`)
|
||||
.toString();
|
||||
|
||||
const dockerCompose: any = jsyaml.load(dockerComposeFile);
|
||||
|
||||
if (!dockerCompose.services[app.id]) {
|
||||
console.error(app.id);
|
||||
}
|
||||
|
||||
expect(dockerCompose.services[app.id]).toBeDefined();
|
||||
expect(dockerCompose.services[app.id].container_name).toBe(app.id);
|
||||
});
|
||||
});
|
||||
|
||||
it("Each app should have network tipi_main_network", () => {
|
||||
const apps = getAppConfigs();
|
||||
|
||||
apps.forEach((app) => {
|
||||
if (!networkExceptions.includes(app.id)) {
|
||||
const dockerComposeFile = fs
|
||||
.readFileSync(`./apps/${app.id}/docker-compose.yml`)
|
||||
.toString();
|
||||
|
||||
const dockerCompose: any = jsyaml.load(dockerComposeFile);
|
||||
|
||||
expect(dockerCompose.services[app.id]).toBeDefined();
|
||||
|
||||
if (!dockerCompose.services[app.id].networks) {
|
||||
console.error(app.id);
|
||||
}
|
||||
|
||||
expect(dockerCompose.services[app.id].networks).toBeDefined();
|
||||
expect(dockerCompose.services[app.id].networks).toStrictEqual([
|
||||
"tipi_main_network",
|
||||
]);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
|
@ -1,16 +0,0 @@
|
|||
{
|
||||
"name": "Adguard",
|
||||
"available": true,
|
||||
"port": 8104,
|
||||
"id": "adguard",
|
||||
"categories": ["network", "security"],
|
||||
"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": "AdguardTeam",
|
||||
"source": "https://github.com/AdguardTeam",
|
||||
"image": "/logos/apps/adguard.jpg",
|
||||
"requirements": {
|
||||
"ports": [53]
|
||||
},
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,131 +0,0 @@
|
|||
bind_host: 0.0.0.0
|
||||
bind_port: 80
|
||||
beta_bind_port: 0
|
||||
users: []
|
||||
auth_attempts: 5
|
||||
block_auth_min: 15
|
||||
http_proxy: ""
|
||||
language: ""
|
||||
debug_pprof: false
|
||||
web_session_ttl: 720
|
||||
dns:
|
||||
bind_hosts:
|
||||
- 0.0.0.0
|
||||
port: 53
|
||||
statistics_interval: 1
|
||||
querylog_enabled: true
|
||||
querylog_file_enabled: true
|
||||
querylog_interval: 2160h
|
||||
querylog_size_memory: 1000
|
||||
anonymize_client_ip: false
|
||||
protection_enabled: true
|
||||
blocking_mode: default
|
||||
blocking_ipv4: ""
|
||||
blocking_ipv6: ""
|
||||
blocked_response_ttl: 10
|
||||
parental_block_host: family-block.dns.adguard.com
|
||||
safebrowsing_block_host: standard-block.dns.adguard.com
|
||||
ratelimit: 20
|
||||
ratelimit_whitelist: []
|
||||
refuse_any: true
|
||||
upstream_dns:
|
||||
- https://dns10.quad9.net/dns-query
|
||||
upstream_dns_file: ""
|
||||
bootstrap_dns:
|
||||
- 9.9.9.10
|
||||
- 149.112.112.10
|
||||
- 2620:fe::10
|
||||
- 2620:fe::fe:10
|
||||
all_servers: false
|
||||
fastest_addr: false
|
||||
fastest_timeout: 1s
|
||||
allowed_clients: []
|
||||
disallowed_clients: []
|
||||
blocked_hosts:
|
||||
- version.bind
|
||||
- id.server
|
||||
- hostname.bind
|
||||
trusted_proxies:
|
||||
- 127.0.0.0/8
|
||||
- ::1/128
|
||||
cache_size: 4194304
|
||||
cache_ttl_min: 0
|
||||
cache_ttl_max: 0
|
||||
cache_optimistic: false
|
||||
bogus_nxdomain: []
|
||||
aaaa_disabled: false
|
||||
enable_dnssec: false
|
||||
edns_client_subnet: false
|
||||
max_goroutines: 300
|
||||
ipset: []
|
||||
filtering_enabled: true
|
||||
filters_update_interval: 24
|
||||
parental_enabled: false
|
||||
safesearch_enabled: false
|
||||
safebrowsing_enabled: false
|
||||
safebrowsing_cache_size: 1048576
|
||||
safesearch_cache_size: 1048576
|
||||
parental_cache_size: 1048576
|
||||
cache_time: 30
|
||||
rewrites: []
|
||||
blocked_services: []
|
||||
upstream_timeout: 10s
|
||||
local_domain_name: lan
|
||||
resolve_clients: true
|
||||
use_private_ptr_resolvers: true
|
||||
local_ptr_upstreams: []
|
||||
tls:
|
||||
enabled: false
|
||||
server_name: ""
|
||||
force_https: false
|
||||
port_https: 443
|
||||
port_dns_over_tls: 853
|
||||
port_dns_over_quic: 784
|
||||
port_dnscrypt: 0
|
||||
dnscrypt_config_file: ""
|
||||
allow_unencrypted_doh: false
|
||||
strict_sni_check: false
|
||||
certificate_chain: ""
|
||||
private_key: ""
|
||||
certificate_path: ""
|
||||
private_key_path: ""
|
||||
filters:
|
||||
- enabled: true
|
||||
url: https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt
|
||||
name: AdGuard DNS filter
|
||||
id: 1
|
||||
- enabled: false
|
||||
url: https://adaway.org/hosts.txt
|
||||
name: AdAway Default Blocklist
|
||||
id: 2
|
||||
whitelist_filters: []
|
||||
user_rules: []
|
||||
dhcp:
|
||||
enabled: false
|
||||
interface_name: ""
|
||||
dhcpv4:
|
||||
gateway_ip: ""
|
||||
subnet_mask: ""
|
||||
range_start: ""
|
||||
range_end: ""
|
||||
lease_duration: 86400
|
||||
icmp_timeout_msec: 1000
|
||||
options: []
|
||||
dhcpv6:
|
||||
range_start: ""
|
||||
lease_duration: 86400
|
||||
ra_slaac_only: false
|
||||
ra_allow_slaac: false
|
||||
clients: []
|
||||
log_compress: false
|
||||
log_localtime: false
|
||||
log_max_backups: 0
|
||||
log_max_size: 100
|
||||
log_max_age: 3
|
||||
log_file: ""
|
||||
verbose: false
|
||||
os:
|
||||
group: ""
|
||||
user: ""
|
||||
rlimit_nofile: 0
|
||||
schema_version: 12
|
|
@ -1,16 +0,0 @@
|
|||
|
||||
version: "3.7"
|
||||
services:
|
||||
adguard:
|
||||
image: adguard/adguardhome:v0.107.7
|
||||
container_name: adguard
|
||||
volumes:
|
||||
- "${APP_DATA_DIR}/data/work:/opt/adguardhome/work"
|
||||
- "${APP_DATA_DIR}/data/conf:/opt/adguardhome/conf"
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- tipi_main_network
|
||||
ports:
|
||||
- 53:53/tcp
|
||||
- 53:53/udp
|
||||
- ${APP_PORT}:80
|
|
@ -1,6 +0,0 @@
|
|||
## AdGuard Home is a network-wide software for blocking ads & tracking.
|
||||
|
||||
After you set it up, it'll cover ALL your home devices, and you don't need any client-side software for that.
|
||||
It operates as a DNS server that re-routes tracking domains to a "black hole", thus preventing your devices from connecting to those servers. It's based on software we use for our public AdGuard DNS servers -- both share a lot of common code.
|
||||
|
||||
![Screenshot](https://cdn.adguard.com/public/Adguard/Common/adguard_home.gif)
|
|
@ -1,47 +0,0 @@
|
|||
{
|
||||
"name": "Anonaddy",
|
||||
"port": 8084,
|
||||
"available": false,
|
||||
"categories": ["utilities"],
|
||||
"id": "anonaddy",
|
||||
"description": "",
|
||||
"short_desc": "Anonymous email forwarding",
|
||||
"author": "",
|
||||
"source": "https://github.com/anonaddy/anonaddy",
|
||||
"image": "https://avatars.githubusercontent.com/u/51450862?s=200&v=4",
|
||||
"requirements": {
|
||||
"ports": [25]
|
||||
},
|
||||
"form_fields": [
|
||||
{
|
||||
"type": "text",
|
||||
"label": "Username",
|
||||
"required": true,
|
||||
"env_variable": "ANONADDY_USERNAME"
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"label": "App key",
|
||||
"hint": "Application key for encrypter service. Generate one with : echo \"base64:$(openssl rand -base64 32)\"",
|
||||
"required": true,
|
||||
"env_variable": "ANONADDY_KEY"
|
||||
},
|
||||
{
|
||||
"type": "fqdn",
|
||||
"label": "Your email domain (eg. example.com)",
|
||||
"max": 50,
|
||||
"min": 3,
|
||||
"required": true,
|
||||
"env_variable": "ANONADDY_DOMAIN"
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"label": "App secret",
|
||||
"hint": "Long random string used when hashing data for the anonymous replies",
|
||||
"max": 50,
|
||||
"min": 3,
|
||||
"required": true,
|
||||
"env_variable": "ANONADDY_SECRET"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,80 +0,0 @@
|
|||
version: "3.7"
|
||||
services:
|
||||
db:
|
||||
image: mariadb:10.5
|
||||
container_name: db-anonaddy
|
||||
command:
|
||||
- "mysqld"
|
||||
- "--character-set-server=utf8mb4"
|
||||
- "--collation-server=utf8mb4_unicode_ci"
|
||||
volumes:
|
||||
- "${APP_DATA_DIR}/db:/var/lib/mysql"
|
||||
environment:
|
||||
MARIADB_DATABASE: anonaddy
|
||||
MARIADB_USER: anonaddy
|
||||
MARIADB_ROOT_PASSWORD: anonaddy
|
||||
MARIADB_PASSWORD: anonaddy
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- tipi_main_network
|
||||
|
||||
redis:
|
||||
image: redis:4.0-alpine
|
||||
container_name: redis-anonaddy
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- tipi_main_network
|
||||
|
||||
anonaddy:
|
||||
image: anonaddy/anonaddy:0.11.1
|
||||
container_name: anonaddy
|
||||
ports:
|
||||
- 25:25
|
||||
- ${APP_PORT}:8000
|
||||
depends_on:
|
||||
- db
|
||||
- redis
|
||||
volumes:
|
||||
- "${APP_DATA_DIR}/data:/data"
|
||||
environment:
|
||||
TZ: ${TZ}
|
||||
DB_HOST: db-anonaddy
|
||||
DB_PASSWORD: anonaddy
|
||||
REDIS_HOST: redis-anonaddy
|
||||
APP_KEY: ${ANONADDY_KEY}
|
||||
ANONADDY_DOMAIN: ${ANONADDY_DOMAIN}
|
||||
ANONADDY_SECRET: ${ANONADDY_SECRET}
|
||||
ANONADDY_ADMIN_USERNAME: ${ANONADDY_USERNAME}
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- tipi_main_network
|
||||
# labels:
|
||||
# traefik.enable: true
|
||||
# traefik.http.routers.anonaddy.rule: Host(`anonaddy.tipi.home`)
|
||||
# traefik.http.routers.anonaddy.tls: true
|
||||
# traefik.http.routers.anonaddy.entrypoints: websecure
|
||||
# traefik.http.routers.anonaddy.service: anonaddy
|
||||
# traefik.http.services.anonaddy.loadbalancer.server.port: 8000
|
||||
# labels:
|
||||
# traefik.enable: true
|
||||
# traefik.http.routers.anonaddy.rule: PathPrefix(`/anonaddy`)
|
||||
|
||||
# # Redirect to ending /
|
||||
# traefik.http.middlewares.anonaddy-redirect.redirectregex.regex: ^(http:\/\/(\[[\w:.]+\]|[\w\._-]+)(:\d+)?)\/anonaddy$$
|
||||
# traefik.http.middlewares.anonaddy-redirect.redirectregex.replacement: $${1}/anonaddy/
|
||||
|
||||
# # Strip /anonaddy/ from URL
|
||||
# traefik.http.middlewares.anonaddy-stripprefix.stripprefixregex.regex: (/anonaddy/|/anonaddy)
|
||||
|
||||
# traefik.http.middlewares.anonaddy-headers.headers.customrequestheaders.Host: $$host
|
||||
# traefik.http.middlewares.anonaddy-headers.headers.customrequestheaders.X-Forwarded-Proto: $$scheme
|
||||
# traefik.http.middlewares.anonaddy-headers.headers.customrequestheaders.X-Forwarded-For: $$proxy_add_x_forwarded_for
|
||||
# traefik.http.middlewares.anonaddy-headers.headers.customrequestheaders.X-Real-IP: $$remote_addr
|
||||
# traefik.http.middlewares.anonaddy-headers.headers.customrequestheaders.X-Frame-Options: "SAMEORIGIN"
|
||||
|
||||
# # Apply middleware
|
||||
# traefik.http.routers.anonaddy.middlewares: anonaddy-redirect, anonaddy-stripprefix, anonaddy-headers
|
||||
|
||||
# traefik.http.routers.anonaddy.entrypoints: http
|
||||
# traefik.http.routers.anonaddy.service: anonaddy
|
||||
# traefik.http.services.anonaddy.loadbalancer.server.port: 8000
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"name": "Booksonic",
|
||||
"available": true,
|
||||
"port": 8040,
|
||||
"id": "booksonic",
|
||||
"categories": ["books", "media"],
|
||||
"description": "",
|
||||
"short_desc": "The selfhosted audiobook server",
|
||||
"author": "https://github.com/popeen",
|
||||
"source": "https://github.com/popeen/Booksonic-Air",
|
||||
"image": "/logos/apps/booksonic.jpg",
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,19 +0,0 @@
|
|||
version: "3.9"
|
||||
services:
|
||||
booksonic:
|
||||
image: lscr.io/linuxserver/booksonic-air:latest
|
||||
container_name: booksonic
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- TZ=${TZ}
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/config:/config
|
||||
- ${ROOT_FOLDER_HOST}/media/data/books/spoken:/audiobooks
|
||||
- ${ROOT_FOLDER_HOST}/media/data/podcasts:/podcasts
|
||||
ports:
|
||||
- ${APP_PORT}:4040
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- tipi_main_network
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
Booksonic Air is a server for hosting the audiobooks you own and reach them from wherever you are.
|
||||
|
||||
Check out [Booksonic App](https://github.com/popeen/Booksonic-App) for connecting to Booksonic servers.
|
||||
<br />
|
||||
Once installed you can setup the following folders : /audiobooks, /podcasts
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"name": "Calibre-Web - EBook Reader",
|
||||
"available": true,
|
||||
"port": 8100,
|
||||
"id": "calibre-web",
|
||||
"categories": ["books"],
|
||||
"description": "On the initial setup screen, enter /books as your calibre library location. \n Default admin login: Username: admin Password: admin123",
|
||||
"short_desc": "Calibre-web is a web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre database.",
|
||||
"author": "https://github.com/janeczku/",
|
||||
"source": "https://github.com/janeczku/calibre-web",
|
||||
"image": "/logos/apps/calibre-web.jpg",
|
||||
"form_fields": []
|
||||
}
|
Binary file not shown.
|
@ -1,17 +0,0 @@
|
|||
version: "3.7"
|
||||
services:
|
||||
calibre-web:
|
||||
image: lscr.io/linuxserver/calibre-web:0.6.18
|
||||
container_name: calibre-web
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- TZ=${TZ}
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/config:/config
|
||||
- ${ROOT_FOLDER_HOST}/media/data/books:/books
|
||||
ports:
|
||||
- ${APP_PORT}:8083
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- tipi_main_network
|
|
@ -1,7 +0,0 @@
|
|||
Calibre-Web is a web app providing a clean interface for browsing, reading and downloading eBooks using a valid Calibre database.
|
||||
|
||||
On the initial setup screen, enter /books as your calibre library location.
|
||||
|
||||
- **username**: admin
|
||||
- **password**: admin123
|
||||
<br />
|
|
@ -1,22 +0,0 @@
|
|||
{
|
||||
"name": "Code-Server - Web VS Code",
|
||||
"available": true,
|
||||
"port": 8101,
|
||||
"id": "code-server",
|
||||
"categories": ["development"],
|
||||
"description": "",
|
||||
"short_desc": "Code-server is VS Code running on a remote server, accessible through the browser.",
|
||||
"author": "https://github.com/coder",
|
||||
"source": "https://github.com/linuxserver/docker-code-server",
|
||||
"image": "https://avatars.githubusercontent.com/u/95932066",
|
||||
"form_fields": [
|
||||
{
|
||||
"type": "password",
|
||||
"label": "Password",
|
||||
"max": 50,
|
||||
"min": 3,
|
||||
"required": true,
|
||||
"env_variable": "CODESERVER_PASSWORD"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,19 +0,0 @@
|
|||
version: "3.7"
|
||||
services:
|
||||
code-server:
|
||||
image: lscr.io/linuxserver/code-server:4.5.1
|
||||
container_name: code-server
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- TZ=${TZ}
|
||||
- PASSWORD=${CODESERVER_PASSWORD}
|
||||
- DEFAULT_WORKSPACE=/config/workspace #optional
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/config:/config #config dir
|
||||
- ${APP_DATA_DIR}/data/projects:/projects
|
||||
ports:
|
||||
- ${APP_PORT}:8443
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- tipi_main_network
|
|
@ -1,7 +0,0 @@
|
|||
## Run VS Code on any machine anywhere and access it in the browser.
|
||||
|
||||
- Code on any device with a consistent development environment
|
||||
- Use cloud servers to speed up tests, compilations, downloads, and more
|
||||
- Preserve battery life when you're on the go; all intensive tasks run on your server
|
||||
|
||||
![screenshot](https://raw.githubusercontent.com/coder/code-server/main/docs/assets/screenshot.png)
|
|
@ -1,6 +0,0 @@
|
|||
version: "3.7"
|
||||
|
||||
networks:
|
||||
tipi_main_network:
|
||||
external:
|
||||
name: runtipi_tipi_main_network
|
|
@ -1,14 +0,0 @@
|
|||
{
|
||||
"name": "File Browser",
|
||||
"available": true,
|
||||
"port": 8096,
|
||||
"id": "filebrowser",
|
||||
"categories": ["utilities"],
|
||||
"description": "Reliable and Performant File Management Desktop Sync and File Sharing\n Default credentials: admin / admin",
|
||||
"short_desc": "Access your homeserver files from your browser",
|
||||
"author": "filebrowser.org",
|
||||
"website": "https://filebrowser.org/",
|
||||
"source": "https://github.com/filebrowser/filebrowser",
|
||||
"image": "/logos/apps/filebrowser.jpg",
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
{
|
||||
"port": 80,
|
||||
"baseURL": "",
|
||||
"address": "",
|
||||
"log": "stdout",
|
||||
"database": "/database/filebrowser.db",
|
||||
"root": "/srv"
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
version: "3.7"
|
||||
services:
|
||||
filebrowser:
|
||||
container_name: filebrowser
|
||||
image: filebrowser/filebrowser:s6
|
||||
ports:
|
||||
- ${APP_PORT}:80
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
volumes:
|
||||
- ${ROOT_FOLDER_HOST}/app-data:/srv/app-data
|
||||
- ${ROOT_FOLDER_HOST}/media:/srv/media
|
||||
- ${APP_DATA_DIR}/data/db:/database
|
||||
- ${APP_DATA_DIR}/data/config:/config
|
||||
networks:
|
||||
- tipi_main_network
|
|
@ -1,12 +0,0 @@
|
|||
## Access your homeserver files from your browser
|
||||
|
||||
filebrowser provides a file managing interface within a specified directory and it can be used to upload, delete, preview, rename and edit your files. It allows the creation of multiple users and each user can have its own directory. It can be used as a standalone app.
|
||||
|
||||
- **username**: admin
|
||||
- **password**: admin
|
||||
<br />
|
||||
## Features
|
||||
|
||||
Please refer to our docs at [https://filebrowser.org/features](https://filebrowser.org/features)
|
||||
|
||||
![Preview](https://user-images.githubusercontent.com/5447088/50716739-ebd26700-107a-11e9-9817-14230c53efd2.gif)
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"name": "FileRun",
|
||||
"port": 8087,
|
||||
"available": false,
|
||||
"id": "filerun",
|
||||
"description": "Reliable and Performant File Management Desktop Sync and File Sharing",
|
||||
"short_desc": "Access your homeserver files from your browser",
|
||||
"author": "FileRun, LDA - Portugal",
|
||||
"source": "https://www.filerun.com/",
|
||||
"image": "https://avatars.githubusercontent.com/u/6422152?v=4",
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
services:
|
||||
filerun-db:
|
||||
container_name: filerun-db
|
||||
user: 1000:1000
|
||||
image: mariadb:10.1
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: tipi
|
||||
MYSQL_USER: tipi
|
||||
MYSQL_PASSWORD: tipi
|
||||
MYSQL_DATABASE: tipi
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/db:/var/lib/mysql
|
||||
networks:
|
||||
- tipi_main_network
|
||||
|
||||
filerun:
|
||||
container_name: filerun
|
||||
image: filerun/filerun:arm64v8
|
||||
environment:
|
||||
FR_DB_HOST: filerun-db
|
||||
FR_DB_PORT: 3306
|
||||
FR_DB_NAME: tipi
|
||||
FR_DB_USER: tipi
|
||||
FR_DB_PASS: tipi
|
||||
APACHE_RUN_USER: 1000
|
||||
APACHE_RUN_GROUP: 1000
|
||||
APACHE_RUN_USER_ID: 33
|
||||
APACHE_RUN_GROUP_ID: 33
|
||||
depends_on:
|
||||
- db
|
||||
links:
|
||||
- db:db
|
||||
ports:
|
||||
- ${APP_PORT}:80
|
||||
volumes:
|
||||
- ${ROOT_FOLDER_HOST}/app-data/medias:/user-files
|
||||
networks:
|
||||
- tipi_main_network
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"name": "Firefly III",
|
||||
"available": true,
|
||||
"port": 8115,
|
||||
"id": "firefly-iii",
|
||||
"categories": ["finance"],
|
||||
"description": "",
|
||||
"short_desc": "Firefly III: a personal finances manager ",
|
||||
"author": "JC5",
|
||||
"website": "https://www.firefly-iii.org/",
|
||||
"source": "https://github.com/firefly-iii/firefly-iii",
|
||||
"image": "/logos/apps/firefly-iii.jpg",
|
||||
"form_fields": [
|
||||
{
|
||||
"type": "email",
|
||||
"label": "Your email",
|
||||
"required": true,
|
||||
"env_variable": "EMAIL"
|
||||
},
|
||||
{
|
||||
"type": "random",
|
||||
"min": 32,
|
||||
"max": 32,
|
||||
"label": "Random key",
|
||||
"env_variable": "APP_KEY"
|
||||
},
|
||||
{
|
||||
"type": "random",
|
||||
"min": 32,
|
||||
"max": 32,
|
||||
"label": "Database password",
|
||||
"env_variable": "MYSQL_PASSWORD"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,59 +0,0 @@
|
|||
version: '3.9'
|
||||
|
||||
services:
|
||||
firefly-iii:
|
||||
image: fireflyiii/core:latest
|
||||
container_name: firefly-iii
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/uplodad:/var/www/html/storage/upload
|
||||
ports:
|
||||
- ${APP_PORT}:8080
|
||||
depends_on:
|
||||
- firefly-iii-db
|
||||
environment:
|
||||
- APP_ENV=local
|
||||
- APP_DEBUG=false
|
||||
- SITE_OWNER=${EMAIL}
|
||||
- APP_KEY=${APP_KEY}
|
||||
- TZ=${TZ}
|
||||
- TRUSTED_PROXIES=**
|
||||
|
||||
# Database
|
||||
- DB_CONNECTION=mysql
|
||||
- DB_HOST=firefly-iii-db
|
||||
- DB_PORT=3306
|
||||
- DB_DATABASE=firefly
|
||||
- DB_USERNAME=firefly
|
||||
- DB_PASSWORD=${MYSQL_PASSWORD}
|
||||
|
||||
# Cookie settings
|
||||
- COOKIE_PATH="/"
|
||||
- COOKIE_DOMAIN=
|
||||
- COOKIE_SECURE=false
|
||||
- COOKIE_SAMESITE=lax
|
||||
|
||||
- APP_NAME=FireflyIII
|
||||
- BROADCAST_DRIVER=log
|
||||
- QUEUE_DRIVER=sync
|
||||
- CACHE_PREFIX=firefly
|
||||
- IS_HEROKU=false
|
||||
- FIREFLY_III_LAYOUT=v1
|
||||
- APP_URL=http://localhost:${APP_PORT}
|
||||
networks:
|
||||
- tipi_main_network
|
||||
|
||||
firefly-iii-db:
|
||||
container_name: firefly-iii-db
|
||||
image: mariadb
|
||||
hostname: fireflyiii-db
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- MYSQL_RANDOM_ROOT_PASSWORD=yes
|
||||
- MYSQL_USER=firefly
|
||||
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
|
||||
- MYSQL_DATABASE=firefly
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/db:/var/lib/mysql
|
||||
networks:
|
||||
- tipi_main_network
|
|
@ -1,26 +0,0 @@
|
|||
"Firefly III" is a (self-hosted) manager for your personal finances. It can help you keep track of your expenses and income, so you can spend less and save more. Firefly III supports the use of budgets, categories and tags. Using a bunch of external tools, you can import data. It also has many neat financial reports available.
|
||||
|
||||
Firefly III should give you **insight** into and **control** over your finances. Money should be useful, not scary. You should be able to *see* where it is going, to *feel* your expenses and to... wow, I'm going overboard with this aren't I?
|
||||
|
||||
But you get the idea: this is your money. These are your expenses. Stop them from controlling you. I built this tool because I started to dislike money. Having money, not having money, paying bills with money, you get the idea. But no more. I want to feel "safe", whatever my balance is. And I hope this tool can help you. I know it helps me.
|
||||
|
||||
![Firefly III on iMac](https://raw.githubusercontent.com/firefly-iii/firefly-iii/develop/.github/assets/img/imac-complete.png)
|
||||
|
||||
### Purpose
|
||||
|
||||
Personal financial management is pretty difficult, and everybody has their own approach to it. Some people make budgets, other people limit their cashflow by throwing away their credit cards, others try to increase their current cashflow. There are tons of ways to save and earn money. Firefly III works on the principle that if you know where your money is going, you can stop it from going there.
|
||||
|
||||
By keeping track of your expenses and your income you can budget accordingly and save money. Stop living from paycheck to paycheck but give yourself the financial wiggle room you need.
|
||||
|
||||
You can read more about the purpose of Firefly III in the [documentation](https://docs.firefly-iii.org/).
|
||||
|
||||
![Firefly III on iPad](https://raw.githubusercontent.com/firefly-iii/firefly-iii/develop/.github/assets/img/ipad-complete.png)
|
||||
|
||||
## Need help?
|
||||
|
||||
If you need support using Firefly III or the associated tools, come find us!
|
||||
|
||||
- [GitHub Discussions for questions and support](https://github.com/firefly-iii/firefly-iii/discussions/)
|
||||
- [Gitter.im for a good chat and a quick answer](https://gitter.im/firefly-iii/firefly-iii)
|
||||
- [GitHub Issues for bugs and issues](https://github.com/firefly-iii/firefly-iii/issues)
|
||||
- [Follow me around for news and updates on Twitter](https://twitter.com/Firefly_iii)
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"name": "FreshRSS",
|
||||
"available": true,
|
||||
"port": 8086,
|
||||
"id": "freshrss",
|
||||
"categories": ["utilities"],
|
||||
"description": "FreshRSS is a self-hosted RSS feed aggregator like Leed or Kriss Feed.\nIt is lightweight, easy to work with, powerful, and customizable.\n\nIt is a multi-user application with an anonymous reading mode. It supports custom tags. There is an API for (mobile) clients, and a Command-Line Interface.\n\nThanks to the WebSub standard (formerly PubSubHubbub), FreshRSS is able to receive instant push notifications from compatible sources, such as Mastodon, Friendica, WordPress, Blogger, FeedBurner, etc.\n\nFreshRSS natively supports basic Web scraping, based on XPath, for Web sites not providing any RSS / Atom feed.\n\nFinally, it supports extensions for further tuning.",
|
||||
"short_desc": "A free, self-hostable aggregator… ",
|
||||
"author": "https://freshrss.org/",
|
||||
"source": "https://github.com/FreshRSS/FreshRSS",
|
||||
"image": "/logos/apps/freshrss.jpg",
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
version: "3.7"
|
||||
|
||||
services:
|
||||
freshrss:
|
||||
image: lscr.io/linuxserver/freshrss:1.19.2
|
||||
container_name: freshrss
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- TZ=${TZ}
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/freshrss:/config
|
||||
ports:
|
||||
- ${APP_PORT}:80
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- tipi_main_network
|
||||
|
||||
# labels:
|
||||
# traefik.enable: true
|
||||
# traefik.http.routers.freshrss.rule: Host(`freshrss.tipi.home`)
|
||||
# traefik.http.routers.freshrss.service: freshrss
|
||||
# traefik.http.routers.freshrss.tls: true
|
||||
# traefik.http.routers.freshrss.entrypoints: websecure
|
||||
# traefik.http.services.freshrss.loadbalancer.server.port: 80
|
|
@ -1,27 +0,0 @@
|
|||
|
||||
|
||||
## A free, self-hostable aggregator…
|
||||
|
||||
FreshRSS is a self-hosted RSS feed aggregator like [Leed](https://github.com/LeedRSS/Leed) or [Kriss Feed](https://tontof.net/kriss/feed/).
|
||||
|
||||
It is lightweight, easy to work with, powerful, and customizable.
|
||||
|
||||
It is a multi-user application with an anonymous reading mode. It supports custom tags.
|
||||
There is an API for (mobile) clients, and a [Command-Line Interface](cli/README.md).
|
||||
|
||||
Thanks to the [WebSub](https://www.w3.org/TR/websub/) standard (formerly [PubSubHubbub](https://github.com/pubsubhubbub/PubSubHubbub)),
|
||||
FreshRSS is able to receive instant push notifications from compatible sources, such as [Mastodon](https://joinmastodon.org), [Friendica](https://friendi.ca), [WordPress](https://wordpress.org/plugins/pubsubhubbub/), Blogger, FeedBurner, etc.
|
||||
|
||||
FreshRSS natively supports basic Web scraping, based on [XPath](https://www.w3.org/TR/xpath-10/), for Web sites not providing any RSS / Atom feed.
|
||||
|
||||
Finally, it supports [extensions](#extensions) for further tuning.
|
||||
|
||||
Feature requests, bug reports, and other contributions are welcome. The best way to contribute is to [open an issue on GitHub](https://github.com/FreshRSS/FreshRSS/issues).
|
||||
We are a friendly community.
|
||||
|
||||
* Official website: [website](https://freshrss.org)
|
||||
* Demo: [Demo](https://demo.freshrss.org/)
|
||||
* License: [GNU AGPL 3](https://www.gnu.org/licenses/agpl-3.0.html)
|
||||
|
||||
![Screenshot](https://raw.githubusercontent.com/FreshRSS/FreshRSS/edge/docs/img/FreshRSS-screenshot.png)
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
{
|
||||
"name": "Ghost",
|
||||
"port": 8117,
|
||||
"available": true,
|
||||
"id": "ghost",
|
||||
"categories": ["social", "media"],
|
||||
"description": "Ghost is a powerful app for new-media creators to publish, share, and grow a business around their content. It comes with modern tools to build a website, publish content, send newsletters & offer paid subscriptions to members.",
|
||||
"short_desc": "Ghost - Turn your audience into a business.",
|
||||
"author": "TryGhost",
|
||||
"source": "https://github.com/TryGhost/Ghost",
|
||||
"image": "/logos/apps/ghost.jpg",
|
||||
"form_fields": [
|
||||
{
|
||||
"type": "random",
|
||||
"label": "Ghost Database password",
|
||||
"min": 20,
|
||||
"env_variable": "GHOST_DATABASE_PASSWORD"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
version: '3.9'
|
||||
|
||||
services:
|
||||
|
||||
ghost:
|
||||
image: ghost:alpine
|
||||
container_name: ghost
|
||||
depends_on:
|
||||
- ghostdb
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- ${APP_PORT}:2368
|
||||
environment:
|
||||
# see https://ghost.org/docs/config/#configuration-options
|
||||
database__client: mysql
|
||||
database__connection__host: ghostdb
|
||||
database__connection__user: tipi
|
||||
database__connection__password: ${GHOST_DATABASE_PASSWORD}
|
||||
database__connection__database: ghosttipi
|
||||
url: http://localhost:${APP_PORT}
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/content:/var/lib/ghost/content
|
||||
networks:
|
||||
- tipi_main_network
|
||||
|
||||
ghostdb:
|
||||
container_name: ghostdb
|
||||
image: mariadb:latest
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: ${GHOST_DATABASE_PASSWORD}
|
||||
MYSQL_USER: tipi
|
||||
MYSQL_PASSWORD: ${GHOST_DATABASE_PASSWORD}
|
||||
MYSQL_DATABASE: ghosttipi
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/db:/var/lib/mysql
|
||||
networks:
|
||||
- tipi_main_network
|
|
@ -1,5 +0,0 @@
|
|||
# A painless self-hosted Blog
|
||||
|
||||
Ghost is a powerful app for new-media creators to publish, share, and grow a business around their content. It comes with modern tools to build a website, publish content, send newsletters & offer paid subscriptions to members.
|
||||
|
||||
![Screenshot](https://ghost.org/images/home/posts_hu3b21debb17401a2115316debd8fe8fa5_467056_2000x0_resize_q100_h2_box_3.webp)
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"name": "Gitea",
|
||||
"port": 8108,
|
||||
"available": true,
|
||||
"id": "gitea",
|
||||
"categories": ["development"],
|
||||
"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": "/logos/apps/gitea.jpg",
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,88 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
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
|
|
@ -1,5 +0,0 @@
|
|||
# A painless self-hosted Git service
|
||||
|
||||
The goal of this project is to make the easiest, fastest, and most painless way of setting up a self-hosted Git service. Using Go, this can be done with an independent binary distribution across all platforms which Go supports, including Linux, macOS, and Windows on x86, amd64, ARM and PowerPC architectures. Want to try it before doing anything else? Do it with the online demo! This project has been forked from Gogs since 2016.11 but changed a lot.
|
||||
|
||||
![Screenshot](https://camo.githubusercontent.com/134f49a62801ab393c211125515d108439c67b59befb2ec3e42e7235af4f5d6c/68747470733a2f2f646c2e67697465612e696f2f73637265656e73686f74732f686f6d655f74696d656c696e652e706e67)
|
|
@ -1,14 +0,0 @@
|
|||
{
|
||||
"name": "Homarr",
|
||||
"available": true,
|
||||
"port": 8102,
|
||||
"id": "homarr",
|
||||
"categories": ["utilities"],
|
||||
"description": "A homepage for your server.",
|
||||
"short_desc": "Homarr is a simple and lightweight homepage for your server, that helps you easily access all of your services in one place.",
|
||||
"author": "ajnart",
|
||||
"source": "https://github.com/ajnart/homarr",
|
||||
"website": "https://discord.gg/C2WTXkzkwK",
|
||||
"image": "/logos/apps/homarr.jpg",
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
version: "3.7"
|
||||
services:
|
||||
homarr:
|
||||
container_name: homarr
|
||||
image: ghcr.io/ajnart/homarr:0.8.0
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/config:/app/data/configs
|
||||
ports:
|
||||
- ${APP_PORT}:7575
|
||||
networks:
|
||||
- tipi_main_network
|
|
@ -1,10 +0,0 @@
|
|||
# Lightweight homepage for your server
|
||||
Homarr is a simple and lightweight homepage for your server, that helps you easily access all of your services in one place.
|
||||
It integrates with the services you use to display information on the homepage (E.g. Show upcoming Sonarr/Radarr releases).
|
||||
|
||||
If you have any questions about Homarr or want to share information with us, please go to one of the following places:
|
||||
|
||||
- [Github Discussions](https://github.com/ajnart/homarr/discussions)
|
||||
- [Discord Server](https://discord.gg/aCsmEV5RgA)
|
||||
|
||||
![Screenshot](https://user-images.githubusercontent.com/71191962/169860380-856634fb-4f41-47cb-ba54-6a9e7b3b9c81.gif)
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"name": "Home Assistant",
|
||||
"available": true,
|
||||
"port": 8123,
|
||||
"id": "homeassistant",
|
||||
"categories": ["automation"],
|
||||
"description": "Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts. Perfect to run on a Raspberry Pi or a local server.",
|
||||
"short_desc": "Open source home automation that puts local control and privacy first",
|
||||
"author": "ArneNaessens",
|
||||
"source": "https://github.com/home-assistant/core",
|
||||
"image": "/logos/apps/homeassistant.jpg",
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
|
||||
version: '3'
|
||||
services:
|
||||
homeassistant:
|
||||
container_name: homeassistant
|
||||
image: "ghcr.io/home-assistant/home-assistant:stable"
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/config:/config
|
||||
restart: unless-stopped
|
||||
privileged: true
|
||||
ports:
|
||||
- ${APP_PORT}:8123
|
||||
network_mode: host
|
|
@ -1,7 +0,0 @@
|
|||
|
||||
## Open source home automation that puts local control and privacy first
|
||||
|
||||
Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts. Perfect to run on a Raspberry Pi or a local server.
|
||||
Check out [home-assistant.io](https://home-assistant.io) for a [demo](https://home-assistant.io/demo/), installation [instructions](https://home-assistant.io/getting-started/), [tutorials](https://home-assistant.io/getting-started/automation/) and [documentation](https://home-assistant.io/docs/)
|
||||
|
||||
![Screenshot](https://raw.githubusercontent.com/home-assistant/core/master/docs/screenshots.png)
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"name": "Invidious",
|
||||
"available": true,
|
||||
"port": 8095,
|
||||
"id": "invidious",
|
||||
"categories": ["media", "social"],
|
||||
"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",
|
||||
"image": "https://raw.githubusercontent.com/iv-org/invidious/master/assets/invidious-colored-vector.svg",
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
#!/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
|
|
@ -1,12 +0,0 @@
|
|||
-- 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;
|
|
@ -1,30 +0,0 @@
|
|||
-- 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");
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
-- 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");
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
-- 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");
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
-- 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;
|
|
@ -1,29 +0,0 @@
|
|||
-- 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;
|
|
@ -1,23 +0,0 @@
|
|||
-- 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");
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
-- 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");
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
-- 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");
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
version: "3.7"
|
||||
services:
|
||||
invidious:
|
||||
user: 1000:1000
|
||||
container_name: invidious
|
||||
image: quay.io/invidious/invidious:latest-arm64
|
||||
restart: unless-stopped
|
||||
dns:
|
||||
- ${DNS_IP}
|
||||
ports:
|
||||
- "${APP_PORT}:3000"
|
||||
environment:
|
||||
INVIDIOUS_CONFIG: |
|
||||
db:
|
||||
dbname: invidious
|
||||
user: tipi
|
||||
password: tipi
|
||||
host: invidious-db
|
||||
port: 5432
|
||||
check_tables: true
|
||||
healthcheck:
|
||||
test: wget -nv --tries=1 --spider http://127.0.0.1:3000/api/v1/comments/jNQXAC9IVRw || exit 1
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 2
|
||||
depends_on:
|
||||
- invidious-db
|
||||
networks:
|
||||
- tipi_main_network
|
||||
|
||||
invidious-db:
|
||||
user: 1000:1000
|
||||
container_name: invidious-db
|
||||
image: docker.io/library/postgres:14
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/postgres:/var/lib/postgresql/data
|
||||
- ${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:
|
||||
POSTGRES_DB: invidious
|
||||
POSTGRES_USER: tipi
|
||||
POSTGRES_PASSWORD: tipi
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
|
||||
networks:
|
||||
- tipi_main_network
|
|
@ -1,48 +0,0 @@
|
|||
version: "3.7"
|
||||
services:
|
||||
invidious:
|
||||
user: 1000:1000
|
||||
container_name: invidious
|
||||
image: quay.io/invidious/invidious:latest
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "${APP_PORT}:3000"
|
||||
environment:
|
||||
# Please read the following file for a comprehensive list of all available
|
||||
# configuration options and their associated syntax:
|
||||
# https://github.com/iv-org/invidious/blob/master/config/config.example.yml
|
||||
INVIDIOUS_CONFIG: |
|
||||
db:
|
||||
dbname: invidious
|
||||
user: tipi
|
||||
password: tipi
|
||||
host: invidious-db
|
||||
port: 5432
|
||||
check_tables: true
|
||||
healthcheck:
|
||||
test: wget -nv --tries=1 --spider http://127.0.0.1:3000/api/v1/comments/jNQXAC9IVRw || exit 1
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 2
|
||||
depends_on:
|
||||
- invidious-db
|
||||
networks:
|
||||
- tipi_main_network
|
||||
|
||||
invidious-db:
|
||||
user: 1000:1000
|
||||
container_name: invidious-db
|
||||
image: docker.io/library/postgres:14
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/postgres:/var/lib/postgresql/data
|
||||
- ${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:
|
||||
POSTGRES_DB: invidious
|
||||
POSTGRES_USER: tipi
|
||||
POSTGRES_PASSWORD: tipi
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
|
||||
networks:
|
||||
- tipi_main_network
|
|
@ -1,27 +0,0 @@
|
|||
|
||||
## An open source alternative front-end to YouTube
|
||||
|
||||
**User features**
|
||||
- Lightweight
|
||||
- No ads
|
||||
- No tracking
|
||||
- No JavaScript required
|
||||
- Light/Dark themes
|
||||
- Customizable homepage
|
||||
- Subscriptions independent from Google
|
||||
- Notifications for all subscribed channels
|
||||
- Audio-only mode (with background play on mobile)
|
||||
- Support for Reddit comments
|
||||
- Available in many languages, thanks to our translators
|
||||
<br />
|
||||
**Data import/export**
|
||||
- Import subscriptions from YouTube, NewPipe and Freetube
|
||||
- Import watch history from NewPipe
|
||||
- Export subscriptions to NewPipe and Freetube
|
||||
- Import/Export Invidious user data
|
||||
<br />
|
||||
**Technical features**
|
||||
- Embedded video support
|
||||
- [Developer API](https://docs.invidious.io/api/)
|
||||
- Does not use official YouTube APIs
|
||||
- No Contributor License Agreement (CLA)
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"name": "Jackett",
|
||||
"available": true,
|
||||
"port": 8097,
|
||||
"id": "jackett",
|
||||
"description": "Jackett works as a proxy server: it translates queries from apps (Sonarr, Radarr, SickRage, CouchPotato, Mylar3, Lidarr, DuckieTV, qBittorrent, Nefarious etc.) into tracker-site-specific http queries, parses the html or json response, and then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches.",
|
||||
"short_desc": "API Support for your favorite torrent trackers ",
|
||||
"categories": ["media", "utilities"],
|
||||
"author": "",
|
||||
"source": "https://github.com/Jackett/Jackett",
|
||||
"image": "/logos/apps/jackett.jpg",
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
version: "3.7"
|
||||
services:
|
||||
jackett:
|
||||
image: lscr.io/linuxserver/jackett:0.20.1342
|
||||
container_name: jackett
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- TZ=${TZ}
|
||||
- AUTO_UPDATE=true
|
||||
dns:
|
||||
- ${DNS_IP}
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data:/config
|
||||
- ${ROOT_FOLDER_HOST}/media/torrents:/media/torrents
|
||||
ports:
|
||||
- ${APP_PORT}:9117
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- tipi_main_network
|
|
@ -1,5 +0,0 @@
|
|||
## API Support for your favorite torrent trackers
|
||||
|
||||
Jackett works as a proxy server: it translates queries from apps ([Sonarr](https://github.com/Sonarr/Sonarr), [Radarr](https://github.com/Radarr/Radarr), [SickRage](https://sickrage.github.io/), [CouchPotato](https://couchpota.to/), [Mylar3](https://github.com/mylar3/mylar3), [Lidarr](https://github.com/lidarr/lidarr), [DuckieTV](https://github.com/SchizoDuckie/DuckieTV), [qBittorrent](https://www.qbittorrent.org/), [Nefarious](https://github.com/lardbit/nefarious) etc.) into tracker-site-specific http queries, parses the html or json response, and then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.
|
||||
|
||||
![Screenshot](https://raw.githubusercontent.com/Jackett/Jackett/master/.github/jackett-screenshot1.png)
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"name": "Jellyfin",
|
||||
"available": true,
|
||||
"port": 8091,
|
||||
"id": "jellyfin",
|
||||
"categories": ["media"],
|
||||
"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",
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
version: "3.7"
|
||||
|
||||
services:
|
||||
jellyfin:
|
||||
image: lscr.io/linuxserver/jellyfin:10.8.1
|
||||
container_name: jellyfin
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/config:/config
|
||||
- ${ROOT_FOLDER_HOST}/media/data:/media/data
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- TZ=${TZ}
|
||||
restart: "unless-stopped"
|
||||
ports:
|
||||
- ${APP_PORT}:8096
|
||||
networks:
|
||||
- tipi_main_network
|
|
@ -1,5 +0,0 @@
|
|||
## A media server for your home collection
|
||||
|
||||
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!
|
||||
|
||||
For further details, please see [our documentation page](https://docs.jellyfin.org/). To receive the latest updates, get help with Jellyfin, and join the community, please visit [one of our communication channels](https://docs.jellyfin.org/general/getting-help.html). For more information about the project, please see our [about page](https://docs.jellyfin.org/general/about.html).
|
|
@ -1,13 +0,0 @@
|
|||
Joplin is a free, open source note taking and to-do application, which can handle a large number of notes organised into notebooks. The notes are searchable, can be copied, tagged and modified either from the applications directly or from your own text editor. The notes are in Markdown format.
|
||||
Notes exported from Evernote can be imported into Joplin, including the formatted content (which is converted to Markdown), resources (images, attachments, etc.) and complete metadata (geolocation, updated time, created time, etc.). Plain Markdown files can also be imported.
|
||||
|
||||
The notes can be securely synchronised using end-to-end encryption with various cloud services including Nextcloud, Dropbox, OneDrive and Joplin Cloud.
|
||||
|
||||
Full text search is available on all platforms to quickly find the information you need. The app can be customised using plugins and themes, and you can also easily create your own.
|
||||
|
||||
The application is available for Windows, Linux, macOS, Android and iOS. A Web Clipper, to save web pages and screenshots from your browser, is also available for Firefox and Chrome.
|
||||
|
||||
## Credentials
|
||||
|
||||
Username: admin@localhost
|
||||
Password: admin
|
|
@ -1,14 +0,0 @@
|
|||
{
|
||||
"name": "Joplin Server",
|
||||
"available": true,
|
||||
"port": 8099,
|
||||
"id": "joplin",
|
||||
"categories": ["utilities"],
|
||||
"description": "Default credentials: admin@localhost / admin",
|
||||
"short_desc": "Note taking and to-do application with synchronisation",
|
||||
"author": "https://github.com/laurent22",
|
||||
"source": "https://github.com/laurent22/joplin",
|
||||
"website": "https://joplinapp.org",
|
||||
"image": "/logos/apps/joplin.jpg",
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
version: "3.7"
|
||||
|
||||
services:
|
||||
db-joplin:
|
||||
container_name: db-joplin
|
||||
image: postgres:14.2
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/postgres:/var/lib/postgresql/data
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- POSTGRES_PASSWORD=tipi
|
||||
- POSTGRES_USER=tipi
|
||||
- POSTGRES_DB=joplin
|
||||
networks:
|
||||
- tipi_main_network
|
||||
|
||||
joplin:
|
||||
container_name: joplin
|
||||
image: florider89/joplin-server:2.7.4
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- db-joplin
|
||||
ports:
|
||||
- ${APP_PORT}:22300
|
||||
dns:
|
||||
- ${DNS_IP}
|
||||
environment:
|
||||
- APP_PORT=22300
|
||||
- APP_BASE_URL=http://${INTERNAL_IP}:${APP_PORT}
|
||||
- DB_CLIENT=pg
|
||||
- POSTGRES_PASSWORD=tipi
|
||||
- POSTGRES_USER=tipi
|
||||
- POSTGRES_DATABASE=joplin
|
||||
- POSTGRES_PORT=5432
|
||||
- POSTGRES_HOST=db-joplin
|
||||
- MAX_TIME_DRIFT=0
|
||||
networks:
|
||||
- tipi_main_network
|
|
@ -1,17 +0,0 @@
|
|||
## Note taking and to-do application with synchronisation
|
||||
|
||||
- **username**: admin@localhost
|
||||
- **password**: admin
|
||||
<br />
|
||||
|
||||
Joplin is a free, open source note taking and to-do application, which can handle a large number of notes organised into notebooks. The notes are searchable, can be copied, tagged and modified either from the applications directly or from your own text editor. The notes are in Markdown format.
|
||||
|
||||
Notes exported from Evernote can be imported into Joplin, including the formatted content (which is converted to Markdown), resources (images, attachments, etc.) and complete metadata (geolocation, updated time, created time, etc.). Plain Markdown files can also be imported.
|
||||
|
||||
The notes can be securely synchronised using end-to-end encryption with various cloud services including Nextcloud, Dropbox, OneDrive and Joplin Cloud.
|
||||
|
||||
Full text search is available on all platforms to quickly find the information you need. The app can be customised using plugins and themes, and you can also easily create your own.
|
||||
|
||||
The application is available for Windows, Linux, macOS, Android and iOS. A Web Clipper, to save web pages and screenshots from your browser, is also available for Firefox and Chrome.
|
||||
|
||||
![Screenshot](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/home-top-img.png)
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"name": "LibReddit",
|
||||
"available": true,
|
||||
"port": 8105,
|
||||
"id": "libreddit",
|
||||
"categories": ["social"],
|
||||
"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": "/logos/apps/libreddit.jpg",
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
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
|
|
@ -1,12 +0,0 @@
|
|||
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
|
|
@ -1,12 +0,0 @@
|
|||
## An alternative private front-end to Reddit
|
||||
|
||||
|
||||
**10 second pitch:** Libreddit is a portmanteau of "libre" (meaning freedom) and "Reddit". It is a private front-end like [Invidious](https://github.com/iv-org/invidious) but for Reddit. Browse the coldest takes of [r/unpopularopinion](https://libreddit.spike.codes/r/unpopularopinion) without being [tracked](#reddit).
|
||||
|
||||
- 🚀 Fast: written in Rust for blazing-fast speeds and memory safety
|
||||
- ☁️ Light: no JavaScript, no ads, no tracking, no bloat
|
||||
- 🕵 Private: all requests are proxied through the server, including media
|
||||
- 🔒 Secure: strong [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) prevents browser requests to Reddit
|
||||
<br />
|
||||
|
||||
![Screenshot](https://camo.githubusercontent.com/0753860e104fd86d32e13d47b31c8db88ec86bbdc66911480d92d20a96332c51/68747470733a2f2f692e6962622e636f2f515962715451742f6c69627265646469742d727573742e706e67)
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"name": "Mealie",
|
||||
"port": 8114,
|
||||
"available": true,
|
||||
"id": "mealie",
|
||||
"description": "Mealie is a self-hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. Easily add recipes into your database by providing the url and Mealie will automatically import the relevant data or add a family recipe with the UI editor. Mealie also provides an API for interactions from 3rd party applications. Default username / password is changeme@email.com / MyPassword",
|
||||
"short_desc": "Mealie is a self-hosted recipe manager and meal planner.",
|
||||
"author": "hay-kot",
|
||||
"categories": [],
|
||||
"source": "https://github.com/hay-kot/mealie",
|
||||
"image": "https://raw.githubusercontent.com/hay-kot/mealie/mealie-next/frontend/static/icons/android-chrome-512x512.png",
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
version: "3.7"
|
||||
services:
|
||||
mealie:
|
||||
container_name: mealie
|
||||
image: hkotel/mealie:v0.5.6
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- ${APP_PORT}:80
|
||||
environment:
|
||||
PUID: 1000
|
||||
PGID: 1000
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data:/app/data
|
||||
networks:
|
||||
- tipi_main_network
|
|
@ -1,9 +0,0 @@
|
|||
## Mealie is a self-hosted recipe manager and meal planner.
|
||||
|
||||
- **username**: changeme@email.com
|
||||
- **password**: MyPassword
|
||||
<br />
|
||||
|
||||
Mealie is a self hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. Easily add recipes into your database by providing the url and Mealie will automatically import the relevant data or add a family recipe with the UI editor. Mealie also provides an API for interactions from 3rd party applications.
|
||||
|
||||
[![Product Name Screen Shot](https://raw.githubusercontent.com/hay-kot/mealie/mealie-next/docs/docs/assets/img/home_screenshot.png)](https://docs.mealie.io/)
|
|
@ -1,14 +0,0 @@
|
|||
{
|
||||
"name": "n8n",
|
||||
"available": true,
|
||||
"port": 8094,
|
||||
"id": "n8n",
|
||||
"categories": ["automation"],
|
||||
"description": "n8n is an extendable workflow automation tool. With a fair-code distribution model, n8n will always have visible source code, be available to self-host, and allow you to add your own custom functions, logic and apps. n8n's node-based approach makes it highly versatile, enabling you to connect anything to everything.",
|
||||
"short_desc": "Workflow Automation Tool. Alternative to Zapier",
|
||||
"author": "n8n.io",
|
||||
"source": "https://github.com/n8n-io/n8n",
|
||||
"website": "https://n8n.io/",
|
||||
"image": "/logos/apps/n8n.jpg",
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
version: "3.7"
|
||||
|
||||
services:
|
||||
db-n8n:
|
||||
container_name: db-n8n
|
||||
image: postgres:14.2
|
||||
restart: on-failure
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/db:/var/lib/postgresql/data
|
||||
environment:
|
||||
- POSTGRES_PASSWORD=tipi
|
||||
- POSTGRES_USER=tipi
|
||||
- POSTGRES_DB=n8n
|
||||
networks:
|
||||
- tipi_main_network
|
||||
|
||||
n8n:
|
||||
container_name: n8n
|
||||
image: n8nio/n8n:0.186.1
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- ${APP_PORT}:5678
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/n8n:/home/node/.n8n
|
||||
command: /bin/sh -c "sleep 5; n8n start"
|
||||
environment:
|
||||
- DB-TYPE=postgresdb
|
||||
- DB_POSTGRESDB_DATABASE=n8n
|
||||
- DB_POSTGRESDB_HOST=db-n8n
|
||||
- DB_POSTGRESDB_PORT=5432
|
||||
- DB_POSTGRESDB_USER=tipi
|
||||
- DB_POSTGRESDB_PASSWORD=tipi
|
||||
depends_on:
|
||||
- db-n8n
|
||||
networks:
|
||||
- tipi_main_network
|
|
@ -1,6 +0,0 @@
|
|||
## Easily automate tasks across different services.
|
||||
|
||||
n8n is an extendable workflow automation tool. With a fair-code distribution model, n8n will always have visible source code, be available to self-host, and allow you to add your own custom functions, logic and apps. n8n's node-based approach makes it highly
|
||||
versatile, enabling you to connect anything to everything.
|
||||
|
||||
![Screenshot](https://raw.githubusercontent.com/n8n-io/n8n/master/assets/n8n-screenshot.png)
|
|
@ -1,30 +0,0 @@
|
|||
{
|
||||
"name": "Nextcloud",
|
||||
"available": true,
|
||||
"port": 8083,
|
||||
"id": "nextcloud",
|
||||
"categories": ["data"],
|
||||
"description": "Nextcloud is a self-hosted, open source, and fully-featured cloud storage solution for your personal files, office documents, and photos.",
|
||||
"short_desc": "Productivity platform that keeps you in control",
|
||||
"author": "Nextcloud GmbH",
|
||||
"source": "https://github.com/nextcloud/server",
|
||||
"image": "https://avatars.githubusercontent.com/u/19211038?s=200&v=4",
|
||||
"form_fields": [
|
||||
{
|
||||
"type": "text",
|
||||
"label": "Username",
|
||||
"max": 50,
|
||||
"min": 3,
|
||||
"required": true,
|
||||
"env_variable": "NEXTCLOUD_ADMIN_USER"
|
||||
},
|
||||
{
|
||||
"type": "password",
|
||||
"label": "Password",
|
||||
"max": 50,
|
||||
"min": 3,
|
||||
"required": true,
|
||||
"env_variable": "NEXTCLOUD_ADMIN_PASSWORD"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,67 +0,0 @@
|
|||
version: "3.7"
|
||||
|
||||
services:
|
||||
db-nextcloud:
|
||||
container_name: db-nextcloud
|
||||
image: postgres:14.2
|
||||
restart: on-failure
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/db:/var/lib/postgresql/data
|
||||
environment:
|
||||
- POSTGRES_PASSWORD=tipi
|
||||
- POSTGRES_USER=tipi
|
||||
- POSTGRES_DB=nextcloud
|
||||
networks:
|
||||
- tipi_main_network
|
||||
|
||||
redis-nextcloud:
|
||||
container_name: redis-nextcloud
|
||||
user: "1000:1000"
|
||||
image: redis:6.2.6
|
||||
restart: on-failure
|
||||
volumes:
|
||||
- "${APP_DATA_DIR}/data/redis:/data"
|
||||
networks:
|
||||
- tipi_main_network
|
||||
|
||||
cron:
|
||||
image: nextcloud:24.0.3-apache
|
||||
restart: on-failure
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/nextcloud:/var/www/html
|
||||
entrypoint: /cron.sh
|
||||
depends_on:
|
||||
- db-nextcloud
|
||||
- redis-nextcloud
|
||||
networks:
|
||||
- tipi_main_network
|
||||
|
||||
nextcloud:
|
||||
container_name: nextcloud
|
||||
image: nextcloud:24.0.3-apache
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- ${APP_PORT}:80
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/nextcloud:/var/www/html
|
||||
environment:
|
||||
- POSTGRES_HOST=db-nextcloud
|
||||
- REDIS_HOST=redis-nextcloud
|
||||
- POSTGRES_PASSWORD=tipi
|
||||
- POSTGRES_USER=tipi
|
||||
- POSTGRES_DB=nextcloud
|
||||
- NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN_USER}
|
||||
- NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_ADMIN_PASSWORD}
|
||||
- NEXTCLOUD_TRUSTED_DOMAINS=${INTERNAL_IP}:${APP_PORT}
|
||||
depends_on:
|
||||
- db-nextcloud
|
||||
- redis-nextcloud
|
||||
networks:
|
||||
- tipi_main_network
|
||||
# labels:
|
||||
# traefik.enable: true
|
||||
# traefik.http.routers.nextcloud.rule: Host(`nextcloud.tipi.home`)
|
||||
# traefik.http.routers.nextcloud.service: nextcloud
|
||||
# traefik.http.routers.nextcloud.tls: true
|
||||
# traefik.http.routers.nextcloud.entrypoints: websecure
|
||||
# traefik.http.services.nextcloud.loadbalancer.server.port: 80
|
|
@ -1,29 +0,0 @@
|
|||
## A safe home for all your data.
|
||||
|
||||
* 📁 **Access your Data** You can store your files, contacts, calendars and more on a server of your choosing.
|
||||
* 🔄 **Sync your Data** You keep your files, contacts, calendars and more synchronized amongst your devices.
|
||||
* 🙌 **Share your Data** …by giving others access to the stuff you want them to see or to collaborate with.
|
||||
* 🚀 **Expandable with hundreds of Apps** ...like [Calendar](https://github.com/nextcloud/calendar), [Contacts](https://github.com/nextcloud/contacts), [Mail](https://github.com/nextcloud/mail), [Video Chat](https://github.com/nextcloud/spreed) and all those you can discover in our [App Store](https://apps.nextcloud.com)
|
||||
* 🔒 **Security** with our encryption mechanisms, [HackerOne bounty program](https://hackerone.com/nextcloud) and two-factor authentication.
|
||||
|
||||
You want to learn more about how you can use Nextcloud to access, share and protect your files, calendars, contacts, communication & more at home and at your organization? [**Learn about all our Features**](https://nextcloud.com/athome/).
|
||||
|
||||
## Get your Nextcloud 🚚
|
||||
|
||||
- ☑️ [**Simply sign up**](https://nextcloud.com/signup/) at one of our providers either through our website or through the apps directly.
|
||||
- 🖥 [**Install** a server by yourself](https://nextcloud.com/install/#instructions-server) on your own hardware or by using one of our ready to use **appliances**
|
||||
- 📦 Buy one of the [awesome **devices** coming with a preinstalled Nextcloud](https://nextcloud.com/devices/)
|
||||
- 🏢 Find a [service **provider**](https://nextcloud.com/providers/) who hosts Nextcloud for you or your company
|
||||
|
||||
Enterprise? Public Sector or Education user? You may want to have a look into [**Nextcloud Enterprise**](https://nextcloud.com/enterprise/) provided by Nextcloud GmbH.
|
||||
|
||||
## Get in touch 💬
|
||||
|
||||
* [📋 Forum](https://help.nextcloud.com)
|
||||
* [👥 Facebook](https://www.facebook.com/nextclouders)
|
||||
* [🐣 Twitter](https://twitter.com/Nextclouders)
|
||||
* [🐘 Mastodon](https://mastodon.xyz/@nextcloud)
|
||||
|
||||
You can also [get support for Nextcloud](https://nextcloud.com/support)!
|
||||
|
||||
![](https://raw.githubusercontent.com/nextcloud/screenshots/master/files/Files%20Sharing.png)
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"name": "Nitter",
|
||||
"available": true,
|
||||
"port": 8106,
|
||||
"id": "nitter",
|
||||
"categories": ["social"],
|
||||
"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": "/logos/apps/nitter.jpg",
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
[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
|
|
@ -1,24 +0,0 @@
|
|||
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
|
|
@ -1,16 +0,0 @@
|
|||
## Alternative Twitter front-end
|
||||
|
||||
A free and open source alternative Twitter front-end focused on privacy and performance. Inspired by the [Invidious](https://github.com/iv-org/invidious) project.
|
||||
|
||||
- No JavaScript or ads
|
||||
- All requests go through the backend, client never talks to Twitter
|
||||
- Prevents Twitter from tracking your IP or JavaScript fingerprint
|
||||
- Uses Twitter's unofficial API (no rate limits or developer account required)
|
||||
- Lightweight (for [@nim_lang](https://nitter.net/nim_lang), 60KB vs 784KB from twitter.com)
|
||||
- RSS feeds
|
||||
- Themes
|
||||
- Mobile support (responsive design)
|
||||
- AGPLv3 licensed, no proprietary instances permitted
|
||||
<br />
|
||||
|
||||
![Screenshot](https://raw.githubusercontent.com/zedeus/nitter/master/screenshot.png)
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"name": "Node-RED",
|
||||
"port": 8111,
|
||||
"available": true,
|
||||
"id": "nodered",
|
||||
"categories": ["automation"],
|
||||
"description": "Node-RED is a programming tool for wiring together hardware devices, APIs and online services in new and interesting ways. It provides a browser-based editor that makes it easy to wire together flows using the wide range of nodes in the palette that can be deployed to its runtime in a single-click.",
|
||||
"short_desc": "Low-code programming for event-driven applications",
|
||||
"author": "node-red",
|
||||
"source": "https://github.com/node-red/node-red",
|
||||
"image": "https://avatars.githubusercontent.com/u/5375661?s=200&v=4",
|
||||
"form_fields": []
|
||||
}
|
|
@ -1,499 +0,0 @@
|
|||
|
||||
/**
|
||||
* This is the default settings file provided by Node-RED.
|
||||
*
|
||||
* It can contain any valid JavaScript code that will get run when Node-RED
|
||||
* is started.
|
||||
*
|
||||
* Lines that start with // are commented out.
|
||||
* Each entry should be separated from the entries above and below by a comma ','
|
||||
*
|
||||
* For more information about individual settings, refer to the documentation:
|
||||
* https://nodered.org/docs/user-guide/runtime/configuration
|
||||
*
|
||||
* The settings are split into the following sections:
|
||||
* - Flow File and User Directory Settings
|
||||
* - Security
|
||||
* - Server Settings
|
||||
* - Runtime Settings
|
||||
* - Editor Settings
|
||||
* - Node Settings
|
||||
*
|
||||
**/
|
||||
|
||||
module.exports = {
|
||||
|
||||
/*******************************************************************************
|
||||
* Flow File and User Directory Settings
|
||||
* - flowFile
|
||||
* - credentialSecret
|
||||
* - flowFilePretty
|
||||
* - userDir
|
||||
* - nodesDir
|
||||
******************************************************************************/
|
||||
|
||||
/** The file containing the flows. If not set, defaults to flows_<hostname>.json **/
|
||||
flowFile: 'flows.json',
|
||||
|
||||
/** By default, credentials are encrypted in storage using a generated key. To
|
||||
* specify your own secret, set the following property.
|
||||
* If you want to disable encryption of credentials, set this property to false.
|
||||
* Note: once you set this property, do not change it - doing so will prevent
|
||||
* node-red from being able to decrypt your existing credentials and they will be
|
||||
* lost.
|
||||
*/
|
||||
//credentialSecret: "a-secret-key",
|
||||
|
||||
/** By default, the flow JSON will be formatted over multiple lines making
|
||||
* it easier to compare changes when using version control.
|
||||
* To disable pretty-printing of the JSON set the following property to false.
|
||||
*/
|
||||
flowFilePretty: true,
|
||||
|
||||
/** By default, all user data is stored in a directory called `.node-red` under
|
||||
* the user's home directory. To use a different location, the following
|
||||
* property can be used
|
||||
*/
|
||||
//userDir: '/home/nol/.node-red/',
|
||||
|
||||
/** Node-RED scans the `nodes` directory in the userDir to find local node files.
|
||||
* The following property can be used to specify an additional directory to scan.
|
||||
*/
|
||||
//nodesDir: '/home/nol/.node-red/nodes',
|
||||
|
||||
/*******************************************************************************
|
||||
* Security
|
||||
* - adminAuth
|
||||
* - https
|
||||
* - httpsRefreshInterval
|
||||
* - requireHttps
|
||||
* - httpNodeAuth
|
||||
* - httpStaticAuth
|
||||
******************************************************************************/
|
||||
|
||||
/** To password protect the Node-RED editor and admin API, the following
|
||||
* property can be used. See http://nodered.org/docs/security.html for details.
|
||||
*/
|
||||
//adminAuth: {
|
||||
// type: "credentials",
|
||||
// users: [{
|
||||
// username: "admin",
|
||||
// password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
|
||||
// permissions: "*"
|
||||
// }]
|
||||
//},
|
||||
|
||||
/** The following property can be used to enable HTTPS
|
||||
* This property can be either an object, containing both a (private) key
|
||||
* and a (public) certificate, or a function that returns such an object.
|
||||
* See http://nodejs.org/api/https.html#https_https_createserver_options_requestlistener
|
||||
* for details of its contents.
|
||||
*/
|
||||
|
||||
/** Option 1: static object */
|
||||
//https: {
|
||||
// key: require("fs").readFileSync('privkey.pem'),
|
||||
// cert: require("fs").readFileSync('cert.pem')
|
||||
//},
|
||||
|
||||
/** Option 2: function that returns the HTTP configuration object */
|
||||
// https: function() {
|
||||
// // This function should return the options object, or a Promise
|
||||
// // that resolves to the options object
|
||||
// return {
|
||||
// key: require("fs").readFileSync('privkey.pem'),
|
||||
// cert: require("fs").readFileSync('cert.pem')
|
||||
// }
|
||||
// },
|
||||
|
||||
/** If the `https` setting is a function, the following setting can be used
|
||||
* to set how often, in hours, the function will be called. That can be used
|
||||
* to refresh any certificates.
|
||||
*/
|
||||
//httpsRefreshInterval : 12,
|
||||
|
||||
/** The following property can be used to cause insecure HTTP connections to
|
||||
* be redirected to HTTPS.
|
||||
*/
|
||||
//requireHttps: true,
|
||||
|
||||
/** To password protect the node-defined HTTP endpoints (httpNodeRoot),
|
||||
* including node-red-dashboard, or the static content (httpStatic), the
|
||||
* following properties can be used.
|
||||
* The `pass` field is a bcrypt hash of the password.
|
||||
* See http://nodered.org/docs/security.html#generating-the-password-hash
|
||||
*/
|
||||
//httpNodeAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."},
|
||||
//httpStaticAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."},
|
||||
|
||||
/*******************************************************************************
|
||||
* Server Settings
|
||||
* - uiPort
|
||||
* - uiHost
|
||||
* - apiMaxLength
|
||||
* - httpServerOptions
|
||||
* - httpAdminRoot
|
||||
* - httpAdminMiddleware
|
||||
* - httpNodeRoot
|
||||
* - httpNodeCors
|
||||
* - httpNodeMiddleware
|
||||
* - httpStatic
|
||||
******************************************************************************/
|
||||
|
||||
/** the tcp port that the Node-RED web server is listening on */
|
||||
uiPort: process.env.PORT || 1880,
|
||||
|
||||
/** By default, the Node-RED UI accepts connections on all IPv4 interfaces.
|
||||
* To listen on all IPv6 addresses, set uiHost to "::",
|
||||
* The following property can be used to listen on a specific interface. For
|
||||
* example, the following would only allow connections from the local machine.
|
||||
*/
|
||||
//uiHost: "127.0.0.1",
|
||||
|
||||
/** The maximum size of HTTP request that will be accepted by the runtime api.
|
||||
* Default: 5mb
|
||||
*/
|
||||
//apiMaxLength: '5mb',
|
||||
|
||||
/** The following property can be used to pass custom options to the Express.js
|
||||
* server used by Node-RED. For a full list of available options, refer
|
||||
* to http://expressjs.com/en/api.html#app.settings.table
|
||||
*/
|
||||
//httpServerOptions: { },
|
||||
|
||||
/** By default, the Node-RED UI is available at http://localhost:1880/
|
||||
* The following property can be used to specify a different root path.
|
||||
* If set to false, this is disabled.
|
||||
*/
|
||||
//httpAdminRoot: '/admin',
|
||||
|
||||
/** The following property can be used to add a custom middleware function
|
||||
* in front of all admin http routes. For example, to set custom http
|
||||
* headers. It can be a single function or an array of middleware functions.
|
||||
*/
|
||||
// httpAdminMiddleware: function(req,res,next) {
|
||||
// // Set the X-Frame-Options header to limit where the editor
|
||||
// // can be embedded
|
||||
// //res.set('X-Frame-Options', 'sameorigin');
|
||||
// next();
|
||||
// },
|
||||
|
||||
|
||||
/** Some nodes, such as HTTP In, can be used to listen for incoming http requests.
|
||||
* By default, these are served relative to '/'. The following property
|
||||
* can be used to specifiy a different root path. If set to false, this is
|
||||
* disabled.
|
||||
*/
|
||||
//httpNodeRoot: '/red-nodes',
|
||||
|
||||
/** The following property can be used to configure cross-origin resource sharing
|
||||
* in the HTTP nodes.
|
||||
* See https://github.com/troygoode/node-cors#configuration-options for
|
||||
* details on its contents. The following is a basic permissive set of options:
|
||||
*/
|
||||
//httpNodeCors: {
|
||||
// origin: "*",
|
||||
// methods: "GET,PUT,POST,DELETE"
|
||||
//},
|
||||
|
||||
/** If you need to set an http proxy please set an environment variable
|
||||
* called http_proxy (or HTTP_PROXY) outside of Node-RED in the operating system.
|
||||
* For example - http_proxy=http://myproxy.com:8080
|
||||
* (Setting it here will have no effect)
|
||||
* You may also specify no_proxy (or NO_PROXY) to supply a comma separated
|
||||
* list of domains to not proxy, eg - no_proxy=.acme.co,.acme.co.uk
|
||||
*/
|
||||
|
||||
/** The following property can be used to add a custom middleware function
|
||||
* in front of all http in nodes. This allows custom authentication to be
|
||||
* applied to all http in nodes, or any other sort of common request processing.
|
||||
* It can be a single function or an array of middleware functions.
|
||||
*/
|
||||
//httpNodeMiddleware: function(req,res,next) {
|
||||
// // Handle/reject the request, or pass it on to the http in node by calling next();
|
||||
// // Optionally skip our rawBodyParser by setting this to true;
|
||||
// //req.skipRawBodyParser = true;
|
||||
// next();
|
||||
//},
|
||||
|
||||
/** When httpAdminRoot is used to move the UI to a different root path, the
|
||||
* following property can be used to identify a directory of static content
|
||||
* that should be served at http://localhost:1880/.
|
||||
*/
|
||||
//httpStatic: '/home/nol/node-red-static/',
|
||||
|
||||
/*******************************************************************************
|
||||
* Runtime Settings
|
||||
* - lang
|
||||
* - logging
|
||||
* - contextStorage
|
||||
* - exportGlobalContextKeys
|
||||
* - externalModules
|
||||
******************************************************************************/
|
||||
|
||||
/** Uncomment the following to run node-red in your preferred language.
|
||||
* Available languages include: en-US (default), ja, de, zh-CN, zh-TW, ru, ko
|
||||
* Some languages are more complete than others.
|
||||
*/
|
||||
// lang: "de",
|
||||
|
||||
/** Configure the logging output */
|
||||
logging: {
|
||||
/** Only console logging is currently supported */
|
||||
console: {
|
||||
/** Level of logging to be recorded. Options are:
|
||||
* fatal - only those errors which make the application unusable should be recorded
|
||||
* error - record errors which are deemed fatal for a particular request + fatal errors
|
||||
* warn - record problems which are non fatal + errors + fatal errors
|
||||
* info - record information about the general running of the application + warn + error + fatal errors
|
||||
* debug - record information which is more verbose than info + info + warn + error + fatal errors
|
||||
* trace - record very detailed logging + debug + info + warn + error + fatal errors
|
||||
* off - turn off all logging (doesn't affect metrics or audit)
|
||||
*/
|
||||
level: "info",
|
||||
/** Whether or not to include metric events in the log output */
|
||||
metrics: false,
|
||||
/** Whether or not to include audit events in the log output */
|
||||
audit: false
|
||||
}
|
||||
},
|
||||
|
||||
/** Context Storage
|
||||
* The following property can be used to enable context storage. The configuration
|
||||
* provided here will enable file-based context that flushes to disk every 30 seconds.
|
||||
* Refer to the documentation for further options: https://nodered.org/docs/api/context/
|
||||
*/
|
||||
//contextStorage: {
|
||||
// default: {
|
||||
// module:"localfilesystem"
|
||||
// },
|
||||
//},
|
||||
|
||||
/** `global.keys()` returns a list of all properties set in global context.
|
||||
* This allows them to be displayed in the Context Sidebar within the editor.
|
||||
* In some circumstances it is not desirable to expose them to the editor. The
|
||||
* following property can be used to hide any property set in `functionGlobalContext`
|
||||
* from being list by `global.keys()`.
|
||||
* By default, the property is set to false to avoid accidental exposure of
|
||||
* their values. Setting this to true will cause the keys to be listed.
|
||||
*/
|
||||
exportGlobalContextKeys: false,
|
||||
|
||||
/** Configure how the runtime will handle external npm modules.
|
||||
* This covers:
|
||||
* - whether the editor will allow new node modules to be installed
|
||||
* - whether nodes, such as the Function node are allowed to have their
|
||||
* own dynamically configured dependencies.
|
||||
* The allow/denyList options can be used to limit what modules the runtime
|
||||
* will install/load. It can use '*' as a wildcard that matches anything.
|
||||
*/
|
||||
externalModules: {
|
||||
// autoInstall: false, /** Whether the runtime will attempt to automatically install missing modules */
|
||||
// autoInstallRetry: 30, /** Interval, in seconds, between reinstall attempts */
|
||||
// palette: { /** Configuration for the Palette Manager */
|
||||
// allowInstall: true, /** Enable the Palette Manager in the editor */
|
||||
// allowUpdate: true, /** Allow modules to be updated in the Palette Manager */
|
||||
// allowUpload: true, /** Allow module tgz files to be uploaded and installed */
|
||||
// allowList: ['*'],
|
||||
// denyList: [],
|
||||
// allowUpdateList: ['*'],
|
||||
// denyUpdateList: []
|
||||
// },
|
||||
// modules: { /** Configuration for node-specified modules */
|
||||
// allowInstall: true,
|
||||
// allowList: [],
|
||||
// denyList: []
|
||||
// }
|
||||
},
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Editor Settings
|
||||
* - disableEditor
|
||||
* - editorTheme
|
||||
******************************************************************************/
|
||||
|
||||
/** The following property can be used to disable the editor. The admin API
|
||||
* is not affected by this option. To disable both the editor and the admin
|
||||
* API, use either the httpRoot or httpAdminRoot properties
|
||||
*/
|
||||
//disableEditor: false,
|
||||
|
||||
/** Customising the editor
|
||||
* See https://nodered.org/docs/user-guide/runtime/configuration#editor-themes
|
||||
* for all available options.
|
||||
*/
|
||||
editorTheme: {
|
||||
/** The following property can be used to set a custom theme for the editor.
|
||||
* See https://github.com/node-red-contrib-themes/theme-collection for
|
||||
* a collection of themes to chose from.
|
||||
*/
|
||||
//theme: "",
|
||||
|
||||
/** To disable the 'Welcome to Node-RED' tour that is displayed the first
|
||||
* time you access the editor for each release of Node-RED, set this to false
|
||||
*/
|
||||
//tours: false,
|
||||
|
||||
palette: {
|
||||
/** The following property can be used to order the categories in the editor
|
||||
* palette. If a node's category is not in the list, the category will get
|
||||
* added to the end of the palette.
|
||||
* If not set, the following default order is used:
|
||||
*/
|
||||
//categories: ['subflows', 'common', 'function', 'network', 'sequence', 'parser', 'storage'],
|
||||
},
|
||||
|
||||
projects: {
|
||||
/** To enable the Projects feature, set this value to true */
|
||||
enabled: false,
|
||||
workflow: {
|
||||
/** Set the default projects workflow mode.
|
||||
* - manual - you must manually commit changes
|
||||
* - auto - changes are automatically committed
|
||||
* This can be overridden per-user from the 'Git config'
|
||||
* section of 'User Settings' within the editor
|
||||
*/
|
||||
mode: "manual"
|
||||
}
|
||||
},
|
||||
|
||||
codeEditor: {
|
||||
/** Select the text editor component used by the editor.
|
||||
* Defaults to "ace", but can be set to "ace" or "monaco"
|
||||
*/
|
||||
lib: "ace",
|
||||
options: {
|
||||
/** The follow options only apply if the editor is set to "monaco"
|
||||
*
|
||||
* theme - must match the file name of a theme in
|
||||
* packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/theme
|
||||
* e.g. "tomorrow-night", "upstream-sunburst", "github", "my-theme"
|
||||
*/
|
||||
theme: "vs",
|
||||
/** other overrides can be set e.g. fontSize, fontFamily, fontLigatures etc.
|
||||
* for the full list, see https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandaloneeditorconstructionoptions.html
|
||||
*/
|
||||
//fontSize: 14,
|
||||
//fontFamily: "Cascadia Code, Fira Code, Consolas, 'Courier New', monospace",
|
||||
//fontLigatures: true,
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/*******************************************************************************
|
||||
* Node Settings
|
||||
* - fileWorkingDirectory
|
||||
* - functionGlobalContext
|
||||
* - functionExternalModules
|
||||
* - nodeMessageBufferMaxLength
|
||||
* - ui (for use with Node-RED Dashboard)
|
||||
* - debugUseColors
|
||||
* - debugMaxLength
|
||||
* - execMaxBufferSize
|
||||
* - httpRequestTimeout
|
||||
* - mqttReconnectTime
|
||||
* - serialReconnectTime
|
||||
* - socketReconnectTime
|
||||
* - socketTimeout
|
||||
* - tcpMsgQueueSize
|
||||
* - inboundWebSocketTimeout
|
||||
* - tlsConfigDisableLocalFiles
|
||||
* - webSocketNodeVerifyClient
|
||||
******************************************************************************/
|
||||
|
||||
/** The working directory to handle relative file paths from within the File nodes
|
||||
* defaults to the working directory of the Node-RED process.
|
||||
*/
|
||||
//fileWorkingDirectory: "",
|
||||
|
||||
/** Allow the Function node to load additional npm modules directly */
|
||||
functionExternalModules: true,
|
||||
|
||||
/** The following property can be used to set predefined values in Global Context.
|
||||
* This allows extra node modules to be made available with in Function node.
|
||||
* For example, the following:
|
||||
* functionGlobalContext: { os:require('os') }
|
||||
* will allow the `os` module to be accessed in a Function node using:
|
||||
* global.get("os")
|
||||
*/
|
||||
functionGlobalContext: {
|
||||
// os:require('os'),
|
||||
},
|
||||
|
||||
/** The maximum number of messages nodes will buffer internally as part of their
|
||||
* operation. This applies across a range of nodes that operate on message sequences.
|
||||
* defaults to no limit. A value of 0 also means no limit is applied.
|
||||
*/
|
||||
//nodeMessageBufferMaxLength: 0,
|
||||
|
||||
/** If you installed the optional node-red-dashboard you can set it's path
|
||||
* relative to httpNodeRoot
|
||||
* Other optional properties include
|
||||
* readOnly:{boolean},
|
||||
* middleware:{function or array}, (req,res,next) - http middleware
|
||||
* ioMiddleware:{function or array}, (socket,next) - socket.io middleware
|
||||
*/
|
||||
//ui: { path: "ui" },
|
||||
|
||||
/** Colourise the console output of the debug node */
|
||||
//debugUseColors: true,
|
||||
|
||||
/** The maximum length, in characters, of any message sent to the debug sidebar tab */
|
||||
debugMaxLength: 1000,
|
||||
|
||||
/** Maximum buffer size for the exec node. Defaults to 10Mb */
|
||||
//execMaxBufferSize: 10000000,
|
||||
|
||||
/** Timeout in milliseconds for HTTP request connections. Defaults to 120s */
|
||||
//httpRequestTimeout: 120000,
|
||||
|
||||
/** Retry time in milliseconds for MQTT connections */
|
||||
mqttReconnectTime: 15000,
|
||||
|
||||
/** Retry time in milliseconds for Serial port connections */
|
||||
serialReconnectTime: 15000,
|
||||
|
||||
/** Retry time in milliseconds for TCP socket connections */
|
||||
//socketReconnectTime: 10000,
|
||||
|
||||
/** Timeout in milliseconds for TCP server socket connections. Defaults to no timeout */
|
||||
//socketTimeout: 120000,
|
||||
|
||||
/** Maximum number of messages to wait in queue while attempting to connect to TCP socket
|
||||
* defaults to 1000
|
||||
*/
|
||||
//tcpMsgQueueSize: 2000,
|
||||
|
||||
/** Timeout in milliseconds for inbound WebSocket connections that do not
|
||||
* match any configured node. Defaults to 5000
|
||||
*/
|
||||
//inboundWebSocketTimeout: 5000,
|
||||
|
||||
/** To disable the option for using local files for storing keys and
|
||||
* certificates in the TLS configuration node, set this to true.
|
||||
*/
|
||||
//tlsConfigDisableLocalFiles: true,
|
||||
|
||||
/** The following property can be used to verify websocket connection attempts.
|
||||
* This allows, for example, the HTTP request headers to be checked to ensure
|
||||
* they include valid authentication information.
|
||||
*/
|
||||
//webSocketNodeVerifyClient: function(info) {
|
||||
// /** 'info' has three properties:
|
||||
// * - origin : the value in the Origin header
|
||||
// * - req : the HTTP request
|
||||
// * - secure : true if req.connection.authorized or req.connection.encrypted is set
|
||||
// *
|
||||
// * The function should return true if the connection should be accepted, false otherwise.
|
||||
// *
|
||||
// * Alternatively, if this function is defined to accept a second argument, callback,
|
||||
// * it can be used to verify the client asynchronously.
|
||||
// * The callback takes three arguments:
|
||||
// * - result : boolean, whether to accept the connection or not
|
||||
// * - code : if result is false, the HTTP error status to return
|
||||
// * - reason: if result is false, the HTTP reason string to return
|
||||
// */
|
||||
//},
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue