# オープンソースCRM「Twenty」のローカル開発環境を構築してみた

> オープンソースCRM「Twenty」のローカル開発環境を構築する手順を実測付きでまとめます。Node/yarnの準備、DockerでのPostgreSQL・Redis起動、DB初期化から動作確認までの流れとハマりどころを解説します。

- 公開日: 2026-07-10
- 著者: 村井 謙太
- タグ: Twenty, CRM, 新しい技術で検証
- URL: https://tech.anycloud.co.jp/articles/twenty-local-setup

---

エニークラウドで、オープンソースのCRM「Twenty」を触りはじめました。手元で自由に動かして中身を見たいので、まずはローカル開発環境を構築しました。

この記事では、構築の手順と実測時間、ハマりどころをまとめます。

## Twentyとは

[Twenty](https://twenty.com) は「#1 Open-Source CRM」を掲げるオープンソースのCRMで、GitHubスターは約5万です。SalesforceやHubSpotの代替を狙うプロダクトの中では、現時点でもっとも勢いのあるOSSのひとつだと思います。

![Twenty公式サイト](./twenty-site.webp)

技術スタックはTypeScriptで統一されたモノレポで、フロントエンドがReact、バックエンドがNestJS、データベースがPostgreSQL、キャッシュがRedisです。定義したオブジェクトはGraphQLとRESTの両APIに自動で公開されます。

ライセンスは本体がAGPL-3.0で、セルフホストなら無料・ユーザー数無制限で使えます。

## 前提環境

構築に使ったマシンはApple SiliconのMacです。必要なものは次の通りです。

| ツール | バージョン | 備考 |
|---|---|---|
| Node | 24.16.0 | リポジトリの `.nvmrc` に合わせる |
| yarn | 4.13.0 | `corepack enable` で有効化。npmは使えない |
| Docker | 28.3.0 | PostgreSQL / Redis をコンテナで立てる |

PostgreSQLとRedisはHomebrewでも立てられますが、リポジトリにDocker用のMakefileが同梱されているので、今回はそちらを使いました。

## 手順

### 1. clone — とにかく大きい

```sh
git clone https://github.com/twentyhq/twenty.git
cd twenty
```

リポジトリはclone後で1.6GB、作業ファイル約26,000個あります。手元の環境では完了まで7分40秒かかりました。

所要時間は回線次第で大きく変わる部分なので、履歴が不要なら `--filter=blob:none` のpartial cloneで短縮できます。

### 2. Nodeとyarnの準備

`.nvmrc` にNodeのバージョンが書かれているので、それに合わせます。

```sh
nvm use            # 24.16.0 に切り替え(未インストールなら nvm install)
corepack enable    # yarn 4 を有効化
yarn -v            # 4.13.0
```

`package.json` のenginesに `"npm": "please-use-yarn"` と書かれている通り、npmでは動きません。yarn 4はcorepack経由で入るので、手動でのインストールは不要でした。

### 3. PostgreSQLとRedisをDockerで起動

リポジトリ同梱のMakefileターゲットを叩くだけです。

```sh
make -C packages/twenty-docker postgres-on-docker
make -C packages/twenty-docker redis-on-docker
```

postgres:16のコンテナ起動に加えて、`default` と `test` のデータベース作成、起動完了の待機までMakefileが面倒を見てくれます。イメージのpullを含めて2〜3分でした。

ポートは5432(PostgreSQL)、6379(Redis)、3000(サーバー)、3001(フロント)を使います。既存の開発環境と衝突しやすい番号なので、起動前に確認しておくと安全です。

```sh
lsof -nP -iTCP:5432 -iTCP:6379 -iTCP:3000 -iTCP:3001 -sTCP:LISTEN
```

### 4. .envの準備

`.env.example` をコピーして、`APP_SECRET` だけランダム値に差し替えます。

```sh
cp packages/twenty-front/.env.example packages/twenty-front/.env
cp packages/twenty-server/.env.example packages/twenty-server/.env
sed -i '' "s|APP_SECRET=replace_me_with_a_random_string|APP_SECRET=$(openssl rand -base64 32)|" packages/twenty-server/.env
```

`.env.example` の中身がlocalhostのPostgreSQL/Redisを指すローカル開発向けデフォルトになっているので、書き換えはこの1箇所で済みました。

### 5. yarn install — 大量のwarningが出るが正常

```sh
yarn install
```

実測で2分24秒でした。このとき `YN0004: ... lists build scripts, but all build scripts have been disabled` というwarningが大量に出ます。

一見エラーに見えますが、Twentyが `.yarnrc.yml` で依存パッケージのビルドスクリプトをデフォルト無効化しているためのもので、正常な挙動です。サプライチェーン攻撃への対策として意図的にこの設定になっています。

### 6. DB初期化と起動

```sh
npx nx database:reset twenty-server   # マイグレーション + シードデータ投入
npx nx start                          # サーバー + ワーカー + フロントを一括起動
```

DB初期化は1分45秒、起動してからフロントとサーバーが応答するまでは1分弱でした。

## 動作確認

http://localhost:3001 を開くとログイン画面が表示されます。

![Twentyのログイン画面。日本語UIでtim@apple.devがプリフィルされている](./login.webp)

開発用の `.env` では `SIGN_IN_PREFILLED=true` が設定されており、シードユーザーの `tim@apple.dev`(パスワードも同じ)が最初から入力されています。そのままサインインするとCRM画面に入れます。

![TwentyのCompaniesビュー。シードデータの企業が599社表示されている](./companies.webp)

シードデータとして599社の企業データが投入済みで、People・Opportunities・Tasks・Workflowsといった主要オブジェクトも一通り触れる状態です。GraphQL APIも `http://localhost:3000/graphql` で応答することを確認できました。

## 予想と違った点

一番意外だったのは、ログイン画面が最初から日本語で表示されたことです。Twentyはi18n対応済みで、ブラウザのロケールに追従します。海外製のOSSは英語UIを覚悟していたので、初回起動から日本語で使い始められるのは嬉しい誤算でした。

もうひとつは環境構築体験の洗練度です。所要時間の実測は次の通りで、cloneを除けば合計約10分でした。

| ステップ | 実測時間 |
|---|---|
| clone | 7分40秒(1.6GB) |
| Node 24.16.0 インストール | 1分弱 |
| PostgreSQL / Redis 起動(イメージpull込み) | 2〜3分 |
| yarn install | 2分24秒 |
| DB初期化(database:reset) | 1分45秒 |
| 起動 → 応答まで | 1分弱 |

DB作成まで面倒を見るMakefile、コピーするだけで動く `.env.example`、ログイン情報のプリフィルなど、開発者が最初につまずくポイントが先回りして潰されています。モノレポは20パッケージある大規模なものですが、体験としては軽快でした。

## おわりに

環境構築は「cloneが重い」以外に大きなハマりどころがなく、Twentyの開発体験の良さを感じる結果になりました。

ここから実際のCRMとしての使い勝手やカスタマイズ性を見ていきます。試してわかったことは、またこのブログで紹介する予定です。
