From af93cdd49fd28badfad5d6ccdaaa2fd0d7a58778 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 13 Apr 2019 19:19:32 +0900 Subject: [PATCH] =?UTF-8?q?Redis=E5=BF=85=E9=A0=88=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .config/example.yml | 8 ++++---- CHANGELOG.md | 3 ++- docs/setup.en.md | 17 ++++++----------- docs/setup.fr.md | 15 +++++---------- docs/setup.ja.md | 23 ++++++----------------- src/db/redis.ts | 4 ++-- src/server/api/limiter.ts | 6 ------ src/server/api/service/discord.ts | 10 ++-------- src/server/api/service/github.ts | 10 ++-------- src/server/api/service/twitter.ts | 10 ++-------- src/server/api/streaming.ts | 31 +++++++++++++------------------ src/services/stream.ts | 22 ++++------------------ 12 files changed, 48 insertions(+), 111 deletions(-) diff --git a/.config/example.yml b/.config/example.yml index 10239f1a7..24985fd28 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -65,10 +65,10 @@ db: # ┌─────────────────────┐ #───┘ Redis configuration └───────────────────────────────────── -#redis: -# host: localhost -# port: 6379 -# pass: example-pass +redis: + host: localhost + port: 6379 + #pass: example-pass # ┌─────────────────────────────┐ #───┘ Elasticsearch configuration └───────────────────────────── diff --git a/CHANGELOG.md b/CHANGELOG.md index 314977703..a17e89ff7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,8 @@ If you encounter any problems with updating, please try the following: 11.0.0 ---------- -* データベースがMongoDBからPostgreSQLに変更されました +* **データベースがMongoDBからPostgreSQLに変更されました** +* **Redisが必須に** * アカウントを完全に削除できるように * ミュート/ブロック時にそのユーザーの投稿のウォッチをすべて解除するように * フォロー申請数が実際より1すくなくなる問題を修正 diff --git a/docs/setup.en.md b/docs/setup.en.md index 2e1706de3..45e3e2c68 100644 --- a/docs/setup.en.md +++ b/docs/setup.en.md @@ -24,18 +24,13 @@ Please install and setup these softwares: #### Dependencies :package: * **[Node.js](https://nodejs.org/en/)** >= 11.7.0 * **[PostgreSQL](https://www.postgresql.org/)** >= 10 +* **[Redis](https://redis.io/)** ##### Optional -* [Redis](https://redis.io/) - * Redis is optional, but we strongly recommended to install it * [Elasticsearch](https://www.elastic.co/) - required to enable the search feature * [FFmpeg](https://www.ffmpeg.org/) -*3.* Setup PostgreSQL ----------------------------------------------------------------- -:) - -*4.* Install Misskey +*3.* Install Misskey ---------------------------------------------------------------- 1. `su - misskey` Connect to misskey user. 2. `git clone -b master git://github.com/syuilo/misskey.git` Clone the misskey repo from master branch. @@ -43,12 +38,12 @@ Please install and setup these softwares: 4. `git checkout $(git tag -l | grep -Ev -- '-(rc|alpha)\.[0-9]+$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) 5. `npm install` Install misskey dependencies. -*5.* Configure Misskey +*4.* Configure Misskey ---------------------------------------------------------------- 1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`. 2. Edit `default.yml` -*6.* Build Misskey +*5.* Build Misskey ---------------------------------------------------------------- Build misskey with the following: @@ -64,13 +59,13 @@ If you're still encountering errors about some modules, use node-gyp: 3. `node-gyp build` 4. `NODE_ENV=production npm run build` -*7.* Init DB +*6.* Init DB ---------------------------------------------------------------- ``` shell npm run init ``` -*8.* That is it. +*7.* That is it. ---------------------------------------------------------------- Well done! Now, you have an environment that run to Misskey. diff --git a/docs/setup.fr.md b/docs/setup.fr.md index 2f8694b9d..e6d36aeff 100644 --- a/docs/setup.fr.md +++ b/docs/setup.fr.md @@ -24,18 +24,13 @@ Installez les paquets suivants : #### Dépendences :package: * **[Node.js](https://nodejs.org/en/)** >= 11.7.0 * **[PostgreSQL](https://www.postgresql.org/)** >= 10 +* **[Redis](https://redis.io/)** ##### Optionnels -* [Redis](https://redis.io/) - * Redis est optionnel mais nous vous recommandons vivement de l'installer * [Elasticsearch](https://www.elastic.co/) - requis pour pouvoir activer la fonctionnalité de recherche * [FFmpeg](https://www.ffmpeg.org/) -*3.* Paramètrage de PostgreSQL ----------------------------------------------------------------- -:) - -*4.* Installation de Misskey +*3.* Installation de Misskey ---------------------------------------------------------------- 1. `su - misskey` Basculez vers l'utilisateur misskey. 2. `git clone -b master git://github.com/syuilo/misskey.git` Clonez la branche master du dépôt misskey. @@ -43,12 +38,12 @@ Installez les paquets suivants : 4. `git checkout $(git tag -l | grep -Ev -- '-(rc|alpha)\.[0-9]+$' | sort -V | tail -n 1)` Checkout sur le tag de la [version la plus récente](https://github.com/syuilo/misskey/releases/latest) 5. `npm install` Installez les dépendances de misskey. -*5.* Création du fichier de configuration +*4.* Création du fichier de configuration ---------------------------------------------------------------- 1. `cp .config/example.yml .config/default.yml` Copiez le fichier `.config/example.yml` et renommez-le`default.yml`. 2. Editez le fichier `default.yml` -*6.* Construction de Misskey +*5.* Construction de Misskey ---------------------------------------------------------------- Construisez Misskey comme ceci : @@ -64,7 +59,7 @@ Si vous rencontrez des erreurs concernant certains modules, utilisez node-gyp: 3. `node-gyp build` 4. `NODE_ENV=production npm run build` -*7.* C'est tout. +*6.* C'est tout. ---------------------------------------------------------------- Excellent ! Maintenant, vous avez un environnement prêt pour lancer Misskey diff --git a/docs/setup.ja.md b/docs/setup.ja.md index f636a7418..1b1730b69 100644 --- a/docs/setup.ja.md +++ b/docs/setup.ja.md @@ -24,25 +24,14 @@ adduser --disabled-password --disabled-login misskey #### 依存関係 :package: * **[Node.js](https://nodejs.org/en/)** (11.7.0以上) * **[PostgreSQL](https://www.postgresql.org/)** (10以上) +* **[Redis](https://redis.io/)** ##### オプション -* [Redis](https://redis.io/) - * Redisはオプションですが、インストールすることを強く推奨します。 - * インストールしなくていいのは、あなたのインスタンスが自分専用のときだけとお考えください。 - * 具体的には、Redisをインストールしないと、次の事が出来なくなります: - * Misskeyプロセスを複数起動しての負荷分散 - * レートリミット - * ジョブキュー - * Twitter連携 * [Elasticsearch](https://www.elastic.co/) * 検索機能を有効にするためにはインストールが必要です。 * [FFmpeg](https://www.ffmpeg.org/) -*3.* PostgreSQLの設定 ----------------------------------------------------------------- -:) - -*4.* Misskeyのインストール +*3.* Misskeyのインストール ---------------------------------------------------------------- 1. `su - misskey` misskeyユーザーを使用 2. `git clone -b master git://github.com/syuilo/misskey.git` masterブランチからMisskeyレポジトリをクローン @@ -50,12 +39,12 @@ adduser --disabled-password --disabled-login misskey 4. `git checkout $(git tag -l | grep -Ev -- '-(rc|alpha)\.[0-9]+$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認 5. `npm install` Misskeyの依存パッケージをインストール -*5.* 設定ファイルを作成する +*4.* 設定ファイルを作成する ---------------------------------------------------------------- 1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする。 2. `default.yml` を編集する。 -*6.* Misskeyのビルド +*5.* Misskeyのビルド ---------------------------------------------------------------- 次のコマンドでMisskeyをビルドしてください: @@ -70,13 +59,13 @@ Debianをお使いであれば、`build-essential`パッケージをインスト 3. `node-gyp build` 4. `NODE_ENV=production npm run build` -*7.* データベースを初期化 +*6.* データベースを初期化 ---------------------------------------------------------------- ``` shell npm run init ``` -*8.* 以上です! +*7.* 以上です! ---------------------------------------------------------------- お疲れ様でした。これでMisskeyを動かす準備は整いました。 diff --git a/src/db/redis.ts b/src/db/redis.ts index cebf2a10a..6518cb005 100644 --- a/src/db/redis.ts +++ b/src/db/redis.ts @@ -1,7 +1,7 @@ import * as redis from 'redis'; import config from '../config'; -export default config.redis ? redis.createClient( +export default redis.createClient( config.redis.port, config.redis.host, { @@ -9,4 +9,4 @@ export default config.redis ? redis.createClient( prefix: config.redis.prefix, db: config.redis.db || 0 } -) : null; +); diff --git a/src/server/api/limiter.ts b/src/server/api/limiter.ts index 8a6c94458..48d12d3cc 100644 --- a/src/server/api/limiter.ts +++ b/src/server/api/limiter.ts @@ -8,12 +8,6 @@ import Logger from '../../services/logger'; const logger = new Logger('limiter'); export default (endpoint: IEndpoint, user: User) => new Promise((ok, reject) => { - // Redisがインストールされてない場合は常に許可 - if (limiterDB == null) { - ok(); - return; - } - const limitation = endpoint.meta.limit!; const key = limitation.hasOwnProperty('key') diff --git a/src/server/api/service/discord.ts b/src/server/api/service/discord.ts index b2561dee6..d8a979b5b 100644 --- a/src/server/api/service/discord.ts +++ b/src/server/api/service/discord.ts @@ -83,8 +83,6 @@ async function getOAuth2() { } router.get('/connect/discord', async ctx => { - if (redis == null) return; - if (!compareOrigin(ctx)) { ctx.throw(400, 'invalid origin'); return; @@ -110,8 +108,6 @@ router.get('/connect/discord', async ctx => { }); router.get('/signin/discord', async ctx => { - if (redis == null) return; - const sessid = uuid(); const params = { @@ -138,8 +134,6 @@ router.get('/signin/discord', async ctx => { }); router.get('/dc/cb', async ctx => { - if (redis == null) return; - const userToken = getUserToken(ctx); const oauth2 = await getOAuth2(); @@ -160,7 +154,7 @@ router.get('/dc/cb', async ctx => { } const { redirect_uri, state } = await new Promise((res, rej) => { - redis!.get(sessid, async (_, state) => { + redis.get(sessid, async (_, state) => { res(JSON.parse(state)); }); }); @@ -241,7 +235,7 @@ router.get('/dc/cb', async ctx => { } const { redirect_uri, state } = await new Promise((res, rej) => { - redis!.get(userToken, async (_, state) => { + redis.get(userToken, async (_, state) => { res(JSON.parse(state)); }); }); diff --git a/src/server/api/service/github.ts b/src/server/api/service/github.ts index 4878d8c52..a4d274cc6 100644 --- a/src/server/api/service/github.ts +++ b/src/server/api/service/github.ts @@ -80,8 +80,6 @@ async function getOath2() { } router.get('/connect/github', async ctx => { - if (redis == null) return; - if (!compareOrigin(ctx)) { ctx.throw(400, 'invalid origin'); return; @@ -106,8 +104,6 @@ router.get('/connect/github', async ctx => { }); router.get('/signin/github', async ctx => { - if (redis == null) return; - const sessid = uuid(); const params = { @@ -133,8 +129,6 @@ router.get('/signin/github', async ctx => { }); router.get('/gh/cb', async ctx => { - if (redis == null) return; - const userToken = getUserToken(ctx); const oauth2 = await getOath2(); @@ -155,7 +149,7 @@ router.get('/gh/cb', async ctx => { } const { redirect_uri, state } = await new Promise((res, rej) => { - redis!.get(sessid, async (_, state) => { + redis.get(sessid, async (_, state) => { res(JSON.parse(state)); }); }); @@ -222,7 +216,7 @@ router.get('/gh/cb', async ctx => { } const { redirect_uri, state } = await new Promise((res, rej) => { - redis!.get(userToken, async (_, state) => { + redis.get(userToken, async (_, state) => { res(JSON.parse(state)); }); }); diff --git a/src/server/api/service/twitter.ts b/src/server/api/service/twitter.ts index b35ee8c47..39fdfd865 100644 --- a/src/server/api/service/twitter.ts +++ b/src/server/api/service/twitter.ts @@ -79,8 +79,6 @@ async function getTwAuth() { } router.get('/connect/twitter', async ctx => { - if (redis == null) return; - if (!compareOrigin(ctx)) { ctx.throw(400, 'invalid origin'); return; @@ -99,8 +97,6 @@ router.get('/connect/twitter', async ctx => { }); router.get('/signin/twitter', async ctx => { - if (redis == null) return; - const twAuth = await getTwAuth(); const twCtx = await twAuth!.begin(); @@ -122,8 +118,6 @@ router.get('/signin/twitter', async ctx => { }); router.get('/tw/cb', async ctx => { - if (redis == null) return; - const userToken = getUserToken(ctx); const twAuth = await getTwAuth(); @@ -137,7 +131,7 @@ router.get('/tw/cb', async ctx => { } const get = new Promise((res, rej) => { - redis!.get(sessid, async (_, twCtx) => { + redis.get(sessid, async (_, twCtx) => { res(twCtx); }); }); @@ -170,7 +164,7 @@ router.get('/tw/cb', async ctx => { } const get = new Promise((res, rej) => { - redis!.get(userToken, async (_, twCtx) => { + redis.get(userToken, async (_, twCtx) => { res(twCtx); }); }); diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts index ab66f2b6d..902c62ef9 100644 --- a/src/server/api/streaming.ts +++ b/src/server/api/streaming.ts @@ -1,7 +1,6 @@ import * as http from 'http'; import * as websocket from 'websocket'; import * as redis from 'redis'; -import Xev from 'xev'; import MainStreamConnection from './stream'; import { ParsedUrlQuery } from 'querystring'; @@ -23,28 +22,24 @@ module.exports = (server: http.Server) => { let ev: EventEmitter; - if (config.redis) { - // Connect to Redis - const subscriber = redis.createClient( - config.redis.port, config.redis.host); + // Connect to Redis + const subscriber = redis.createClient( + config.redis.port, config.redis.host); - subscriber.subscribe('misskey'); + subscriber.subscribe('misskey'); - ev = new EventEmitter(); + ev = new EventEmitter(); - subscriber.on('message', async (_, data) => { - const obj = JSON.parse(data); + subscriber.on('message', async (_, data) => { + const obj = JSON.parse(data); - ev.emit(obj.channel, obj.message); - }); + ev.emit(obj.channel, obj.message); + }); - connection.once('close', () => { - subscriber.unsubscribe(); - subscriber.quit(); - }); - } else { - ev = new Xev(); - } + connection.once('close', () => { + subscriber.unsubscribe(); + subscriber.quit(); + }); const main = new MainStreamConnection(connection, ev, user, app); diff --git a/src/services/stream.ts b/src/services/stream.ts index c52af48b5..28cb2057e 100644 --- a/src/services/stream.ts +++ b/src/services/stream.ts @@ -1,33 +1,19 @@ import redis from '../db/redis'; -import Xev from 'xev'; import { User } from '../models/entities/user'; import { Note } from '../models/entities/note'; import { UserList } from '../models/entities/user-list'; import { ReversiGame } from '../models/entities/games/reversi/game'; class Publisher { - private ev: Xev | null = null; - - constructor() { - // Redisがインストールされてないときはプロセス間通信を使う - if (redis == null) { - this.ev = new Xev(); - } - } - private publish = (channel: string, type: string | null, value?: any): void => { const message = type == null ? value : value == null ? { type: type, body: null } : { type: type, body: value }; - if (this.ev) { - this.ev.emit(channel, message); - } else { - redis!.publish('misskey', JSON.stringify({ - channel: channel, - message: message - })); - } + redis.publish('misskey', JSON.stringify({ + channel: channel, + message: message + })); } public publishMainStream = (userId: User['id'], type: string, value?: any): void => {