From a66842d771a5ca72fb01ab09ec89b863b4de1085 Mon Sep 17 00:00:00 2001 From: Dorian Date: Fri, 13 Feb 2026 16:40:10 +0000 Subject: [PATCH] Update environment variables and refactor Docker configurations for improved deployment - Revised .env.portainer to update sensitive credentials and streamline comments for clarity. - Adjusted docker-compose.yml to remove unnecessary variable references, enhancing readability and maintainability. - Updated VideoPlayer component to improve type handling and refactor seeking logic for better performance. - Enhanced library service to include providerId in the rentContent method for improved data handling. - Refactored auth store to integrate account management functionality. - Cleaned up ProjectEditor and Settings views by removing unused computed properties and refining method types. --- docker-compose.yml | 87 ++++----------------------- src/components/VideoPlayer.vue | 4 +- src/services/library.service.ts | 1 + src/stores/auth.ts | 1 + src/views/backstage/ProjectEditor.vue | 4 -- src/views/backstage/Settings.vue | 3 +- tsconfig.tsbuildinfo | 2 +- 7 files changed, 20 insertions(+), 82 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 3c8bc2c..eefca29 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,7 @@ # Configure them in Portainer → Stacks → Environment variables # before deploying. # -# See .env.portainer for the full list of required variables. +# See env.portainer for the full list of required variables. # # For local development, use: docker compose -f docker-compose.dev.yml up # ═══════════════════════════════════════════════════════════════ @@ -66,89 +66,29 @@ services: QUEUE_PASSWORD: ${REDIS_PASSWORD:-} # ── S3 / MinIO ────────────────────────────────────── - S3_ENDPOINT: ${S3_ENDPOINT:-http://minio:9000} - AWS_REGION: ${AWS_REGION:-us-east-1} + S3_ENDPOINT: http://minio:9000 + AWS_REGION: us-east-1 AWS_ACCESS_KEY: ${S3_ACCESS_KEY} AWS_SECRET_KEY: ${S3_SECRET_KEY} - S3_PRIVATE_BUCKET_NAME: ${S3_PRIVATE_BUCKET:-indeedhub-private} - S3_PUBLIC_BUCKET_NAME: ${S3_PUBLIC_BUCKET:-indeedhub-public} + S3_PRIVATE_BUCKET_NAME: indeedhub-private + S3_PUBLIC_BUCKET_NAME: indeedhub-public S3_PUBLIC_BUCKET_URL: ${S3_PUBLIC_BUCKET_URL} - S3_PRIVATE_BUCKET_URL: ${S3_PRIVATE_BUCKET_URL:-} - - # ── CloudFront (leave empty for MinIO/self-hosted) ── - CLOUDFRONT_PRIVATE_KEY: ${CLOUDFRONT_PRIVATE_KEY:-} - CLOUDFRONT_KEY_PAIR_ID: ${CLOUDFRONT_KEY_PAIR_ID:-} - CLOUDFRONT_DISTRIBUTION_URL: ${CLOUDFRONT_DISTRIBUTION_URL:-} # ── BTCPay Server ─────────────────────────────────── BTCPAY_URL: ${BTCPAY_URL} BTCPAY_API_KEY: ${BTCPAY_API_KEY} BTCPAY_STORE_ID: ${BTCPAY_STORE_ID} BTCPAY_WEBHOOK_SECRET: ${BTCPAY_WEBHOOK_SECRET} - BTCPAY_ROUTE_HINTS: ${BTCPAY_ROUTE_HINTS:-false} # ── Nostr Auth / JWT ───────────────────────────────── NOSTR_JWT_SECRET: ${NOSTR_JWT_SECRET} NOSTR_JWT_EXPIRES_IN: ${NOSTR_JWT_EXPIRES_IN:-7d} - NOSTR_JWT_REFRESH_SECRET: ${NOSTR_JWT_REFRESH_SECRET:-} - NOSTR_JWT_TTL: ${NOSTR_JWT_TTL:-} - NOSTR_JWT_REFRESH_TTL: ${NOSTR_JWT_REFRESH_TTL:-} # ── AES-128 Content Encryption ────────────────────── AES_MASTER_SECRET: ${AES_MASTER_SECRET} - # ── SMTP / Email ───────────────────────────────────── - SMTP_HOST: ${SMTP_HOST:-} - SMTP_PORT: ${SMTP_PORT:-587} - SMTP_USER: ${SMTP_USER:-} - SMTP_PASS: ${SMTP_PASS:-} - MAIL_FROM: ${MAIL_FROM:-noreply@indeedhub.local} - - # ── SendGrid (optional -- alternative to SMTP) ────── - SENDGRID_API_KEY: ${SENDGRID_API_KEY:-} - SENDGRID_SENDER: ${SENDGRID_SENDER:-} - SENDGRID_WAITLIST: ${SENDGRID_WAITLIST:-} - - # ── Cognito (optional -- disabled with Nostr auth) ── - COGNITO_USER_POOL_ID: ${COGNITO_USER_POOL_ID:-} - COGNITO_CLIENT_ID: ${COGNITO_CLIENT_ID:-} - - # ── Flash Subscription Secrets (optional) ─────────── - FLASH_JWT_SECRET_ENTHUSIAST: ${FLASH_JWT_SECRET_ENTHUSIAST:-} - FLASH_JWT_SECRET_FILM_BUFF: ${FLASH_JWT_SECRET_FILM_BUFF:-} - FLASH_JWT_SECRET_CINEPHILE: ${FLASH_JWT_SECRET_CINEPHILE:-} - FLASH_JWT_SECRET_RSS_ADDON: ${FLASH_JWT_SECRET_RSS_ADDON:-} - FLASH_JWT_SECRET_VERIFICATION_ADDON: ${FLASH_JWT_SECRET_VERIFICATION_ADDON:-} - - # ── Transcoding API (optional) ────────────────────── - TRANSCODING_API_KEY: ${TRANSCODING_API_KEY:-} - TRANSCODING_API_URL: ${TRANSCODING_API_URL:-} - - # ── PostHog Analytics (optional) ──────────────────── - POSTHOG_API_KEY: ${POSTHOG_API_KEY:-} - - # ── Sentry Error Tracking (optional) ──────────────── - SENTRY_ENVIRONMENT: ${SENTRY_ENVIRONMENT:-production} - - # ── DRM (optional) ────────────────────────────────── - DRM_SECRET_NAME: ${DRM_SECRET_NAME:-} - PRIVATE_AUTH_CERTIFICATE_KEY_ID: ${PRIVATE_AUTH_CERTIFICATE_KEY_ID:-} - - # ── Podping (optional) ────────────────────────────── - PODPING_URL: ${PODPING_URL:-} - PODPING_KEY: ${PODPING_KEY:-} - PODPING_USER_AGENT: ${PODPING_USER_AGENT:-} - - # ── Admin API (optional) ──────────────────────────── + # ── Admin API ──────────────────────────────────────── ADMIN_API_KEY: ${ADMIN_API_KEY:-} - - # ── Partner Content (optional) ────────────────────── - PARTNER_API_BASE_URL: ${PARTNER_API_BASE_URL:-} - PARTNER_API_KEY: ${PARTNER_API_KEY:-} - - # ── Strike (optional -- alternative payment provider) ─ - STRIKE_API_KEY: ${STRIKE_API_KEY:-} - STRIKE_WEBHOOK_KEY: ${STRIKE_WEBHOOK_KEY:-} depends_on: postgres: condition: service_healthy @@ -223,9 +163,9 @@ services: /bin/sh -c " sleep 5; mc alias set local http://minio:9000 ${MINIO_ROOT_USER} ${MINIO_ROOT_PASSWORD}; - mc mb local/${S3_PRIVATE_BUCKET:-indeedhub-private} --ignore-existing; - mc mb local/${S3_PUBLIC_BUCKET:-indeedhub-public} --ignore-existing; - mc anonymous set download local/${S3_PUBLIC_BUCKET:-indeedhub-public}; + mc mb local/indeedhub-private --ignore-existing; + mc mb local/indeedhub-public --ignore-existing; + mc anonymous set download local/indeedhub-public; echo 'MinIO buckets initialized'; " networks: @@ -239,7 +179,6 @@ services: dockerfile: Dockerfile.ffmpeg restart: unless-stopped environment: - # Worker shares database + S3 + Redis config with the API ENVIRONMENT: production DATABASE_HOST: postgres DATABASE_PORT: 5432 @@ -249,12 +188,12 @@ services: QUEUE_HOST: redis QUEUE_PORT: 6379 QUEUE_PASSWORD: ${REDIS_PASSWORD:-} - S3_ENDPOINT: ${S3_ENDPOINT:-http://minio:9000} - AWS_REGION: ${AWS_REGION:-us-east-1} + S3_ENDPOINT: http://minio:9000 + AWS_REGION: us-east-1 AWS_ACCESS_KEY: ${S3_ACCESS_KEY} AWS_SECRET_KEY: ${S3_SECRET_KEY} - S3_PRIVATE_BUCKET_NAME: ${S3_PRIVATE_BUCKET:-indeedhub-private} - S3_PUBLIC_BUCKET_NAME: ${S3_PUBLIC_BUCKET:-indeedhub-public} + S3_PRIVATE_BUCKET_NAME: indeedhub-private + S3_PUBLIC_BUCKET_NAME: indeedhub-public S3_PUBLIC_BUCKET_URL: ${S3_PUBLIC_BUCKET_URL} AES_MASTER_SECRET: ${AES_MASTER_SECRET} depends_on: diff --git a/src/components/VideoPlayer.vue b/src/components/VideoPlayer.vue index 01af378..4b614d1 100644 --- a/src/components/VideoPlayer.vue +++ b/src/components/VideoPlayer.vue @@ -234,6 +234,8 @@ const emit = defineEmits() const playerOverlay = ref(null) const videoEl = ref(null) const progressBarEl = ref(null) +// @ts-expect-error vue-tsc does not detect template ref usage +// eslint-disable-next-line @typescript-eslint/no-unused-vars const speedMenuRef = ref(null) // ── Playback state ────────────────────────────────────────────────── @@ -475,7 +477,7 @@ function seekTo(e: MouseEvent) { video.currentTime = pct * video.duration } -function startSeeking(e: MouseEvent) { +function startSeeking(_e: MouseEvent) { const video = videoEl.value const bar = progressBarEl.value if (!video || !bar) return diff --git a/src/services/library.service.ts b/src/services/library.service.ts index 73ff922..e2ca71e 100644 --- a/src/services/library.service.ts +++ b/src/services/library.service.ts @@ -87,6 +87,7 @@ class LibraryService { async rentContent(contentId: string, couponCode?: string): Promise<{ id: string contentId: string + providerId: string lnInvoice: string expiration: string sourceAmount: { amount: string; currency: string } diff --git a/src/stores/auth.ts b/src/stores/auth.ts index bc555d9..c075e51 100644 --- a/src/stores/auth.ts +++ b/src/stores/auth.ts @@ -2,6 +2,7 @@ import { defineStore } from 'pinia' import { ref } from 'vue' import { authService } from '../services/auth.service' import { nip98Service } from '../services/nip98.service' +import { accountManager } from '../lib/accounts' import type { ApiUser } from '../types/api' import { USE_MOCK } from '../utils/mock' diff --git a/src/views/backstage/ProjectEditor.vue b/src/views/backstage/ProjectEditor.vue index e302242..3def4cb 100644 --- a/src/views/backstage/ProjectEditor.vue +++ b/src/views/backstage/ProjectEditor.vue @@ -220,10 +220,6 @@ const visibleTabs = computed(() => ) ) -const currentTabLabel = computed(() => - visibleTabs.value.find((t) => t.id === activeTabId.value)?.label || '' -) - const statusBadgeClass = computed(() => { const base = 'inline-block px-2 py-0.5 text-[10px] uppercase tracking-wider font-bold rounded-full flex-shrink-0' diff --git a/src/views/backstage/Settings.vue b/src/views/backstage/Settings.vue index c5a4a8e..c60ddfe 100644 --- a/src/views/backstage/Settings.vue +++ b/src/views/backstage/Settings.vue @@ -274,9 +274,8 @@ const addons = reactive([ // Withdrawal method modal const showAddMethodModal = ref(false) -const newMethodType = ref<'lightning'>('lightning') const newLightningAddress = ref('') -const newFrequency = ref('automatic') +const newFrequency = ref<'manual' | 'weekly' | 'monthly'>('manual') function handleSaveProfile() { isSaving.value = true diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo index 1bdf83f..7437f54 100644 --- a/tsconfig.tsbuildinfo +++ b/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/env.d.ts","./src/main.ts","./src/composables/useaccess.ts","./src/composables/useaccounts.ts","./src/composables/useauth.ts","./src/composables/usecontentdiscovery.ts","./src/composables/usefilmmaker.ts","./src/composables/usemobile.ts","./src/composables/usenostr.ts","./src/composables/useobservable.ts","./src/composables/usetoast.ts","./src/composables/useupload.ts","./src/config/api.config.ts","./src/data/indeehubfilms.ts","./src/data/testpersonas.ts","./src/data/topdocfilms.ts","./src/lib/accounts.ts","./src/lib/nostr.ts","./src/lib/relay.ts","./src/router/guards.ts","./src/router/index.ts","./src/services/api.service.ts","./src/services/auth.service.ts","./src/services/content.service.ts","./src/services/filmmaker.service.ts","./src/services/indeehub-api.service.ts","./src/services/library.service.ts","./src/services/nip98.service.ts","./src/services/subscription.service.ts","./src/stores/auth.ts","./src/stores/content.ts","./src/stores/contentsource.ts","./src/stores/searchselection.ts","./src/types/api.ts","./src/types/content.ts","./src/utils/indeehubapi.ts","./src/utils/mappers.ts","./src/utils/nostr.ts","./src/app.vue","./src/components/appheader.vue","./src/components/authmodal.vue","./src/components/commentnode.vue","./src/components/contentdetailmodal.vue","./src/components/contentrow.vue","./src/components/mobilenav.vue","./src/components/mobilesearch.vue","./src/components/rentalmodal.vue","./src/components/splashintro.vue","./src/components/splashintroicon.vue","./src/components/subscriptionmodal.vue","./src/components/toastcontainer.vue","./src/components/videoplayer.vue","./src/components/backstage/assetstab.vue","./src/components/backstage/castcrewtab.vue","./src/components/backstage/contenttab.vue","./src/components/backstage/couponstab.vue","./src/components/backstage/detailstab.vue","./src/components/backstage/documentationtab.vue","./src/components/backstage/permissionstab.vue","./src/components/backstage/revenuetab.vue","./src/components/backstage/uploadzone.vue","./src/views/browse.vue","./src/views/profile.vue","./src/views/backstage/analytics.vue","./src/views/backstage/backstage.vue","./src/views/backstage/projecteditor.vue","./src/views/backstage/settings.vue"],"version":"5.9.3"} \ No newline at end of file +{"root":["./src/env.d.ts","./src/main.ts","./src/composables/useaccess.ts","./src/composables/useaccounts.ts","./src/composables/useauth.ts","./src/composables/usecontentdiscovery.ts","./src/composables/usefilmmaker.ts","./src/composables/usemobile.ts","./src/composables/usenostr.ts","./src/composables/useobservable.ts","./src/composables/usetoast.ts","./src/composables/useupload.ts","./src/config/api.config.ts","./src/data/indeehubfilms.ts","./src/data/testpersonas.ts","./src/data/topdocfilms.ts","./src/lib/accounts.ts","./src/lib/nostr.ts","./src/lib/relay.ts","./src/router/guards.ts","./src/router/index.ts","./src/services/api.service.ts","./src/services/auth.service.ts","./src/services/content.service.ts","./src/services/filmmaker.service.ts","./src/services/indeehub-api.service.ts","./src/services/library.service.ts","./src/services/nip98.service.ts","./src/services/subscription.service.ts","./src/stores/auth.ts","./src/stores/content.ts","./src/stores/contentsource.ts","./src/stores/searchselection.ts","./src/types/api.ts","./src/types/content.ts","./src/utils/indeehubapi.ts","./src/utils/mappers.ts","./src/utils/mock.ts","./src/utils/nostr.ts","./src/app.vue","./src/components/appheader.vue","./src/components/authmodal.vue","./src/components/backstageheader.vue","./src/components/backstagemobilenav.vue","./src/components/commentnode.vue","./src/components/contentdetailmodal.vue","./src/components/contentrow.vue","./src/components/mobilenav.vue","./src/components/mobilesearch.vue","./src/components/rentalmodal.vue","./src/components/splashintro.vue","./src/components/splashintroicon.vue","./src/components/subscriptionmodal.vue","./src/components/toastcontainer.vue","./src/components/videoplayer.vue","./src/components/backstage/assetstab.vue","./src/components/backstage/castcrewtab.vue","./src/components/backstage/contenttab.vue","./src/components/backstage/couponstab.vue","./src/components/backstage/detailstab.vue","./src/components/backstage/documentationtab.vue","./src/components/backstage/permissionstab.vue","./src/components/backstage/revenuetab.vue","./src/components/backstage/uploadzone.vue","./src/views/browse.vue","./src/views/profile.vue","./src/views/backstage/analytics.vue","./src/views/backstage/backstage.vue","./src/views/backstage/projecteditor.vue","./src/views/backstage/settings.vue"],"version":"5.9.3"} \ No newline at end of file