Create project from existing legacy Forest project and configuration

Hello,

I’m trying to create a new project for a new instance of my existing app deployed on another server.
The current wizard to create a new project does not let me skip the lumber creation steps. I don’t have a dev environment, just a prod one.
I just want to pass a new domain and get a KEY and SECRET to configure my app.
Any option?

Thanks

  • Package Version: “forest-express-sequelize”: “^5.7.0”,
  • Express Version: “express”: “^4.16.4”,
  • Sequelize Version: “sequelize”: “^4.44.2”,
  • Database Dialect: postgres
  • Database Version: 12.5
  • Project Name: Briq
1 Like

Hello @LaurentVB ,

Happy to see you want more Forest projects :slight_smile:

To create a new project, indeed you have to follow the lumber creation steps.

Once this is done, you can add the forest elements from another project (assuming this is compatible with the underlying model and database of course).
We do not have any “clone project” shortcut today.

Hi Sliman, thanks fo the reply.
Both methods for the lumber project creation fail.
Here is the log for the Docker method:

briq_for_essec | > briq-for-essec@0.0.1 start /usr/src/app
briq_for_essec | > node ./server.js
briq_for_essec | 
briq_for_essec | /usr/src/app/node_modules/sequelize/lib/associations/has-many.js:120
briq_for_essec |       type: this.options.keyType || this.source.rawAttributes[this.sourceKeyAttribute].type,
briq_for_essec |                                                                                        ^
briq_for_essec | 
briq_for_essec | TypeError: Cannot read property 'type' of undefined
briq_for_essec |     at HasMany._injectAttributes (/usr/src/app/node_modules/sequelize/lib/associations/has-many.js:120:88)
briq_for_essec |     at Function.hasMany (/usr/src/app/node_modules/sequelize/lib/associations/mixin.js:37:17)
briq_for_essec |     at Function.Timezones.associate (/usr/src/app/models/timezones.js:32:15)
briq_for_essec |     at Object.keys.forEach (/usr/src/app/models/index.js:44:19)
briq_for_essec |     at Array.forEach (<anonymous>)
briq_for_essec |     at Object.<anonymous> (/usr/src/app/models/index.js:42:17)
briq_for_essec |     at Module._compile (internal/modules/cjs/loader.js:778:30)
briq_for_essec |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
briq_for_essec |     at Module.load (internal/modules/cjs/loader.js:653:32)
briq_for_essec |     at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
briq_for_essec |     at Function.Module._load (internal/modules/cjs/loader.js:585:3)
briq_for_essec |     at Module.require (internal/modules/cjs/loader.js:692:17)
briq_for_essec |     at require (internal/modules/cjs/helpers.js:25:18)
briq_for_essec |     at Object.<anonymous> (/usr/src/app/routes/achievement-files.js:3:30)
briq_for_essec |     at Module._compile (internal/modules/cjs/loader.js:778:30)
briq_for_essec |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
briq_for_essec |     at Module.load (internal/modules/cjs/loader.js:653:32)
briq_for_essec |     at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
briq_for_essec |     at Function.Module._load (internal/modules/cjs/loader.js:585:3)
briq_for_essec |     at Module.require (internal/modules/cjs/loader.js:692:17)
briq_for_essec |     at require (internal/modules/cjs/helpers.js:25:18)
briq_for_essec |     at /usr/src/app/node_modules/require-all/index.js:56:46
briq_for_essec |     at Array.forEach (<anonymous>)
briq_for_essec |     at requireAll (/usr/src/app/node_modules/require-all/index.js:34:9)
briq_for_essec |     at Object.<anonymous> (/usr/src/app/app.js:56:1)
briq_for_essec |     at Module._compile (internal/modules/cjs/loader.js:778:30)
briq_for_essec |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
briq_for_essec |     at Module.load (internal/modules/cjs/loader.js:653:32)
briq_for_essec |     at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
briq_for_essec |     at Function.Module._load (internal/modules/cjs/loader.js:585:3)
briq_for_essec |     at Module.require (internal/modules/cjs/loader.js:692:17)
briq_for_essec |     at require (internal/modules/cjs/helpers.js:25:18)
briq_for_essec |     at Object.<anonymous> (/usr/src/app/server.js:5:13)
briq_for_essec |     at Module._compile (internal/modules/cjs/loader.js:778:30)
briq_for_essec | npm ERR! code ELIFECYCLE
briq_for_essec | npm ERR! errno 1
briq_for_essec | npm ERR! briq-for-essec@0.0.1 start: `node ./server.js`
briq_for_essec | npm ERR! Exit status 1
briq_for_essec | npm ERR! 
briq_for_essec | npm ERR! Failed at the briq-for-essec@0.0.1 start script.
briq_for_essec | npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
briq_for_essec | 
briq_for_essec | npm ERR! A complete log of this run can be found in:
briq_for_essec | npm ERR!     /root/.npm/_logs/2021-01-08T16_33_05_145Z-debug.log
briq_for_essec exited with code 1

Hi @LaurentVB,

Would you mind running a docker images forestadmin/lumber command in order to ensure that you’re running your docker setup with the latest image version?

Thank you :pray:

Currently it returns a empty list, because the container exits immediately after docker-compose up

~/projects/briq/Briq for Essec $ docker images forestadmin/lumber
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
~/projects/briq/Briq for Essec $ 

@LaurentVB, while going through a new project creation, when choosing docker, you’re asked to run a command that starts by pulling the forestadmin/lumber docker image and then ini a new lumber project with the provided credentials.

Thus after running this comment, you should have a forestadmin/lumber docker image locally.

Or maybe you’re not running the docker command we’re providing during a new project creation?

Sorry, had cleaned up downloaded containers to start from scratch, here’s the output after running the process again:

~/projects/briq $ docker images forestadmin/lumber
REPOSITORY           TAG       IMAGE ID       CREATED      SIZE
forestadmin/lumber   latest    356f05af2ffd   3 days ago   741MB

Thank you @LaurentVB, it looks like you are indeed on the last docker image version.

Is there any logs before the one you shared? That might give us hints on when the issue occurred exactly (and maybe on which model generation)

Here is the full log.

For the record: I don’t need lumber, I don’t want to go through a full setup, I already have a working forest setup in my app, that I only want to run on a different server and in a different forest project.

~/projects/briq $ docker run \
>   -v `pwd`:/usr/src/app --init \
>   <other params redacted>
>   -ti forestadmin/lumber
✓ Connecting to your database
✓ Analyzing the database
✓ Creating your project on Forest Admin
  create forest/achievement-files.js
  create forest/achievements.js
  create forest/applications.js
  create forest/billing-plans.js
  create forest/briq-conversions.js
  create forest/catalogs.js
  create forest/categories.js
  create forest/countries.js
  create forest/digests.js
  create forest/discarded-messages.js
  create forest/feedback-requests.js
  create forest/feedbacks.js
  create forest/installs.js
  create forest/invitations.js
  create forest/message-excluded-users.js
  create forest/messages.js
  create forest/notifications.js
  create forest/notifications-preferences.js
  create forest/order-workflows.js
  create forest/orders.js
  create forest/organizations.js
  create forest/payments.js
  create forest/power-boosts.js
  create forest/praise-reactions.js
  create forest/praise-users.js
  create forest/praises.js
  create forest/products.js
  create forest/sequelize-meta.js
  create forest/surveys.js
  create forest/task-categories.js
  create forest/task-messages.js
  create forest/task-owners.js
  create forest/task-reminders.js
  create forest/task-suggestion-user-groups.js
  create forest/task-suggestions.js
  create forest/task-user-groups.js
  create forest/tasks.js
  create forest/timezones.js
  create forest/transaction-notifications.js
  create forest/transactions.js
  create forest/user-emails.js
  create forest/user-group-users.js
  create forest/user-groups.js
  create forest/users.js
  create middlewares/forestadmin.js
  create middlewares/welcome.js
  create models/index.js
  create models/achievement-files.js
  create models/achievements.js
  create models/applications.js
  create models/billing-plans.js
  create models/briq-conversions.js
  create models/catalogs.js
  create models/categories.js
  create models/countries.js
  create models/digests.js
  create models/discarded-messages.js
  create models/feedback-requests.js
  create models/feedbacks.js
  create models/installs.js
  create models/invitations.js
  create models/message-excluded-users.js
  create models/messages.js
  create models/notifications.js
  create models/notifications-preferences.js
  create models/order-workflows.js
  create models/orders.js
  create models/organizations.js
  create models/payments.js
  create models/power-boosts.js
  create models/praise-reactions.js
  create models/praise-users.js
  create models/praises.js
  create models/products.js
  create models/sequelize-meta.js
  create models/surveys.js
  create models/task-categories.js
  create models/task-messages.js
  create models/task-owners.js
  create models/task-reminders.js
  create models/task-suggestion-user-groups.js
  create models/task-suggestions.js
  create models/task-user-groups.js
  create models/tasks.js
  create models/timezones.js
  create models/transaction-notifications.js
  create models/transactions.js
  create models/user-emails.js
  create models/user-group-users.js
  create models/user-groups.js
  create models/users.js
  create public/favicon.png
  create routes/achievement-files.js
  create routes/achievements.js
  create routes/applications.js
  create routes/billing-plans.js
  create routes/briq-conversions.js
  create routes/catalogs.js
  create routes/categories.js
  create routes/countries.js
  create routes/digests.js
  create routes/discarded-messages.js
  create routes/feedback-requests.js
  create routes/feedbacks.js
  create routes/installs.js
  create routes/invitations.js
  create routes/message-excluded-users.js
  create routes/messages.js
  create routes/notifications.js
  create routes/notifications-preferences.js
  create routes/order-workflows.js
  create routes/orders.js
  create routes/organizations.js
  create routes/payments.js
  create routes/power-boosts.js
  create routes/praise-reactions.js
  create routes/praise-users.js
  create routes/praises.js
  create routes/products.js
  create routes/sequelize-meta.js
  create routes/surveys.js
  create routes/task-categories.js
  create routes/task-messages.js
  create routes/task-owners.js
  create routes/task-reminders.js
  create routes/task-suggestion-user-groups.js
  create routes/task-suggestions.js
  create routes/task-user-groups.js
  create routes/tasks.js
  create routes/timezones.js
  create routes/transaction-notifications.js
  create routes/transactions.js
  create routes/user-emails.js
  create routes/user-group-users.js
  create routes/user-groups.js
  create routes/users.js
  create views/index.html
  create .dockerignore
  create .env
  create .gitignore
  create app.js
  create docker-compose.yml
  create Dockerfile
  create package.json
  create /server.js
✓ Creating your project files
> Hooray, installation success!
added 216 packages from 214 contributors and audited 217 packages in 25.589s
found 0 vulnerabilities

~/projects/briq $ docker images forestadmin/lumber
REPOSITORY           TAG       IMAGE ID       CREATED      SIZE
forestadmin/lumber   latest    356f05af2ffd   3 days ago   741MB
~/projects/briq $ cd "Briq for Essec"
~/projects/briq/Briq for Essec $ docker-compose up
Recreating briq_for_essec ... done
Attaching to briq_for_essec
briq_for_essec | 
briq_for_essec | > briq-for-essec@0.0.1 start /usr/src/app
briq_for_essec | > node ./server.js
briq_for_essec | 
briq_for_essec | /usr/src/app/node_modules/sequelize/lib/associations/has-many.js:120
briq_for_essec |       type: this.options.keyType || this.source.rawAttributes[this.sourceKeyAttribute].type,
briq_for_essec |                                                                                        ^
briq_for_essec | 
briq_for_essec | TypeError: Cannot read property 'type' of undefined
briq_for_essec |     at HasMany._injectAttributes (/usr/src/app/node_modules/sequelize/lib/associations/has-many.js:120:88)
briq_for_essec |     at Function.hasMany (/usr/src/app/node_modules/sequelize/lib/associations/mixin.js:37:17)
briq_for_essec |     at Function.Timezones.associate (/usr/src/app/models/timezones.js:32:15)
briq_for_essec |     at Object.keys.forEach (/usr/src/app/models/index.js:44:19)
briq_for_essec |     at Array.forEach (<anonymous>)
briq_for_essec |     at Object.<anonymous> (/usr/src/app/models/index.js:42:17)
briq_for_essec |     at Module._compile (internal/modules/cjs/loader.js:778:30)
briq_for_essec |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
briq_for_essec |     at Module.load (internal/modules/cjs/loader.js:653:32)
briq_for_essec |     at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
briq_for_essec |     at Function.Module._load (internal/modules/cjs/loader.js:585:3)
briq_for_essec |     at Module.require (internal/modules/cjs/loader.js:692:17)
briq_for_essec |     at require (internal/modules/cjs/helpers.js:25:18)
briq_for_essec |     at Object.<anonymous> (/usr/src/app/routes/achievement-files.js:3:30)
briq_for_essec |     at Module._compile (internal/modules/cjs/loader.js:778:30)
briq_for_essec |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
briq_for_essec |     at Module.load (internal/modules/cjs/loader.js:653:32)
briq_for_essec |     at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
briq_for_essec |     at Function.Module._load (internal/modules/cjs/loader.js:585:3)
briq_for_essec |     at Module.require (internal/modules/cjs/loader.js:692:17)
briq_for_essec |     at require (internal/modules/cjs/helpers.js:25:18)
briq_for_essec |     at /usr/src/app/node_modules/require-all/index.js:56:46
briq_for_essec |     at Array.forEach (<anonymous>)
briq_for_essec |     at requireAll (/usr/src/app/node_modules/require-all/index.js:34:9)
briq_for_essec |     at Object.<anonymous> (/usr/src/app/app.js:56:1)
briq_for_essec |     at Module._compile (internal/modules/cjs/loader.js:778:30)
briq_for_essec |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
briq_for_essec |     at Module.load (internal/modules/cjs/loader.js:653:32)
briq_for_essec |     at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
briq_for_essec |     at Function.Module._load (internal/modules/cjs/loader.js:585:3)
briq_for_essec |     at Module.require (internal/modules/cjs/loader.js:692:17)
briq_for_essec |     at require (internal/modules/cjs/helpers.js:25:18)
briq_for_essec |     at Object.<anonymous> (/usr/src/app/server.js:5:13)
briq_for_essec |     at Module._compile (internal/modules/cjs/loader.js:778:30)
briq_for_essec | npm ERR! code ELIFECYCLE
briq_for_essec | npm ERR! errno 1
briq_for_essec | npm ERR! briq-for-essec@0.0.1 start: `node ./server.js`
briq_for_essec | npm ERR! Exit status 1
briq_for_essec | npm ERR! 
briq_for_essec | npm ERR! Failed at the briq-for-essec@0.0.1 start script.
briq_for_essec | npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
briq_for_essec | 
briq_for_essec | npm ERR! A complete log of this run can be found in:
briq_for_essec | npm ERR!     /root/.npm/_logs/2021-01-11T09_16_14_415Z-debug.log
briq_for_essec exited with code 1

Ok, sorry it seems that I missed the use case you’re trying to solve.

Do you need to set up a brand new project linked to another database?

Or a new environment for your existing project?

If you’re not sure of which one, you can share with me the use case you’re trying to solve so I can lead you to the best suited solution

Can a new environment have a separate access list?
Meaning some users will only be able to access this environment?

Once again this depends on your need.

If what you need is to restrict access to some collections to some users, what you might need is to define teams: https://docs.forestadmin.com/documentation/reference-guide/teams-and-users/create-and-manage-a-team

If your need is different, you might share it with me so I can help you choose setup what you need

I see 3 different use cases that requires different setups:

  • If the two separate group of users are using the same single database and that they are sharing actions/models etc, you’d prefer defining teams to keep the same logic and ease code support. Then only display the wanted collection to the relevant team.
  • If the two group of users are using completely different databases and that you want the data/collection/actions to be completely separated, then you should consider having two different projects.
  • If those two groups of users are using different databases but you need to have cross databases charts, info or just some people to have access to both databases, you should keep it all under the same project, add the support for multiple databases and then add teams to restrict user access to the collections from the wanted database.

I hope this will help