New dev commands and updates

This commit is contained in:
Jori Lallo
2017-11-10 15:24:29 -08:00
parent a6f8b0b2c9
commit c33c7f04d8
10 changed files with 148 additions and 12 deletions

View File

@@ -5,6 +5,7 @@ import logger from 'koa-logger';
import mount from 'koa-mount';
import Koa from 'koa';
import bugsnag from 'bugsnag';
import updates from './utils/updates';
import api from './api';
import routes from './routes';
@@ -82,4 +83,17 @@ app.use(
})
);
/**
* Production updates and anonymous analytics.
*
* Set ENABLE_UPDATES=false to disable them for your installation
*/
if (
process.env.ENABLE_UPDATES !== 'false' &&
process.env.NODE_ENV === 'production'
) {
updates();
setInterval(updates, 24 * 3600 * 1000);
}
export default app;

View File

@@ -3,7 +3,7 @@ import Sequelize from 'sequelize';
import EncryptedField from 'sequelize-encrypted';
import debug from 'debug';
const secretKey = process.env.SEQUELIZE_SECRET;
const secretKey = process.env.SECRET_KEY;
export const encryptedFields = EncryptedField(Sequelize, secretKey);

71
server/utils/updates.js Normal file
View File

@@ -0,0 +1,71 @@
// @flow
import crypto from 'crypto';
import invariant from 'invariant';
import fetch from 'isomorphic-fetch';
import { client } from '../redis';
import packageInfo from '../../package.json';
import { User, Team, Collection, Document } from '../models';
const UPDATES_URL = 'https://updates.getoutline.com';
const UPDATES_KEY = 'UPDATES_KEY';
export default async () => {
invariant(
process.env.SECRET_KEY && process.env.URL,
'SECRET_KEY or URL env var is not set'
);
const secret = process.env.SECRET_KEY.slice(0, 6) + process.env.URL;
const id = crypto.createHash('sha256').update(secret).digest('hex');
const [
userCount,
teamCount,
collectionCount,
documentCount,
] = await Promise.all([
User.count(),
Team.count(),
Collection.count(),
Document.count(),
]);
const body = JSON.stringify({
id,
version: 1,
clientVersion: packageInfo.version,
analytics: {
userCount,
teamCount,
collectionCount,
documentCount,
},
});
await client.del('UPDATES_KEY');
try {
const response = await fetch(UPDATES_URL, {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body,
});
const data = await response.json();
if (data.severity) {
await client.set(
UPDATES_KEY,
JSON.stringify({
severity: data.severity,
message: data.message,
url: data.url,
})
);
}
} catch (_e) {
// no-op
}
};