Share Everythingのバックエンドです。
nginx + mongo + node + typescript + dockerで開発しています。
堅牢性よりも可用性を重視するためにapache/mysqlではなくnginx/mongoの組み合わせでサーバを構築します。
node/tsを選択したのはただの趣味です。
APIは基本的にRESTfulをベースとして設計。 ただしRESTをちゃんと理解しているわけではないのでこれであっているかは謎です。
現状の実装は全てをテキストとして保持します。 画像もbase64でエンコードしてdataurl形式で持っている状態です。 将来的には画像は別で管理したいところ。S3とか。
MongoDBはAtlas、APIサーバはAWSで本番運営しています。
運営しているドメインはshare-everything-api.cosocaf.comです。
TLS対応しているのでhttps://share-everything-api.cosocaf.comへアクセスできます。
このサービスは複数の集団がそれぞれ独立した空間を持ち、その空間内で特定の値を共有するものです。
それぞれの共有空間をroomと(勝手に)呼び、それを操作するAPIを定義します。
:idで示される共有空間に格納されている値を取り出す。
APIから返される値のフォーマットは次の通り。
{
"status": "success" | "error",
// もしstatusがsuccessならば
"result": {
"content": "<共有空間に格納されている値>",
},
// もしstatusがerrorならば
"reason": "<エラーになった原因>",
}共有空間を新規作成する。
APIから返される値のフォーマットは次の通り。
{
"status": "success" | "error",
// もしstatusがsuccessならば
"result": {
"id": "<共有空間のID>"
},
// もしstatusがerrorならば
"reason": "<エラーになった原因>",
}:idで示される共有空間に値を格納する。
APIから返される値のフォーマットは次の通り。
{
"status": "success" | "error",
// もしstatusがsuccessならば
"result": {},
// もしstatusがerrorならば
"reason": "<エラーになった原因>",
}また、送信者はリクエストのボディに次のフォーマットのデータを格納しなければならない。
HTTPヘッダにContent-Type: application/jsonを指定すること。
{
// formatで示された形式にフォーマットされたデータ
"content": "<格納する値>",
// 生テキストを保持するならtext, 短縮URL化するならurl
"type": "text" | "url",
// contentの形式。rawは未加工、base64はBase64形式。
"format": "raw" | "base64",
}:idで示される共有空間を削除する。
APIから返される値のフォーマットは次の通り。
{
"status": "success" | "error",
// もしstatusがsuccessならば
"result": {},
// もしstatusがerrorならば
"reason": "<エラーになった原因>",
}リポジトリはクローンしている前提です。
serverへ移動します。
cd ./servernpmを設定し、ビルドします。
npm install
npm run build- Dockerを起動します。
cd ../
docker-compose up --build以上です。まとめると次のコマンドになります。
cd ./server
npm install
npm run build
cd ../
docker-compose up --buildこれで動くはず。多分。