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.
This commit is contained in:
Dorian
2026-02-13 16:40:10 +00:00
parent a8dc82dc59
commit a66842d771
7 changed files with 20 additions and 82 deletions

View File

@@ -6,7 +6,7 @@
# Configure them in Portainer → Stacks → Environment variables # Configure them in Portainer → Stacks → Environment variables
# before deploying. # 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 # For local development, use: docker compose -f docker-compose.dev.yml up
# ═══════════════════════════════════════════════════════════════ # ═══════════════════════════════════════════════════════════════
@@ -66,89 +66,29 @@ services:
QUEUE_PASSWORD: ${REDIS_PASSWORD:-} QUEUE_PASSWORD: ${REDIS_PASSWORD:-}
# ── S3 / MinIO ────────────────────────────────────── # ── S3 / MinIO ──────────────────────────────────────
S3_ENDPOINT: ${S3_ENDPOINT:-http://minio:9000} S3_ENDPOINT: http://minio:9000
AWS_REGION: ${AWS_REGION:-us-east-1} AWS_REGION: us-east-1
AWS_ACCESS_KEY: ${S3_ACCESS_KEY} AWS_ACCESS_KEY: ${S3_ACCESS_KEY}
AWS_SECRET_KEY: ${S3_SECRET_KEY} AWS_SECRET_KEY: ${S3_SECRET_KEY}
S3_PRIVATE_BUCKET_NAME: ${S3_PRIVATE_BUCKET:-indeedhub-private} S3_PRIVATE_BUCKET_NAME: indeedhub-private
S3_PUBLIC_BUCKET_NAME: ${S3_PUBLIC_BUCKET:-indeedhub-public} S3_PUBLIC_BUCKET_NAME: indeedhub-public
S3_PUBLIC_BUCKET_URL: ${S3_PUBLIC_BUCKET_URL} 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 Server ───────────────────────────────────
BTCPAY_URL: ${BTCPAY_URL} BTCPAY_URL: ${BTCPAY_URL}
BTCPAY_API_KEY: ${BTCPAY_API_KEY} BTCPAY_API_KEY: ${BTCPAY_API_KEY}
BTCPAY_STORE_ID: ${BTCPAY_STORE_ID} BTCPAY_STORE_ID: ${BTCPAY_STORE_ID}
BTCPAY_WEBHOOK_SECRET: ${BTCPAY_WEBHOOK_SECRET} BTCPAY_WEBHOOK_SECRET: ${BTCPAY_WEBHOOK_SECRET}
BTCPAY_ROUTE_HINTS: ${BTCPAY_ROUTE_HINTS:-false}
# ── Nostr Auth / JWT ───────────────────────────────── # ── Nostr Auth / JWT ─────────────────────────────────
NOSTR_JWT_SECRET: ${NOSTR_JWT_SECRET} NOSTR_JWT_SECRET: ${NOSTR_JWT_SECRET}
NOSTR_JWT_EXPIRES_IN: ${NOSTR_JWT_EXPIRES_IN:-7d} 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-128 Content Encryption ──────────────────────
AES_MASTER_SECRET: ${AES_MASTER_SECRET} AES_MASTER_SECRET: ${AES_MASTER_SECRET}
# ── SMTP / Email ───────────────────────────────────── # ── Admin API ────────────────────────────────────────
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_KEY: ${ADMIN_API_KEY:-} 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: depends_on:
postgres: postgres:
condition: service_healthy condition: service_healthy
@@ -223,9 +163,9 @@ services:
/bin/sh -c " /bin/sh -c "
sleep 5; sleep 5;
mc alias set local http://minio:9000 ${MINIO_ROOT_USER} ${MINIO_ROOT_PASSWORD}; 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/indeedhub-private --ignore-existing;
mc mb local/${S3_PUBLIC_BUCKET:-indeedhub-public} --ignore-existing; mc mb local/indeedhub-public --ignore-existing;
mc anonymous set download local/${S3_PUBLIC_BUCKET:-indeedhub-public}; mc anonymous set download local/indeedhub-public;
echo 'MinIO buckets initialized'; echo 'MinIO buckets initialized';
" "
networks: networks:
@@ -239,7 +179,6 @@ services:
dockerfile: Dockerfile.ffmpeg dockerfile: Dockerfile.ffmpeg
restart: unless-stopped restart: unless-stopped
environment: environment:
# Worker shares database + S3 + Redis config with the API
ENVIRONMENT: production ENVIRONMENT: production
DATABASE_HOST: postgres DATABASE_HOST: postgres
DATABASE_PORT: 5432 DATABASE_PORT: 5432
@@ -249,12 +188,12 @@ services:
QUEUE_HOST: redis QUEUE_HOST: redis
QUEUE_PORT: 6379 QUEUE_PORT: 6379
QUEUE_PASSWORD: ${REDIS_PASSWORD:-} QUEUE_PASSWORD: ${REDIS_PASSWORD:-}
S3_ENDPOINT: ${S3_ENDPOINT:-http://minio:9000} S3_ENDPOINT: http://minio:9000
AWS_REGION: ${AWS_REGION:-us-east-1} AWS_REGION: us-east-1
AWS_ACCESS_KEY: ${S3_ACCESS_KEY} AWS_ACCESS_KEY: ${S3_ACCESS_KEY}
AWS_SECRET_KEY: ${S3_SECRET_KEY} AWS_SECRET_KEY: ${S3_SECRET_KEY}
S3_PRIVATE_BUCKET_NAME: ${S3_PRIVATE_BUCKET:-indeedhub-private} S3_PRIVATE_BUCKET_NAME: indeedhub-private
S3_PUBLIC_BUCKET_NAME: ${S3_PUBLIC_BUCKET:-indeedhub-public} S3_PUBLIC_BUCKET_NAME: indeedhub-public
S3_PUBLIC_BUCKET_URL: ${S3_PUBLIC_BUCKET_URL} S3_PUBLIC_BUCKET_URL: ${S3_PUBLIC_BUCKET_URL}
AES_MASTER_SECRET: ${AES_MASTER_SECRET} AES_MASTER_SECRET: ${AES_MASTER_SECRET}
depends_on: depends_on:

View File

@@ -234,6 +234,8 @@ const emit = defineEmits<Emits>()
const playerOverlay = ref<HTMLElement | null>(null) const playerOverlay = ref<HTMLElement | null>(null)
const videoEl = ref<HTMLVideoElement | null>(null) const videoEl = ref<HTMLVideoElement | null>(null)
const progressBarEl = ref<HTMLElement | null>(null) const progressBarEl = ref<HTMLElement | null>(null)
// @ts-expect-error vue-tsc does not detect template ref usage
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const speedMenuRef = ref<HTMLElement | null>(null) const speedMenuRef = ref<HTMLElement | null>(null)
// ── Playback state ────────────────────────────────────────────────── // ── Playback state ──────────────────────────────────────────────────
@@ -475,7 +477,7 @@ function seekTo(e: MouseEvent) {
video.currentTime = pct * video.duration video.currentTime = pct * video.duration
} }
function startSeeking(e: MouseEvent) { function startSeeking(_e: MouseEvent) {
const video = videoEl.value const video = videoEl.value
const bar = progressBarEl.value const bar = progressBarEl.value
if (!video || !bar) return if (!video || !bar) return

View File

@@ -87,6 +87,7 @@ class LibraryService {
async rentContent(contentId: string, couponCode?: string): Promise<{ async rentContent(contentId: string, couponCode?: string): Promise<{
id: string id: string
contentId: string contentId: string
providerId: string
lnInvoice: string lnInvoice: string
expiration: string expiration: string
sourceAmount: { amount: string; currency: string } sourceAmount: { amount: string; currency: string }

View File

@@ -2,6 +2,7 @@ import { defineStore } from 'pinia'
import { ref } from 'vue' import { ref } from 'vue'
import { authService } from '../services/auth.service' import { authService } from '../services/auth.service'
import { nip98Service } from '../services/nip98.service' import { nip98Service } from '../services/nip98.service'
import { accountManager } from '../lib/accounts'
import type { ApiUser } from '../types/api' import type { ApiUser } from '../types/api'
import { USE_MOCK } from '../utils/mock' import { USE_MOCK } from '../utils/mock'

View File

@@ -220,10 +220,6 @@ const visibleTabs = computed(() =>
) )
) )
const currentTabLabel = computed(() =>
visibleTabs.value.find((t) => t.id === activeTabId.value)?.label || ''
)
const statusBadgeClass = computed(() => { const statusBadgeClass = computed(() => {
const base = 'inline-block px-2 py-0.5 text-[10px] uppercase tracking-wider font-bold rounded-full flex-shrink-0' const base = 'inline-block px-2 py-0.5 text-[10px] uppercase tracking-wider font-bold rounded-full flex-shrink-0'

View File

@@ -274,9 +274,8 @@ const addons = reactive([
// Withdrawal method modal // Withdrawal method modal
const showAddMethodModal = ref(false) const showAddMethodModal = ref(false)
const newMethodType = ref<'lightning'>('lightning')
const newLightningAddress = ref('') const newLightningAddress = ref('')
const newFrequency = ref<string>('automatic') const newFrequency = ref<'manual' | 'weekly' | 'monthly'>('manual')
function handleSaveProfile() { function handleSaveProfile() {
isSaving.value = true isSaving.value = true

View File

@@ -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"} {"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"}