diff options
Diffstat (limited to 'server/initializers/config.ts')
-rw-r--r-- | server/initializers/config.ts | 688 |
1 files changed, 0 insertions, 688 deletions
diff --git a/server/initializers/config.ts b/server/initializers/config.ts deleted file mode 100644 index 3e3b8ad1f..000000000 --- a/server/initializers/config.ts +++ /dev/null | |||
@@ -1,688 +0,0 @@ | |||
1 | import bytes from 'bytes' | ||
2 | import { IConfig } from 'config' | ||
3 | import { dirname, join } from 'path' | ||
4 | import { decacheModule } from '@server/helpers/decache' | ||
5 | import { VideoRedundancyConfigFilter } from '@shared/models/redundancy/video-redundancy-config-filter.type' | ||
6 | import { BroadcastMessageLevel } from '@shared/models/server' | ||
7 | import { buildPath, root } from '../../shared/core-utils' | ||
8 | import { VideoPrivacy, VideosRedundancyStrategy } from '../../shared/models' | ||
9 | import { NSFWPolicyType } from '../../shared/models/videos/nsfw-policy.type' | ||
10 | import { parseBytes, parseDurationToMs } from '../helpers/core-utils' | ||
11 | |||
12 | // Use a variable to reload the configuration if we need | ||
13 | let config: IConfig = require('config') | ||
14 | |||
15 | const configChangedHandlers: Function[] = [] | ||
16 | |||
17 | const CONFIG = { | ||
18 | CUSTOM_FILE: getLocalConfigFilePath(), | ||
19 | LISTEN: { | ||
20 | PORT: config.get<number>('listen.port'), | ||
21 | HOSTNAME: config.get<string>('listen.hostname') | ||
22 | }, | ||
23 | SECRETS: { | ||
24 | PEERTUBE: config.get<string>('secrets.peertube') | ||
25 | }, | ||
26 | DATABASE: { | ||
27 | DBNAME: config.has('database.name') ? config.get<string>('database.name') : 'peertube' + config.get<string>('database.suffix'), | ||
28 | HOSTNAME: config.get<string>('database.hostname'), | ||
29 | PORT: config.get<number>('database.port'), | ||
30 | SSL: config.get<boolean>('database.ssl'), | ||
31 | USERNAME: config.get<string>('database.username'), | ||
32 | PASSWORD: config.get<string>('database.password'), | ||
33 | POOL: { | ||
34 | MAX: config.get<number>('database.pool.max') | ||
35 | } | ||
36 | }, | ||
37 | REDIS: { | ||
38 | HOSTNAME: config.has('redis.hostname') ? config.get<string>('redis.hostname') : null, | ||
39 | PORT: config.has('redis.port') ? config.get<number>('redis.port') : null, | ||
40 | SOCKET: config.has('redis.socket') ? config.get<string>('redis.socket') : null, | ||
41 | AUTH: config.has('redis.auth') ? config.get<string>('redis.auth') : null, | ||
42 | DB: config.has('redis.db') ? config.get<number>('redis.db') : null, | ||
43 | SENTINEL: { | ||
44 | ENABLED: config.has('redis.sentinel.enabled') ? config.get<boolean>('redis.sentinel.enabled') : false, | ||
45 | ENABLE_TLS: config.has('redis.sentinel.enable_tls') ? config.get<boolean>('redis.sentinel.enable_tls') : false, | ||
46 | SENTINELS: config.has('redis.sentinel.sentinels') ? config.get<{ hostname: string, port: number }[]>('redis.sentinel.sentinels') : [], | ||
47 | MASTER_NAME: config.has('redis.sentinel.master_name') ? config.get<string>('redis.sentinel.master_name') : null | ||
48 | } | ||
49 | }, | ||
50 | SMTP: { | ||
51 | TRANSPORT: config.has('smtp.transport') ? config.get<string>('smtp.transport') : 'smtp', | ||
52 | SENDMAIL: config.has('smtp.sendmail') ? config.get<string>('smtp.sendmail') : null, | ||
53 | HOSTNAME: config.get<string>('smtp.hostname'), | ||
54 | PORT: config.get<number>('smtp.port'), | ||
55 | USERNAME: config.get<string>('smtp.username'), | ||
56 | PASSWORD: config.get<string>('smtp.password'), | ||
57 | TLS: config.get<boolean>('smtp.tls'), | ||
58 | DISABLE_STARTTLS: config.get<boolean>('smtp.disable_starttls'), | ||
59 | CA_FILE: config.get<string>('smtp.ca_file'), | ||
60 | FROM_ADDRESS: config.get<string>('smtp.from_address') | ||
61 | }, | ||
62 | EMAIL: { | ||
63 | BODY: { | ||
64 | SIGNATURE: config.get<string>('email.body.signature') | ||
65 | }, | ||
66 | SUBJECT: { | ||
67 | PREFIX: config.get<string>('email.subject.prefix') + ' ' | ||
68 | } | ||
69 | }, | ||
70 | |||
71 | CLIENT: { | ||
72 | VIDEOS: { | ||
73 | MINIATURE: { | ||
74 | get PREFER_AUTHOR_DISPLAY_NAME () { return config.get<boolean>('client.videos.miniature.prefer_author_display_name') }, | ||
75 | get DISPLAY_AUTHOR_AVATAR () { return config.get<boolean>('client.videos.miniature.display_author_avatar') } | ||
76 | }, | ||
77 | RESUMABLE_UPLOAD: { | ||
78 | get MAX_CHUNK_SIZE () { return parseBytes(config.get<number>('client.videos.resumable_upload.max_chunk_size') || 0) } | ||
79 | } | ||
80 | }, | ||
81 | MENU: { | ||
82 | LOGIN: { | ||
83 | get REDIRECT_ON_SINGLE_EXTERNAL_AUTH () { return config.get<boolean>('client.menu.login.redirect_on_single_external_auth') } | ||
84 | } | ||
85 | } | ||
86 | }, | ||
87 | |||
88 | DEFAULTS: { | ||
89 | PUBLISH: { | ||
90 | DOWNLOAD_ENABLED: config.get<boolean>('defaults.publish.download_enabled'), | ||
91 | COMMENTS_ENABLED: config.get<boolean>('defaults.publish.comments_enabled'), | ||
92 | PRIVACY: config.get<VideoPrivacy>('defaults.publish.privacy'), | ||
93 | LICENCE: config.get<number>('defaults.publish.licence') | ||
94 | }, | ||
95 | P2P: { | ||
96 | WEBAPP: { | ||
97 | ENABLED: config.get<boolean>('defaults.p2p.webapp.enabled') | ||
98 | }, | ||
99 | EMBED: { | ||
100 | ENABLED: config.get<boolean>('defaults.p2p.embed.enabled') | ||
101 | } | ||
102 | } | ||
103 | }, | ||
104 | |||
105 | STORAGE: { | ||
106 | TMP_DIR: buildPath(config.get<string>('storage.tmp')), | ||
107 | TMP_PERSISTENT_DIR: buildPath(config.get<string>('storage.tmp_persistent')), | ||
108 | BIN_DIR: buildPath(config.get<string>('storage.bin')), | ||
109 | ACTOR_IMAGES_DIR: buildPath(config.get<string>('storage.avatars')), | ||
110 | LOG_DIR: buildPath(config.get<string>('storage.logs')), | ||
111 | WEB_VIDEOS_DIR: buildPath(config.get<string>('storage.web_videos')), | ||
112 | STREAMING_PLAYLISTS_DIR: buildPath(config.get<string>('storage.streaming_playlists')), | ||
113 | REDUNDANCY_DIR: buildPath(config.get<string>('storage.redundancy')), | ||
114 | THUMBNAILS_DIR: buildPath(config.get<string>('storage.thumbnails')), | ||
115 | STORYBOARDS_DIR: buildPath(config.get<string>('storage.storyboards')), | ||
116 | PREVIEWS_DIR: buildPath(config.get<string>('storage.previews')), | ||
117 | CAPTIONS_DIR: buildPath(config.get<string>('storage.captions')), | ||
118 | TORRENTS_DIR: buildPath(config.get<string>('storage.torrents')), | ||
119 | CACHE_DIR: buildPath(config.get<string>('storage.cache')), | ||
120 | PLUGINS_DIR: buildPath(config.get<string>('storage.plugins')), | ||
121 | CLIENT_OVERRIDES_DIR: buildPath(config.get<string>('storage.client_overrides')), | ||
122 | WELL_KNOWN_DIR: buildPath(config.get<string>('storage.well_known')) | ||
123 | }, | ||
124 | STATIC_FILES: { | ||
125 | PRIVATE_FILES_REQUIRE_AUTH: config.get<boolean>('static_files.private_files_require_auth') | ||
126 | }, | ||
127 | OBJECT_STORAGE: { | ||
128 | ENABLED: config.get<boolean>('object_storage.enabled'), | ||
129 | MAX_UPLOAD_PART: bytes.parse(config.get<string>('object_storage.max_upload_part')), | ||
130 | ENDPOINT: config.get<string>('object_storage.endpoint'), | ||
131 | REGION: config.get<string>('object_storage.region'), | ||
132 | UPLOAD_ACL: { | ||
133 | PUBLIC: config.get<string>('object_storage.upload_acl.public'), | ||
134 | PRIVATE: config.get<string>('object_storage.upload_acl.private') | ||
135 | }, | ||
136 | CREDENTIALS: { | ||
137 | ACCESS_KEY_ID: config.get<string>('object_storage.credentials.access_key_id'), | ||
138 | SECRET_ACCESS_KEY: config.get<string>('object_storage.credentials.secret_access_key') | ||
139 | }, | ||
140 | PROXY: { | ||
141 | PROXIFY_PRIVATE_FILES: config.get<boolean>('object_storage.proxy.proxify_private_files') | ||
142 | }, | ||
143 | WEB_VIDEOS: { | ||
144 | BUCKET_NAME: config.get<string>('object_storage.web_videos.bucket_name'), | ||
145 | PREFIX: config.get<string>('object_storage.web_videos.prefix'), | ||
146 | BASE_URL: config.get<string>('object_storage.web_videos.base_url') | ||
147 | }, | ||
148 | STREAMING_PLAYLISTS: { | ||
149 | BUCKET_NAME: config.get<string>('object_storage.streaming_playlists.bucket_name'), | ||
150 | PREFIX: config.get<string>('object_storage.streaming_playlists.prefix'), | ||
151 | BASE_URL: config.get<string>('object_storage.streaming_playlists.base_url') | ||
152 | } | ||
153 | }, | ||
154 | WEBSERVER: { | ||
155 | SCHEME: config.get<boolean>('webserver.https') === true ? 'https' : 'http', | ||
156 | WS: config.get<boolean>('webserver.https') === true ? 'wss' : 'ws', | ||
157 | HOSTNAME: config.get<string>('webserver.hostname'), | ||
158 | PORT: config.get<number>('webserver.port') | ||
159 | }, | ||
160 | OAUTH2: { | ||
161 | TOKEN_LIFETIME: { | ||
162 | ACCESS_TOKEN: parseDurationToMs(config.get<string>('oauth2.token_lifetime.access_token')), | ||
163 | REFRESH_TOKEN: parseDurationToMs(config.get<string>('oauth2.token_lifetime.refresh_token')) | ||
164 | } | ||
165 | }, | ||
166 | RATES_LIMIT: { | ||
167 | API: { | ||
168 | WINDOW_MS: parseDurationToMs(config.get<string>('rates_limit.api.window')), | ||
169 | MAX: config.get<number>('rates_limit.api.max') | ||
170 | }, | ||
171 | SIGNUP: { | ||
172 | WINDOW_MS: parseDurationToMs(config.get<string>('rates_limit.signup.window')), | ||
173 | MAX: config.get<number>('rates_limit.signup.max') | ||
174 | }, | ||
175 | LOGIN: { | ||
176 | WINDOW_MS: parseDurationToMs(config.get<string>('rates_limit.login.window')), | ||
177 | MAX: config.get<number>('rates_limit.login.max') | ||
178 | }, | ||
179 | RECEIVE_CLIENT_LOG: { | ||
180 | WINDOW_MS: parseDurationToMs(config.get<string>('rates_limit.receive_client_log.window')), | ||
181 | MAX: config.get<number>('rates_limit.receive_client_log.max') | ||
182 | }, | ||
183 | ASK_SEND_EMAIL: { | ||
184 | WINDOW_MS: parseDurationToMs(config.get<string>('rates_limit.ask_send_email.window')), | ||
185 | MAX: config.get<number>('rates_limit.ask_send_email.max') | ||
186 | }, | ||
187 | PLUGINS: { | ||
188 | WINDOW_MS: parseDurationToMs(config.get<string>('rates_limit.plugins.window')), | ||
189 | MAX: config.get<number>('rates_limit.plugins.max') | ||
190 | }, | ||
191 | WELL_KNOWN: { | ||
192 | WINDOW_MS: parseDurationToMs(config.get<string>('rates_limit.well_known.window')), | ||
193 | MAX: config.get<number>('rates_limit.well_known.max') | ||
194 | }, | ||
195 | FEEDS: { | ||
196 | WINDOW_MS: parseDurationToMs(config.get<string>('rates_limit.feeds.window')), | ||
197 | MAX: config.get<number>('rates_limit.feeds.max') | ||
198 | }, | ||
199 | ACTIVITY_PUB: { | ||
200 | WINDOW_MS: parseDurationToMs(config.get<string>('rates_limit.activity_pub.window')), | ||
201 | MAX: config.get<number>('rates_limit.activity_pub.max') | ||
202 | }, | ||
203 | CLIENT: { | ||
204 | WINDOW_MS: parseDurationToMs(config.get<string>('rates_limit.client.window')), | ||
205 | MAX: config.get<number>('rates_limit.client.max') | ||
206 | } | ||
207 | }, | ||
208 | TRUST_PROXY: config.get<string[]>('trust_proxy'), | ||
209 | LOG: { | ||
210 | LEVEL: config.get<string>('log.level'), | ||
211 | ROTATION: { | ||
212 | ENABLED: config.get<boolean>('log.rotation.enabled'), | ||
213 | MAX_FILE_SIZE: bytes.parse(config.get<string>('log.rotation.max_file_size')), | ||
214 | MAX_FILES: config.get<number>('log.rotation.max_files') | ||
215 | }, | ||
216 | ANONYMIZE_IP: config.get<boolean>('log.anonymize_ip'), | ||
217 | LOG_PING_REQUESTS: config.get<boolean>('log.log_ping_requests'), | ||
218 | LOG_TRACKER_UNKNOWN_INFOHASH: config.get<boolean>('log.log_tracker_unknown_infohash'), | ||
219 | PRETTIFY_SQL: config.get<boolean>('log.prettify_sql'), | ||
220 | ACCEPT_CLIENT_LOG: config.get<boolean>('log.accept_client_log') | ||
221 | }, | ||
222 | OPEN_TELEMETRY: { | ||
223 | METRICS: { | ||
224 | ENABLED: config.get<boolean>('open_telemetry.metrics.enabled'), | ||
225 | |||
226 | HTTP_REQUEST_DURATION: { | ||
227 | ENABLED: config.get<boolean>('open_telemetry.metrics.http_request_duration.enabled') | ||
228 | }, | ||
229 | |||
230 | PROMETHEUS_EXPORTER: { | ||
231 | HOSTNAME: config.get<string>('open_telemetry.metrics.prometheus_exporter.hostname'), | ||
232 | PORT: config.get<number>('open_telemetry.metrics.prometheus_exporter.port') | ||
233 | } | ||
234 | }, | ||
235 | TRACING: { | ||
236 | ENABLED: config.get<boolean>('open_telemetry.tracing.enabled'), | ||
237 | |||
238 | JAEGER_EXPORTER: { | ||
239 | ENDPOINT: config.get<string>('open_telemetry.tracing.jaeger_exporter.endpoint') | ||
240 | } | ||
241 | } | ||
242 | }, | ||
243 | TRENDING: { | ||
244 | VIDEOS: { | ||
245 | INTERVAL_DAYS: config.get<number>('trending.videos.interval_days'), | ||
246 | ALGORITHMS: { | ||
247 | get ENABLED () { return config.get<string[]>('trending.videos.algorithms.enabled') }, | ||
248 | get DEFAULT () { return config.get<string>('trending.videos.algorithms.default') } | ||
249 | } | ||
250 | } | ||
251 | }, | ||
252 | REDUNDANCY: { | ||
253 | VIDEOS: { | ||
254 | CHECK_INTERVAL: parseDurationToMs(config.get<string>('redundancy.videos.check_interval')), | ||
255 | STRATEGIES: buildVideosRedundancy(config.get<any[]>('redundancy.videos.strategies')) | ||
256 | } | ||
257 | }, | ||
258 | REMOTE_REDUNDANCY: { | ||
259 | VIDEOS: { | ||
260 | ACCEPT_FROM: config.get<VideoRedundancyConfigFilter>('remote_redundancy.videos.accept_from') | ||
261 | } | ||
262 | }, | ||
263 | CSP: { | ||
264 | ENABLED: config.get<boolean>('csp.enabled'), | ||
265 | REPORT_ONLY: config.get<boolean>('csp.report_only'), | ||
266 | REPORT_URI: config.get<string>('csp.report_uri') | ||
267 | }, | ||
268 | SECURITY: { | ||
269 | FRAMEGUARD: { | ||
270 | ENABLED: config.get<boolean>('security.frameguard.enabled') | ||
271 | }, | ||
272 | POWERED_BY_HEADER: { | ||
273 | ENABLED: config.get<boolean>('security.powered_by_header.enabled') | ||
274 | } | ||
275 | }, | ||
276 | TRACKER: { | ||
277 | ENABLED: config.get<boolean>('tracker.enabled'), | ||
278 | PRIVATE: config.get<boolean>('tracker.private'), | ||
279 | REJECT_TOO_MANY_ANNOUNCES: config.get<boolean>('tracker.reject_too_many_announces') | ||
280 | }, | ||
281 | HISTORY: { | ||
282 | VIDEOS: { | ||
283 | MAX_AGE: parseDurationToMs(config.get('history.videos.max_age')) | ||
284 | } | ||
285 | }, | ||
286 | VIEWS: { | ||
287 | VIDEOS: { | ||
288 | REMOTE: { | ||
289 | MAX_AGE: parseDurationToMs(config.get('views.videos.remote.max_age')) | ||
290 | }, | ||
291 | LOCAL_BUFFER_UPDATE_INTERVAL: parseDurationToMs(config.get('views.videos.local_buffer_update_interval')), | ||
292 | IP_VIEW_EXPIRATION: parseDurationToMs(config.get('views.videos.ip_view_expiration')) | ||
293 | } | ||
294 | }, | ||
295 | GEO_IP: { | ||
296 | ENABLED: config.get<boolean>('geo_ip.enabled'), | ||
297 | COUNTRY: { | ||
298 | DATABASE_URL: config.get<string>('geo_ip.country.database_url') | ||
299 | } | ||
300 | }, | ||
301 | PLUGINS: { | ||
302 | INDEX: { | ||
303 | ENABLED: config.get<boolean>('plugins.index.enabled'), | ||
304 | CHECK_LATEST_VERSIONS_INTERVAL: parseDurationToMs(config.get<string>('plugins.index.check_latest_versions_interval')), | ||
305 | URL: config.get<string>('plugins.index.url') | ||
306 | } | ||
307 | }, | ||
308 | FEDERATION: { | ||
309 | VIDEOS: { | ||
310 | FEDERATE_UNLISTED: config.get<boolean>('federation.videos.federate_unlisted'), | ||
311 | CLEANUP_REMOTE_INTERACTIONS: config.get<boolean>('federation.videos.cleanup_remote_interactions') | ||
312 | }, | ||
313 | SIGN_FEDERATED_FETCHES: config.get<boolean>('federation.sign_federated_fetches') | ||
314 | }, | ||
315 | PEERTUBE: { | ||
316 | CHECK_LATEST_VERSION: { | ||
317 | ENABLED: config.get<boolean>('peertube.check_latest_version.enabled'), | ||
318 | URL: config.get<string>('peertube.check_latest_version.url') | ||
319 | } | ||
320 | }, | ||
321 | WEBADMIN: { | ||
322 | CONFIGURATION: { | ||
323 | EDITION: { | ||
324 | ALLOWED: config.get<boolean>('webadmin.configuration.edition.allowed') | ||
325 | } | ||
326 | } | ||
327 | }, | ||
328 | FEEDS: { | ||
329 | VIDEOS: { | ||
330 | COUNT: config.get<number>('feeds.videos.count') | ||
331 | }, | ||
332 | COMMENTS: { | ||
333 | COUNT: config.get<number>('feeds.comments.count') | ||
334 | } | ||
335 | }, | ||
336 | REMOTE_RUNNERS: { | ||
337 | STALLED_JOBS: { | ||
338 | LIVE: parseDurationToMs(config.get<string>('remote_runners.stalled_jobs.live')), | ||
339 | VOD: parseDurationToMs(config.get<string>('remote_runners.stalled_jobs.vod')) | ||
340 | } | ||
341 | }, | ||
342 | ADMIN: { | ||
343 | get EMAIL () { return config.get<string>('admin.email') } | ||
344 | }, | ||
345 | CONTACT_FORM: { | ||
346 | get ENABLED () { return config.get<boolean>('contact_form.enabled') } | ||
347 | }, | ||
348 | SIGNUP: { | ||
349 | get ENABLED () { return config.get<boolean>('signup.enabled') }, | ||
350 | get REQUIRES_APPROVAL () { return config.get<boolean>('signup.requires_approval') }, | ||
351 | get LIMIT () { return config.get<number>('signup.limit') }, | ||
352 | get REQUIRES_EMAIL_VERIFICATION () { return config.get<boolean>('signup.requires_email_verification') }, | ||
353 | get MINIMUM_AGE () { return config.get<number>('signup.minimum_age') }, | ||
354 | FILTERS: { | ||
355 | CIDR: { | ||
356 | get WHITELIST () { return config.get<string[]>('signup.filters.cidr.whitelist') }, | ||
357 | get BLACKLIST () { return config.get<string[]>('signup.filters.cidr.blacklist') } | ||
358 | } | ||
359 | } | ||
360 | }, | ||
361 | USER: { | ||
362 | HISTORY: { | ||
363 | VIDEOS: { | ||
364 | get ENABLED () { return config.get<boolean>('user.history.videos.enabled') } | ||
365 | } | ||
366 | }, | ||
367 | get VIDEO_QUOTA () { return parseBytes(config.get<number>('user.video_quota')) }, | ||
368 | get VIDEO_QUOTA_DAILY () { return parseBytes(config.get<number>('user.video_quota_daily')) } | ||
369 | }, | ||
370 | VIDEO_CHANNELS: { | ||
371 | get MAX_PER_USER () { return config.get<number>('video_channels.max_per_user') } | ||
372 | }, | ||
373 | TRANSCODING: { | ||
374 | get ENABLED () { return config.get<boolean>('transcoding.enabled') }, | ||
375 | get ALLOW_ADDITIONAL_EXTENSIONS () { return config.get<boolean>('transcoding.allow_additional_extensions') }, | ||
376 | get ALLOW_AUDIO_FILES () { return config.get<boolean>('transcoding.allow_audio_files') }, | ||
377 | get THREADS () { return config.get<number>('transcoding.threads') }, | ||
378 | get CONCURRENCY () { return config.get<number>('transcoding.concurrency') }, | ||
379 | get PROFILE () { return config.get<string>('transcoding.profile') }, | ||
380 | get ALWAYS_TRANSCODE_ORIGINAL_RESOLUTION () { return config.get<boolean>('transcoding.always_transcode_original_resolution') }, | ||
381 | RESOLUTIONS: { | ||
382 | get '0p' () { return config.get<boolean>('transcoding.resolutions.0p') }, | ||
383 | get '144p' () { return config.get<boolean>('transcoding.resolutions.144p') }, | ||
384 | get '240p' () { return config.get<boolean>('transcoding.resolutions.240p') }, | ||
385 | get '360p' () { return config.get<boolean>('transcoding.resolutions.360p') }, | ||
386 | get '480p' () { return config.get<boolean>('transcoding.resolutions.480p') }, | ||
387 | get '720p' () { return config.get<boolean>('transcoding.resolutions.720p') }, | ||
388 | get '1080p' () { return config.get<boolean>('transcoding.resolutions.1080p') }, | ||
389 | get '1440p' () { return config.get<boolean>('transcoding.resolutions.1440p') }, | ||
390 | get '2160p' () { return config.get<boolean>('transcoding.resolutions.2160p') } | ||
391 | }, | ||
392 | HLS: { | ||
393 | get ENABLED () { return config.get<boolean>('transcoding.hls.enabled') } | ||
394 | }, | ||
395 | WEB_VIDEOS: { | ||
396 | get ENABLED () { return config.get<boolean>('transcoding.web_videos.enabled') } | ||
397 | }, | ||
398 | REMOTE_RUNNERS: { | ||
399 | get ENABLED () { return config.get<boolean>('transcoding.remote_runners.enabled') } | ||
400 | } | ||
401 | }, | ||
402 | LIVE: { | ||
403 | get ENABLED () { return config.get<boolean>('live.enabled') }, | ||
404 | |||
405 | get MAX_DURATION () { return parseDurationToMs(config.get<string>('live.max_duration')) }, | ||
406 | get MAX_INSTANCE_LIVES () { return config.get<number>('live.max_instance_lives') }, | ||
407 | get MAX_USER_LIVES () { return config.get<number>('live.max_user_lives') }, | ||
408 | |||
409 | get ALLOW_REPLAY () { return config.get<boolean>('live.allow_replay') }, | ||
410 | |||
411 | LATENCY_SETTING: { | ||
412 | get ENABLED () { return config.get<boolean>('live.latency_setting.enabled') } | ||
413 | }, | ||
414 | |||
415 | RTMP: { | ||
416 | get ENABLED () { return config.get<boolean>('live.rtmp.enabled') }, | ||
417 | get PORT () { return config.get<number>('live.rtmp.port') }, | ||
418 | get HOSTNAME () { return config.get<number>('live.rtmp.hostname') }, | ||
419 | get PUBLIC_HOSTNAME () { return config.get<number>('live.rtmp.public_hostname') } | ||
420 | }, | ||
421 | |||
422 | RTMPS: { | ||
423 | get ENABLED () { return config.get<boolean>('live.rtmps.enabled') }, | ||
424 | get PORT () { return config.get<number>('live.rtmps.port') }, | ||
425 | get HOSTNAME () { return config.get<number>('live.rtmps.hostname') }, | ||
426 | get PUBLIC_HOSTNAME () { return config.get<number>('live.rtmps.public_hostname') }, | ||
427 | get KEY_FILE () { return config.get<string>('live.rtmps.key_file') }, | ||
428 | get CERT_FILE () { return config.get<string>('live.rtmps.cert_file') } | ||
429 | }, | ||
430 | |||
431 | TRANSCODING: { | ||
432 | get ENABLED () { return config.get<boolean>('live.transcoding.enabled') }, | ||
433 | get THREADS () { return config.get<number>('live.transcoding.threads') }, | ||
434 | get PROFILE () { return config.get<string>('live.transcoding.profile') }, | ||
435 | |||
436 | get ALWAYS_TRANSCODE_ORIGINAL_RESOLUTION () { return config.get<boolean>('live.transcoding.always_transcode_original_resolution') }, | ||
437 | |||
438 | RESOLUTIONS: { | ||
439 | get '144p' () { return config.get<boolean>('live.transcoding.resolutions.144p') }, | ||
440 | get '240p' () { return config.get<boolean>('live.transcoding.resolutions.240p') }, | ||
441 | get '360p' () { return config.get<boolean>('live.transcoding.resolutions.360p') }, | ||
442 | get '480p' () { return config.get<boolean>('live.transcoding.resolutions.480p') }, | ||
443 | get '720p' () { return config.get<boolean>('live.transcoding.resolutions.720p') }, | ||
444 | get '1080p' () { return config.get<boolean>('live.transcoding.resolutions.1080p') }, | ||
445 | get '1440p' () { return config.get<boolean>('live.transcoding.resolutions.1440p') }, | ||
446 | get '2160p' () { return config.get<boolean>('live.transcoding.resolutions.2160p') } | ||
447 | }, | ||
448 | REMOTE_RUNNERS: { | ||
449 | get ENABLED () { return config.get<boolean>('live.transcoding.remote_runners.enabled') } | ||
450 | } | ||
451 | } | ||
452 | }, | ||
453 | VIDEO_STUDIO: { | ||
454 | get ENABLED () { return config.get<boolean>('video_studio.enabled') }, | ||
455 | REMOTE_RUNNERS: { | ||
456 | get ENABLED () { return config.get<boolean>('video_studio.remote_runners.enabled') } | ||
457 | } | ||
458 | }, | ||
459 | VIDEO_FILE: { | ||
460 | UPDATE: { | ||
461 | get ENABLED () { return config.get<boolean>('video_file.update.enabled') } | ||
462 | } | ||
463 | }, | ||
464 | IMPORT: { | ||
465 | VIDEOS: { | ||
466 | get CONCURRENCY () { return config.get<number>('import.videos.concurrency') }, | ||
467 | get TIMEOUT () { return parseDurationToMs(config.get<string>('import.videos.timeout')) }, | ||
468 | |||
469 | HTTP: { | ||
470 | get ENABLED () { return config.get<boolean>('import.videos.http.enabled') }, | ||
471 | |||
472 | YOUTUBE_DL_RELEASE: { | ||
473 | get URL () { return config.get<string>('import.videos.http.youtube_dl_release.url') }, | ||
474 | get NAME () { return config.get<string>('import.videos.http.youtube_dl_release.name') }, | ||
475 | get PYTHON_PATH () { return config.get<string>('import.videos.http.youtube_dl_release.python_path') } | ||
476 | }, | ||
477 | |||
478 | get FORCE_IPV4 () { return config.get<boolean>('import.videos.http.force_ipv4') } | ||
479 | }, | ||
480 | TORRENT: { | ||
481 | get ENABLED () { return config.get<boolean>('import.videos.torrent.enabled') } | ||
482 | } | ||
483 | }, | ||
484 | VIDEO_CHANNEL_SYNCHRONIZATION: { | ||
485 | get ENABLED () { return config.get<boolean>('import.video_channel_synchronization.enabled') }, | ||
486 | get MAX_PER_USER () { return config.get<number>('import.video_channel_synchronization.max_per_user') }, | ||
487 | get CHECK_INTERVAL () { return parseDurationToMs(config.get<string>('import.video_channel_synchronization.check_interval')) }, | ||
488 | get VIDEOS_LIMIT_PER_SYNCHRONIZATION () { | ||
489 | return config.get<number>('import.video_channel_synchronization.videos_limit_per_synchronization') | ||
490 | }, | ||
491 | get FULL_SYNC_VIDEOS_LIMIT () { | ||
492 | return config.get<number>('import.video_channel_synchronization.full_sync_videos_limit') | ||
493 | } | ||
494 | } | ||
495 | }, | ||
496 | AUTO_BLACKLIST: { | ||
497 | VIDEOS: { | ||
498 | OF_USERS: { | ||
499 | get ENABLED () { return config.get<boolean>('auto_blacklist.videos.of_users.enabled') } | ||
500 | } | ||
501 | } | ||
502 | }, | ||
503 | CACHE: { | ||
504 | PREVIEWS: { | ||
505 | get SIZE () { return config.get<number>('cache.previews.size') } | ||
506 | }, | ||
507 | VIDEO_CAPTIONS: { | ||
508 | get SIZE () { return config.get<number>('cache.captions.size') } | ||
509 | }, | ||
510 | TORRENTS: { | ||
511 | get SIZE () { return config.get<number>('cache.torrents.size') } | ||
512 | }, | ||
513 | STORYBOARDS: { | ||
514 | get SIZE () { return config.get<number>('cache.storyboards.size') } | ||
515 | } | ||
516 | }, | ||
517 | INSTANCE: { | ||
518 | get NAME () { return config.get<string>('instance.name') }, | ||
519 | get SHORT_DESCRIPTION () { return config.get<string>('instance.short_description') }, | ||
520 | get DESCRIPTION () { return config.get<string>('instance.description') }, | ||
521 | get TERMS () { return config.get<string>('instance.terms') }, | ||
522 | get CODE_OF_CONDUCT () { return config.get<string>('instance.code_of_conduct') }, | ||
523 | |||
524 | get CREATION_REASON () { return config.get<string>('instance.creation_reason') }, | ||
525 | |||
526 | get MODERATION_INFORMATION () { return config.get<string>('instance.moderation_information') }, | ||
527 | get ADMINISTRATOR () { return config.get<string>('instance.administrator') }, | ||
528 | get MAINTENANCE_LIFETIME () { return config.get<string>('instance.maintenance_lifetime') }, | ||
529 | get BUSINESS_MODEL () { return config.get<string>('instance.business_model') }, | ||
530 | get HARDWARE_INFORMATION () { return config.get<string>('instance.hardware_information') }, | ||
531 | |||
532 | get LANGUAGES () { return config.get<string[]>('instance.languages') || [] }, | ||
533 | get CATEGORIES () { return config.get<number[]>('instance.categories') || [] }, | ||
534 | |||
535 | get IS_NSFW () { return config.get<boolean>('instance.is_nsfw') }, | ||
536 | get DEFAULT_NSFW_POLICY () { return config.get<NSFWPolicyType>('instance.default_nsfw_policy') }, | ||
537 | |||
538 | get DEFAULT_CLIENT_ROUTE () { return config.get<string>('instance.default_client_route') }, | ||
539 | |||
540 | CUSTOMIZATIONS: { | ||
541 | get JAVASCRIPT () { return config.get<string>('instance.customizations.javascript') }, | ||
542 | get CSS () { return config.get<string>('instance.customizations.css') } | ||
543 | }, | ||
544 | get ROBOTS () { return config.get<string>('instance.robots') }, | ||
545 | get SECURITYTXT () { return config.get<string>('instance.securitytxt') }, | ||
546 | get SECURITYTXT_CONTACT () { return config.get<string>('admin.email') } | ||
547 | }, | ||
548 | SERVICES: { | ||
549 | TWITTER: { | ||
550 | get USERNAME () { return config.get<string>('services.twitter.username') }, | ||
551 | get WHITELISTED () { return config.get<boolean>('services.twitter.whitelisted') } | ||
552 | } | ||
553 | }, | ||
554 | FOLLOWERS: { | ||
555 | INSTANCE: { | ||
556 | get ENABLED () { return config.get<boolean>('followers.instance.enabled') }, | ||
557 | get MANUAL_APPROVAL () { return config.get<boolean>('followers.instance.manual_approval') } | ||
558 | } | ||
559 | }, | ||
560 | FOLLOWINGS: { | ||
561 | INSTANCE: { | ||
562 | AUTO_FOLLOW_BACK: { | ||
563 | get ENABLED () { | ||
564 | return config.get<boolean>('followings.instance.auto_follow_back.enabled') | ||
565 | } | ||
566 | }, | ||
567 | AUTO_FOLLOW_INDEX: { | ||
568 | get ENABLED () { | ||
569 | return config.get<boolean>('followings.instance.auto_follow_index.enabled') | ||
570 | }, | ||
571 | get INDEX_URL () { | ||
572 | return config.get<string>('followings.instance.auto_follow_index.index_url') | ||
573 | } | ||
574 | } | ||
575 | } | ||
576 | }, | ||
577 | THEME: { | ||
578 | get DEFAULT () { return config.get<string>('theme.default') } | ||
579 | }, | ||
580 | BROADCAST_MESSAGE: { | ||
581 | get ENABLED () { return config.get<boolean>('broadcast_message.enabled') }, | ||
582 | get MESSAGE () { return config.get<string>('broadcast_message.message') }, | ||
583 | get LEVEL () { return config.get<BroadcastMessageLevel>('broadcast_message.level') }, | ||
584 | get DISMISSABLE () { return config.get<boolean>('broadcast_message.dismissable') } | ||
585 | }, | ||
586 | SEARCH: { | ||
587 | REMOTE_URI: { | ||
588 | get USERS () { return config.get<boolean>('search.remote_uri.users') }, | ||
589 | get ANONYMOUS () { return config.get<boolean>('search.remote_uri.anonymous') } | ||
590 | }, | ||
591 | SEARCH_INDEX: { | ||
592 | get ENABLED () { return config.get<boolean>('search.search_index.enabled') }, | ||
593 | get URL () { return config.get<string>('search.search_index.url') }, | ||
594 | get DISABLE_LOCAL_SEARCH () { return config.get<boolean>('search.search_index.disable_local_search') }, | ||
595 | get IS_DEFAULT_SEARCH () { return config.get<boolean>('search.search_index.is_default_search') } | ||
596 | } | ||
597 | } | ||
598 | |||
599 | } | ||
600 | |||
601 | function registerConfigChangedHandler (fun: Function) { | ||
602 | configChangedHandlers.push(fun) | ||
603 | } | ||
604 | |||
605 | function isEmailEnabled () { | ||
606 | if (CONFIG.SMTP.TRANSPORT === 'sendmail' && CONFIG.SMTP.SENDMAIL) return true | ||
607 | |||
608 | if (CONFIG.SMTP.TRANSPORT === 'smtp' && CONFIG.SMTP.HOSTNAME && CONFIG.SMTP.PORT) return true | ||
609 | |||
610 | return false | ||
611 | } | ||
612 | |||
613 | function getLocalConfigFilePath () { | ||
614 | const localConfigDir = getLocalConfigDir() | ||
615 | |||
616 | let filename = 'local' | ||
617 | if (process.env.NODE_ENV) filename += `-${process.env.NODE_ENV}` | ||
618 | if (process.env.NODE_APP_INSTANCE) filename += `-${process.env.NODE_APP_INSTANCE}` | ||
619 | |||
620 | return join(localConfigDir, filename + '.json') | ||
621 | } | ||
622 | |||
623 | // --------------------------------------------------------------------------- | ||
624 | |||
625 | export { | ||
626 | CONFIG, | ||
627 | getLocalConfigFilePath, | ||
628 | registerConfigChangedHandler, | ||
629 | isEmailEnabled | ||
630 | } | ||
631 | |||
632 | // --------------------------------------------------------------------------- | ||
633 | |||
634 | function getLocalConfigDir () { | ||
635 | if (process.env.PEERTUBE_LOCAL_CONFIG) return process.env.PEERTUBE_LOCAL_CONFIG | ||
636 | |||
637 | const configSources = config.util.getConfigSources() | ||
638 | if (configSources.length === 0) throw new Error('Invalid config source.') | ||
639 | |||
640 | return dirname(configSources[0].name) | ||
641 | } | ||
642 | |||
643 | function buildVideosRedundancy (objs: any[]): VideosRedundancyStrategy[] { | ||
644 | if (!objs) return [] | ||
645 | |||
646 | if (!Array.isArray(objs)) return objs | ||
647 | |||
648 | return objs.map(obj => { | ||
649 | return Object.assign({}, obj, { | ||
650 | minLifetime: parseDurationToMs(obj.min_lifetime), | ||
651 | size: bytes.parse(obj.size), | ||
652 | minViews: obj.min_views | ||
653 | }) | ||
654 | }) | ||
655 | } | ||
656 | |||
657 | export function reloadConfig () { | ||
658 | |||
659 | function getConfigDirectories () { | ||
660 | if (process.env.NODE_CONFIG_DIR) { | ||
661 | return process.env.NODE_CONFIG_DIR.split(':') | ||
662 | } | ||
663 | |||
664 | return [ join(root(), 'config') ] | ||
665 | } | ||
666 | |||
667 | function purge () { | ||
668 | const directories = getConfigDirectories() | ||
669 | |||
670 | for (const fileName in require.cache) { | ||
671 | if (directories.some((dir) => fileName.includes(dir)) === false) { | ||
672 | continue | ||
673 | } | ||
674 | |||
675 | delete require.cache[fileName] | ||
676 | } | ||
677 | |||
678 | decacheModule('config') | ||
679 | } | ||
680 | |||
681 | purge() | ||
682 | |||
683 | config = require('config') | ||
684 | |||
685 | for (const configChangedHandler of configChangedHandlers) { | ||
686 | configChangedHandler() | ||
687 | } | ||
688 | } | ||