app-platform: remove revoked onlyoffice app
This commit is contained in:
parent
881478a873
commit
de60f7e21e
@ -21,7 +21,7 @@
|
|||||||
- **Fedimint** federation guardian and gateway
|
- **Fedimint** federation guardian and gateway
|
||||||
|
|
||||||
### Self-Hosted Apps (30)
|
### Self-Hosted Apps (30)
|
||||||
Bitcoin (ThunderHub), Storage (FileBrowser, Immich, Nextcloud), Productivity (Penpot, OnlyOffice, Vaultwarden), Media (Jellyfin, PhotoPrism), Search (SearXNG), AI (Ollama), Network (Tailscale, Nginx Proxy Manager), Home (Home Assistant), Nostr (nostr-rs-relay, Nostrudel), Dev (Grafana, Portainer), and more.
|
Bitcoin (ThunderHub), Storage (FileBrowser, Immich, Nextcloud), Productivity (Penpot, Vaultwarden), Media (Jellyfin, PhotoPrism), Search (SearXNG), AI (Ollama), Network (Tailscale, Nginx Proxy Manager), Home (Home Assistant), Nostr (nostr-rs-relay, Nostrudel), Dev (Grafana, Portainer), and more.
|
||||||
|
|
||||||
### Decentralized Identity
|
### Decentralized Identity
|
||||||
- Ed25519 node identity with DID Documents (did:key)
|
- Ed25519 node identity with DID Documents (did:key)
|
||||||
|
|||||||
@ -33,7 +33,6 @@
|
|||||||
| ollama | 11434 | v0.5.4 |
|
| ollama | 11434 | v0.5.4 |
|
||||||
| grafana | 3001 | v10.2.0 |
|
| grafana | 3001 | v10.2.0 |
|
||||||
| portainer | 9000 | v2.19.4 |
|
| portainer | 9000 | v2.19.4 |
|
||||||
| onlyoffice | 8088 | v7.5.1 |
|
|
||||||
| penpot | 8089 | v2.4 |
|
| penpot | 8089 | v2.4 |
|
||||||
|
|
||||||
## Building Apps
|
## Building Apps
|
||||||
|
|||||||
@ -17,7 +17,6 @@ This document lists all port assignments for Archipelago apps.
|
|||||||
| mempool | 4080 | TCP | Web UI | 14080 |
|
| mempool | 4080 | TCP | Web UI | 14080 |
|
||||||
| ollama | 11434 | TCP | API | 21434 |
|
| ollama | 11434 | TCP | API | 21434 |
|
||||||
| searxng | 8888 | TCP | Web UI | 18888 |
|
| searxng | 8888 | TCP | Web UI | 18888 |
|
||||||
| onlyoffice | 8088 | TCP | Web UI | 18088 |
|
|
||||||
| penpot | 8089 | TCP | Web UI | 18089 |
|
| penpot | 8089 | TCP | Web UI | 18089 |
|
||||||
| lnd | 9735, 10009, 18080 | TCP | P2P, gRPC, REST | 19735, 20009, 28080 |
|
| lnd | 9735, 10009, 18080 | TCP | P2P, gRPC, REST | 19735, 20009, 28080 |
|
||||||
| core-lightning | 9736, 9835 | TCP | P2P, gRPC | 19736, 19835 |
|
| core-lightning | 9736, 9835 | TCP | P2P, gRPC | 19736, 19835 |
|
||||||
@ -47,7 +46,6 @@ In development mode, all ports are offset by 10000 to avoid conflicts with produ
|
|||||||
| Mempool | http://localhost:14080 |
|
| Mempool | http://localhost:14080 |
|
||||||
| Ollama | http://localhost:21434 |
|
| Ollama | http://localhost:21434 |
|
||||||
| SearXNG | http://localhost:18888 |
|
| SearXNG | http://localhost:18888 |
|
||||||
| OnlyOffice | http://localhost:18088 |
|
|
||||||
| Penpot | http://localhost:18089 |
|
| Penpot | http://localhost:18089 |
|
||||||
| LND REST | http://localhost:18080 |
|
| LND REST | http://localhost:18080 |
|
||||||
| Core Lightning | http://localhost:19835 |
|
| Core Lightning | http://localhost:19835 |
|
||||||
|
|||||||
@ -23,7 +23,7 @@ Containerized applications for the Archipelago Bitcoin Node OS. All apps run in
|
|||||||
|
|
||||||
### Self-Hosted Services
|
### Self-Hosted Services
|
||||||
- **nextcloud** (v28), **jellyfin** (v10.8.13), **immich** (release), **photoprism** (v240915)
|
- **nextcloud** (v28), **jellyfin** (v10.8.13), **immich** (release), **photoprism** (v240915)
|
||||||
- **vaultwarden** (v1.30.0-alpine), **onlyoffice** (v7.5.1), **penpot** (v2.4)
|
- **vaultwarden** (v1.30.0-alpine), **penpot** (v2.4)
|
||||||
- **homeassistant** (v2024.1), **filebrowser** (v2.27.0), **searxng** (2024.11.17)
|
- **homeassistant** (v2024.1), **filebrowser** (v2.27.0), **searxng** (2024.11.17)
|
||||||
- **ollama** (v0.5.4), **grafana** (v10.2.0), **portainer** (v2.19.4)
|
- **ollama** (v0.5.4), **grafana** (v10.2.0), **portainer** (v2.19.4)
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +0,0 @@
|
|||||||
# OnlyOffice - uses official image
|
|
||||||
FROM onlyoffice/documentserver:7.5.0
|
|
||||||
|
|
||||||
# Default configuration is in the image
|
|
||||||
# No additional setup needed
|
|
||||||
@ -1,54 +0,0 @@
|
|||||||
app:
|
|
||||||
id: onlyoffice
|
|
||||||
name: OnlyOffice
|
|
||||||
version: 7.5.0
|
|
||||||
description: Office suite and document collaboration. Edit documents, spreadsheets, and presentations.
|
|
||||||
|
|
||||||
container:
|
|
||||||
image: onlyoffice/documentserver:7.5.0
|
|
||||||
image_signature: cosign://...
|
|
||||||
pull_policy: if-not-present
|
|
||||||
|
|
||||||
dependencies:
|
|
||||||
- storage: 10Gi
|
|
||||||
|
|
||||||
resources:
|
|
||||||
cpu_limit: 4
|
|
||||||
memory_limit: 4Gi
|
|
||||||
disk_limit: 10Gi
|
|
||||||
|
|
||||||
security:
|
|
||||||
capabilities: []
|
|
||||||
readonly_root: false # OnlyOffice needs write access
|
|
||||||
no_new_privileges: true
|
|
||||||
user: 1000
|
|
||||||
seccomp_profile: default
|
|
||||||
network_policy: isolated
|
|
||||||
apparmor_profile: onlyoffice
|
|
||||||
|
|
||||||
ports:
|
|
||||||
- host: 8088
|
|
||||||
container: 80
|
|
||||||
protocol: tcp # Web UI
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
- type: bind
|
|
||||||
source: /var/lib/archipelago/onlyoffice
|
|
||||||
target: /var/www/onlyoffice/Data
|
|
||||||
options: [rw]
|
|
||||||
|
|
||||||
environment:
|
|
||||||
- JWT_ENABLED=false
|
|
||||||
- JWT_SECRET=${ONLYOFFICE_JWT_SECRET}
|
|
||||||
|
|
||||||
health_check:
|
|
||||||
type: http
|
|
||||||
endpoint: http://localhost:8088
|
|
||||||
path: /healthcheck
|
|
||||||
interval: 30s
|
|
||||||
timeout: 5s
|
|
||||||
retries: 3
|
|
||||||
|
|
||||||
metadata:
|
|
||||||
launch:
|
|
||||||
open_in_new_tab: true
|
|
||||||
@ -490,21 +490,6 @@ server {
|
|||||||
sub_filter_once on;
|
sub_filter_once on;
|
||||||
sub_filter '</head>' '<script src="/nostr-provider.js"></script></head>';
|
sub_filter '</head>' '<script src="/nostr-provider.js"></script></head>';
|
||||||
}
|
}
|
||||||
location /app/onlyoffice/ {
|
|
||||||
proxy_pass http://127.0.0.1:8044/;
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_hide_header X-Frame-Options;
|
|
||||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
|
||||||
proxy_hide_header Content-Security-Policy;
|
|
||||||
add_header X-Content-Type-Options "nosniff" always;
|
|
||||||
proxy_set_header Accept-Encoding "";
|
|
||||||
sub_filter_once on;
|
|
||||||
sub_filter '</head>' '<script src="/nostr-provider.js"></script></head>';
|
|
||||||
}
|
|
||||||
# Remaining apps (also available on HTTPS via snippet include)
|
# Remaining apps (also available on HTTPS via snippet include)
|
||||||
location /app/searxng/ {
|
location /app/searxng/ {
|
||||||
proxy_pass http://127.0.0.1:8888/;
|
proxy_pass http://127.0.0.1:8888/;
|
||||||
|
|||||||
@ -117,20 +117,6 @@ location /app/lnd/ {
|
|||||||
sub_filter_once on;
|
sub_filter_once on;
|
||||||
sub_filter '</head>' '<script src="/nostr-provider.js"></script></head>';
|
sub_filter '</head>' '<script src="/nostr-provider.js"></script></head>';
|
||||||
}
|
}
|
||||||
location /app/onlyoffice/ {
|
|
||||||
proxy_pass http://127.0.0.1:8044/;
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_hide_header X-Frame-Options;
|
|
||||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
|
||||||
proxy_hide_header Content-Security-Policy;
|
|
||||||
proxy_set_header Accept-Encoding "";
|
|
||||||
sub_filter_once on;
|
|
||||||
sub_filter '</head>' '<script src="/nostr-provider.js"></script></head>';
|
|
||||||
}
|
|
||||||
location /app/jellyfin/ {
|
location /app/jellyfin/ {
|
||||||
proxy_pass http://127.0.0.1:8096/;
|
proxy_pass http://127.0.0.1:8096/;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
|
|||||||
@ -253,7 +253,6 @@ const portMappings = {
|
|||||||
'nostr-rs-relay': 7000,
|
'nostr-rs-relay': 7000,
|
||||||
'syncthing': 8384,
|
'syncthing': 8384,
|
||||||
'penpot': 9001,
|
'penpot': 9001,
|
||||||
'onlyoffice': 8044,
|
|
||||||
'nginx-proxy-manager': 8181,
|
'nginx-proxy-manager': 8181,
|
||||||
'indeedhub': 8190,
|
'indeedhub': 8190,
|
||||||
'dwn': 3000,
|
'dwn': 3000,
|
||||||
@ -283,7 +282,6 @@ async function getDockerContainers() {
|
|||||||
'mempool-electrs': 'mempool-electrs',
|
'mempool-electrs': 'mempool-electrs',
|
||||||
'archy-ollama': 'ollama',
|
'archy-ollama': 'ollama',
|
||||||
'archy-searxng': 'searxng',
|
'archy-searxng': 'searxng',
|
||||||
'archy-onlyoffice': 'onlyoffice',
|
|
||||||
'archy-penpot-frontend': 'penpot'
|
'archy-penpot-frontend': 'penpot'
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -361,11 +359,6 @@ async function getDockerContainers() {
|
|||||||
icon: '/assets/img/app-icons/searxng.png',
|
icon: '/assets/img/app-icons/searxng.png',
|
||||||
description: 'Privacy-respecting metasearch engine'
|
description: 'Privacy-respecting metasearch engine'
|
||||||
},
|
},
|
||||||
'onlyoffice': {
|
|
||||||
title: 'OnlyOffice',
|
|
||||||
icon: '/assets/img/onlyoffice.webp',
|
|
||||||
description: 'Office suite and document collaboration'
|
|
||||||
},
|
|
||||||
'penpot': {
|
'penpot': {
|
||||||
title: 'Penpot',
|
title: 'Penpot',
|
||||||
icon: '/assets/img/penpot.webp',
|
icon: '/assets/img/penpot.webp',
|
||||||
@ -463,7 +456,6 @@ const marketplaceMetadata = {
|
|||||||
'grafana': { title: 'Grafana', shortDesc: 'Analytics and monitoring dashboards', icon: '/assets/img/app-icons/grafana.png' },
|
'grafana': { title: 'Grafana', shortDesc: 'Analytics and monitoring dashboards', icon: '/assets/img/app-icons/grafana.png' },
|
||||||
'searxng': { title: 'SearXNG', shortDesc: 'Privacy-respecting metasearch engine', icon: '/assets/img/app-icons/searxng.png' },
|
'searxng': { title: 'SearXNG', shortDesc: 'Privacy-respecting metasearch engine', icon: '/assets/img/app-icons/searxng.png' },
|
||||||
'ollama': { title: 'Ollama', shortDesc: 'Run large language models locally', icon: '/assets/img/app-icons/ollama.png' },
|
'ollama': { title: 'Ollama', shortDesc: 'Run large language models locally', icon: '/assets/img/app-icons/ollama.png' },
|
||||||
'onlyoffice': { title: 'OnlyOffice', shortDesc: 'Office suite for document collaboration', icon: '/assets/img/app-icons/onlyoffice.webp' },
|
|
||||||
'penpot': { title: 'Penpot', shortDesc: 'Open-source design and prototyping platform', icon: '/assets/img/app-icons/penpot.webp' },
|
'penpot': { title: 'Penpot', shortDesc: 'Open-source design and prototyping platform', icon: '/assets/img/app-icons/penpot.webp' },
|
||||||
'nextcloud': { title: 'Nextcloud', shortDesc: 'Self-hosted cloud storage and collaboration', icon: '/assets/img/app-icons/nextcloud.webp' },
|
'nextcloud': { title: 'Nextcloud', shortDesc: 'Self-hosted cloud storage and collaboration', icon: '/assets/img/app-icons/nextcloud.webp' },
|
||||||
'vaultwarden': { title: 'Vaultwarden', shortDesc: 'Self-hosted password manager (Bitwarden-compatible)', icon: '/assets/img/app-icons/vaultwarden.webp' },
|
'vaultwarden': { title: 'Vaultwarden', shortDesc: 'Self-hosted password manager (Bitwarden-compatible)', icon: '/assets/img/app-icons/vaultwarden.webp' },
|
||||||
|
|||||||
@ -25,7 +25,6 @@ const appIds = [
|
|||||||
'mempool',
|
'mempool',
|
||||||
'ollama',
|
'ollama',
|
||||||
'searxng',
|
'searxng',
|
||||||
'onlyoffice',
|
|
||||||
'penpot'
|
'penpot'
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -38,7 +37,6 @@ const repoMap = {
|
|||||||
'lightning-stack': 'lnd-startos',
|
'lightning-stack': 'lnd-startos',
|
||||||
'mempool': 'mempool-startos',
|
'mempool': 'mempool-startos',
|
||||||
'searxng': 'searxng-startos',
|
'searxng': 'searxng-startos',
|
||||||
'onlyoffice': 'onlyoffice-startos',
|
|
||||||
'penpot': 'penpot-startos',
|
'penpot': 'penpot-startos',
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,4 +168,3 @@ async function main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
main().catch(console.error)
|
main().catch(console.error)
|
||||||
|
|
||||||
|
|||||||
@ -25,7 +25,6 @@ const NEW_TAB_APP_IDS = new Set([
|
|||||||
'vaultwarden',
|
'vaultwarden',
|
||||||
'nextcloud',
|
'nextcloud',
|
||||||
'portainer',
|
'portainer',
|
||||||
'onlyoffice',
|
|
||||||
'tailscale',
|
'tailscale',
|
||||||
'nginx-proxy-manager',
|
'nginx-proxy-manager',
|
||||||
'uptime-kuma',
|
'uptime-kuma',
|
||||||
@ -105,7 +104,6 @@ const PORT_TO_APP_ID: Record<string, string> = {
|
|||||||
'9000': 'portainer',
|
'9000': 'portainer',
|
||||||
'8087': 'netbird',
|
'8087': 'netbird',
|
||||||
'8086': 'netbird',
|
'8086': 'netbird',
|
||||||
'9980': 'onlyoffice',
|
|
||||||
'11434': 'ollama',
|
'11434': 'ollama',
|
||||||
'2283': 'immich',
|
'2283': 'immich',
|
||||||
'23000': 'btcpay-server',
|
'23000': 'btcpay-server',
|
||||||
@ -127,7 +125,6 @@ const APP_ID_TO_PORT: Record<string, string> = {
|
|||||||
vaultwarden: '8082',
|
vaultwarden: '8082',
|
||||||
nextcloud: '8085',
|
nextcloud: '8085',
|
||||||
portainer: '9000',
|
portainer: '9000',
|
||||||
onlyoffice: '8044',
|
|
||||||
tailscale: '8240',
|
tailscale: '8240',
|
||||||
'nginx-proxy-manager': '8081',
|
'nginx-proxy-manager': '8081',
|
||||||
'uptime-kuma': '3002',
|
'uptime-kuma': '3002',
|
||||||
|
|||||||
@ -438,42 +438,6 @@ export const dummyApps: Record<string, PackageDataEntry> = {
|
|||||||
status: ServiceStatus.Running
|
status: ServiceStatus.Running
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'onlyoffice': {
|
|
||||||
state: PackageState.Running,
|
|
||||||
'static-files': {
|
|
||||||
license: 'AGPL-3.0',
|
|
||||||
instructions: 'Office suite and document collaboration',
|
|
||||||
icon: '/assets/img/onlyoffice.webp'
|
|
||||||
},
|
|
||||||
manifest: {
|
|
||||||
id: 'onlyoffice',
|
|
||||||
title: 'OnlyOffice',
|
|
||||||
version: '7.5.0',
|
|
||||||
description: {
|
|
||||||
short: 'Office suite and document collaboration',
|
|
||||||
long: 'OnlyOffice is a secure office suite that enables real-time collaborative editing of documents, spreadsheets, and presentations. Self-hosted alternative to Google Workspace and Microsoft 365.'
|
|
||||||
},
|
|
||||||
'release-notes': 'Initial release',
|
|
||||||
license: 'AGPL-3.0',
|
|
||||||
'wrapper-repo': 'https://github.com/ONLYOFFICE/DocumentServer',
|
|
||||||
'upstream-repo': 'https://github.com/ONLYOFFICE/DocumentServer',
|
|
||||||
'support-site': 'https://github.com/ONLYOFFICE/DocumentServer/issues',
|
|
||||||
'marketing-site': 'https://www.onlyoffice.com',
|
|
||||||
'donation-url': null
|
|
||||||
},
|
|
||||||
installed: {
|
|
||||||
'current-dependents': {},
|
|
||||||
'current-dependencies': {},
|
|
||||||
'last-backup': null,
|
|
||||||
'interface-addresses': {
|
|
||||||
main: {
|
|
||||||
'tor-address': 'onlyoffice.onion',
|
|
||||||
'lan-address': 'http://localhost:8083'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
status: ServiceStatus.Running
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'indeedhub': {
|
'indeedhub': {
|
||||||
state: PackageState.Running,
|
state: PackageState.Running,
|
||||||
'static-files': {
|
'static-files': {
|
||||||
|
|||||||
@ -3,13 +3,15 @@
|
|||||||
<!-- Nav header -- tabs + categories + search -->
|
<!-- Nav header -- tabs + categories + search -->
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<!-- Desktop: page tabs + category tabs + search -->
|
<!-- Desktop: page tabs + category tabs + search -->
|
||||||
<div class="hidden md:flex items-center gap-4">
|
<div ref="appsHeaderRef" class="hidden md:flex items-center gap-4 relative">
|
||||||
<div class="mode-switcher hidden md:inline-flex flex-shrink-0">
|
<div ref="appsPrimaryRef" class="flex-shrink-0">
|
||||||
<button class="mode-switcher-btn" :class="{ 'mode-switcher-btn-active': activeTab === 'apps' }" @click="activeTab = 'apps'; router.replace({ query: {} })">My Apps</button>
|
<div class="mode-switcher hidden md:inline-flex">
|
||||||
<RouterLink to="/dashboard/discover" class="mode-switcher-btn">App Store</RouterLink>
|
<button class="mode-switcher-btn" :class="{ 'mode-switcher-btn-active': activeTab === 'apps' }" @click="activeTab = 'apps'; router.replace({ query: {} })">My Apps</button>
|
||||||
<button class="mode-switcher-btn" :class="{ 'mode-switcher-btn-active': activeTab === 'websites' }" @click="activeTab = 'websites'; router.replace({ query: { tab: 'websites' } })">Websites</button>
|
<RouterLink to="/dashboard/discover" class="mode-switcher-btn">App Store</RouterLink>
|
||||||
|
<button class="mode-switcher-btn" :class="{ 'mode-switcher-btn-active': activeTab === 'websites' }" @click="activeTab = 'websites'; router.replace({ query: { tab: 'websites' } })">Websites</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="activeTab === 'apps' && categoriesWithApps.length > 1" class="mode-switcher category-tabs-wide hidden md:inline-flex flex-shrink-0">
|
<div v-show="activeTab === 'apps' && categoriesWithApps.length > 1 && !collapseCategories" class="mode-switcher category-tabs-wide hidden md:inline-flex flex-shrink-0">
|
||||||
<button
|
<button
|
||||||
v-for="category in categoriesWithApps"
|
v-for="category in categoriesWithApps"
|
||||||
:key="category.id"
|
:key="category.id"
|
||||||
@ -18,6 +20,32 @@
|
|||||||
:class="{ 'mode-switcher-btn-active': selectedCategory === category.id }"
|
:class="{ 'mode-switcher-btn-active': selectedCategory === category.id }"
|
||||||
>{{ category.name }}</button>
|
>{{ category.name }}</button>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-show="activeTab === 'apps' && categoriesWithApps.length > 1 && collapseCategories" class="segmented-select flex-shrink-0">
|
||||||
|
<label class="sr-only" for="apps-category-select">My Apps category</label>
|
||||||
|
<select
|
||||||
|
id="apps-category-select"
|
||||||
|
v-model="selectedCategory"
|
||||||
|
class="segmented-select-control"
|
||||||
|
>
|
||||||
|
<option
|
||||||
|
v-for="category in categoriesWithApps"
|
||||||
|
:key="category.id"
|
||||||
|
:value="category.id"
|
||||||
|
>
|
||||||
|
{{ category.name }}
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div ref="appsCategoryProbeRef" class="mode-switcher category-tabs-probe" aria-hidden="true">
|
||||||
|
<button
|
||||||
|
v-for="category in categoriesWithApps"
|
||||||
|
:key="category.id"
|
||||||
|
class="mode-switcher-btn"
|
||||||
|
type="button"
|
||||||
|
>
|
||||||
|
{{ category.name }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
<div class="app-header-search-wrap flex items-center gap-2">
|
<div class="app-header-search-wrap flex items-center gap-2">
|
||||||
<input
|
<input
|
||||||
v-model="searchQuery"
|
v-model="searchQuery"
|
||||||
@ -318,6 +346,7 @@ import { useLastKnownPackages } from './apps/appPackageCache'
|
|||||||
import { useAppsActions } from './apps/useAppsActions'
|
import { useAppsActions } from './apps/useAppsActions'
|
||||||
import { validateSideloadRequest } from './apps/sideloadValidation'
|
import { validateSideloadRequest } from './apps/sideloadValidation'
|
||||||
import { useMarketplaceApp } from '@/composables/useMarketplaceApp'
|
import { useMarketplaceApp } from '@/composables/useMarketplaceApp'
|
||||||
|
import { useCollapsingHeaderTabs } from '@/composables/useCollapsingHeaderTabs'
|
||||||
import {
|
import {
|
||||||
type AppsTab, filterEntriesForTab, isWebOnlyApp, isWebsitePackage, opensInTab, resolveRuntimeLaunchUrl,
|
type AppsTab, filterEntriesForTab, isWebOnlyApp, isWebsitePackage, opensInTab, resolveRuntimeLaunchUrl,
|
||||||
WEB_ONLY_APPS, WEB_ONLY_APP_URLS, buildAllCategories, useCategoriesWithApps,
|
WEB_ONLY_APPS, WEB_ONLY_APP_URLS, buildAllCategories, useCategoriesWithApps,
|
||||||
@ -411,6 +440,15 @@ const packages = computed(() => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const categoriesWithApps = useCategoriesWithApps(packages, ALL_CATEGORIES)
|
const categoriesWithApps = useCategoriesWithApps(packages, ALL_CATEGORIES)
|
||||||
|
const appsHeaderRef = ref<HTMLElement | null>(null)
|
||||||
|
const appsPrimaryRef = ref<HTMLElement | null>(null)
|
||||||
|
const appsCategoryProbeRef = ref<HTMLElement | null>(null)
|
||||||
|
const { collapsed: collapseCategories } = useCollapsingHeaderTabs(
|
||||||
|
appsHeaderRef,
|
||||||
|
appsPrimaryRef,
|
||||||
|
appsCategoryProbeRef,
|
||||||
|
144
|
||||||
|
)
|
||||||
|
|
||||||
const curatedApps = getCuratedAppList()
|
const curatedApps = getCuratedAppList()
|
||||||
const marketplaceMatches = computed(() => {
|
const marketplaceMatches = computed(() => {
|
||||||
|
|||||||
@ -101,7 +101,6 @@ const launchableApps = computed<KioskApp[]>(() => {
|
|||||||
'filebrowser': '/app/filebrowser/',
|
'filebrowser': '/app/filebrowser/',
|
||||||
'searxng': '/app/searxng/',
|
'searxng': '/app/searxng/',
|
||||||
'ollama': '/app/ollama/',
|
'ollama': '/app/ollama/',
|
||||||
'onlyoffice': '/app/onlyoffice/',
|
|
||||||
'portainer': '/app/portainer/',
|
'portainer': '/app/portainer/',
|
||||||
'uptime-kuma': '/app/uptime-kuma/',
|
'uptime-kuma': '/app/uptime-kuma/',
|
||||||
'nginx-proxy-manager': '/app/nginx-proxy-manager/',
|
'nginx-proxy-manager': '/app/nginx-proxy-manager/',
|
||||||
|
|||||||
@ -32,7 +32,6 @@ export const ROUTE_TO_PACKAGE_KEY: Record<string, string> = {
|
|||||||
grafana: 'grafana',
|
grafana: 'grafana',
|
||||||
searxng: 'searxng',
|
searxng: 'searxng',
|
||||||
ollama: 'ollama',
|
ollama: 'ollama',
|
||||||
onlyoffice: 'onlyoffice',
|
|
||||||
nextcloud: 'nextcloud',
|
nextcloud: 'nextcloud',
|
||||||
vaultwarden: 'vaultwarden',
|
vaultwarden: 'vaultwarden',
|
||||||
jellyfin: 'jellyfin',
|
jellyfin: 'jellyfin',
|
||||||
@ -77,7 +76,6 @@ export const APP_URLS: Record<string, { dev: string; prod: string }> = {
|
|||||||
'mempool': { dev: 'http://localhost:4080', prod: 'http://localhost:4080' },
|
'mempool': { dev: 'http://localhost:4080', prod: 'http://localhost:4080' },
|
||||||
'ollama': { dev: 'http://localhost:11434', prod: 'http://localhost:11434' },
|
'ollama': { dev: 'http://localhost:11434', prod: 'http://localhost:11434' },
|
||||||
'searxng': { dev: 'http://localhost:8888', prod: 'http://localhost:8888' },
|
'searxng': { dev: 'http://localhost:8888', prod: 'http://localhost:8888' },
|
||||||
'onlyoffice': { dev: 'http://localhost:9980', prod: 'http://localhost:9980' },
|
|
||||||
'nextcloud': { dev: 'http://localhost:8085', prod: 'http://localhost:8085' },
|
'nextcloud': { dev: 'http://localhost:8085', prod: 'http://localhost:8085' },
|
||||||
'vaultwarden': { dev: 'http://localhost:8082', prod: 'http://localhost:8082' },
|
'vaultwarden': { dev: 'http://localhost:8082', prod: 'http://localhost:8082' },
|
||||||
'jellyfin': { dev: 'http://localhost:8096', prod: 'http://localhost:8096' },
|
'jellyfin': { dev: 'http://localhost:8096', prod: 'http://localhost:8096' },
|
||||||
|
|||||||
@ -16,35 +16,17 @@ export const APP_PORTS: Record<string, number> = {
|
|||||||
'electrs': 50002,
|
'electrs': 50002,
|
||||||
'archy-electrs-ui': 50002,
|
'archy-electrs-ui': 50002,
|
||||||
'mempool-electrs': 50002,
|
'mempool-electrs': 50002,
|
||||||
'btcpay-server': 23000,
|
|
||||||
'lnd': 18083,
|
'lnd': 18083,
|
||||||
'archy-lnd-ui': 18083,
|
'archy-lnd-ui': 18083,
|
||||||
'mempool': 4080,
|
|
||||||
'mempool-web': 4080,
|
'mempool-web': 4080,
|
||||||
'archy-mempool-web': 4080,
|
|
||||||
'homeassistant': 8123,
|
|
||||||
'grafana': 3000,
|
|
||||||
'searxng': 8888,
|
|
||||||
'ollama': 11434,
|
'ollama': 11434,
|
||||||
'onlyoffice': 8044,
|
|
||||||
'nextcloud': 8085,
|
|
||||||
'vaultwarden': 8082,
|
|
||||||
'jellyfin': 8096,
|
|
||||||
'photoprism': 2342,
|
|
||||||
'immich': 2283,
|
'immich': 2283,
|
||||||
'immich_server': 2283,
|
'immich_server': 2283,
|
||||||
'filebrowser': 8083,
|
|
||||||
'nginx-proxy-manager': 8081,
|
'nginx-proxy-manager': 8081,
|
||||||
'gitea': 3001,
|
|
||||||
'portainer': 9000,
|
|
||||||
'netbird': 8087,
|
'netbird': 8087,
|
||||||
'tailscale': 8240,
|
'tailscale': 8240,
|
||||||
'uptime-kuma': 3002,
|
|
||||||
'fedimint': 8175,
|
|
||||||
'fedimintd': 8175,
|
'fedimintd': 8175,
|
||||||
'fedimint-gateway': 8176,
|
'fedimint-gateway': 8176,
|
||||||
'indeedhub': 7778,
|
|
||||||
'botfights': 9100,
|
|
||||||
'dwn': 3100,
|
'dwn': 3100,
|
||||||
'endurain': 8080,
|
'endurain': 8080,
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,7 +20,6 @@ export const GENERATED_APP_PORTS: Record<string, number> = {
|
|||||||
"morphos-server": 8086,
|
"morphos-server": 8086,
|
||||||
"nextcloud": 8085,
|
"nextcloud": 8085,
|
||||||
"nostr-rs-relay": 18081,
|
"nostr-rs-relay": 18081,
|
||||||
"onlyoffice": 8088,
|
|
||||||
"photoprism": 2342,
|
"photoprism": 2342,
|
||||||
"portainer": 9000,
|
"portainer": 9000,
|
||||||
"router": 8084,
|
"router": 8084,
|
||||||
@ -63,7 +62,6 @@ export const GENERATED_APP_TITLES: Record<string, string> = {
|
|||||||
"morphos-server": "MorphOS Server",
|
"morphos-server": "MorphOS Server",
|
||||||
"nextcloud": "Nextcloud",
|
"nextcloud": "Nextcloud",
|
||||||
"nostr-rs-relay": "Nostr Relay (Rust)",
|
"nostr-rs-relay": "Nostr Relay (Rust)",
|
||||||
"onlyoffice": "OnlyOffice",
|
|
||||||
"photoprism": "PhotoPrism",
|
"photoprism": "PhotoPrism",
|
||||||
"portainer": "Portainer",
|
"portainer": "Portainer",
|
||||||
"router": "Mesh Router",
|
"router": "Mesh Router",
|
||||||
@ -80,7 +78,6 @@ export const GENERATED_NEW_TAB_APPS = new Set<string>([
|
|||||||
"grafana",
|
"grafana",
|
||||||
"homeassistant",
|
"homeassistant",
|
||||||
"nextcloud",
|
"nextcloud",
|
||||||
"onlyoffice",
|
|
||||||
"photoprism",
|
"photoprism",
|
||||||
"portainer",
|
"portainer",
|
||||||
"uptime-kuma",
|
"uptime-kuma",
|
||||||
|
|||||||
@ -25,7 +25,6 @@ INTERNAL_MANIFEST_IDS = {
|
|||||||
"lnd-ui",
|
"lnd-ui",
|
||||||
"mempool-api",
|
"mempool-api",
|
||||||
"morphos-server",
|
"morphos-server",
|
||||||
"onlyoffice",
|
|
||||||
"router",
|
"router",
|
||||||
"strfry",
|
"strfry",
|
||||||
"web5-dwn",
|
"web5-dwn",
|
||||||
|
|||||||
@ -465,18 +465,6 @@ load_spec_searxng() {
|
|||||||
SPEC_OPTIONAL="true"
|
SPEC_OPTIONAL="true"
|
||||||
}
|
}
|
||||||
|
|
||||||
load_spec_onlyoffice() {
|
|
||||||
reset_spec
|
|
||||||
SPEC_NAME="onlyoffice"
|
|
||||||
SPEC_IMAGE="${ONLYOFFICE_IMAGE}"
|
|
||||||
SPEC_PORTS="9980:80"
|
|
||||||
SPEC_MEMORY="$(mem_limit onlyoffice)"
|
|
||||||
SPEC_HEALTH_CMD="curl -sf http://localhost:80/ || exit 1"
|
|
||||||
SPEC_TIER="3"
|
|
||||||
SPEC_CAPS="CHOWN SETUID SETGID DAC_OVERRIDE"
|
|
||||||
SPEC_OPTIONAL="true"
|
|
||||||
}
|
|
||||||
|
|
||||||
load_spec_filebrowser() {
|
load_spec_filebrowser() {
|
||||||
reset_spec
|
reset_spec
|
||||||
SPEC_NAME="filebrowser"
|
SPEC_NAME="filebrowser"
|
||||||
@ -617,7 +605,6 @@ ALL_CONTAINER_SPECS=(
|
|||||||
vaultwarden
|
vaultwarden
|
||||||
nextcloud
|
nextcloud
|
||||||
searxng
|
searxng
|
||||||
onlyoffice
|
|
||||||
filebrowser
|
filebrowser
|
||||||
nginx-proxy-manager
|
nginx-proxy-manager
|
||||||
portainer
|
portainer
|
||||||
|
|||||||
@ -340,7 +340,7 @@ deploy_node() {
|
|||||||
# Containers running as root (UID 0 → host UID 100000)
|
# Containers running as root (UID 0 → host UID 100000)
|
||||||
for dir in lnd electrumx btcpay nbxplorer jellyfin vaultwarden \
|
for dir in lnd electrumx btcpay nbxplorer jellyfin vaultwarden \
|
||||||
home-assistant fedimint fedimint-gateway photoprism ollama filebrowser \
|
home-assistant fedimint fedimint-gateway photoprism ollama filebrowser \
|
||||||
nextcloud uptime-kuma onlyoffice nginx-proxy-manager portainer nostr-rs-relay searxng; do
|
nextcloud uptime-kuma nginx-proxy-manager portainer nostr-rs-relay searxng; do
|
||||||
[ -d "/var/lib/archipelago/$dir" ] && sudo chown -R 100000:100000 "/var/lib/archipelago/$dir" 2>/dev/null
|
[ -d "/var/lib/archipelago/$dir" ] && sudo chown -R 100000:100000 "/var/lib/archipelago/$dir" 2>/dev/null
|
||||||
done
|
done
|
||||||
# Bitcoin Knots: container UID 101 → host UID 100101
|
# Bitcoin Knots: container UID 101 → host UID 100101
|
||||||
@ -893,18 +893,6 @@ LNDCONF
|
|||||||
-e PHOTOPRISM_ADMIN_PASSWORD=archipelago -e PHOTOPRISM_DEFAULT_LOCALE=en \
|
-e PHOTOPRISM_ADMIN_PASSWORD=archipelago -e PHOTOPRISM_DEFAULT_LOCALE=en \
|
||||||
$PHOTOPRISM_IMAGE
|
$PHOTOPRISM_IMAGE
|
||||||
fi
|
fi
|
||||||
# OnlyOffice
|
|
||||||
if ! \$DOCKER ps --format '{{.Names}}' 2>/dev/null | grep -qx onlyoffice; then
|
|
||||||
if \$DOCKER ps -a --format '{{.Names}}' 2>/dev/null | grep -qx onlyoffice; then
|
|
||||||
\$DOCKER start onlyoffice 2>/dev/null || true
|
|
||||||
else
|
|
||||||
\$DOCKER run -d --name onlyoffice --restart unless-stopped \
|
|
||||||
--health-cmd 'curl -sf http://localhost:80/' --health-interval=30s --health-timeout=5s --health-retries=3 \
|
|
||||||
--cap-drop ALL --cap-add CHOWN --cap-add SETUID --cap-add SETGID --cap-add DAC_OVERRIDE \
|
|
||||||
--security-opt no-new-privileges:true \
|
|
||||||
-p 9980:80 $ONLYOFFICE_IMAGE
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
# Nginx Proxy Manager
|
# Nginx Proxy Manager
|
||||||
if ! \$DOCKER ps --format '{{.Names}}' 2>/dev/null | grep -qx nginx-proxy-manager; then
|
if ! \$DOCKER ps --format '{{.Names}}' 2>/dev/null | grep -qx nginx-proxy-manager; then
|
||||||
if \$DOCKER ps -a --format '{{.Names}}' 2>/dev/null | grep -qx nginx-proxy-manager; then
|
if \$DOCKER ps -a --format '{{.Names}}' 2>/dev/null | grep -qx nginx-proxy-manager; then
|
||||||
|
|||||||
@ -100,7 +100,6 @@ mem_limit() {
|
|||||||
local low="${LOW_MEM:-false}"
|
local low="${LOW_MEM:-false}"
|
||||||
case "$name" in
|
case "$name" in
|
||||||
bitcoin|bitcoin-core|bitcoin-knots) $low && echo "4g" || echo "8g" ;;
|
bitcoin|bitcoin-core|bitcoin-knots) $low && echo "4g" || echo "8g" ;;
|
||||||
onlyoffice) $low && echo "1g" || echo "2g" ;;
|
|
||||||
ollama) $low && echo "1g" || echo "4g" ;;
|
ollama) $low && echo "1g" || echo "4g" ;;
|
||||||
lnd) echo "512m" ;;
|
lnd) echo "512m" ;;
|
||||||
electrumx|mempool-electrs|electrs) echo "4g" ;;
|
electrumx|mempool-electrs|electrs) echo "4g" ;;
|
||||||
|
|||||||
@ -89,16 +89,6 @@ location /app/lnd/ {
|
|||||||
proxy_read_timeout 300s;
|
proxy_read_timeout 300s;
|
||||||
proxy_send_timeout 300s;
|
proxy_send_timeout 300s;
|
||||||
}
|
}
|
||||||
location /app/onlyoffice/ {
|
|
||||||
proxy_pass http://127.0.0.1:9980/;
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_hide_header X-Frame-Options;
|
|
||||||
proxy_hide_header Content-Security-Policy;
|
|
||||||
}
|
|
||||||
location /app/jellyfin/ {
|
location /app/jellyfin/ {
|
||||||
proxy_pass http://127.0.0.1:8096/;
|
proxy_pass http://127.0.0.1:8096/;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user