]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/initializers/installer.js
Server: add unique to unique indexes
[github/Chocobozzz/PeerTube.git] / server / initializers / installer.js
CommitLineData
37dc07b2
C
1'use strict'
2
37dc07b2 3const config = require('config')
1a42c9e2 4const each = require('async/each')
37dc07b2 5const mkdirp = require('mkdirp')
bb1e6d0c 6const passwordGenerator = require('password-generator')
37dc07b2 7const path = require('path')
1a42c9e2 8const series = require('async/series')
37dc07b2
C
9
10const checker = require('./checker')
9bd26629 11const constants = require('./constants')
feb4bdfd 12const db = require('./database')
37dc07b2 13const logger = require('../helpers/logger')
5f698b82 14const peertubeCrypto = require('../helpers/peertube-crypto')
69b0a27c 15
37dc07b2 16const installer = {
c4403b29 17 installApplication
37dc07b2
C
18}
19
20function installApplication (callback) {
1a42c9e2 21 series([
feb4bdfd
C
22 function createDatabase (callbackAsync) {
23 db.sequelize.sync().asCallback(callbackAsync)
24 // db.sequelize.sync({ force: true }).asCallback(callbackAsync)
25 },
26
cefc718d
C
27 function createDirectories (callbackAsync) {
28 createDirectoriesIfNotExist(callbackAsync)
29 },
30
31 function createCertificates (callbackAsync) {
32 peertubeCrypto.createCertsIfNotExist(callbackAsync)
33 },
34
35 function createOAuthClient (callbackAsync) {
36 createOAuthClientIfNotExist(callbackAsync)
37 },
38
39 function createOAuthUser (callbackAsync) {
9bd26629 40 createOAuthAdminIfNotExist(callbackAsync)
cefc718d
C
41 }
42 ], callback)
37dc07b2
C
43}
44
45// ---------------------------------------------------------------------------
46
47module.exports = installer
48
49// ---------------------------------------------------------------------------
50
51function createDirectoriesIfNotExist (callback) {
52 const storages = config.get('storage')
53
1a42c9e2 54 each(Object.keys(storages), function (key, callbackEach) {
37dc07b2
C
55 const dir = storages[key]
56 mkdirp(path.join(__dirname, '..', '..', dir), callbackEach)
57 }, callback)
58}
59
60function createOAuthClientIfNotExist (callback) {
61 checker.clientsExist(function (err, exist) {
62 if (err) return callback(err)
63
64 // Nothing to do, clients already exist
65 if (exist === true) return callback(null)
66
67 logger.info('Creating a default OAuth Client.')
68
feb4bdfd
C
69 const id = passwordGenerator(32, false, /[a-z0-9]/)
70 const secret = passwordGenerator(32, false, /[a-zA-Z0-9]/)
71 const client = db.OAuthClient.build({
72 clientId: id,
69b0a27c 73 clientSecret: secret,
2f372a86 74 grants: [ 'password', 'refresh_token' ]
69b0a27c
C
75 })
76
feb4bdfd 77 client.save().asCallback(function (err, createdClient) {
37dc07b2
C
78 if (err) return callback(err)
79
feb4bdfd 80 logger.info('Client id: ' + createdClient.clientId)
69b0a27c 81 logger.info('Client secret: ' + createdClient.clientSecret)
37dc07b2
C
82
83 return callback(null)
84 })
85 })
86}
87
9bd26629 88function createOAuthAdminIfNotExist (callback) {
37dc07b2
C
89 checker.usersExist(function (err, exist) {
90 if (err) return callback(err)
91
92 // Nothing to do, users already exist
93 if (exist === true) return callback(null)
94
95 logger.info('Creating the administrator.')
96
bb1e6d0c 97 const username = 'root'
9bd26629 98 const role = constants.USER_ROLES.ADMIN
67bf9b96 99 const createOptions = {}
d14b3e37
C
100 let password = ''
101
102 // Do not generate a random password for tests
103 if (process.env.NODE_ENV === 'test') {
104 password = 'test'
105
106 if (process.env.NODE_APP_INSTANCE) {
107 password += process.env.NODE_APP_INSTANCE
108 }
67bf9b96
C
109
110 // Our password is weak so do not validate it
111 createOptions.validate = false
d14b3e37
C
112 } else {
113 password = passwordGenerator(8, true)
114 }
37dc07b2 115
67bf9b96 116 const userData = {
c4403b29
C
117 username,
118 password,
119 role
67bf9b96 120 }
69b0a27c 121
67bf9b96 122 db.User.create(userData, createOptions).asCallback(function (err, createdUser) {
37dc07b2
C
123 if (err) return callback(err)
124
26d7d31b
C
125 logger.info('Username: ' + username)
126 logger.info('User password: ' + password)
37dc07b2 127
b769007f
C
128 logger.info('Creating Application table.')
129 db.Application.create({ migrationVersion: constants.LAST_MIGRATION_VERSION }).asCallback(callback)
37dc07b2
C
130 })
131 })
132}