Modules: - Chain: daemon RPC client (DaemonRpc singleton, cached queries) - Explorer: block browser, tx viewer, alias directory, search, stats API - Names: .lthn TLD registrar portal (availability check, lookup, directory) - Trade: scaffold (DEX frontend + API) - Pool: scaffold (mining pool dashboard) Replaces 5 Node.js containers (5.9GB) with one FrankenPHP app. Built on CorePHP framework pattern from host.uk.com. Co-Authored-By: Charon <charon@lethean.io>
621 lines
19 KiB
PHP
621 lines
19 KiB
PHP
<?php
|
|
|
|
return [
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| SocialHost Configuration
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| This file contains configuration for the SocialHost social media
|
|
| management system, including provider settings, limits, and features.
|
|
|
|
|
*/
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Media Storage
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
'disk' => env('SOCIAL_DISK', 'public'),
|
|
|
|
'max_file_size' => [
|
|
'image' => env('SOCIAL_MAX_IMAGE_SIZE', 1024 * 15), // 15MB
|
|
'gif' => env('SOCIAL_MAX_GIF_SIZE', 1024 * 15), // 15MB
|
|
'video' => env('SOCIAL_MAX_VIDEO_SIZE', 1024 * 200), // 200MB
|
|
],
|
|
|
|
'mime_types' => [
|
|
'image/jpg',
|
|
'image/jpeg',
|
|
'image/gif',
|
|
'image/png',
|
|
'image/webp',
|
|
'video/mp4',
|
|
'video/x-m4v',
|
|
'video/quicktime',
|
|
],
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Media Processing
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
'ffmpeg_path' => env('FFMPEG_PATH', '/usr/bin/ffmpeg'),
|
|
'ffprobe_path' => env('FFPROBE_PATH', '/usr/bin/ffprobe'),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Caching
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
'cache_prefix' => env('SOCIAL_CACHE_PREFIX', 'social'),
|
|
'cache_ttl' => env('SOCIAL_CACHE_TTL', 3600), // 1 hour
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Logging
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
'log_channel' => env('SOCIAL_LOG_CHANNEL', null),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Provider Credentials
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| OAuth credentials for each social network provider.
|
|
|
|
|
*/
|
|
'credentials' => [
|
|
'twitter' => [
|
|
'client_id' => env('TWITTER_CLIENT_ID'),
|
|
'client_secret' => env('TWITTER_CLIENT_SECRET'),
|
|
'tier' => env('TWITTER_TIER', 'free'), // free, basic, pro, enterprise
|
|
],
|
|
|
|
'facebook' => [
|
|
'client_id' => env('FACEBOOK_CLIENT_ID'),
|
|
'client_secret' => env('FACEBOOK_CLIENT_SECRET'),
|
|
'api_version' => env('FACEBOOK_API_VERSION', 'v18.0'),
|
|
],
|
|
|
|
'instagram' => [
|
|
'client_id' => env('INSTAGRAM_CLIENT_ID'),
|
|
'client_secret' => env('INSTAGRAM_CLIENT_SECRET'),
|
|
],
|
|
|
|
'linkedin' => [
|
|
'client_id' => env('LINKEDIN_CLIENT_ID'),
|
|
'client_secret' => env('LINKEDIN_CLIENT_SECRET'),
|
|
],
|
|
|
|
'tiktok' => [
|
|
'client_id' => env('TIKTOK_CLIENT_ID'),
|
|
'client_secret' => env('TIKTOK_CLIENT_SECRET'),
|
|
],
|
|
|
|
'youtube' => [
|
|
'client_id' => env('YOUTUBE_CLIENT_ID'),
|
|
'client_secret' => env('YOUTUBE_CLIENT_SECRET'),
|
|
],
|
|
|
|
'pinterest' => [
|
|
'client_id' => env('PINTEREST_CLIENT_ID'),
|
|
'client_secret' => env('PINTEREST_CLIENT_SECRET'),
|
|
],
|
|
|
|
'threads' => [
|
|
'client_id' => env('THREADS_CLIENT_ID'),
|
|
'client_secret' => env('THREADS_CLIENT_SECRET'),
|
|
],
|
|
|
|
'bluesky' => [
|
|
// Uses credentials auth, no OAuth app
|
|
],
|
|
|
|
'mastodon' => [
|
|
// Dynamic per-instance OAuth
|
|
],
|
|
|
|
'reddit' => [
|
|
'client_id' => env('REDDIT_CLIENT_ID'),
|
|
'client_secret' => env('REDDIT_CLIENT_SECRET'),
|
|
],
|
|
|
|
'medium' => [
|
|
'client_id' => env('MEDIUM_CLIENT_ID'),
|
|
'client_secret' => env('MEDIUM_CLIENT_SECRET'),
|
|
],
|
|
|
|
'devto' => [
|
|
// Uses API key auth
|
|
],
|
|
|
|
'hashnode' => [
|
|
// Uses API key auth
|
|
],
|
|
|
|
'wordpress' => [
|
|
// Uses API key or app passwords
|
|
],
|
|
|
|
'telegram' => [
|
|
// Uses bot token
|
|
],
|
|
|
|
'discord' => [
|
|
'webhook_enabled' => env('DISCORD_WEBHOOK_ENABLED', true),
|
|
],
|
|
|
|
'slack' => [
|
|
'webhook_enabled' => env('SLACK_WEBHOOK_ENABLED', true),
|
|
],
|
|
],
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Provider Options
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Platform-specific posting limits and capabilities.
|
|
|
|
|
*/
|
|
'providers' => [
|
|
'twitter' => [
|
|
'name' => 'X (Twitter)',
|
|
'simultaneous_posting' => false,
|
|
'character_limit' => 280,
|
|
'media_limit' => [
|
|
'photos' => 4,
|
|
'videos' => 1,
|
|
'gifs' => 1,
|
|
'allow_mixing' => false,
|
|
],
|
|
'poll_limit' => [
|
|
'min_options' => 2,
|
|
'max_options' => 4,
|
|
'max_option_length' => 25,
|
|
'min_duration_minutes' => 5,
|
|
'max_duration_minutes' => 10080, // 7 days
|
|
'default_duration_minutes' => 1440, // 1 day
|
|
],
|
|
'features' => ['posts', 'threads', 'polls', 'analytics'],
|
|
'auth_type' => 'oauth2',
|
|
],
|
|
|
|
'facebook_page' => [
|
|
'name' => 'Facebook Page',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 5000,
|
|
'media_limit' => [
|
|
'photos' => 10,
|
|
'videos' => 1,
|
|
'gifs' => 1,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['posts', 'stories', 'reels', 'analytics'],
|
|
'auth_type' => 'oauth2',
|
|
],
|
|
|
|
'facebook_group' => [
|
|
'name' => 'Facebook Group',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 5000,
|
|
'media_limit' => [
|
|
'photos' => 10,
|
|
'videos' => 1,
|
|
'gifs' => 1,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['posts'],
|
|
'auth_type' => 'oauth2',
|
|
],
|
|
|
|
'instagram' => [
|
|
'name' => 'Instagram',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 2200,
|
|
'media_limit' => [
|
|
'photos' => 10,
|
|
'videos' => 1,
|
|
'gifs' => 0,
|
|
'allow_mixing' => true,
|
|
],
|
|
'features' => ['posts', 'stories', 'reels', 'analytics'],
|
|
'auth_type' => 'oauth2',
|
|
],
|
|
|
|
'linkedin' => [
|
|
'name' => 'LinkedIn Profile',
|
|
'simultaneous_posting' => false,
|
|
'character_limit' => 3000,
|
|
'media_limit' => [
|
|
'photos' => 9,
|
|
'videos' => 1,
|
|
'gifs' => 1,
|
|
'allow_mixing' => false,
|
|
],
|
|
'poll_limit' => [
|
|
'min_options' => 2,
|
|
'max_options' => 4,
|
|
'max_option_length' => 140,
|
|
'min_duration_minutes' => 1440, // 1 day
|
|
'max_duration_minutes' => 20160, // 14 days
|
|
'default_duration_minutes' => 4320, // 3 days
|
|
],
|
|
'features' => ['posts', 'articles', 'polls', 'analytics'],
|
|
'auth_type' => 'oauth2',
|
|
],
|
|
|
|
'linkedin_page' => [
|
|
'name' => 'LinkedIn Page',
|
|
'simultaneous_posting' => false,
|
|
'character_limit' => 3000,
|
|
'media_limit' => [
|
|
'photos' => 9,
|
|
'videos' => 1,
|
|
'gifs' => 1,
|
|
'allow_mixing' => false,
|
|
],
|
|
'poll_limit' => [
|
|
'min_options' => 2,
|
|
'max_options' => 4,
|
|
'max_option_length' => 140,
|
|
'min_duration_minutes' => 1440, // 1 day
|
|
'max_duration_minutes' => 20160, // 14 days
|
|
'default_duration_minutes' => 4320, // 3 days
|
|
],
|
|
'features' => ['posts', 'articles', 'polls', 'analytics'],
|
|
'auth_type' => 'oauth2',
|
|
],
|
|
|
|
'tiktok' => [
|
|
'name' => 'TikTok',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 2200,
|
|
'media_limit' => [
|
|
'photos' => 0,
|
|
'videos' => 1,
|
|
'gifs' => 0,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['videos', 'analytics'],
|
|
'auth_type' => 'oauth2',
|
|
],
|
|
|
|
'youtube' => [
|
|
'name' => 'YouTube',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 5000,
|
|
'media_limit' => [
|
|
'photos' => 0,
|
|
'videos' => 1,
|
|
'gifs' => 0,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['videos', 'shorts', 'analytics'],
|
|
'auth_type' => 'oauth2',
|
|
],
|
|
|
|
'pinterest' => [
|
|
'name' => 'Pinterest',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 500,
|
|
'media_limit' => [
|
|
'photos' => 1,
|
|
'videos' => 0,
|
|
'gifs' => 0,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['pins', 'boards', 'analytics'],
|
|
'auth_type' => 'oauth2',
|
|
],
|
|
|
|
'threads' => [
|
|
'name' => 'Threads',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 500,
|
|
'media_limit' => [
|
|
'photos' => 10,
|
|
'videos' => 1,
|
|
'gifs' => 1,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['posts', 'threads'],
|
|
'auth_type' => 'oauth2',
|
|
],
|
|
|
|
'mastodon' => [
|
|
'name' => 'Mastodon',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 500, // Default, varies by instance
|
|
'media_limit' => [
|
|
'photos' => 4,
|
|
'videos' => 1,
|
|
'gifs' => 1,
|
|
'allow_mixing' => false,
|
|
],
|
|
'poll_limit' => [
|
|
'min_options' => 2,
|
|
'max_options' => 4,
|
|
'max_option_length' => 50, // Default, varies by instance
|
|
'min_duration_minutes' => 5,
|
|
'max_duration_minutes' => 10080, // 7 days
|
|
'default_duration_minutes' => 1440, // 1 day
|
|
],
|
|
'features' => ['posts', 'threads', 'polls'],
|
|
'auth_type' => 'oauth2_server',
|
|
],
|
|
|
|
'bluesky' => [
|
|
'name' => 'Bluesky',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 300,
|
|
'media_limit' => [
|
|
'photos' => 4,
|
|
'videos' => 0,
|
|
'gifs' => 0,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['posts', 'threads'],
|
|
'auth_type' => 'credentials',
|
|
],
|
|
|
|
'reddit' => [
|
|
'name' => 'Reddit',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 40000,
|
|
'media_limit' => [
|
|
'photos' => 20,
|
|
'videos' => 1,
|
|
'gifs' => 1,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['posts'],
|
|
'auth_type' => 'oauth2',
|
|
],
|
|
|
|
'medium' => [
|
|
'name' => 'Medium',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 0, // No limit
|
|
'media_limit' => [
|
|
'photos' => 0, // Inline in content
|
|
'videos' => 0,
|
|
'gifs' => 0,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['articles'],
|
|
'auth_type' => 'oauth2',
|
|
],
|
|
|
|
'devto' => [
|
|
'name' => 'DEV.to',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 0,
|
|
'media_limit' => [
|
|
'photos' => 0,
|
|
'videos' => 0,
|
|
'gifs' => 0,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['articles'],
|
|
'auth_type' => 'api_key',
|
|
],
|
|
|
|
'hashnode' => [
|
|
'name' => 'Hashnode',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 0,
|
|
'media_limit' => [
|
|
'photos' => 0,
|
|
'videos' => 0,
|
|
'gifs' => 0,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['articles'],
|
|
'auth_type' => 'api_key',
|
|
],
|
|
|
|
'wordpress' => [
|
|
'name' => 'WordPress',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 0,
|
|
'media_limit' => [
|
|
'photos' => 0,
|
|
'videos' => 0,
|
|
'gifs' => 0,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['articles', 'pages'],
|
|
'auth_type' => 'api_key',
|
|
],
|
|
|
|
'telegram' => [
|
|
'name' => 'Telegram',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 4096,
|
|
'media_limit' => [
|
|
'photos' => 10,
|
|
'videos' => 1,
|
|
'gifs' => 1,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['posts'],
|
|
'auth_type' => 'bot_token',
|
|
],
|
|
|
|
'discord' => [
|
|
'name' => 'Discord',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 2000,
|
|
'media_limit' => [
|
|
'photos' => 10,
|
|
'videos' => 1,
|
|
'gifs' => 1,
|
|
'allow_mixing' => true,
|
|
],
|
|
'features' => ['posts'],
|
|
'auth_type' => 'webhook',
|
|
],
|
|
|
|
'slack' => [
|
|
'name' => 'Slack',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 40000,
|
|
'media_limit' => [
|
|
'photos' => 10,
|
|
'videos' => 1,
|
|
'gifs' => 1,
|
|
'allow_mixing' => true,
|
|
],
|
|
'features' => ['posts'],
|
|
'auth_type' => 'webhook',
|
|
],
|
|
|
|
'vk' => [
|
|
'name' => 'VK',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 15895,
|
|
'media_limit' => [
|
|
'photos' => 10,
|
|
'videos' => 1,
|
|
'gifs' => 1,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['posts', 'analytics'],
|
|
'auth_type' => 'oauth2',
|
|
],
|
|
|
|
'lemmy' => [
|
|
'name' => 'Lemmy',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 10000,
|
|
'media_limit' => [
|
|
'photos' => 1,
|
|
'videos' => 0,
|
|
'gifs' => 0,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['posts'],
|
|
'auth_type' => 'credentials_server',
|
|
],
|
|
|
|
'farcaster' => [
|
|
'name' => 'Farcaster',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 320,
|
|
'media_limit' => [
|
|
'photos' => 2,
|
|
'videos' => 0,
|
|
'gifs' => 0,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['posts'],
|
|
'auth_type' => 'signer',
|
|
],
|
|
|
|
'nostr' => [
|
|
'name' => 'Nostr',
|
|
'simultaneous_posting' => true,
|
|
'character_limit' => 0,
|
|
'media_limit' => [
|
|
'photos' => 0,
|
|
'videos' => 0,
|
|
'gifs' => 0,
|
|
'allow_mixing' => false,
|
|
],
|
|
'features' => ['posts'],
|
|
'auth_type' => 'keys',
|
|
],
|
|
],
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Default Settings
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
'defaults' => [
|
|
'queue_times_per_day' => 4,
|
|
'posts_per_page' => 20,
|
|
'analytics_retention_days' => 365,
|
|
],
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Webhook Events
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
'webhook_events' => [
|
|
'post.published',
|
|
'post.failed',
|
|
'post.scheduled',
|
|
'account.connected',
|
|
'account.disconnected',
|
|
'account.error',
|
|
'account.refreshed',
|
|
],
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Feature Flags
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Control feature availability for gradual rollout and A/B testing.
|
|
| Phase 8: Vue → Livewire migration flags.
|
|
|
|
|
*/
|
|
'features' => [
|
|
// Two-factor authentication (disabled until native implementation)
|
|
'two_factor_auth' => env('SOCIAL_TWO_FACTOR_AUTH', false),
|
|
|
|
// Redirect legacy MixPost Vue routes to Livewire equivalents
|
|
'redirect_mixpost_routes' => env('SOCIAL_REDIRECT_MIXPOST', true),
|
|
|
|
// Use native Livewire UI (when false, falls back to MixPost Vue)
|
|
'livewire_ui' => env('SOCIAL_LIVEWIRE_UI', true),
|
|
|
|
// Enable new post composer (Phase 8 feature)
|
|
'new_composer' => env('SOCIAL_NEW_COMPOSER', true),
|
|
|
|
// Enable kanban view for posts
|
|
'kanban_view' => env('SOCIAL_KANBAN_VIEW', true),
|
|
|
|
// Enable calendar view for posts
|
|
'calendar_view' => env('SOCIAL_CALENDAR_VIEW', true),
|
|
|
|
// Enable AI-powered features (requires AI credits entitlement)
|
|
'ai_suggestions' => env('SOCIAL_AI_SUGGESTIONS', true),
|
|
|
|
// Enable bulk post operations
|
|
'bulk_operations' => env('SOCIAL_BULK_OPERATIONS', true),
|
|
|
|
// Enable advanced analytics dashboard
|
|
'advanced_analytics' => env('SOCIAL_ADVANCED_ANALYTICS', true),
|
|
|
|
// Enable webhook management UI
|
|
'webhook_management' => env('SOCIAL_WEBHOOK_MANAGEMENT', true),
|
|
|
|
// Enable template system
|
|
'templates' => env('SOCIAL_TEMPLATES', true),
|
|
],
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Migration Settings
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Settings for the MixPost → Native SocialHost migration.
|
|
|
|
|
*/
|
|
'migration' => [
|
|
// Allow access to legacy MixPost API endpoints
|
|
'allow_legacy_api' => env('SOCIAL_ALLOW_LEGACY_API', true),
|
|
|
|
// Keep MixPost tables after migration (safety net)
|
|
'preserve_mixpost_tables' => env('SOCIAL_PRESERVE_MIXPOST_TABLES', true),
|
|
|
|
// Migration completed flag
|
|
'migration_complete' => env('SOCIAL_MIGRATION_COMPLETE', false),
|
|
],
|
|
];
|