Redis必須に

This commit is contained in:
syuilo 2019-04-13 19:19:32 +09:00
parent 6240f172fe
commit af93cdd49f
12 changed files with 48 additions and 111 deletions

View file

@ -65,10 +65,10 @@ db:
# ┌─────────────────────┐ # ┌─────────────────────┐
#───┘ Redis configuration └───────────────────────────────────── #───┘ Redis configuration └─────────────────────────────────────
#redis: redis:
# host: localhost host: localhost
# port: 6379 port: 6379
# pass: example-pass #pass: example-pass
# ┌─────────────────────────────┐ # ┌─────────────────────────────┐
#───┘ Elasticsearch configuration └───────────────────────────── #───┘ Elasticsearch configuration └─────────────────────────────

View file

@ -7,7 +7,8 @@ If you encounter any problems with updating, please try the following:
11.0.0 11.0.0
---------- ----------
* データベースがMongoDBからPostgreSQLに変更されました * **データベースがMongoDBからPostgreSQLに変更されました**
* **Redisが必須に**
* アカウントを完全に削除できるように * アカウントを完全に削除できるように
* ミュート/ブロック時にそのユーザーの投稿のウォッチをすべて解除するように * ミュート/ブロック時にそのユーザーの投稿のウォッチをすべて解除するように
* フォロー申請数が実際より1すくなくなる問題を修正 * フォロー申請数が実際より1すくなくなる問題を修正

View file

@ -24,18 +24,13 @@ Please install and setup these softwares:
#### Dependencies :package: #### Dependencies :package:
* **[Node.js](https://nodejs.org/en/)** >= 11.7.0 * **[Node.js](https://nodejs.org/en/)** >= 11.7.0
* **[PostgreSQL](https://www.postgresql.org/)** >= 10 * **[PostgreSQL](https://www.postgresql.org/)** >= 10
* **[Redis](https://redis.io/)**
##### Optional ##### 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 * [Elasticsearch](https://www.elastic.co/) - required to enable the search feature
* [FFmpeg](https://www.ffmpeg.org/) * [FFmpeg](https://www.ffmpeg.org/)
*3.* Setup PostgreSQL *3.* Install Misskey
----------------------------------------------------------------
:)
*4.* Install Misskey
---------------------------------------------------------------- ----------------------------------------------------------------
1. `su - misskey` Connect to misskey user. 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. 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) 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. `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`. 1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
2. Edit `default.yml` 2. Edit `default.yml`
*6.* Build Misskey *5.* Build Misskey
---------------------------------------------------------------- ----------------------------------------------------------------
Build misskey with the following: 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` 3. `node-gyp build`
4. `NODE_ENV=production npm run build` 4. `NODE_ENV=production npm run build`
*7.* Init DB *6.* Init DB
---------------------------------------------------------------- ----------------------------------------------------------------
``` shell ``` shell
npm run init npm run init
``` ```
*8.* That is it. *7.* That is it.
---------------------------------------------------------------- ----------------------------------------------------------------
Well done! Now, you have an environment that run to Misskey. Well done! Now, you have an environment that run to Misskey.

View file

@ -24,18 +24,13 @@ Installez les paquets suivants :
#### Dépendences :package: #### Dépendences :package:
* **[Node.js](https://nodejs.org/en/)** >= 11.7.0 * **[Node.js](https://nodejs.org/en/)** >= 11.7.0
* **[PostgreSQL](https://www.postgresql.org/)** >= 10 * **[PostgreSQL](https://www.postgresql.org/)** >= 10
* **[Redis](https://redis.io/)**
##### Optionnels ##### 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 * [Elasticsearch](https://www.elastic.co/) - requis pour pouvoir activer la fonctionnalité de recherche
* [FFmpeg](https://www.ffmpeg.org/) * [FFmpeg](https://www.ffmpeg.org/)
*3.* Paramètrage de PostgreSQL *3.* Installation de Misskey
----------------------------------------------------------------
:)
*4.* Installation de Misskey
---------------------------------------------------------------- ----------------------------------------------------------------
1. `su - misskey` Basculez vers l'utilisateur 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. 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) 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. `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`. 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` 2. Editez le fichier `default.yml`
*6.* Construction de Misskey *5.* Construction de Misskey
---------------------------------------------------------------- ----------------------------------------------------------------
Construisez Misskey comme ceci : Construisez Misskey comme ceci :
@ -64,7 +59,7 @@ Si vous rencontrez des erreurs concernant certains modules, utilisez node-gyp:
3. `node-gyp build` 3. `node-gyp build`
4. `NODE_ENV=production npm run 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 Excellent ! Maintenant, vous avez un environnement prêt pour lancer Misskey

View file

@ -24,25 +24,14 @@ adduser --disabled-password --disabled-login misskey
#### 依存関係 :package: #### 依存関係 :package:
* **[Node.js](https://nodejs.org/en/)** (11.7.0以上) * **[Node.js](https://nodejs.org/en/)** (11.7.0以上)
* **[PostgreSQL](https://www.postgresql.org/)** (10以上) * **[PostgreSQL](https://www.postgresql.org/)** (10以上)
* **[Redis](https://redis.io/)**
##### オプション ##### オプション
* [Redis](https://redis.io/)
* Redisはオプションですが、インストールすることを強く推奨します。
* インストールしなくていいのは、あなたのインスタンスが自分専用のときだけとお考えください。
* 具体的には、Redisをインストールしないと、次の事が出来なくなります:
* Misskeyプロセスを複数起動しての負荷分散
* レートリミット
* ジョブキュー
* Twitter連携
* [Elasticsearch](https://www.elastic.co/) * [Elasticsearch](https://www.elastic.co/)
* 検索機能を有効にするためにはインストールが必要です。 * 検索機能を有効にするためにはインストールが必要です。
* [FFmpeg](https://www.ffmpeg.org/) * [FFmpeg](https://www.ffmpeg.org/)
*3.* PostgreSQLの設定 *3.* Misskeyのインストール
----------------------------------------------------------------
:)
*4.* Misskeyのインストール
---------------------------------------------------------------- ----------------------------------------------------------------
1. `su - misskey` misskeyユーザーを使用 1. `su - misskey` misskeyユーザーを使用
2. `git clone -b master git://github.com/syuilo/misskey.git` masterブランチから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)を確認 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. `npm install` Misskeyの依存パッケージをインストール
*5.* 設定ファイルを作成する *4.* 設定ファイルを作成する
---------------------------------------------------------------- ----------------------------------------------------------------
1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする。 1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする。
2. `default.yml` を編集する。 2. `default.yml` を編集する。
*6.* Misskeyのビルド *5.* Misskeyのビルド
---------------------------------------------------------------- ----------------------------------------------------------------
次のコマンドでMisskeyをビルドしてください: 次のコマンドでMisskeyをビルドしてください:
@ -70,13 +59,13 @@ Debianをお使いであれば、`build-essential`パッケージをインスト
3. `node-gyp build` 3. `node-gyp build`
4. `NODE_ENV=production npm run build` 4. `NODE_ENV=production npm run build`
*7.* データベースを初期化 *6.* データベースを初期化
---------------------------------------------------------------- ----------------------------------------------------------------
``` shell ``` shell
npm run init npm run init
``` ```
*8.* 以上です! *7.* 以上です!
---------------------------------------------------------------- ----------------------------------------------------------------
お疲れ様でした。これでMisskeyを動かす準備は整いました。 お疲れ様でした。これでMisskeyを動かす準備は整いました。

View file

@ -1,7 +1,7 @@
import * as redis from 'redis'; import * as redis from 'redis';
import config from '../config'; import config from '../config';
export default config.redis ? redis.createClient( export default redis.createClient(
config.redis.port, config.redis.port,
config.redis.host, config.redis.host,
{ {
@ -9,4 +9,4 @@ export default config.redis ? redis.createClient(
prefix: config.redis.prefix, prefix: config.redis.prefix,
db: config.redis.db || 0 db: config.redis.db || 0
} }
) : null; );

View file

@ -8,12 +8,6 @@ import Logger from '../../services/logger';
const logger = new Logger('limiter'); const logger = new Logger('limiter');
export default (endpoint: IEndpoint, user: User) => new Promise((ok, reject) => { export default (endpoint: IEndpoint, user: User) => new Promise((ok, reject) => {
// Redisがインストールされてない場合は常に許可
if (limiterDB == null) {
ok();
return;
}
const limitation = endpoint.meta.limit!; const limitation = endpoint.meta.limit!;
const key = limitation.hasOwnProperty('key') const key = limitation.hasOwnProperty('key')

View file

@ -83,8 +83,6 @@ async function getOAuth2() {
} }
router.get('/connect/discord', async ctx => { router.get('/connect/discord', async ctx => {
if (redis == null) return;
if (!compareOrigin(ctx)) { if (!compareOrigin(ctx)) {
ctx.throw(400, 'invalid origin'); ctx.throw(400, 'invalid origin');
return; return;
@ -110,8 +108,6 @@ router.get('/connect/discord', async ctx => {
}); });
router.get('/signin/discord', async ctx => { router.get('/signin/discord', async ctx => {
if (redis == null) return;
const sessid = uuid(); const sessid = uuid();
const params = { const params = {
@ -138,8 +134,6 @@ router.get('/signin/discord', async ctx => {
}); });
router.get('/dc/cb', async ctx => { router.get('/dc/cb', async ctx => {
if (redis == null) return;
const userToken = getUserToken(ctx); const userToken = getUserToken(ctx);
const oauth2 = await getOAuth2(); const oauth2 = await getOAuth2();
@ -160,7 +154,7 @@ router.get('/dc/cb', async ctx => {
} }
const { redirect_uri, state } = await new Promise<any>((res, rej) => { const { redirect_uri, state } = await new Promise<any>((res, rej) => {
redis!.get(sessid, async (_, state) => { redis.get(sessid, async (_, state) => {
res(JSON.parse(state)); res(JSON.parse(state));
}); });
}); });
@ -241,7 +235,7 @@ router.get('/dc/cb', async ctx => {
} }
const { redirect_uri, state } = await new Promise<any>((res, rej) => { const { redirect_uri, state } = await new Promise<any>((res, rej) => {
redis!.get(userToken, async (_, state) => { redis.get(userToken, async (_, state) => {
res(JSON.parse(state)); res(JSON.parse(state));
}); });
}); });

View file

@ -80,8 +80,6 @@ async function getOath2() {
} }
router.get('/connect/github', async ctx => { router.get('/connect/github', async ctx => {
if (redis == null) return;
if (!compareOrigin(ctx)) { if (!compareOrigin(ctx)) {
ctx.throw(400, 'invalid origin'); ctx.throw(400, 'invalid origin');
return; return;
@ -106,8 +104,6 @@ router.get('/connect/github', async ctx => {
}); });
router.get('/signin/github', async ctx => { router.get('/signin/github', async ctx => {
if (redis == null) return;
const sessid = uuid(); const sessid = uuid();
const params = { const params = {
@ -133,8 +129,6 @@ router.get('/signin/github', async ctx => {
}); });
router.get('/gh/cb', async ctx => { router.get('/gh/cb', async ctx => {
if (redis == null) return;
const userToken = getUserToken(ctx); const userToken = getUserToken(ctx);
const oauth2 = await getOath2(); const oauth2 = await getOath2();
@ -155,7 +149,7 @@ router.get('/gh/cb', async ctx => {
} }
const { redirect_uri, state } = await new Promise<any>((res, rej) => { const { redirect_uri, state } = await new Promise<any>((res, rej) => {
redis!.get(sessid, async (_, state) => { redis.get(sessid, async (_, state) => {
res(JSON.parse(state)); res(JSON.parse(state));
}); });
}); });
@ -222,7 +216,7 @@ router.get('/gh/cb', async ctx => {
} }
const { redirect_uri, state } = await new Promise<any>((res, rej) => { const { redirect_uri, state } = await new Promise<any>((res, rej) => {
redis!.get(userToken, async (_, state) => { redis.get(userToken, async (_, state) => {
res(JSON.parse(state)); res(JSON.parse(state));
}); });
}); });

View file

@ -79,8 +79,6 @@ async function getTwAuth() {
} }
router.get('/connect/twitter', async ctx => { router.get('/connect/twitter', async ctx => {
if (redis == null) return;
if (!compareOrigin(ctx)) { if (!compareOrigin(ctx)) {
ctx.throw(400, 'invalid origin'); ctx.throw(400, 'invalid origin');
return; return;
@ -99,8 +97,6 @@ router.get('/connect/twitter', async ctx => {
}); });
router.get('/signin/twitter', async ctx => { router.get('/signin/twitter', async ctx => {
if (redis == null) return;
const twAuth = await getTwAuth(); const twAuth = await getTwAuth();
const twCtx = await twAuth!.begin(); const twCtx = await twAuth!.begin();
@ -122,8 +118,6 @@ router.get('/signin/twitter', async ctx => {
}); });
router.get('/tw/cb', async ctx => { router.get('/tw/cb', async ctx => {
if (redis == null) return;
const userToken = getUserToken(ctx); const userToken = getUserToken(ctx);
const twAuth = await getTwAuth(); const twAuth = await getTwAuth();
@ -137,7 +131,7 @@ router.get('/tw/cb', async ctx => {
} }
const get = new Promise<any>((res, rej) => { const get = new Promise<any>((res, rej) => {
redis!.get(sessid, async (_, twCtx) => { redis.get(sessid, async (_, twCtx) => {
res(twCtx); res(twCtx);
}); });
}); });
@ -170,7 +164,7 @@ router.get('/tw/cb', async ctx => {
} }
const get = new Promise<any>((res, rej) => { const get = new Promise<any>((res, rej) => {
redis!.get(userToken, async (_, twCtx) => { redis.get(userToken, async (_, twCtx) => {
res(twCtx); res(twCtx);
}); });
}); });

View file

@ -1,7 +1,6 @@
import * as http from 'http'; import * as http from 'http';
import * as websocket from 'websocket'; import * as websocket from 'websocket';
import * as redis from 'redis'; import * as redis from 'redis';
import Xev from 'xev';
import MainStreamConnection from './stream'; import MainStreamConnection from './stream';
import { ParsedUrlQuery } from 'querystring'; import { ParsedUrlQuery } from 'querystring';
@ -23,28 +22,24 @@ module.exports = (server: http.Server) => {
let ev: EventEmitter; let ev: EventEmitter;
if (config.redis) { // Connect to Redis
// Connect to Redis const subscriber = redis.createClient(
const subscriber = redis.createClient( config.redis.port, config.redis.host);
config.redis.port, config.redis.host);
subscriber.subscribe('misskey'); subscriber.subscribe('misskey');
ev = new EventEmitter(); ev = new EventEmitter();
subscriber.on('message', async (_, data) => { subscriber.on('message', async (_, data) => {
const obj = JSON.parse(data); const obj = JSON.parse(data);
ev.emit(obj.channel, obj.message); ev.emit(obj.channel, obj.message);
}); });
connection.once('close', () => { connection.once('close', () => {
subscriber.unsubscribe(); subscriber.unsubscribe();
subscriber.quit(); subscriber.quit();
}); });
} else {
ev = new Xev();
}
const main = new MainStreamConnection(connection, ev, user, app); const main = new MainStreamConnection(connection, ev, user, app);

View file

@ -1,33 +1,19 @@
import redis from '../db/redis'; import redis from '../db/redis';
import Xev from 'xev';
import { User } from '../models/entities/user'; import { User } from '../models/entities/user';
import { Note } from '../models/entities/note'; import { Note } from '../models/entities/note';
import { UserList } from '../models/entities/user-list'; import { UserList } from '../models/entities/user-list';
import { ReversiGame } from '../models/entities/games/reversi/game'; import { ReversiGame } from '../models/entities/games/reversi/game';
class Publisher { 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 => { private publish = (channel: string, type: string | null, value?: any): void => {
const message = type == null ? value : value == null ? const message = type == null ? value : value == null ?
{ type: type, body: null } : { type: type, body: null } :
{ type: type, body: value }; { type: type, body: value };
if (this.ev) { redis.publish('misskey', JSON.stringify({
this.ev.emit(channel, message); channel: channel,
} else { message: message
redis!.publish('misskey', JSON.stringify({ }));
channel: channel,
message: message
}));
}
} }
public publishMainStream = (userId: User['id'], type: string, value?: any): void => { public publishMainStream = (userId: User['id'], type: string, value?: any): void => {