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
# 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:

View File

@@ -234,6 +234,8 @@ const emit = defineEmits<Emits>()
const playerOverlay = ref<HTMLElement | null>(null)
const videoEl = ref<HTMLVideoElement | 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)
// ── 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

View File

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

View File

@@ -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'

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 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
const showAddMethodModal = ref(false)
const newMethodType = ref<'lightning'>('lightning')
const newLightningAddress = ref('')
const newFrequency = ref<string>('automatic')
const newFrequency = ref<'manual' | 'weekly' | 'monthly'>('manual')
function handleSaveProfile() {
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"}