denoland / denoland/deploy_feedback
Firebase Admin RTDB Works Locally But Not in Deno Deploy
- Dominant language
- No language data
- Stars
- 79
- Forks
- 5
- PR merge metrics
- No merged PRs in 30d
Description
## Context / Setup
I am using Firebase Admin in Fresh `1.6.8` to fetch and render values from a Firebase realtime database server-side. My project is deployed on Deno Deploy with the `Fresh (with Build step)` preset and the contents of my Firebase service account file are stored in the `FIREBASE_ADMIN_KEY` environment variable in Deno Deploy.
## Goal
I would like to use Firebase Admin server-side at runtime but do not want the Firebase initialization or related code executed at build time.
## Problem
My project works locally with the code provided below however when I deploy, the build process fails with the following error:
```
warning: Packages contained npm lifecycle scripts (preinstall/install/postinstall) that were not executed.
This may cause the packages to not work correctly. To run them, use the `--allow-scripts` flag with `deno cache`
(e.g. `deno cache --allow-scripts=pkg1,pkg2 `):
npm:protobufjs@7.4.0
error: Uncaught (in promise) Error: Service account object must contain a string "project_id" property.
at new ServiceAccount (file:///home/runner/work/Stampede-v2/Stampede-v2/node_modules/.deno/firebase-admin@12.5.0/node_modules/firebase-admin/lib/app/credential-internal.js:145:19)
at new ServiceAccountCredential (file:///home/runner/work/Stampede-v2/Stampede-v2/node_modules/.deno/firebase-admin@12.5.0/node_modules/firebase-admin/lib/app/credential-internal.js:70:15)
at cert (file:///home/runner/work/Stampede-v2/Stampede-v2/node_modules/.deno/firebase-admin@12.5.0/node_modules/firebase-admin/lib/app/credential-factory.js:103:54)
at file:///home/runner/work/Stampede-v2/Stampede-v2/utilities/firebase.ts:6:15
Error: Process completed with exit code 1.
```
This issue occurs as a result of `FIREBASE_ADMIN_KEY` not being accessible in the build environment but this also signifies that the build process is attempting to initialize a connection to Firebase. I only want the connection to initialize in the deployed runtime environment not in the build environment.
## Code
**./firebase.ts**
```ts
import { initializeApp, cert, ServiceAccount } from "npm:firebase-admin/app";
import { getDatabase } from 'npm:firebase-admin/database';
const firebaseCreds: ServiceAccount = JSON.parse(Deno.env.get("FIREBASE_ADMIN_KEY") || "{}");
const firebase = initializeApp({
credential: cert(firebaseCreds),
databaseURL: "https://my-database-default-rtdb.firebaseio.com/"
});
const database = getDatabase(firebase);
export { database };
```
**./routes/index.tsx**
```tsx
import { database } from "../firebase.js";
export const handler: Handlers = {
async GET(_req, ctx) {
const ref = database.ref("/test");
const value = (await ref.get()).val();
return ctx.render(value);
}
}
export default function Home(props: PageProps) {
return (
{ props.data }
);
}
```
Contributor guide
No contributing guide indexed for this repository
Research direction
Start with the reported setup in ./firebase.ts and routes/index.tsx, then inspect how Fresh 1.6.8 builds the Deno Deploy project and handles FIREBASE_ADMIN_KEY. Reproduce the build failure with the Firebase Admin initialization shown. Done means the build no longer requires the runtime-only credential while Firebase access still works in the deployed handler.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- deno, firebase, typescript
- Domain
- backend, build-system, cloud, databases
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100