開発者向けSNS /dev/null をWSL2とLaravel Sailでローカル起動してみた
dev-null.shとは
/dev/null は、開発者向けのオープンソースSNSです。GitHubアカウントでログインし、開発者同士でフォローしたり、投稿(Commitと呼ばれています)や返信をしたりできます。
Laravel界隈で知られる Nuno Maduro、Brent Roose、Matthieu Napoli、Pauline Vos らがライブ配信で開発を始めたプロジェクトで、現在はコミュニティからのPull Requestも受け付けながら開発が進められています。
ソースコードはGitHubでMITライセンスのもと公開されており、Laravel 13、Inertia.js、React、PostgreSQLなどを使って構築されています。
開発開始から間もないにもかかわらず、かなりの勢いで機能が追加されているのも特徴です。今回は、このアプリケーションを実際にローカル環境で動かしてみます。
利用されている技術スタック
主な技術スタックは以下のとおりです(2026年11月3日時点)。
分類
技術
言語
PHP 8.5、TypeScript
バックエンド
Laravel 13
フロントエンド
React 19、Inertia.js 3
CSS / UI
Tailwind CSS 4、Radix UI
ビルドツール
Vite+
パッケージ管理
Composer、Bun 1.4
データベース
PostgreSQL 17以上
DB拡張
pgvector、pg_trgm
認証
Laravel Socialite(GitHub OAuth)
なおベースはLaravel Starter Kitのnunoカスタムが使われています
データベースにはPostgreSQLを採用しており、ベクトル検索のためのpgvectorと、文字列検索向けのpg_trgm拡張が必要です。
動かしてみる
筆者の環境ではWSL2(Debian)を利用しています。今回はLaravel Sailを使ってDockerコンテナ上で動かすため、DockerとDocker Composeが利用できるLinux環境であれば、おおむね同じ手順で構築できるはずです。
リポジトリをclone
git clone dev-null-sh/dev-null.sh
cd dev-null.sh
公式READMEではcomposer setupで環境を構築できますが、このコマンドは依存パッケージのインストールからDBのマイグレーション、フロントエンドのビルドまで実行します。
今回はLaravel Sailを利用するため、まずはComposerの依存パッケージだけをインストールします。
ホスト側のPHPバージョンや拡張モジュールの要件チェックを無視してインストール
composer install --ignore-platform-reqs
--ignore-platform-reqsは、ホスト側のPHP環境がプロジェクトの要件を満たしていなくても依存パッケージをインストールするためのオプションです。実際のアプリケーションは後ほどSailのコンテナ内で実行します。なお、標準の依存パッケージにはlaravel/sailが含まれていないので、後ほど追加します。
!
ここでLaravel Vetというツールから次のメッセージが表示されました。
Vet has no trust entry in [vet.json] yet.
Run [./vendor/bin/vet --init] to record what you trust today.
Laravel VetはComposerの依存パッケージの変更を監査するためのツールです。これは脆弱性が検出されたという警告ではなく、信頼済みパッケージの初期登録がまだ行われていないという通知です。
laravel/sail を開発依存に追加
composer.json
@@ -35,6 +35,7 @@
"laravel/pail": "^1.2.7",
"laravel/pao": "^1.1.5",
"laravel/pint": "^1.32.1",
- "laravel/sail": "^1.69",
"laravel/tinker": "^3.0.2",
"laravel/vet": "^0.2.1",
"mockery/mockery": "^1.6.15",
これでcomposer.lockを更新し、Sailをインストールします。
Sailの依存関係だけを更新
composer update laravel/sail --ignore-platform-reqs --no-scripts
なお、--no-scriptsを付けているのは、このプロジェクトのpost-update-cmdで別の依存パッケージの更新処理も実行されるためです。
Sailの設定ファイルを生成する
PostgreSQLとPHP 8.5を使用するSail環境を生成
php artisan sail:install --with=pgsql --php=8.5
これでcompose.yamlなどの設定ファイルが生成されます。
この後、コンテナを起動します。
Sailのコンテナを起動
./vendor/bin/sail up
特にポートを変更していなければ、http://localhost:8000でアクセスできます。
ただし、まだDBの初期化を行っていないため、アプリケーションにアクセスするとエラーになります。
おなじみのマイグレーション未実行エラー
DB初期化
まず、マイグレーションとSeederを実行してDBを初期化します。
テーブルを作成し、初期データを投入
./vendor/bin/sail artisan migrate:fresh --seed
ところが、ここでエラーが発生しました。
pgvectorがみつからないエラー
このアプリケーションではPostgreSQLのpgvector拡張を使用していますが、Sailが生成した標準のPostgreSQLイメージには含まれていません。
そこで、compose.yaml のPostgreSQLイメージをpgvector入りのものに差し替えます。
compose.yaml
@@ -24,7 +24,7 @@ services:
depends_on:
- pgsql
pgsql:
- image: 'postgres:18-alpine'
- image: 'pgvector/pgvector:pg18'
ports:
- '${FORWARD_DB_PORT:-5432}:5432'
environment:
イメージの変更を反映するため、Sailを再起動します。
コンテナを停止・削除(DBのデータボリュームは保持)
./vendor/bin/sail down
新しいイメージでコンテナを起動
./vendor/bin/sail up -d
改めてマイグレーションを実行します。
DBを初期化し、Seederを実行
./vendor/bin/sail artisan migrate:fresh --seed
今度は問題なく完了しました。
all done
!
migrate:freshは既存のテーブルをすべて削除して再作成します。今回は新規の開発環境なので問題ありませんが、既存データのあるDBでは注意してください。
フロントエンド
続いて、フロントエンドの依存パッケージをインストールし、ビルドします。
ロックファイルに従って依存パッケージをインストール
./vendor/bin/sail bun install --frozen-lockfile
本番用アセットをビルド
./vendor/bin/sail bun run build
これでビルドまで完了です。
さらに、ホットリロード(HMR)を利用するため、Vite+の開発サーバーを起動します。
Vite+の開発サーバーを起動
./vendor/bin/sail bun run dev
無事に起動。最初から表示されている投稿はSeederで投入されたダミーデータ
ログインしてみる
dev-null.shのログイン通常はGitHub OAuthによる認証のみを利用しますが、開発モード(APP_ENV=local)ではGitHubの認証情報なしでローカルログインできます。任意のハンドル名を入力すればログインできるので、動作確認のためにGitHub OAuthアプリを登録する必要はありません。
開発モードでのローカルログイン
Seederをざっくり日本語にしてみる
初期状態ではSeederによって英語のダミー投稿が投入されています。せっかくなので、投稿内容をざっくり日本語に変更してみます。AI任せです。
まあAIで
変更後、Seederを再実行します。
DBを初期化し、変更したSeederのデータを投入
./vendor/bin/sail artisan migrate:fresh --seed
日本語のダミー投稿が並ぶようになりました
Laravel Starter Kitをベースに、Inertia.jsとReactで構築されているため、こうした改変も比較的簡単にできます。Laravelに慣れている人なら、ソースコードを追いながらあれこれ手を加えてみるのも面白そうです。
あとがき
今回はローカル環境で起動し、Seederを改変するところまで試してみました。自分も普段からLaravel + Inertia.js + Reactでアプリケーションを開発しているので、かなり馴染みのある構成です。Laravel Starter Kitをベースにしていることもあり、コードを追うのも改変するのも比較的やりやすい印象でした。
中身を覗いてみると、Trendingのランキングなどもなかなか興味深い実装です。機械学習モデルに頼るのではなく、投稿への反応や経過時間、フォロー関係などをSQLでスコアリングしています。特にランキングやレコメンデーションの実装は、一から考えるとなかなか面倒な部分なので、実際に動いているコードが読めるのはありがたいところです。
筆者のアカウント
dev-null.sh
Mentions
開発者向けSNS /dev/null をWSL2とLaravel Sailでローカル起動してみた dev-null.shとは /dev/null は、開発者向けのオープンソースSNSです。GitHubアカウントでログインし、開発者同士でフォローしたり、投稿(Commitと呼ばれています)や返信をしたりできます。 Laravel界隈で知られる Nuno Maduro、Brent Roose、Matthieu Napoli、Pauline Vos らがライブ配信で開発を始めたプロジェクトで、現在はコミュニティからのPull Requestも受け付けながら開発が進められています。 ソースコードはGitHubでMITライセンスのもと公開されており、Laravel 13、Inertia.js、React、PostgreSQLなどを使って構築されています。 開発開始から間もないにもかかわらず、かなりの勢いで機能が追加されているのも特徴です。今回は、このアプリケーションを実際にローカル環境で動かしてみます。 利用されている技術スタック 主な技術スタックは以下のとおりです(2026年11月3日時点)。 分類 技術 言語 PHP 8.5、TypeScript バックエンド Laravel 13 フロントエンド React 19、Inertia.js 3 CSS / UI Tailwind CSS 4、Radix UI ビルドツール Vite+ パッケージ管理 Composer、Bun 1.4 データベース PostgreSQL 17以上 DB拡張 pgvector、pg_trgm 認証 Laravel Socialite(GitHub OAuth) なおベースはLaravel Starter Kitのnunoカスタムが使われています データベースにはPostgreSQLを採用しており、ベクトル検索のためのpgvectorと、文字列検索向けのpg_trgm拡張が必要です。 動かしてみる 筆者の環境ではWSL2(Debian)を利用しています。今回はLaravel Sailを使ってDockerコンテナ上で動かすため、DockerとDocker Composeが利用できるLinux環境であれば、おおむね同じ手順で構築できるはずです。 リポジトリをclone git clone dev-null-sh/dev-null.sh cd dev-null.sh 公式READMEではcomposer setupで環境を構築できますが、このコマンドは依存パッケージのインストールからDBのマイグレーション、フロントエンドのビルドまで実行します。 今回はLaravel Sailを利用するため、まずはComposerの依存パッケージだけをインストールします。 ホスト側のPHPバージョンや拡張モジュールの要件チェックを無視してインストール composer install --ignore-platform-reqs --ignore-platform-reqsは、ホスト側のPHP環境がプロジェクトの要件を満たしていなくても依存パッケージをインストールするためのオプションです。実際のアプリケーションは後ほどSailのコンテナ内で実行します。なお、標準の依存パッケージにはlaravel/sailが含まれていないので、後ほど追加します。 ! ここでLaravel Vetというツールから次のメッセージが表示されました。 Vet has no trust entry in [vet.json] yet. Run [./vendor/bin/vet --init] to record what you trust today. Laravel VetはComposerの依存パッケージの変更を監査するためのツールです。これは脆弱性が検出されたという警告ではなく、信頼済みパッケージの初期登録がまだ行われていないという通知です。 laravel/sail を開発依存に追加 composer.json @@ -35,6 +35,7 @@ "laravel/pail": "^1.2.7", "laravel/pao": "^1.1.5", "laravel/pint": "^1.32.1", - "laravel/sail": "^1.69", "laravel/tinker": "^3.0.2", "laravel/vet": "^0.2.1", "mockery/mockery": "^1.6.15", これでcomposer.lockを更新し、Sailをインストールします。 Sailの依存関係だけを更新 composer update laravel/sail --ignore-platform-reqs --no-scripts なお、--no-scriptsを付けているのは、このプロジェクトのpost-update-cmdで別の依存パッケージの更新処理も実行されるためです。 Sailの設定ファイルを生成する PostgreSQLとPHP 8.5を使用するSail環境を生成 php artisan sail:install --with=pgsql --php=8.5 これでcompose.yamlなどの設定ファイルが生成されます。 この後、コンテナを起動します。 Sailのコンテナを起動 ./vendor/bin/sail up 特にポートを変更していなければ、http://localhost:8000でアクセスできます。 ただし、まだDBの初期化を行っていないため、アプリケーションにアクセスするとエラーになります。 おなじみのマイグレーション未実行エラー DB初期化 まず、マイグレーションとSeederを実行してDBを初期化します。 テーブルを作成し、初期データを投入 ./vendor/bin/sail artisan migrate:fresh --seed ところが、ここでエラーが発生しました。 pgvectorがみつからないエラー このアプリケーションではPostgreSQLのpgvector拡張を使用していますが、Sailが生成した標準のPostgreSQLイメージには含まれていません。 そこで、compose.yaml のPostgreSQLイメージをpgvector入りのものに差し替えます。 compose.yaml @@ -24,7 +24,7 @@ services: depends_on: - pgsql pgsql: - image: 'postgres:18-alpine' - image: 'pgvector/pgvector:pg18' ports: - '${FORWARD_DB_PORT:-5432}:5432' environment: イメージの変更を反映するため、Sailを再起動します。 コンテナを停止・削除(DBのデータボリュームは保持) ./vendor/bin/sail down 新しいイメージでコンテナを起動 ./vendor/bin/sail up -d 改めてマイグレーションを実行します。 DBを初期化し、Seederを実行 ./vendor/bin/sail artisan migrate:fresh --seed 今度は問題なく完了しました。 all done ! migrate:freshは既存のテーブルをすべて削除して再作成します。今回は新規の開発環境なので問題ありませんが、既存データのあるDBでは注意してください。 フロントエンド 続いて、フロントエンドの依存パッケージをインストールし、ビルドします。 ロックファイルに従って依存パッケージをインストール ./vendor/bin/sail bun install --frozen-lockfile 本番用アセットをビルド ./vendor/bin/sail bun run build これでビルドまで完了です。 さらに、ホットリロード(HMR)を利用するため、Vite+の開発サーバーを起動します。 Vite+の開発サーバーを起動 ./vendor/bin/sail bun run dev 無事に起動。最初から表示されている投稿はSeederで投入されたダミーデータ ログインしてみる dev-null.shのログイン通常はGitHub OAuthによる認証のみを利用しますが、開発モード(APP_ENV=local)ではGitHubの認証情報なしでローカルログインできます。任意のハンドル名を入力すればログインできるので、動作確認のためにGitHub OAuthアプリを登録する必要はありません。 開発モードでのローカルログイン Seederをざっくり日本語にしてみる 初期状態ではSeederによって英語のダミー投稿が投入されています。せっかくなので、投稿内容をざっくり日本語に変更してみます。AI任せです。 まあAIで 変更後、Seederを再実行します。 DBを初期化し、変更したSeederのデータを投入 ./vendor/bin/sail artisan migrate:fresh --seed 日本語のダミー投稿が並ぶようになりました Laravel Starter Kitをベースに、Inertia.jsとReactで構築されているため、こうした改変も比較的簡単にできます。Laravelに慣れている人なら、ソースコードを追いながらあれこれ手を加えてみるのも面白そうです。 あとがき 今回はローカル環境で起動し、Seederを改変するところまで試してみました。自分も普段からLaravel + Inertia.js + Reactでアプリケーションを開発しているので、かなり馴染みのある構成です。Laravel Starter Kitをベースにしていることもあり、コードを追うのも改変するのも比較的やりやすい印象でした。 中身を覗いてみると、Trendingのランキングなどもなかなか興味深い実装です。機械学習モデルに頼るのではなく、投稿への反応や経過時間、フォロー関係などをSQLでスコアリングしています。特にランキングやレコメンデーションの実装は、一から考えるとなかなか面倒な部分なので、実際に動いているコードが読めるのはありがたいところです。 筆者のアカウント dev-null.sh
Made a PR for laravel/vet to support the --agent flag. It allows selecting an installed review agent before defaulting to first agent in the PATH. vet#9