]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
/!\ Use a dedicated config file for development
authorChocobozzz <me@florianbigard.com>
Wed, 6 Jul 2022 13:44:14 +0000 (15:44 +0200)
committerChocobozzz <me@florianbigard.com>
Wed, 6 Jul 2022 14:12:17 +0000 (16:12 +0200)
It means you have to replace NODE_ENV=test to NODE_ENV=dev if you use it
npm run dev:* commands are already updated

26 files changed:
.github/CONTRIBUTING.md
config/dev.yaml [new file with mode: 0644]
config/test.yaml
scripts/dev/client.sh
scripts/dev/embed.sh
scripts/dev/index.sh
scripts/dev/server.sh
server.ts
server/controllers/api/oauth-clients.ts
server/controllers/plugins.ts
server/helpers/core-utils.ts
server/helpers/custom-validators/activitypub/misc.ts
server/helpers/custom-validators/servers.ts
server/initializers/checker-after-init.ts
server/initializers/constants.ts
server/initializers/database.ts
server/lib/client-html.ts
server/lib/emailer.ts
server/lib/job-queue/handlers/video-views-stats.ts
server/lib/schedulers/actor-follow-scheduler.ts
server/lib/schedulers/remove-old-jobs-scheduler.ts
server/lib/views/shared/video-viewer-counters.ts
server/lib/views/shared/video-viewer-stats.ts
server/middlewares/validators/follows.ts
server/middlewares/validators/oembed.ts
support/doc/plugins/guide.md

index 4bc590bde988d9cbaa1aa58e0ca75edf11fb0a81..e8570dd2b96d390b6fdb4b7d0630e4d51602d819 100644 (file)
@@ -216,7 +216,7 @@ Instance configurations are in `config/test-{1,2,3}.yaml`.
 To test emails with PeerTube:
 
  * Run [mailslurper](http://mailslurper.com/)
- * Run PeerTube using mailslurper SMTP port: `NODE_CONFIG='{ "smtp": { "hostname": "localhost", "port": 2500, "tls": false } }' NODE_ENV=test npm start`
+ * Run PeerTube using mailslurper SMTP port: `NODE_CONFIG='{ "smtp": { "hostname": "localhost", "port": 2500, "tls": false } }' NODE_ENV=dev node dist/server`
 
 ## Plugins & Themes
 
diff --git a/config/dev.yaml b/config/dev.yaml
new file mode 100644 (file)
index 0000000..15e239b
--- /dev/null
@@ -0,0 +1,105 @@
+listen:
+  hostname: '::'
+  port: 9000
+
+webserver:
+  https: false
+
+database:
+  hostname: 'localhost'
+  port: 5432
+
+redis:
+  hostname: 'localhost'
+
+smtp:
+  hostname: null
+  port: 1025
+  tls: false
+  disable_starttls: true
+  from_address: 'test-admin@localhost'
+  username: null
+  password: null
+
+log:
+  level: 'debug'
+
+contact_form:
+  enabled: true
+
+peertube:
+  check_latest_version:
+    enabled: false
+
+redundancy:
+  videos:
+    check_interval: '5 minutes'
+    strategies:
+      -
+        size: '1000MB'
+        min_lifetime: '10 minutes'
+        strategy: 'most-views'
+      -
+        size: '1000MB'
+        min_lifetime: '10 minutes'
+        strategy: 'trending'
+      -
+        size: '1000MB'
+        min_lifetime: '10 minutes'
+        strategy: 'recently-added'
+        min_views: 1
+
+cache:
+  previews:
+    size: 10
+  captions:
+    size: 10
+  torrents:
+    size: 10
+
+signup:
+  enabled: true
+  requires_email_verification: false
+
+live:
+  enabled: true
+
+  allow_replay: true
+
+  transcoding:
+    enabled: true
+    threads: 2
+
+    resolutions:
+      360p: true
+      720p: true
+
+import:
+  videos:
+    concurrency: 2
+    http:
+      enabled: true
+    torrent:
+      enabled: true
+
+instance:
+  default_nsfw_policy: 'display'
+
+plugins:
+  index:
+    check_latest_versions_interval: '10 minutes'
+
+federation:
+  videos:
+    cleanup_remote_interactions: false
+
+views:
+  videos:
+    remote:
+      max_age: -1
+
+geo_ip:
+  enabled: true
+
+video_studio:
+  enabled: true
index 8118c479b660194520cd61b52431c24a5812609c..3e08f0ac82f6305f804fae6fe59e6419b1331928 100644 (file)
@@ -133,28 +133,6 @@ plugins:
   index:
     check_latest_versions_interval: '10 minutes'
 
-search:
-  # Add ability to fetch remote videos/actors by their URI, that may not be federated with your instance
-  # If enabled, the associated group will be able to "escape" from the instance follows
-  # That means they will be able to follow channels, watch videos, list videos of non followed instances
-  remote_uri:
-    users: true
-    anonymous: false
-
-  # Use a third party index instead of your local index, only for search results
-  # Useful to discover content outside of your instance
-  search_index:
-    enabled: false
-    # URL of the search index, that should use the same search API and routes
-    # than PeerTube: https://docs.joinpeertube.org/api-rest-reference.html
-    # You should deploy your own with https://framagit.org/framasoft/peertube/search-index,
-    # and can use https://search.joinpeertube.org/ for tests, but keep in mind the latter is an unmoderated search index
-    url: 'http://localhost:3234'
-    # You can disable local search, so users only use the search index
-    disable_local_search: false
-    # If you did not disable local search, you can decide to use the search index by default
-    is_default_search: true
-
 federation:
   videos:
     federate_unlisted: true
index 1846f9a7d3959cd530c97b8f0e1e9fa72d895576..92e8bb6accc9c33c7513504cb020c03f6ea55240 100755 (executable)
@@ -9,12 +9,12 @@ if [ ! -z ${2+x} ] && [ "$2" = "--ar-locale" ]; then
 fi
 
 clientCommand="cd client && node --max_old_space_size=4096 node_modules/.bin/ng serve --proxy-config proxy.config.json --hmr --configuration $clientConfiguration --host 0.0.0.0 --disable-host-check --port 3000"
-serverCommand="npm run build:server && NODE_ENV=test node dist/server"
+serverCommand="npm run build:server && NODE_ENV=dev node dist/server"
 
 if [ ! -z ${1+x} ] && [ "$1" = "--skip-server" ]; then
-  NODE_ENV=test eval $clientCommand
+  eval $clientCommand
 else
-  NODE_ENV=test node node_modules/.bin/concurrently -k \
+  node node_modules/.bin/concurrently -k \
     "$clientCommand" \
     "$serverCommand"
 fi
index b4835604e0193a6908ce5d37b226fb61b45fa5a3..e694950e6c24bd9747b4c1b3e28c065fa7fddda3 100755 (executable)
@@ -2,6 +2,6 @@
 
 set -eu
 
-NODE_ENV=test npm run concurrently -- -k \
+npm run concurrently -- -k \
   "cd client && npm run webpack -- --config webpack/webpack.video-embed.js --mode development --watch" \
-  "npm run build:server && NODE_ENV=test npm start"
+  "npm run build:server && NODE_ENV=dev npm start"
index beb88606f72bb60d80958396cc6822270ca25a9b..7e0332115a69b3e18d0aebcd52f0c18c29a22cde 100755 (executable)
@@ -2,6 +2,6 @@
 
 set -eu
 
-NODE_ENV=test npm run concurrently -- -k \
+npm run concurrently -- -k \
   "sh scripts/dev/client.sh --skip-server ${1:-}" \
   "sh scripts/dev/server.sh --skip-client"
index 9dae43a632b79d72f02fc25570ee741409cd657c..c52c5124c4db187dca063c312dd37e1ddeb6fb1e 100755 (executable)
@@ -22,4 +22,4 @@ npm run resolve-tspaths:server
 cp -r ./server/static ./server/assets ./dist/server
 cp -r "./server/lib/emails" "./dist/server/lib"
 
-./node_modules/.bin/tsc-watch --build --preserveWatchOutput --verbose --onSuccess 'sh -c "npm run resolve-tspaths:server && NODE_ENV=test node dist/server"'
+./node_modules/.bin/tsc-watch --build --preserveWatchOutput --verbose --onSuccess 'sh -c "npm run resolve-tspaths:server && NODE_ENV=dev node dist/server"'
index 73b7441f9f4b066793436f92bc29c408f6ec46d2..7ab20643b9e287bc0c8cbc1a87807907dcb439a9 100644 (file)
--- a/server.ts
+++ b/server.ts
@@ -134,7 +134,7 @@ import { HttpStatusCode } from './shared/models/http/http-error-codes'
 import { VideosTorrentCache } from '@server/lib/files-cache/videos-torrent-cache'
 import { ServerConfigManager } from '@server/lib/server-config-manager'
 import { VideoViewsManager } from '@server/lib/views/video-views-manager'
-import { isTestInstance } from './server/helpers/core-utils'
+import { isTestOrDevInstance } from './server/helpers/core-utils'
 import { OpenTelemetryMetrics } from '@server/lib/opentelemetry/metrics'
 
 // ----------- Command line -----------
@@ -148,7 +148,7 @@ cli
 // ----------- App -----------
 
 // Enable CORS for develop
-if (isTestInstance()) {
+if (isTestOrDevInstance()) {
   app.use(cors({
     origin: '*',
     exposedHeaders: 'Retry-After',
index 2d847bdc1c6481efe910ba9fcbc91a1036e6e3b3..eb7942fd68247ce9f093ecac92de189fcce54c2c 100644 (file)
@@ -1,4 +1,5 @@
 import express from 'express'
+import { isTestOrDevInstance } from '@server/helpers/core-utils'
 import { OAuthClientModel } from '@server/models/oauth/oauth-client'
 import { HttpStatusCode, OAuthClientLocal } from '@shared/models'
 import { logger } from '../../helpers/logger'
@@ -22,7 +23,7 @@ async function getLocalClient (req: express.Request, res: express.Response, next
   }
 
   // Don't make this check if this is a test instance
-  if (process.env.NODE_ENV !== 'test' && req.get('host') !== headerHostShouldBe) {
+  if (!isTestOrDevInstance() && req.get('host') !== headerHostShouldBe) {
     logger.info('Getting client tokens for host %s is forbidden (expected %s).', req.get('host'), headerHostShouldBe)
     return res.fail({
       status: HttpStatusCode.FORBIDDEN_403,
index 28fffc9e1dfcee68e0d886e3b655fdf69583b236..51db1ad89f4c5798ffce0d50fd6e0275df2ccd1e 100644 (file)
@@ -5,7 +5,7 @@ import { optionalAuthenticate } from '@server/middlewares/auth'
 import { getCompleteLocale, is18nLocale } from '../../shared/core-utils/i18n'
 import { HttpStatusCode } from '../../shared/models/http/http-error-codes'
 import { PluginType } from '../../shared/models/plugins/plugin.type'
-import { isTestInstance } from '../helpers/core-utils'
+import { isProdInstance } from '../helpers/core-utils'
 import { PLUGIN_GLOBAL_CSS_PATH } from '../initializers/constants'
 import { PluginManager, RegisteredPlugin } from '../lib/plugins/plugin-manager'
 import { getExternalAuthValidator, getPluginValidator, pluginStaticDirectoryValidator } from '../middlewares/validators/plugins'
@@ -13,7 +13,7 @@ import { serveThemeCSSValidator } from '../middlewares/validators/themes'
 
 const sendFileOptions = {
   maxAge: '30 days',
-  immutable: !isTestInstance()
+  immutable: isProdInstance()
 }
 
 const pluginsRouter = express.Router()
index 6ebe8e2acb5a2b6dace1282a0f8598ecb2c00a24..4bbf0228d6369e558453f6b69d8f2511fb88f416 100644 (file)
@@ -165,6 +165,14 @@ function isTestInstance () {
   return process.env.NODE_ENV === 'test'
 }
 
+function isDevInstance () {
+  return process.env.NODE_ENV === 'dev'
+}
+
+function isTestOrDevInstance () {
+  return isTestInstance() || isDevInstance()
+}
+
 function isProdInstance () {
   return process.env.NODE_ENV === 'production'
 }
@@ -270,6 +278,7 @@ const pipelinePromise = promisify(pipeline)
 
 export {
   isTestInstance,
+  isTestOrDevInstance,
   isProdInstance,
   getAppNumber,
 
index 9d823299fea1db78131676ae4c29ad2ff5e413cc..ff15f115f8d81145049083f7179f9b295ab3f243 100644 (file)
@@ -1,6 +1,6 @@
 import validator from 'validator'
 import { CONSTRAINTS_FIELDS } from '../../../initializers/constants'
-import { isTestInstance } from '../../core-utils'
+import { isTestOrDevInstance } from '../../core-utils'
 import { exists } from '../misc'
 
 function isUrlValid (url: string) {
@@ -13,7 +13,7 @@ function isUrlValid (url: string) {
   }
 
   // We validate 'localhost', so we don't have the top level domain
-  if (isTestInstance()) {
+  if (isTestOrDevInstance()) {
     isURLOptions.require_tld = false
   }
 
index c0f8b6aebb23219e86f0932ab13a0487822eb2a9..b9f45c282de305e4a8b831bba522c2c173d33c4d 100644 (file)
@@ -1,7 +1,7 @@
 import validator from 'validator'
-import { exists, isArray } from './misc'
-import { isTestInstance } from '../core-utils'
 import { CONSTRAINTS_FIELDS } from '../../initializers/constants'
+import { isTestOrDevInstance } from '../core-utils'
+import { exists, isArray } from './misc'
 
 function isHostValid (host: string) {
   const isURLOptions = {
@@ -10,7 +10,7 @@ function isHostValid (host: string) {
   }
 
   // We validate 'localhost', so we don't have the top level domain
-  if (isTestInstance()) {
+  if (isTestOrDevInstance()) {
     isURLOptions.require_tld = false
   }
 
index f65798c420467abe55a2defb9d23dd59acfcbb6d..e542a539556368ffbab5a84d6599ceea886777c3 100644 (file)
@@ -4,7 +4,7 @@ import { URL } from 'url'
 import { getFFmpegVersion } from '@server/helpers/ffmpeg'
 import { VideoRedundancyConfigFilter } from '@shared/models/redundancy/video-redundancy-config-filter.type'
 import { RecentlyAddedStrategy } from '../../shared/models/redundancy'
-import { isProdInstance, isTestInstance, parseSemVersion } from '../helpers/core-utils'
+import { isProdInstance, parseSemVersion } from '../helpers/core-utils'
 import { isArray } from '../helpers/custom-validators/misc'
 import { logger } from '../helpers/logger'
 import { ApplicationModel, getServerActor } from '../models/application/application'
@@ -34,6 +34,9 @@ async function checkActivityPubUrls () {
 // Some checks on configuration files or throw if there is an error
 function checkConfig () {
 
+  const configFiles = config.util.getConfigSources().map(s => s.name).join(' -> ')
+  logger.info('Using following configuration file hierarchy: %s.', configFiles)
+
   // Moved configuration keys
   if (config.has('services.csp-logger')) {
     logger.warn('services.csp-logger configuration has been renamed to csp.report_uri. Please update your configuration file.')
@@ -128,7 +131,7 @@ function checkLocalRedundancyConfig () {
       }
 
       // Lifetime should not be < 10 hours
-      if (!isTestInstance() && r.minLifetime < 1000 * 3600 * 10) {
+      if (isProdInstance() && r.minLifetime < 1000 * 3600 * 10) {
         throw new Error('Video redundancy minimum lifetime should be >= 10 hours for strategy ' + r.strategy)
       }
     }
index e3683269c585b039acd0ec94d9274cacaa130151..009f878fcc4c1f4d6a312e9d9eba5a3a50479641 100644 (file)
@@ -19,7 +19,7 @@ import { NSFWPolicyType } from '../../shared/models/videos/nsfw-policy.type'
 import { VideoPlaylistPrivacy } from '../../shared/models/videos/playlist/video-playlist-privacy.model'
 import { VideoPlaylistType } from '../../shared/models/videos/playlist/video-playlist-type.model'
 // Do not use barrels, remain constants as independent as possible
-import { isTestInstance, parseDurationToMs, sanitizeHost, sanitizeUrl } from '../helpers/core-utils'
+import { isTestInstance, isTestOrDevInstance, parseDurationToMs, sanitizeHost, sanitizeUrl } from '../helpers/core-utils'
 import { CONFIG, registerConfigChangedHandler } from './config'
 
 // ---------------------------------------------------------------------------
@@ -822,57 +822,62 @@ const STATS_TIMESERIE = {
 // ---------------------------------------------------------------------------
 
 // Special constants for a test instance
-if (isTestInstance() === true && process.env.PRODUCTION_CONSTANTS !== 'true') {
-  PRIVATE_RSA_KEY_SIZE = 1024
+if (process.env.PRODUCTION_CONSTANTS !== 'true') {
+  if (isTestOrDevInstance()) {
+    PRIVATE_RSA_KEY_SIZE = 1024
 
-  ACTOR_FOLLOW_SCORE.BASE = 20
+    ACTOR_FOLLOW_SCORE.BASE = 20
 
-  REMOTE_SCHEME.HTTP = 'http'
-  REMOTE_SCHEME.WS = 'ws'
+    REMOTE_SCHEME.HTTP = 'http'
+    REMOTE_SCHEME.WS = 'ws'
 
-  STATIC_MAX_AGE.SERVER = '0'
+    STATIC_MAX_AGE.SERVER = '0'
 
-  ACTIVITY_PUB.COLLECTION_ITEMS_PER_PAGE = 2
-  ACTIVITY_PUB.ACTOR_REFRESH_INTERVAL = 10 * 1000 // 10 seconds
-  ACTIVITY_PUB.VIDEO_REFRESH_INTERVAL = 10 * 1000 // 10 seconds
-  ACTIVITY_PUB.VIDEO_PLAYLIST_REFRESH_INTERVAL = 10 * 1000 // 10 seconds
+    SCHEDULER_INTERVALS_MS.ACTOR_FOLLOW_SCORES = 1000
+    SCHEDULER_INTERVALS_MS.REMOVE_OLD_JOBS = 10000
+    SCHEDULER_INTERVALS_MS.REMOVE_OLD_HISTORY = 5000
+    SCHEDULER_INTERVALS_MS.REMOVE_OLD_VIEWS = 5000
+    SCHEDULER_INTERVALS_MS.UPDATE_VIDEOS = 5000
+    SCHEDULER_INTERVALS_MS.AUTO_FOLLOW_INDEX_INSTANCES = 5000
+    SCHEDULER_INTERVALS_MS.UPDATE_INBOX_STATS = 5000
+    SCHEDULER_INTERVALS_MS.CHECK_PEERTUBE_VERSION = 2000
 
-  CONSTRAINTS_FIELDS.ACTORS.IMAGE.FILE_SIZE.max = 100 * 1024 // 100KB
-  CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max = 400 * 1024 // 400KB
+    REPEAT_JOBS['videos-views-stats'] = { every: 5000 }
 
-  SCHEDULER_INTERVALS_MS.ACTOR_FOLLOW_SCORES = 1000
-  SCHEDULER_INTERVALS_MS.REMOVE_OLD_JOBS = 10000
-  SCHEDULER_INTERVALS_MS.REMOVE_OLD_HISTORY = 5000
-  SCHEDULER_INTERVALS_MS.REMOVE_OLD_VIEWS = 5000
-  SCHEDULER_INTERVALS_MS.UPDATE_VIDEOS = 5000
-  SCHEDULER_INTERVALS_MS.AUTO_FOLLOW_INDEX_INSTANCES = 5000
-  SCHEDULER_INTERVALS_MS.UPDATE_INBOX_STATS = 5000
-  SCHEDULER_INTERVALS_MS.CHECK_PEERTUBE_VERSION = 2000
+    REPEAT_JOBS['activitypub-cleaner'] = { every: 5000 }
+    AP_CLEANER.PERIOD = 5000
 
-  REPEAT_JOBS['videos-views-stats'] = { every: 5000 }
+    REDUNDANCY.VIDEOS.RANDOMIZED_FACTOR = 1
 
-  REPEAT_JOBS['activitypub-cleaner'] = { every: 5000 }
-  AP_CLEANER.PERIOD = 5000
+    CONTACT_FORM_LIFETIME = 1000 // 1 second
 
-  REDUNDANCY.VIDEOS.RANDOMIZED_FACTOR = 1
+    JOB_ATTEMPTS['email'] = 1
 
-  VIEW_LIFETIME.VIEWER_COUNTER = 1000 * 5 // 5 second
-  VIEW_LIFETIME.VIEWER_STATS = 1000 * 5 // 5 second
-  CONTACT_FORM_LIFETIME = 1000 // 1 second
+    FILES_CACHE.VIDEO_CAPTIONS.MAX_AGE = 3000
+    MEMOIZE_TTL.OVERVIEWS_SAMPLE = 3000
+    MEMOIZE_TTL.LIVE_ABLE_TO_UPLOAD = 3000
+    OVERVIEWS.VIDEOS.SAMPLE_THRESHOLD = 2
 
-  JOB_ATTEMPTS['email'] = 1
+    PLUGIN_EXTERNAL_AUTH_TOKEN_LIFETIME = 5000
+  }
+
+  if (isTestInstance()) {
+    ACTIVITY_PUB.COLLECTION_ITEMS_PER_PAGE = 2
+    ACTIVITY_PUB.ACTOR_REFRESH_INTERVAL = 10 * 1000 // 10 seconds
+    ACTIVITY_PUB.VIDEO_REFRESH_INTERVAL = 10 * 1000 // 10 seconds
+    ACTIVITY_PUB.VIDEO_PLAYLIST_REFRESH_INTERVAL = 10 * 1000 // 10 seconds
 
-  FILES_CACHE.VIDEO_CAPTIONS.MAX_AGE = 3000
-  MEMOIZE_TTL.OVERVIEWS_SAMPLE = 3000
-  MEMOIZE_TTL.LIVE_ABLE_TO_UPLOAD = 3000
-  OVERVIEWS.VIDEOS.SAMPLE_THRESHOLD = 2
+    CONSTRAINTS_FIELDS.ACTORS.IMAGE.FILE_SIZE.max = 100 * 1024 // 100KB
+    CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max = 400 * 1024 // 400KB
 
-  PLUGIN_EXTERNAL_AUTH_TOKEN_LIFETIME = 5000
+    VIEW_LIFETIME.VIEWER_COUNTER = 1000 * 5 // 5 second
+    VIEW_LIFETIME.VIEWER_STATS = 1000 * 5 // 5 second
 
-  VIDEO_LIVE.CLEANUP_DELAY = getIntEnv('PEERTUBE_TEST_CONSTANTS_VIDEO_LIVE_CLEANUP_DELAY') ?? 5000
-  VIDEO_LIVE.SEGMENT_TIME_SECONDS.DEFAULT_LATENCY = 2
-  VIDEO_LIVE.SEGMENT_TIME_SECONDS.SMALL_LATENCY = 1
-  VIDEO_LIVE.EDGE_LIVE_DELAY_SEGMENTS_NOTIFICATION = 1
+    VIDEO_LIVE.CLEANUP_DELAY = getIntEnv('PEERTUBE_TEST_CONSTANTS_VIDEO_LIVE_CLEANUP_DELAY') ?? 5000
+    VIDEO_LIVE.SEGMENT_TIME_SECONDS.DEFAULT_LATENCY = 2
+    VIDEO_LIVE.SEGMENT_TIME_SECONDS.SMALL_LATENCY = 1
+    VIDEO_LIVE.EDGE_LIVE_DELAY_SEGMENTS_NOTIFICATION = 1
+  }
 }
 
 updateWebserverUrls()
index 09786a91f7e6a64af63475268e3dcbbf072bc2a6..91286241bd475ff3603ed59f4f54798708e61eaa 100644 (file)
@@ -8,9 +8,10 @@ import { UserNotificationModel } from '@server/models/user/user-notification'
 import { UserVideoHistoryModel } from '@server/models/user/user-video-history'
 import { VideoJobInfoModel } from '@server/models/video/video-job-info'
 import { VideoLiveSessionModel } from '@server/models/video/video-live-session'
+import { VideoSourceModel } from '@server/models/video/video-source'
 import { LocalVideoViewerModel } from '@server/models/view/local-video-viewer'
 import { LocalVideoViewerWatchSectionModel } from '@server/models/view/local-video-viewer-watch-section'
-import { isTestInstance } from '../helpers/core-utils'
+import { isTestOrDevInstance } from '../helpers/core-utils'
 import { logger } from '../helpers/logger'
 import { AbuseModel } from '../models/abuse/abuse'
 import { AbuseMessageModel } from '../models/abuse/abuse-message'
@@ -49,7 +50,6 @@ import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-pla
 import { VideoTagModel } from '../models/video/video-tag'
 import { VideoViewModel } from '../models/view/video-view'
 import { CONFIG } from './config'
-import { VideoSourceModel } from '@server/models/video/video-source'
 
 require('pg').defaults.parseInt8 = true // Avoid BIGINT to be converted to string
 
@@ -81,13 +81,13 @@ const sequelizeTypescript = new SequelizeTypescript({
   pool: {
     max: poolMax
   },
-  benchmark: isTestInstance(),
+  benchmark: isTestOrDevInstance(),
   isolationLevel: Transaction.ISOLATION_LEVELS.SERIALIZABLE,
   logging: (message: string, benchmark: number) => {
     if (process.env.NODE_DB_LOG === 'false') return
 
     let newMessage = 'Executed SQL request'
-    if (isTestInstance() === true && benchmark !== undefined) {
+    if (isTestOrDevInstance() === true && benchmark !== undefined) {
       newMessage += ' in ' + benchmark + 'ms'
     }
 
index 1e8d030230cd18e90a271a7c6b0e55aeb5873052..899d80c15e4ecd3fe873f43a8ca4a4e1b7c157f0 100644 (file)
@@ -2,6 +2,7 @@ import express from 'express'
 import { readFile } from 'fs-extra'
 import { join } from 'path'
 import validator from 'validator'
+import { isTestOrDevInstance } from '@server/helpers/core-utils'
 import { toCompleteUUID } from '@server/helpers/custom-validators/misc'
 import { mdToOneLinePlainText } from '@server/helpers/markdown'
 import { ActorImageModel } from '@server/models/actor/actor-image'
@@ -30,7 +31,6 @@ import { MAccountActor, MChannelActor } from '../types/models'
 import { getActivityStreamDuration } from './activitypub/activity'
 import { getBiggestActorImage } from './actor-image'
 import { ServerConfigManager } from './server-config-manager'
-import { isTestInstance } from '@server/helpers/core-utils'
 
 type Tags = {
   ogType: string
@@ -234,7 +234,7 @@ class ClientHtml {
     const path = ClientHtml.getEmbedPath()
 
     // Disable HTML cache in dev mode because webpack can regenerate JS files
-    if (!isTestInstance() && ClientHtml.htmlCache[path]) {
+    if (!isTestOrDevInstance() && ClientHtml.htmlCache[path]) {
       return ClientHtml.htmlCache[path]
     }
 
index edc99057ca9e76f69180e5429f3575f5f42b7b60..42d7650ddb76c8e60b8ba15226ca99e868385623 100644 (file)
@@ -2,10 +2,10 @@ import { readFileSync } from 'fs-extra'
 import { isArray, merge } from 'lodash'
 import { createTransport, Transporter } from 'nodemailer'
 import { join } from 'path'
+import { root } from '@shared/core-utils'
 import { EmailPayload } from '@shared/models'
 import { SendEmailDefaultOptions } from '../../shared/models/server/emailer.model'
-import { isTestInstance } from '../helpers/core-utils'
-import { root } from '@shared/core-utils'
+import { isTestOrDevInstance } from '../helpers/core-utils'
 import { bunyanLogger, logger } from '../helpers/logger'
 import { CONFIG, isEmailEnabled } from '../initializers/config'
 import { WEBSERVER } from '../initializers/constants'
@@ -29,7 +29,7 @@ class Emailer {
     this.initialized = true
 
     if (!isEmailEnabled()) {
-      if (!isTestInstance()) {
+      if (!isTestOrDevInstance()) {
         logger.error('Cannot use SMTP server because of lack of configuration. PeerTube will not be able to send mails!')
       }
 
index 689a5a3b4f05692743dcb0c5e83e3e8bb9383cb1..c9aa218e54a48723eead0de8c846d9df897a8837 100644 (file)
@@ -1,5 +1,5 @@
 import { VideoViewModel } from '@server/models/view/video-view'
-import { isTestInstance } from '../../../helpers/core-utils'
+import { isTestOrDevInstance } from '../../../helpers/core-utils'
 import { logger } from '../../../helpers/logger'
 import { VideoModel } from '../../../models/video/video'
 import { Redis } from '../../redis'
@@ -8,7 +8,7 @@ async function processVideosViewsStats () {
   const lastHour = new Date()
 
   // In test mode, we run this function multiple times per hour, so we don't want the values of the previous hour
-  if (!isTestInstance()) lastHour.setHours(lastHour.getHours() - 1)
+  if (!isTestOrDevInstance()) lastHour.setHours(lastHour.getHours() - 1)
 
   const hour = lastHour.getHours()
   const startDate = lastHour.setMinutes(0, 0, 0)
index 560f97f3ee3d6e41d2453b54990500cd563d42c0..e1c56c135d0fce1caf7da1ad4b816996efc6942d 100644 (file)
@@ -1,4 +1,4 @@
-import { isTestInstance } from '../../helpers/core-utils'
+import { isTestOrDevInstance } from '../../helpers/core-utils'
 import { logger } from '../../helpers/logger'
 import { ACTOR_FOLLOW_SCORE, SCHEDULER_INTERVALS_MS } from '../../initializers/constants'
 import { ActorFollowModel } from '../../models/actor/actor-follow'
@@ -39,7 +39,7 @@ export class ActorFollowScheduler extends AbstractScheduler {
   }
 
   private async removeBadActorFollows () {
-    if (!isTestInstance()) logger.info('Removing bad actor follows (scheduler).')
+    if (!isTestOrDevInstance()) logger.info('Removing bad actor follows (scheduler).')
 
     try {
       await ActorFollowModel.removeBadActorFollows()
index dffef3542ec35542353b4652956540a47333303f..879846999dc9383b6d27fa57238b646eabdf2097 100644 (file)
@@ -1,8 +1,8 @@
-import { isTestInstance } from '../../helpers/core-utils'
+import { isTestOrDevInstance } from '../../helpers/core-utils'
 import { logger } from '../../helpers/logger'
+import { SCHEDULER_INTERVALS_MS } from '../../initializers/constants'
 import { JobQueue } from '../job-queue'
 import { AbstractScheduler } from './abstract-scheduler'
-import { SCHEDULER_INTERVALS_MS } from '../../initializers/constants'
 
 export class RemoveOldJobsScheduler extends AbstractScheduler {
 
@@ -15,7 +15,7 @@ export class RemoveOldJobsScheduler extends AbstractScheduler {
   }
 
   protected internalExecute () {
-    if (!isTestInstance()) logger.info('Removing old jobs in scheduler.')
+    if (!isTestOrDevInstance()) logger.info('Removing old jobs in scheduler.')
 
     return JobQueue.Instance.removeOldJobs()
   }
index cf3fa5882ee49542ad0d39a5a1349979a11f1966..f851ce0505f90f9583185c9beb5157b0065ecad0 100644 (file)
@@ -1,4 +1,4 @@
-import { isTestInstance } from '@server/helpers/core-utils'
+import { isTestOrDevInstance } from '@server/helpers/core-utils'
 import { logger, loggerTagsFactory } from '@server/helpers/logger'
 import { VIEW_LIFETIME } from '@server/initializers/constants'
 import { sendView } from '@server/lib/activitypub/send/send-view'
@@ -117,7 +117,7 @@ export class VideoViewerCounters {
     if (this.processingViewerCounters) return
     this.processingViewerCounters = true
 
-    if (!isTestInstance()) logger.info('Cleaning video viewers.', lTags())
+    if (!isTestOrDevInstance()) logger.info('Cleaning video viewers.', lTags())
 
     try {
       for (const videoId of this.viewersPerVideo.keys()) {
index a56c205590711cfded6fecf32d42c7af2a2458ea..542bd51cfc6a65a5a0c5c052c767c90c2e65925b 100644 (file)
@@ -1,5 +1,5 @@
 import { Transaction } from 'sequelize/types'
-import { isTestInstance } from '@server/helpers/core-utils'
+import { isTestOrDevInstance } from '@server/helpers/core-utils'
 import { GeoIP } from '@server/helpers/geo-ip'
 import { logger, loggerTagsFactory } from '@server/helpers/logger'
 import { MAX_LOCAL_VIEWER_WATCH_SECTIONS, VIEW_LIFETIME } from '@server/initializers/constants'
@@ -118,7 +118,7 @@ export class VideoViewerStats {
     if (this.processingViewersStats) return
     this.processingViewersStats = true
 
-    if (!isTestInstance()) logger.info('Processing viewer statistics.', lTags())
+    if (!isTestOrDevInstance()) logger.info('Processing viewer statistics.', lTags())
 
     const now = new Date().getTime()
 
index df4cefe2815fb96d59952b562bf1694fd66c607c..86d2d6228d4c9db1c5ffd837d5b62615d606e661 100644 (file)
@@ -1,12 +1,13 @@
 import express from 'express'
 import { body, param, query } from 'express-validator'
+import { isProdInstance } from '@server/helpers/core-utils'
 import { isEachUniqueHandleValid, isFollowStateValid, isRemoteHandleValid } from '@server/helpers/custom-validators/follows'
 import { loadActorUrlOrGetFromWebfinger } from '@server/lib/activitypub/actors'
 import { getRemoteNameAndHost } from '@server/lib/activitypub/follow'
 import { getServerActor } from '@server/models/application/application'
 import { MActorFollowActorsDefault } from '@server/types/models'
+import { ServerFollowCreate } from '@shared/models'
 import { HttpStatusCode } from '../../../shared/models/http/http-error-codes'
-import { isTestInstance } from '../../helpers/core-utils'
 import { isActorTypeValid, isValidActorHandle } from '../../helpers/custom-validators/activitypub/actor'
 import { isEachUniqueHostValid, isHostValid } from '../../helpers/custom-validators/servers'
 import { logger } from '../../helpers/logger'
@@ -14,7 +15,6 @@ import { WEBSERVER } from '../../initializers/constants'
 import { ActorModel } from '../../models/actor/actor'
 import { ActorFollowModel } from '../../models/actor/actor-follow'
 import { areValidationErrors } from './shared'
-import { ServerFollowCreate } from '@shared/models'
 
 const listFollowsValidator = [
   query('state')
@@ -42,7 +42,7 @@ const followValidator = [
 
   (req: express.Request, res: express.Response, next: express.NextFunction) => {
     // Force https if the administrator wants to follow remote actors
-    if (isTestInstance() === false && WEBSERVER.SCHEME === 'http') {
+    if (isProdInstance() && WEBSERVER.SCHEME === 'http') {
       return res
         .status(HttpStatusCode.INTERNAL_SERVER_ERROR_500)
         .json({
index fc1a294e0898ef56cac18ef8970579996f9e3760..8e7b44a86adeded2286efa6e51cc14582271a23a 100644 (file)
@@ -5,7 +5,7 @@ import { loadVideo } from '@server/lib/model-loaders'
 import { VideoPlaylistModel } from '@server/models/video/video-playlist'
 import { VideoPlaylistPrivacy, VideoPrivacy } from '@shared/models'
 import { HttpStatusCode } from '../../../shared/models/http/http-error-codes'
-import { isTestInstance } from '../../helpers/core-utils'
+import { isTestOrDevInstance } from '../../helpers/core-utils'
 import { isIdOrUUIDValid, isUUIDValid, toCompleteUUID } from '../../helpers/custom-validators/misc'
 import { logger } from '../../helpers/logger'
 import { WEBSERVER } from '../../initializers/constants'
@@ -34,7 +34,7 @@ const isURLOptions = {
 }
 
 // We validate 'localhost', so we don't have the top level domain
-if (isTestInstance()) {
+if (isTestOrDevInstance()) {
   isURLOptions.require_tld = false
 }
 
index e460f214e2098c343a1e2068183f30107c7288a2..e567e6c1b352b689ee9ab6d1189067ebe6bc0c84 100644 (file)
@@ -1036,7 +1036,7 @@ $ npm run setup:cli
  * Run PeerTube (you can access to your instance on http://localhost:9000):
 
 ```
-$ NODE_ENV=test npm start
+$ NODE_ENV=dev npm start
 ```
 
  * Register the instance via the CLI: