diff --git a/README.md b/README.md index 8c953f23..6b958aec 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -

Morpheus
A WebApp to generate artwork with stable diffusion models.

▶️ Quickstart | @@ -11,11 +10,13 @@ -   +
-**Morpheus is an open-source project that offers a creative and innovative platform for generating stunning artworks using image editing and stable diffusion models.** +**Morpheus is an open-source project that offers a creative and innovative platform for generating stunning artworks +using image editing and stable diffusion models.**
@@ -27,7 +28,7 @@ ## Key Features - **Free & open source**, you can create your own server and keep your data -- **Powerful, modular design to support and load many models** +- **Powerful, modular design to support and load many models** - **Several use cases supported**, we provide Image to image support, Controlnet and Pix2pix - **Local Setup or Cloud** - **Infrastructure as Code**, We also open source the infrastructure as code to run it on scale. @@ -45,12 +46,14 @@ Prequisites: -> Morpheus uses Firebase for authentication: Generate a service account credentials JSON file in Firebase before starting. +> Morpheus uses Firebase for authentication: Generate a service account credentials JSON file in Firebase before +> starting. -> Install Docker and Docker Compose on your system (if not already installed, skip if using k8s setup) +> Install Docker +> and Docker Compose on your system (if not +> already installed, skip if using k8s setup)
- ```bash # make sure you've installed docker: https://docs.docker.com/engine/install/ # and docker-compose: https://docs.docker.com/compose/install/ @@ -73,6 +76,7 @@ nano morpheus-server/secrets.env # Build the docker images docker-compose build ``` + Follow one,
@@ -83,6 +87,7 @@ Follow one, # Run using the staging profile docker-compose --profile=staging up ``` +
@@ -94,7 +99,9 @@ Update the environment variable for environment in `morpheus-server/secrets.env` ```shell ENVIRONMENT=local-mps ``` + Run the image locally if you have an M1/M2 Mac + ```shell # Make sure you don't have any other morpheus docker containers running or images built docker-compose --file docker-compose-local-mps.yaml up @@ -102,6 +109,7 @@ docker-compose --file docker-compose-local-mps.yaml up In a new terminal window, run the following commands to run the celery workers (for stable-diffusion and magic-prompt) locally: + ```shell # Move to the morpheus-server directory cd morpheus-server @@ -175,7 +183,7 @@ docker compose run --rm model-script db update local sdiffusion You only need to change the information in yaml file in order to update the information in db. If you want to add a new model, you only need to add its information in the -file [models-info.yam](./morpheus-server/scripts/models/models-info.yaml) +file [models-info.yaml](./morpheus-server/scripts/models/models-info.yaml) #### ControlNet models @@ -186,9 +194,10 @@ In order to use ControlNet **locally**, you need to download and register the mo docker compose run --rm model-script upload local controlnet ``` -ControlNet models will also be downloaded to the directory `morpheus-server/tmp`. If you want to add a new model, you only +ControlNet models will also be downloaded to the directory `morpheus-server/tmp`. If you want to add a new model, you +only need to add its information in the -file [controlnet-models-info.yam](./morpheus-server/scripts/models/controlnet-models-info.yaml) +file [controlnet-models-info.yaml](./morpheus-server/scripts/models/controlnet-models-info.yaml) In the same way, if model is already registered on database, this command allows you update the register on it. If you want only interact with the database, you can run this command to update the register: @@ -199,9 +208,24 @@ docker compose run --rm model-script db update local controlnet You only need to change the information in yaml file in order to update the information in db. +#### MagicPrompt model + +In order to use MagicPrompt **locally**, you need to download and upload the model to the S3 bucket: + +```bash +# register models specified in morpheus-server/scripts/models/magicprompt-models-info.yaml +docker compose run --rm model-script upload local magicprompt +``` + +MagicPrompt model will also be downloaded to the directory `morpheus-server/tmp`. If you want to add a new model, you +only +need to add its information in the +file [magicprompt-models-info.yaml](./morpheus-server/scripts/models/magicprompt-models-info.yaml) + For more information about this script, you can read the [README](./morpheus-server/scripts/models/README.md). ## Development + ### Running the backend tests ```shell @@ -222,7 +246,7 @@ docker compose run --rm api pytest tests/test_module.py::test_function docker-compose run --rm api alembic revision --autogenerate -m "Initial migration" # Migrate / Update the head -docker-compose run --rm api alembic upgrade head +docker-compose run --rm api alembic upgrade head ``` ### PG admin @@ -230,6 +254,7 @@ docker-compose run --rm api alembic upgrade head PGadmin is available in: localhost:8002 The user and password must be added in secrets.env file. + ``` # example values PGADMIN_DEFAULT_EMAIL=admin@admin.com @@ -267,7 +292,8 @@ jq -r '.default | to_entries[] | .key + .value.version' Pipfile.lock > requireme ``` -**Note:** This project doesn't use requirements.txt to manage dependencies. requirements.lint.txt is only used for using cache in ci workflow linting job. +**Note:** This project doesn't use requirements.txt to manage dependencies. requirements.lint.txt is only used for using +cache in ci workflow linting job. ### Adding a new dependency to the frontend @@ -321,6 +347,7 @@ docker compose run --rm model-script db delete --target ``` ### Running without GPU (this returns fixed fake images from the models) + ```shell # Build the docker image if you don't have gpu docker-compose --profile=local build @@ -328,6 +355,7 @@ docker-compose --profile=local build # Run the image locally if you don't have gpu docker-compose --profile=local up ``` + ### Adding a new feature If you want to add a new feature, you should follow the next steps: @@ -367,13 +395,20 @@ If all the checks pass, you can push your changes ## Configuring k8s cluster -Some templates have been included to help create the Kubernetes cluster and the necessary infrastructure. For additional configuration documentation, please refer to this [link](https://github.com/Monadical-SAS/Morpheus/tree/main/infra/modules). +Some templates have been included to help create the Kubernetes cluster and the necessary infrastructure. For additional +configuration documentation, please refer to +this [link](https://github.com/Monadical-SAS/Morpheus/tree/main/infra/modules). To configure Terraform, please follow these steps: -* Create a new SSL certificate using the ACM (Amazon Certificate Manager) service in AWS to obtain the ARN (Amazon Resource Name). Remember to save the ARN for the next steps. -* Create a DB secret using the "Secrets Manager" service in the AWS console. The secret should be an "Other type of secret". The value must be in this format: ```{"username":"username","password":"xxxxxxxxxxxxxxxxx"}```. Save the secret name for the next steps. -* Create a terraform.tfvars file in the ./infra/envs/staging/ folder with the information obtained from your AWS account. Use the ARN for the arn_ssl_certificate_cf_distribution field and the DB secret name for db_password_secret_manager_name. Additionally, update cname_frontend with a domain that you manage. +* Create a new SSL certificate using the ACM (Amazon Certificate Manager) service in AWS to obtain the ARN (Amazon + Resource Name). Remember to save the ARN for the next steps. +* Create a DB secret using the "Secrets Manager" service in the AWS console. The secret should be an "Other type of + secret". The value must be in this format: ```{"username":"username","password":"xxxxxxxxxxxxxxxxx"}```. Save the + secret name for the next steps. +* Create a terraform.tfvars file in the ./infra/envs/staging/ folder with the information obtained from your AWS + account. Use the ARN for the arn_ssl_certificate_cf_distribution field and the DB secret name for + db_password_secret_manager_name. Additionally, update cname_frontend with a domain that you manage. ``` AWS_ACCESS_KEY = "" @@ -393,7 +428,8 @@ region = "us-east-1" To manage Terraform backends, follow these steps: * Create an S3 bucket to manage the Terraform backends. -* Create a backend.conf file in ./infra/envs/staging/ based on backend.conf.dist. Make sure to update the route if you prefer to use a different one. +* Create a backend.conf file in ./infra/envs/staging/ based on backend.conf.dist. Make sure to update the route if you + prefer to use a different one. ```conf bucket = "morpheus-infra-backend" @@ -411,7 +447,8 @@ terraform apply ``` * Save the Terraform outputs to a separate file. -* Create a kubectl configuration file to access the cluster. Use the Terraform outputs to complete the arguments for the region and cluster name. +* Create a kubectl configuration file to access the cluster. Use the Terraform outputs to complete the arguments for the + region and cluster name. ```bash aws eks --region us-east-1 update-kubeconfig --name cluster-name-from-outputs @@ -420,18 +457,22 @@ aws eks --region us-east-1 update-kubeconfig --name cluster-name-from-outputs ### Installing helm charts - Nginx ingress * Create a backend.conf file in the ./infra/charts/staging/ folder based on the backend.conf.dist file provided. + ``` bucket = "morpheus-infra-backend" key = "env/staging/charts/state.tfstate" region = "us-east-1" ``` -* Create a terraform.tfvars file in the ./infra/envs/staging/ folder that includes the path to your Kubernetes configuration. +* Create a terraform.tfvars file in the ./infra/envs/staging/ folder that includes the path to your Kubernetes + configuration. + ``` kubeconfig_path = "/home/user/.kube/config" ``` * To apply the Ingress Helm chart (this step should be performed after creating the cluster): + ```bash cd ./infra/test/eks-charts terraform init -backend-config=backend.conf @@ -443,6 +484,7 @@ terraform apply create a file called morpheus-secrets.yaml based on ./infra/tools/k8s/morpheus-secrets.yaml.example. Make sure to update the values with the secrets that are coded in base64. + ```bash # To code for example POSTGRES_USER echo -n "dbpassword" | base64 -w 0 @@ -494,7 +536,6 @@ kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0. ## Run with supervisor - ```bash # In repo directory mkdir -p data/logs @@ -519,59 +560,73 @@ sudo supervisorctl stop stablediffusion docker compose down ``` -When using the stop instruction, you need to down the containers manually using docker compose because supervisor can't handle docker +When using the stop instruction, you need to down the containers manually using docker compose because supervisor can't +handle docker processes, only start and check that the service is running - - - # CI/CD configuration -The platform currently uses GitHub Actions for deployment. To integrate this with your custom project, you should set the following secrets in GitHub: +The platform currently uses GitHub Actions for deployment. To integrate this with your custom project, you should set +the following secrets in GitHub: AWS access variables: + - AWS_ACCESS_KEY_ID: Aws credential - AWS_SECRET_ACCESS_KEY: Aws credential - AWS_CLUSTER_NAME: Name of the eks cluster. This is used to generate the kube config. - AWS_REGION: Aws region where is located the eks cluster. Eg. us-east-1 Cloudflare tokens to clear the cache: + - CLOUDFLARE_API_TOKEN - CLOUDFLARE_ZONE_ID Dockerhub tokens to push and pull images in the deploy process: + - DOCKER_HUB_TOKEN - DOCKER_HUB_USER Firebase configuration: + - FIREBASE_CLIENT_EMAIL - FIREBASE_PRIVATE_KEY - FIREBASE_PROJECT_ID Other infra configuration: + - FRONTEND_DOMAIN: Platform domain (Eg. morpheus.com) Sentry configuration: + - SENTRY_AUTH_TOKEN - SENTRY_ENV - SENTRY_ORG - SENTRY_PROJECT - SENTRY_URL +Monorepo configuration: + +- CICD_REPO_PATH: Repo path in the GitHub actions runner. Usually the repo name. E.g. + /home/runner/work/Morpheus/Morpheus + # How to collaborate ### Forking the Repository -* Go to the Morpheus's GitHub repository. + +* Go to the Morpheus's GitHub repository. * Click on the "Fork" button in the top-right corner of the repository page. * This will create a copy of the repository under your GitHub account. ### Cloning the Forked Repository + * On your GitHub account, navigate to the forked repository. * Click on the "Code" button and copy the repository URL. * Clone the repository locally ### Adding an Upstream Remote + Change to the repository directory using cd. + ``` git remote add upstream https://github.com/Monadical-SAS/Morpheus.git ``` @@ -579,20 +634,27 @@ git remote add upstream https://github.com/Monadical-SAS/Morpheus.git ### Creating a New Branch for your changes ### Create a Pull request + * Go to the original project's GitHub repository. * Create a new PR selecting your forked repository and the branch containing your changes. ### Updating Your Fork with Upstream Changes: * Fetch the upstream repository changes using the git fetch command. + ``` git fetch upstream ``` -* Switch to your local main branch using git checkout main and merge the upstream changes into your local main branch using git merge. + +* Switch to your local main branch using git checkout main and merge the upstream changes into your local main branch + using git merge. + ``` git merge upstream/main ``` + * Push the updated changes to your forked repository on GitHub using git push. + ``` git push origin main ``` diff --git a/morpheus-client/components/FAQ/FAQ.tsx b/morpheus-client/components/FAQ/FAQ.tsx index 51bbf98e..858f2621 100644 --- a/morpheus-client/components/FAQ/FAQ.tsx +++ b/morpheus-client/components/FAQ/FAQ.tsx @@ -97,23 +97,23 @@ export const FAQ = () => {
  • Text To Image:{" "} - +
  • Image To Image:{" "} - +
  • Pix To Pix:{" "} - +
  • ControlNet:{" "} - +
  • Inpainting:{" "} - +
diff --git a/morpheus-client/components/Footer/Footer.tsx b/morpheus-client/components/Footer/Footer.tsx index f62be948..cc127a7e 100644 --- a/morpheus-client/components/Footer/Footer.tsx +++ b/morpheus-client/components/Footer/Footer.tsx @@ -13,11 +13,8 @@ const Footer = () => {
- - Terms of service - - - Policy Service + + Contact us
diff --git a/morpheus-client/components/ImageDraggable/ImageDraggable.tsx b/morpheus-client/components/ImageDraggable/ImageDraggable.tsx index eade7ad7..5109b16d 100644 --- a/morpheus-client/components/ImageDraggable/ImageDraggable.tsx +++ b/morpheus-client/components/ImageDraggable/ImageDraggable.tsx @@ -157,8 +157,8 @@ const DragDropFile = (props: DragDropFileProps) => { > setShowEditModal(false)} /> diff --git a/morpheus-client/pages/about.tsx b/morpheus-client/pages/about.tsx index 4c637993..59ecc7af 100644 --- a/morpheus-client/pages/about.tsx +++ b/morpheus-client/pages/about.tsx @@ -1,6 +1,6 @@ import MainContainer from "../layout/MainContainer/MainContainer"; import FAQ from "../components/FAQ/FAQ"; -import {AppLink} from "@/components/AppLink/AppLink"; +import { AppLink } from "@/components/AppLink/AppLink"; import ImagePrompt from "@/components/ImagePrompt/ImagePrompt"; import { ControlNetDescription, @@ -13,205 +13,204 @@ import styles from "../styles/pages/About.module.scss"; const About = () => { return ( - -
-
-
-

- Create breathtaking visuals in seconds: -

-

- Morpheus effortlessly turns your imaginative concepts into - artistic reality using keywords and styles. -

-
- - Morpheus example -
- -
+ +
+
+
+

+ Create breathtaking visuals in seconds: +

- Morpheus is an experimental{" "} - - project built by - - intended to lower the amount of expertise required to put - open-source generative models into the hands of creators and - professionals. + Morpheus effortlessly turns your imaginative concepts into + artistic reality using keywords and styles.

+
-

- This project aims to provide a simplified, user-friendly frontend - similar to the{" "} - - , with an accompanying back-end that automatically deploys any model - to GPU instances with a load balancer. -

- -

- We’re hoping to get some feedback from users like you! Do you find - this useful? Are there features missing from our [roadmap](link to - roadmap) that you would like to see? Run into any problems or bugs? - We want to hear about it! Contact us via [email](mailto link) or - - . -

-
- -
-

Frontend

-

- Our hosted version of the Morpheus project supports text-to-image, - image-to-image, pix2pix, ControlNet, and inpainting capabilities. - Collaborative image editing (MSPaint-style) is also near completion - (see our{" "} - - roadmap - - ). -

- -

Text-to-Image:

- - -

Image-to-Image:

- + Morpheus example +
-

Pix2Pix:

- - -

ControlNet:

- - -

Inpainting:

- -
- -
-

Backend

- -

- The Morpheus project is designed to make deploying a generative - image model as simple as possible. -

- -
    -
  • - Go to the Models Info YAML file and update it with the information - for the new model: -
    - name: My new model name
    - description: My new model description
    - source: Hugging Face model ID -
    -
  • - -
  • - Run the following command from your terminal:
    -
    - - docker compose run --rm model-script upload local sdiffusion - -
    -
  • - -
  • Refresh the browser, and the model will be ready to use.
  • -
- -

- You can find more information on how to do this at - -

-
- -
- +

+ Morpheus is an experimental{" "} + - - + intended to lower the amount of expertise required to put + open-source generative models into the hands of creators and + professionals. +

+ +

+ This project aims to provide a simplified, user-friendly frontend + similar to the{" "} + - - + +

+ We’re hoping to get some feedback from users like you! Do you find + this useful? Are there features missing from our{" "} + + roadmap + {" "} + that you would like to see? Run into any problems or bugs? We want + to hear about it! Contact us via{" "} + + email + {" "} + or + -

- -
-

Roadmap

- -

- Migrate to a plugin-based architecture: -

-

- This will allow easy addition, modification, or removal of - functionalities within the Morpheus codebase. It will also allow - external contributors to propose new features as plugins and expose - them in the Morpheus plugin marketplace. -

- -

Plugin marketplace:

-

- This will enable end users to choose which functionalities to use in - the application based on their specific needs. -

- -

Support for Lora embeddings:

-

- This will allow users to choose from a wide variety of different - styles when generating new images. -

- -

- Integrate ray.io as the model serving engine: -

-

- Ray is a framework for scaling AI and Python applications in - general. With this integration, the way models are served locally - and in production will be unified, and the serving and scaling of - models within the system will be improved. -

- -

Administrator:

-

- This will allow the addition or removal of new models and styles - through a graphical interface, simplifying the process. -

-
- -
- -
-
-
+ . +

+ + +
+

Frontend

+

+ Our hosted version of the Morpheus project supports text-to-image, + image-to-image, pix2pix, ControlNet, and inpainting capabilities. + Collaborative image editing (MSPaint-style) is also near completion. +

+ +

Text-to-Image:

+ + +

Image-to-Image:

+ + +

Pix2Pix:

+ + +

ControlNet:

+ + +

Inpainting:

+ +
+ +
+

Backend

+ +

+ The Morpheus project is designed to make deploying a generative + image model as simple as possible. +

+ + + +

+ You can find more information on how to do this at + +

+
+ +
+ + + + + +
+ +
+

Roadmap

+ +

+ Migrate to a plugin-based architecture: +

+

+ This will allow easy addition, modification, or removal of + functionalities within the Morpheus codebase. It will also allow + external contributors to propose new features as plugins and expose + them in the Morpheus plugin marketplace. +

+ +

Support for Lora embeddings:

+

+ This will allow users to choose from a wide variety of different + styles when generating new images. +

+ +

+ Integrate ray.io as the model serving engine: +

+

+ Ray is a framework for scaling AI and Python applications in + general. With this integration, the way models are served locally + and in production will be unified, and the serving and scaling of + models within the system will be improved. +

+ +

Administrator:

+

+ This will allow the addition or removal of new models and styles + through a graphical interface, simplifying the process. +

+
+ +
+ +
+ + ); }; -export default About; \ No newline at end of file +export default About; diff --git a/morpheus-client/pages/imagine/inpainting.tsx b/morpheus-client/pages/imagine/inpainting.tsx index aee39841..bd02e7c3 100644 --- a/morpheus-client/pages/imagine/inpainting.tsx +++ b/morpheus-client/pages/imagine/inpainting.tsx @@ -1,11 +1,11 @@ import { NextPage } from "next"; -import ImageDraggable from "../../components/ImageDraggable/ImageDraggable"; -import ImageGallery from "../../components/ImageGallery/ImageGallery"; -import { UploadMaskIcon } from "../../components/icons/uploadMask"; -import ImagineInput from "../../components/ImagineInput/ImagineInput"; -import PrivateRoute from "../../components/Auth/PrivateRoute/PrivateRoute"; -import { useDiffusion } from "../../context/SDContext"; -import { useImagine } from "../../context/ImagineContext"; +import ImageDraggable from "@/components/ImageDraggable/ImageDraggable"; +import ImageGallery from "@/components/ImageGallery/ImageGallery"; +import { UploadMaskIcon } from "@/components/icons/uploadMask"; +import ImagineInput from "@/components/ImagineInput/ImagineInput"; +import PrivateRoute from "@/components/Auth/PrivateRoute/PrivateRoute"; +import { useDiffusion } from "@/context/SDContext"; +import { useImagine } from "@/context/ImagineContext"; import styles from "../../styles/pages/StableDiffusion.module.scss"; const Inpainting: NextPage = () => { diff --git a/morpheus-server/firebase-admin-sdk.json b/morpheus-server/firebase-admin-sdk.json deleted file mode 100644 index d9ee7b8d..00000000 --- a/morpheus-server/firebase-admin-sdk.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "service_account", - "project_id": "morpheus-sd", - "private_key_id": "e03815a2eabac917b4a199aa0fd68d6d67a3450d", - "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDcv7iNg6eWSgY8\nUd8FWQHGdIGLbB1dU/CFOVvAKEyFGJinBruTQnUEsVNTkFQYFj90VyD4E9p7sSOv\nS/DZt/JSRyyz2APRpmIEvrOlbUXqr3knhsaIamj82Axl/xJY95iXWUyhwwW9vd9d\nikQJYmrY/K0j8J26hR+DHOKMlAmvI2A1W33e/PXcaPO2pH748m5Q4dszarZ343An\nm065l7iNvom2MvIjS4aVICIFiaoFs30c9vuiTxc0F5DhP+N3bNoSYE7oS833eMQD\nKC26FQVMKURNk92YJYIEM53b54Lk7n/Cyn+TP7Y1z0PgXSfWA9eIv1BBlmOnbhGd\nUw+FEYgJAgMBAAECggEAAkFNI9jz9dOUw7n8YsQZggr/pcp5dFIes2W2G7ztpzBs\noswtT2BO7LjZBpIDYemcRVZ8hjxBr6DMIgbPE5JO/esvODkdNN+TwcOm9yoqHC8l\nuDMmxQ79OpQEcGhOKi2BWA53+3EQFnOhnAWFE2l3ePb/182l9tlUTJUXdWMvxCO+\nBOtXNJ9ay+vdZtXL9tyIIYge73KoT/UU/n9pbuDbhbA9OFDDLW3jRDykDCVwJQqO\nL1pI1c9HdlQLB/cMlOQbWmlymiNB0WNEK10/yEDExoE7fN1RYFr4IKQfN+NrnIei\np9P9rLTgOdFNx1c4oZXTXCsdSe5EcTSXLJV2hO76VwKBgQDv1qGhvUx/HZB3yf0L\nEya3U/lZuFQrfj3aTwgic3w8VUdFHjjAnY3K+9O90SU7VA1jA5UMu0I88U6/y57h\nLVFI7FbAljFpzjVVPegquN+6IH5WAAX733uqT2JTluKTweI68v4TF11EIz586Ywa\n7ryyuwuHXf55VXl/o/w+v7YkywKBgQDrn8iImMasLCSk9AjYBPX4WYmwfJUCbGZS\nIpmzJCfzUBK9BVfgxJ3ruvuaAn94Qt/x/CR9fgtpCW0Zu4yIt5YGVt3ExsgBpO3z\nNqfFQBbiS5fQocBDWhWty0hDMRUvZRq6Z+1/hvRAeyI76mOzsWEqipryXAUhxmBB\nOeh1/xi/+wKBgH2gVxl5JlCPE9UrIDhk16q/eaTdQHlnrs5jB0fEZhbUNHin0+JQ\npKzmK4sJug7RgBGVFsWMcK2rWCxuY9JfAmzIHsjR4yAgux7jRnDaVZYQ3xv89yVv\ncj9LRZ2zMwtiSzXFggBOBLRkIZ8cVh7lXkHgZ7GIMnsronCRXNchZC7xAoGBANuu\nwvpQbtNx6Mx+1owJvAdL++s3jHqQ9KlZpzH14OWi34WqqK9gwdhaImEKOSy4NTHZ\no2/5h8vrxPO8ACAsAs1wSh5AM5QM4OnlKHDo+y0Ly8TyOl7Ra+r44Cv9ZEInIs9v\nPGitO6eu5lE0jLaqB+zxA9w5XXOLEI1f31O8fqfnAoGAJONgLU1cSlLoc8/dHk5s\neNTcz1cmbkH70Kwm+w+XwruO3zoijuDdUjrNy0z247hZU/6AcXbzPSxKRxvglFYz\nq2f/Jw7pzYRlgMuEEfiGy2V2CPY9UAkgNBQ0fdj8WOyOyU5+Q5uEplYc2AF/mz58\nL3qrG8USlCazV3MwOj/G8zk=\n-----END PRIVATE KEY-----\n", - "client_email": "firebase-adminsdk-hy43a@morpheus-sd.iam.gserviceaccount.com", - "client_id": "111478589064623071333", - "auth_uri": "https://accounts.google.com/o/oauth2/auth", - "token_uri": "https://oauth2.googleapis.com/token", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-hy43a%40morpheus-sd.iam.gserviceaccount.com" -}