docker-compose × Firebase Emulator でローカル環境構築
by
meijin
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
docker-compose × Firebase Emulator でローカル環境構築 株式会社 NoSchool CTO / meijin 1
Slide 2
Slide 2 text
⽬次 1. ⾃⼰紹介 2. 課題 3. Emulator を docker-compose でセットアップ 1. Firestore 2. Auth 4. 成果 5. 告知 2
Slide 3
Slide 3 text
⾃⼰紹介 3
Slide 4
Slide 4 text
⾃⼰紹介 Twitter Account 名⼈さん | マナリンク CTO@Meijin_garden Skill TypeScript(Nuxt/Next/Nest) / Laravel / AWS / Docker / Firebase / GitHub Actions 4
Slide 5
Slide 5 text
Next.js の LT を先⽇やりました 5
Slide 6
Slide 6 text
オンライン家庭教師マナリンク 6
Slide 7
Slide 7 text
Firebase の使いどころ オンライン家庭教師と、学⽣&親御さんが使うチャットに利⽤ Web(Nuxt.js) ⇔ スマホアプリ(React Native) Firebase Auth & Firestore & Storage を利⽤ (ちなみに) Nuxt.js では composition-api で Firebase ⽤のフックを作成 vue-composition-api で Firestore を扱う react-firebase- hooks ⾵の Composition Function を作った 7
Slide 8
Slide 8 text
課題と要望 課題 ステージング⽤ Firebase を各開発者がローカルでも利⽤ データやアカウント情報が混ざってややこしい... 要望 1. ローカルで Firebase(Auth/Firestore/Functions)を動かしたい! 2. Web フロント(Nuxt)、アプリ(React Native)から使いたい! 3. Web バックエンド(NestJS)からの Admin SDK も動かしたい! 8
Slide 9
Slide 9 text
Emulator を docker-compose でセット アップ 9
Slide 10
Slide 10 text
Emulator の概要 CLI から擬似的な Firebase 環境を起動できる仕組み localhost はもちろん、コンテナ内や CI でも起動できる Auth/Firestore/Functions/Hosting 等に対応 今回は docker-compose 上で動かすことで、Web バックエンド との接続も図る 10
Slide 11
Slide 11 text
Emulator セットアップの全体的な流れ Docker コンテナ作成 Node.js コンテナの Dockerfile を書く docker-compose.yml で他コンテナのネットワークと接続 コンテナを起動する bash で⼊り込み、エミュレータを起動する ソースコードの書き換え 環境変数を⾒て、Emulator の利⽤可否を分岐する 11
Slide 12
Slide 12 text
Docker コンテナ作成 FROM node:10-buster RUN apt-get update -y RUN apt-get install -y curl openjdk-11-jre-headless RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \ && apt-get install -y nodejs RUN npm install -g firebase-tools && mkdir functions COPY ./package.json ./ COPY ./yarn.lock ./ COPY ./functions/package.json ./functions/. COPY ./functions/yarn.lock ./functions/. 12
Slide 13
Slide 13 text
docker-compose.yml version: '3.7' networks: server: external: name: XXXXXX services: firebase: build: context: . dockerfile: ./docker/local/Dockerfile volumes: - ./:/opt/workspace:cached ports: - 9099:9099 # Auth - 4000:4000 # Emulator Suite UI - 5001:5001 # Cloud Functions - 8080:8080 # Cloud Firestore environment: USE_LOCAL_BACKEND: 1 working_dir: /opt/workspace networks: - server command: bash -c 'yarn && cd functions && yarn && /bin/bash' tty: true 13
Slide 14
Slide 14 text
docker-compose.yml ポイント Web コンテナの docker-compose network と接続する これにより http://nginx 等で Web に接続できるし、Web からも http://firebase:9099 等の URI で Emulator に接続できる networks: server: external: name: XXXXXX_default 14
Slide 15
Slide 15 text
Emulator の起動画⾯(Firestore) http://localhost:4000/firestore 15
Slide 16
Slide 16 text
データの Export/Import 以下のコマンドで Emulator 内のデータは出し⼊れできるので、 基本的なデータを⼊れたら Seeder 代わりに開発メンバー間で共有す るのがおすすめ firebase emulators:export ./data/export_my_data -P default firebase emulators:start -P default --import=./data/export_my_data 16
Slide 17
Slide 17 text
ソースコードからの呼び出し 17
Slide 18
Slide 18 text
フロントエンドから呼び出し useAuth/useFirestore/useStorage(Storage は将来に期待)という 命名で export const enabledEmulator = () => process.env.USE_FIREBASE_EMULATOR export const useAuth = () => { auth = firebase.app().auth() if (enabledEmulator()) { auth.useEmulator('http://localhost:9099') } return auth } 18
Slide 19
Slide 19 text
フロントエンドから呼び出し2 ざっくりこんな感じです useAuth().onAuthStateChanged((user) => { state.firebaseUser = user; }); const collection: CollectionReference = useFirestore().collection( "rooms" ); 19
Slide 20
Slide 20 text
バックエンド(例:NestJS)からの呼び出し AdminSDK からの接続も Emulator 対応している docker-compose で接続しているのでホスト名は firebase import * as admin from "firebase-admin"; // ... admin.firestore().settings({ host: "firebase:8080", ssl: false, }); 20
Slide 21
Slide 21 text
React Native Emulator と接続 Nuxt⇔React Native 間でのリ アルタイムチャットがローカル 環境完結で実現できる! (useAuth 等は同等のコードで 動いた) 21
Slide 22
Slide 22 text
利⽤上の注意点 22
Slide 23
Slide 23 text
Storage には未対応 つまり、Storage の動作確認をしたければそこだけステージングの Firebase に引き続きアップロードされる 環境変数の再読み込みが必要で割と⾯倒 各開発者が個⼈⽤の Firebase を持って運⽤するのも⼀案 23
Slide 24
Slide 24 text
所感 24
Slide 25
Slide 25 text
所感 思ったより完成度が⾼かった 特に Firestore を hook にした Functions が動くのはちょっと 感動 Admin SDK も Emulator を向いて使える Auth は Custom Token を使った認証もいける 今後の課題 Storage 対応 25
Slide 26
Slide 26 text
告知 26
Slide 27
Slide 27 text
CTO(私) が 1⼈で全部開発していて寂しい 27
Slide 28
Slide 28 text
オンライン指導専⽤アプリもやってます 28
Slide 29
Slide 29 text
参考になったら投げ銭をお願いします! marpで書いた markdown を(ほぼ)そのまま Zenn に上げました 29
Slide 30
Slide 30 text
ご清聴ありがとうございました 30