Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wiki-js
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
wiki-js
Commits
749766e9
You need to sign in or sign up before continuing.
Commit
749766e9
authored
Aug 02, 2017
by
NGPixel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: queue handling
parent
2020e457
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
236 additions
and
144 deletions
+236
-144
config.sample.yml
config.sample.yml
+10
-1
data.yml
server/app/data.yml
+6
-0
index.js
server/index.js
+15
-6
master.js
server/master.js
+7
-4
auth.js
server/modules/auth.js
+73
-71
config.js
server/modules/config.js
+0
-3
db.js
server/modules/db.js
+26
-6
documents.js
server/modules/documents.js
+1
-1
queue.js
server/modules/queue.js
+37
-0
redis.js
server/modules/redis.js
+5
-1
git-sync.js
server/queues/git-sync.js
+3
-0
upl-clear-temp.js
server/queues/upl-clear-temp.js
+3
-0
worker.js
server/worker.js
+50
-51
No files found.
config.sample.yml
View file @
749766e9
...
@@ -42,6 +42,15 @@ redis:
...
@@ -42,6 +42,15 @@ redis:
# ---------------------------------------------------------------------
# ---------------------------------------------------------------------
# Background Workers
# Background Workers
# ---------------------------------------------------------------------
# ---------------------------------------------------------------------
# Leave 0 for auto based on CPU cores
# Leave 0 for auto based on CPU cores
workers
:
0
workers
:
0
# ---------------------------------------------------------------------
# High Availability
# ---------------------------------------------------------------------
# Read the docs BEFORE changing these settings!
ha
:
nodeuid
:
primary
readonly
:
false
server/app/data.yml
View file @
749766e9
...
@@ -21,6 +21,12 @@ defaults:
...
@@ -21,6 +21,12 @@ defaults:
db
:
0
db
:
0
password
:
null
password
:
null
workers
:
0
workers
:
0
ha
:
nodeuid
:
primary
readonly
:
false
queues
:
-
gitSync
-
uplClearTemp
authProviders
:
authProviders
:
-
local
-
local
-
microsoft
-
microsoft
...
...
server/index.js
View file @
749766e9
...
@@ -48,18 +48,27 @@ if (numWorkers > numCPUs) {
...
@@ -48,18 +48,27 @@ if (numWorkers > numCPUs) {
}
}
if
(
cluster
.
isMaster
)
{
if
(
cluster
.
isMaster
)
{
wiki
.
logger
.
info
(
'--------------------------'
)
wiki
.
logger
.
info
(
'Wiki.js is initializing...'
)
wiki
.
logger
.
info
(
'Wiki.js is initializing...'
)
wiki
.
logger
.
info
(
'--------------------------'
)
require
(
'./master'
)
require
(
'./master'
).
then
(()
=>
{
// -> Create background workers
for
(
let
i
=
0
;
i
<
numWorkers
;
i
++
)
{
cluster
.
fork
()
}
for
(
let
i
=
0
;
i
<
numWorkers
;
i
++
)
{
// -> Queue post-init tasks
cluster
.
fork
()
}
wiki
.
queue
.
uplClearTemp
.
add
({},
{
repeat
:
{
cron
:
'*/15 * * * *'
}
})
})
cluster
.
on
(
'exit'
,
(
worker
,
code
,
signal
)
=>
{
cluster
.
on
(
'exit'
,
(
worker
,
code
,
signal
)
=>
{
wiki
.
logger
.
info
(
`
Worker #
${
worker
.
id
}
di
ed.`
)
wiki
.
logger
.
info
(
`
Background Worker #
${
worker
.
id
}
was terminat
ed.`
)
})
})
}
else
{
}
else
{
wiki
.
logger
.
info
(
`Background Worker #
${
cluster
.
worker
.
id
}
is
start
ing...`
)
wiki
.
logger
.
info
(
`Background Worker #
${
cluster
.
worker
.
id
}
is
initializ
ing...`
)
require
(
'./worker'
)
require
(
'./worker'
)
}
}
server/master.js
View file @
749766e9
...
@@ -4,20 +4,23 @@
...
@@ -4,20 +4,23 @@
const
Promise
=
require
(
'bluebird'
)
const
Promise
=
require
(
'bluebird'
)
wiki
.
redis
=
require
(
'./modules/redis'
).
init
()
wiki
.
queue
=
require
(
'./modules/queue'
).
init
()
module
.
exports
=
Promise
.
join
(
module
.
exports
=
Promise
.
join
(
wiki
.
db
.
onReady
,
wiki
.
db
.
onReady
,
wiki
.
configSvc
.
loadFromDb
()
wiki
.
configSvc
.
loadFromDb
(),
wiki
.
queue
.
clean
()
).
then
(()
=>
{
).
then
(()
=>
{
// ----------------------------------------
// ----------------------------------------
// Load global modules
// Load global modules
// ----------------------------------------
// ----------------------------------------
wiki
.
disk
=
require
(
'./modules/disk'
).
init
()
wiki
.
disk
=
require
(
'./modules/disk'
).
init
()
wiki
.
entries
=
require
(
'./modules/entrie
s'
).
init
()
wiki
.
docs
=
require
(
'./modules/document
s'
).
init
()
wiki
.
git
=
require
(
'./modules/git'
).
init
(
false
)
wiki
.
git
=
require
(
'./modules/git'
).
init
(
false
)
wiki
.
lang
=
require
(
'i18next'
)
wiki
.
lang
=
require
(
'i18next'
)
wiki
.
mark
=
require
(
'./modules/markdown'
)
wiki
.
mark
=
require
(
'./modules/markdown'
)
wiki
.
redis
=
require
(
'./modules/redis'
).
init
()
wiki
.
search
=
require
(
'./modules/search'
).
init
()
wiki
.
search
=
require
(
'./modules/search'
).
init
()
wiki
.
upl
=
require
(
'./modules/uploads'
).
init
()
wiki
.
upl
=
require
(
'./modules/uploads'
).
init
()
...
@@ -75,7 +78,7 @@ module.exports = Promise.join(
...
@@ -75,7 +78,7 @@ module.exports = Promise.join(
// Passport Authentication
// Passport Authentication
// ----------------------------------------
// ----------------------------------------
require
(
'./modules/auth'
)(
passport
)
require
(
'./modules/auth'
)
.
init
(
passport
)
wiki
.
rights
=
require
(
'./modules/rights'
)
wiki
.
rights
=
require
(
'./modules/rights'
)
// wiki.rights.init()
// wiki.rights.init()
...
...
server/modules/auth.js
View file @
749766e9
...
@@ -4,87 +4,89 @@
...
@@ -4,87 +4,89 @@
const
_
=
require
(
'lodash'
)
const
_
=
require
(
'lodash'
)
module
.
exports
=
(
passport
)
=>
{
module
.
exports
=
{
init
(
passport
)
{
// Serialization user methods
// Serialization user methods
passport
.
serializeUser
(
function
(
user
,
done
)
{
passport
.
serializeUser
(
function
(
user
,
done
)
{
done
(
null
,
user
.
_id
)
done
(
null
,
user
.
_id
)
})
})
passport
.
deserializeUser
(
function
(
id
,
done
)
{
passport
.
deserializeUser
(
function
(
id
,
done
)
{
wiki
.
db
.
User
.
findById
(
id
).
then
((
user
)
=>
{
wiki
.
db
.
User
.
findById
(
id
).
then
((
user
)
=>
{
if
(
user
)
{
if
(
user
)
{
done
(
null
,
user
)
done
(
null
,
user
)
}
else
{
}
else
{
done
(
new
Error
(
wiki
.
lang
.
t
(
'auth:errors:usernotfound'
)),
null
)
done
(
new
Error
(
wiki
.
lang
.
t
(
'auth:errors:usernotfound'
)),
null
)
}
}
return
true
return
true
}).
catch
((
err
)
=>
{
}).
catch
((
err
)
=>
{
done
(
err
,
null
)
done
(
err
,
null
)
})
})
})
})
// Load authentication strategies
// Load authentication strategies
wiki
.
config
.
authStrategies
=
{
wiki
.
config
.
authStrategies
=
{
list
:
_
.
pickBy
(
wiki
.
config
.
auth
,
strategy
=>
strategy
.
enabled
),
list
:
_
.
pickBy
(
wiki
.
config
.
auth
,
strategy
=>
strategy
.
enabled
),
socialEnabled
:
(
_
.
chain
(
wiki
.
config
.
auth
).
omit
(
'local'
).
filter
([
'enabled'
,
true
]).
value
().
length
>
0
)
socialEnabled
:
(
_
.
chain
(
wiki
.
config
.
auth
).
omit
(
'local'
).
filter
([
'enabled'
,
true
]).
value
().
length
>
0
)
}
}
_
.
forOwn
(
wiki
.
config
.
authStrategies
.
list
,
(
strategyConfig
,
strategyName
)
=>
{
_
.
forOwn
(
wiki
.
config
.
authStrategies
.
list
,
(
strategyConfig
,
strategyName
)
=>
{
strategyConfig
.
callbackURL
=
`
${
wiki
.
config
.
site
.
host
}
/login/
${
strategyName
}
/callback`
strategyConfig
.
callbackURL
=
`
${
wiki
.
config
.
site
.
host
}
/login/
${
strategyName
}
/callback`
require
(
`../authentication/
${
strategyName
}
`
)(
passport
,
strategyConfig
)
require
(
`../authentication/
${
strategyName
}
`
)(
passport
,
strategyConfig
)
wiki
.
logger
.
info
(
`Authentication Provider
${
_
.
upperFirst
(
strategyName
)}
: OK`
)
wiki
.
logger
.
info
(
`Authentication Provider
${
_
.
upperFirst
(
strategyName
)}
: OK`
)
})
})
// Create Guest account for first-time
// Create Guest account for first-time
return
wiki
.
db
.
User
.
findOne
({
return
wiki
.
db
.
User
.
findOne
({
where
:
{
where
:
{
provider
:
'local'
,
email
:
'guest@example.com'
}
}).
then
((
c
)
=>
{
if
(
c
<
1
)
{
return
wiki
.
db
.
User
.
create
({
provider
:
'local'
,
provider
:
'local'
,
email
:
'guest@example.com'
,
email
:
'guest@example.com'
name
:
'Guest'
,
}
password
:
''
,
}).
then
((
c
)
=>
{
role
:
'guest'
if
(
c
<
1
)
{
}).
then
(()
=>
{
return
wiki
.
db
.
User
.
create
({
wiki
.
logger
.
info
(
'[AUTH] Guest account created successfully!'
)
provider
:
'local'
,
return
true
email
:
'guest@example.com'
,
}).
catch
((
err
)
=>
{
name
:
'Guest'
,
wiki
.
logger
.
error
(
'[AUTH] An error occured while creating guest account:'
)
password
:
''
,
wiki
.
logger
.
error
(
err
)
role
:
'guest'
return
err
}).
then
(()
=>
{
})
wiki
.
logger
.
info
(
'[AUTH] Guest account created successfully!'
)
}
return
true
})
}).
catch
((
err
)
=>
{
wiki
.
logger
.
error
(
'[AUTH] An error occured while creating guest account:'
)
wiki
.
logger
.
error
(
err
)
return
err
})
}
})
// .then(() => {
// .then(() => {
// if (process.env.WIKI_JS_HEROKU) {
// if (process.env.WIKI_JS_HEROKU) {
// return wiki.db.User.findOne({ provider: 'local', email: process.env.WIKI_ADMIN_EMAIL }).then((c) => {
// return wiki.db.User.findOne({ provider: 'local', email: process.env.WIKI_ADMIN_EMAIL }).then((c) => {
// if (c < 1) {
// if (c < 1) {
// // Create root admin account (HEROKU ONLY)
// // Create root admin account (HEROKU ONLY)
// return wiki.db.User.create({
// return wiki.db.User.create({
// provider: 'local',
// provider: 'local',
// email: process.env.WIKI_ADMIN_EMAIL,
// email: process.env.WIKI_ADMIN_EMAIL,
// name: 'Administrator',
// name: 'Administrator',
// password: '$2a$04$MAHRw785Xe/Jd5kcKzr3D.VRZDeomFZu2lius4gGpZZ9cJw7B7Mna', // admin123 (default)
// password: '$2a$04$MAHRw785Xe/Jd5kcKzr3D.VRZDeomFZu2lius4gGpZZ9cJw7B7Mna', // admin123 (default)
// role: 'admin'
// role: 'admin'
// }).then(() => {
// }).then(() => {
// wiki.logger.info('[AUTH] Root admin account created successfully!')
// wiki.logger.info('[AUTH] Root admin account created successfully!')
// return true
// return true
// }).catch((err) => {
// }).catch((err) => {
// wiki.logger.error('[AUTH] An error occured while creating root admin account:')
// wiki.logger.error('[AUTH] An error occured while creating root admin account:')
// wiki.logger.error(err)
// wiki.logger.error(err)
// return err
// return err
// })
// })
// } else { return true }
// } else { return true }
// })
// })
// } else { return true }
// } else { return true }
// })
// })
}
}
}
server/modules/config.js
View file @
749766e9
...
@@ -13,9 +13,6 @@ module.exports = {
...
@@ -13,9 +13,6 @@ module.exports = {
/**
/**
* Load root config from disk
* Load root config from disk
*
* @param {any} confPaths
* @returns
*/
*/
init
()
{
init
()
{
let
confPaths
=
{
let
confPaths
=
{
...
...
server/modules/db.js
View file @
749766e9
...
@@ -63,12 +63,32 @@ module.exports = {
...
@@ -63,12 +63,32 @@ module.exports = {
require
(
path
.
join
(
dbModelsPath
,
'_relations.js'
))(
self
)
require
(
path
.
join
(
dbModelsPath
,
'_relations.js'
))(
self
)
// Sync DB
// Set init tasks
self
.
onReady
=
(
wiki
.
IS_MASTER
)
?
self
.
inst
.
sync
({
let
initTasks
=
{
force
:
false
,
// -> Sync DB Schemas
logging
:
false
syncSchemas
()
{
})
:
Promise
.
resolve
()
return
self
.
inst
.
sync
({
force
:
false
,
logging
:
false
})
},
// -> Set Connection App Name
setAppName
()
{
return
self
.
inst
.
query
(
`set application_name = 'Wiki.js'`
,
{
raw
:
true
})
}
}
let
initTasksQueue
=
(
wiki
.
IS_MASTER
)
?
[
initTasks
.
syncSchemas
,
initTasks
.
setAppName
]
:
[
initTasks
.
setAppName
]
// Perform init tasks
self
.
onReady
=
Promise
.
each
(
initTasksQueue
,
t
=>
t
())
return
self
return
self
}
}
...
...
server/modules/
entrie
s.js
→
server/modules/
document
s.js
View file @
749766e9
...
@@ -10,7 +10,7 @@ const _ = require('lodash')
...
@@ -10,7 +10,7 @@ const _ = require('lodash')
const
entryHelper
=
require
(
'../helpers/entry'
)
const
entryHelper
=
require
(
'../helpers/entry'
)
/**
/**
*
Entrie
s Model
*
Document
s Model
*/
*/
module
.
exports
=
{
module
.
exports
=
{
...
...
server/modules/queue.js
0 → 100644
View file @
749766e9
'use strict'
/* global wiki */
const
Bull
=
require
(
'bull'
)
const
Promise
=
require
(
'bluebird'
)
module
.
exports
=
{
init
()
{
wiki
.
data
.
queues
.
forEach
(
queueName
=>
{
this
[
queueName
]
=
new
Bull
(
queueName
,
{
prefix
:
`q-
${
wiki
.
config
.
ha
.
nodeuid
}
`
,
redis
:
wiki
.
config
.
redis
})
})
return
this
},
clean
()
{
return
Promise
.
each
(
wiki
.
data
.
queues
,
queueName
=>
{
return
new
Promise
((
resolve
,
reject
)
=>
{
let
keyStream
=
wiki
.
redis
.
scanStream
({
match
:
`q-
${
wiki
.
config
.
ha
.
nodeuid
}
:
${
queueName
}
:*`
})
keyStream
.
on
(
'data'
,
resultKeys
=>
{
if
(
resultKeys
.
length
>
0
)
{
wiki
.
redis
.
del
(
resultKeys
)
}
})
keyStream
.
on
(
'end'
,
resolve
)
})
}).
then
(()
=>
{
wiki
.
logger
.
info
(
'Purging old queue jobs: OK'
)
}).
catch
(
err
=>
{
wiki
.
logger
.
error
(
err
)
})
}
}
server/modules/redis.js
View file @
749766e9
...
@@ -19,7 +19,11 @@ module.exports = {
...
@@ -19,7 +19,11 @@ module.exports = {
*/
*/
init
()
{
init
()
{
if
(
isPlainObject
(
wiki
.
config
.
redis
))
{
if
(
isPlainObject
(
wiki
.
config
.
redis
))
{
return
new
Redis
(
wiki
.
config
.
redis
)
let
red
=
new
Redis
(
wiki
.
config
.
redis
)
red
.
on
(
'ready'
,
()
=>
{
wiki
.
logger
.
info
(
'Redis connection: OK'
)
})
return
red
}
else
{
}
else
{
wiki
.
logger
.
error
(
'Invalid Redis configuration!'
)
wiki
.
logger
.
error
(
'Invalid Redis configuration!'
)
process
.
exit
(
1
)
process
.
exit
(
1
)
...
...
server/queues/git-sync.js
View file @
749766e9
...
@@ -61,5 +61,8 @@ module.exports = (job, done) => {
...
@@ -61,5 +61,8 @@ module.exports = (job, done) => {
})
})
return
jobCbStreamDocs
return
jobCbStreamDocs
}).
then
(()
=>
{
wiki
.
logger
.
info
(
'Git remote repository sync: DONE'
)
return
true
})
})
}
}
server/queues/upl-clear-temp.js
View file @
749766e9
...
@@ -22,5 +22,8 @@ module.exports = (job, done) => {
...
@@ -22,5 +22,8 @@ module.exports = (job, done) => {
}
}
})
})
})
})
}).
then
(()
=>
{
wiki
.
logger
.
info
(
'Purging temporary upload files: DONE'
)
return
true
})
})
}
}
server/worker.js
View file @
749766e9
...
@@ -2,69 +2,68 @@
...
@@ -2,69 +2,68 @@
/* global wiki */
/* global wiki */
const
path
=
require
(
'path'
)
const
Promise
=
require
(
'bluebird'
)
wiki
.
REPOPATH
=
path
.
resolve
(
wiki
.
ROOTPATH
,
wiki
.
config
.
paths
.
repo
)
wiki
.
DATAPATH
=
path
.
resolve
(
wiki
.
ROOTPATH
,
wiki
.
config
.
paths
.
data
)
wiki
.
UPLTEMPPATH
=
path
.
join
(
wiki
.
DATAPATH
,
'temp-upload'
)
// ----------------------------------------
module
.
exports
=
Promise
.
join
(
// Load global modules
wiki
.
db
.
onReady
,
// ----------------------------------------
wiki
.
configSvc
.
loadFromDb
([
'features'
,
'git'
,
'logging'
,
'site'
,
'uploads'
])
).
then
(()
=>
{
const
path
=
require
(
'path'
)
// wiki.upl = require('./modules/uploads-agent').init()
wiki
.
REPOPATH
=
path
.
resolve
(
wiki
.
ROOTPATH
,
wiki
.
config
.
paths
.
repo
)
// wiki.git = require('./modules/git').init()
wiki
.
DATAPATH
=
path
.
resolve
(
wiki
.
ROOTPATH
,
wiki
.
config
.
paths
.
data
)
// wiki.entries = require('./modules/entries').init()
wiki
.
UPLTEMPPATH
=
path
.
join
(
wiki
.
DATAPATH
,
'temp-upload'
)
wiki
.
lang
=
require
(
'i18next'
)
wiki
.
mark
=
require
(
'./modules/markdown'
)
// ----------------------------------------
// ----------------------------------------
// Load loc
al modules
// Load glob
al modules
// ----------------------------------------
// ----------------------------------------
const
Promise
=
require
(
'bluebird'
)
// wiki.upl = require('./modules/uploads-agent').init()
const
i18nBackend
=
require
(
'i18next-node-fs-backend'
)
// wiki.git = require('./modules/git').init()
// wiki.entries = require('./modules/entries').init()
wiki
.
lang
=
require
(
'i18next'
)
wiki
.
mark
=
require
(
'./modules/markdown'
)
// ----------------------------------------
// ----------------------------------------
// Localization Engine
// Localization Engine
// ----------------------------------------
// ----------------------------------------
wiki
.
lang
.
use
(
i18nBackend
).
init
({
const
i18nBackend
=
require
(
'i18next-node-fs-backend'
)
load
:
'languageOnly'
,
wiki
.
lang
.
use
(
i18nBackend
).
init
({
ns
:
[
'common'
,
'admin'
,
'auth'
,
'errors'
,
'git'
],
load
:
'languageOnly'
,
defaultNS
:
'common'
,
ns
:
[
'common'
,
'admin'
,
'auth'
,
'errors'
,
'git'
],
saveMissing
:
false
,
defaultNS
:
'common'
,
preload
:
[
wiki
.
config
.
lang
],
saveMissing
:
false
,
lng
:
wiki
.
config
.
lang
,
preload
:
[
wiki
.
config
.
lang
],
fallbackLng
:
'en'
,
lng
:
wiki
.
config
.
lang
,
backend
:
{
fallbackLng
:
'en'
,
loadPath
:
path
.
join
(
wiki
.
SERVERPATH
,
'locales/{{lng}}/{{ns}}.json'
)
backend
:
{
}
loadPath
:
path
.
join
(
wiki
.
SERVERPATH
,
'locales/{{lng}}/{{ns}}.json'
)
})
}
})
// ----------------------------------------
// ----------------------------------------
// Start Queues
// Start Queues
// ----------------------------------------
// ----------------------------------------
const
Bull
=
require
(
'bull'
)
const
Bull
=
require
(
'bull'
)
const
autoload
=
require
(
'auto-load'
)
const
autoload
=
require
(
'auto-load'
)
let
queues
=
autoload
(
path
.
join
(
wiki
.
SERVERPATH
,
'queues'
))
let
queues
=
autoload
(
path
.
join
(
wiki
.
SERVERPATH
,
'queues'
))
Promise
.
join
(
wiki
.
db
.
onReady
// wiki.upl.initialScan()
).
then
(()
=>
{
for
(
let
queueName
in
queues
)
{
for
(
let
queueName
in
queues
)
{
new
Bull
(
queueName
,
{
redis
:
wiki
.
config
.
redis
}).
process
(
queues
[
queueName
])
new
Bull
(
queueName
,
{
prefix
:
`q-
${
wiki
.
config
.
ha
.
nodeuid
}
`
,
redis
:
wiki
.
config
.
redis
}).
process
(
queues
[
queueName
])
}
}
})
// ----------------------------------------
// ----------------------------------------
// Shutdown gracefully
// Shutdown gracefully
// ----------------------------------------
// ----------------------------------------
process
.
on
(
'disconnect'
,
()
=>
{
process
.
on
(
'disconnect'
,
()
=>
{
wiki
.
logger
.
warn
(
'Lost connection to Master. Exiting...'
)
wiki
.
logger
.
warn
(
'Lost connection to Master. Exiting...'
)
process
.
exit
()
process
.
exit
()
})
})
})
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment