diff --git a/api/.env.defaults b/api/.env.defaults
index ec63f0099d8e332beeb98eebeb534786a303b01a..eda459d2a6ba95e8411351356b098bd25da6d0ca 100644
--- a/api/.env.defaults
+++ b/api/.env.defaults
@@ -14,10 +14,3 @@ AUTH_JWT_SECRET=SecretForDevPurposeOnly
 AUTH_JWT_TOKEN_EXPIRES_IN=2d
 AUTH_COOKIE_SAME_SITE=strict
 AUTH_COOKIE_SECURE=true
-
-#DB
-DB_HOST=localhost
-DB_PORT=5454
-DB_USERNAME=postgres
-DB_PASSWORD=pass123
-DB_NAME=postgres
diff --git a/api/ormconfig.ts b/api/ormconfig.ts
new file mode 100644
index 0000000000000000000000000000000000000000..27afa05b4dda41d61eeae90c870720df0fd9fa92
--- /dev/null
+++ b/api/ormconfig.ts
@@ -0,0 +1,20 @@
+import { ConfigModule } from '@nestjs/config';
+import dbConfiguration from './src/config/db.config';
+
+ConfigModule.forRoot({
+  isGlobal: true,
+  envFilePath: ['.env', '.env.defaults'],
+  load: [dbConfiguration],
+});
+
+const config = {
+  ...dbConfiguration(),
+  entities: ['dist/**/*.entity.js', 'dist/**/*.model.js'],
+  migrations: ['dist/migrations/*{.ts,.js}'],
+  migrationsRun: false,
+  cli: {
+    migrationsDir: 'src/migrations',
+  },
+};
+
+export default config;
diff --git a/api/package.json b/api/package.json
index 142d29fc53b88f607a56e402253edafcad98d9c7..50b06683499367df8fe7320b083a7c8120de2702 100644
--- a/api/package.json
+++ b/api/package.json
@@ -20,7 +20,10 @@
     "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
     "test:e2e": "jest --config ./test/jest.e2e-config.ts",
     "test:we2e": "jest --watch --config ./test/jest.e2e-config.ts",
-    "prepare": "cd .. && husky install api/.husky"
+    "prepare": "cd .. && husky install api/.husky",
+    "typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js",
+    "typeorm:migration:generate": "npm run typeorm -- migration:generate -n",
+    "typeorm:migration:run": "npm run typeorm -- migration:run"
   },
   "dependencies": {
     "@nestjs/apollo": "^10.0.6",
diff --git a/api/src/config/db.config.ts b/api/src/config/db.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..346dbffe42c0724fe8cf6aa15b6376bab4113c87
--- /dev/null
+++ b/api/src/config/db.config.ts
@@ -0,0 +1,12 @@
+import { registerAs } from '@nestjs/config';
+
+export default registerAs('database', () => {
+  return {
+    type: 'postgres',
+    host: process.env.DB_HOST || 'localhost',
+    port: +process.env.DB_PORT || 5432,
+    username: process.env.DB_USERNAME || 'postgres',
+    password: process.env.DB_PASSWORD || 'pass123',
+    database: process.env.DB_NAME || 'postgres',
+  };
+});
diff --git a/api/src/engine/models/category.model.ts b/api/src/engine/models/category.model.ts
index 921ebfce8d518a66a484bf44d04cf330b8091915..2000d8f655368b17f99c6c7eee5540b32d94b9a0 100644
--- a/api/src/engine/models/category.model.ts
+++ b/api/src/engine/models/category.model.ts
@@ -1,5 +1,5 @@
 import { ObjectType } from '@nestjs/graphql';
-import { Entity } from './entity.model';
+import { BaseModel } from './entity.model';
 
 @ObjectType()
-export class Category extends Entity {}
+export class Category extends BaseModel {}
diff --git a/api/src/engine/models/dataset.model.ts b/api/src/engine/models/dataset.model.ts
index a15340b0281906705dfc12e32a8af5db4165a27f..74bf78d13631da85366cf288fc22a6ed3f9b919b 100644
--- a/api/src/engine/models/dataset.model.ts
+++ b/api/src/engine/models/dataset.model.ts
@@ -1,8 +1,8 @@
 import { Field, ObjectType } from '@nestjs/graphql';
-import { Entity } from './entity.model';
+import { BaseModel } from './entity.model';
 
 @ObjectType()
-export class Dataset extends Entity {
+export class Dataset extends BaseModel {
   @Field({ nullable: true, defaultValue: false })
   isLongitudinal?: boolean;
 }
diff --git a/api/src/engine/models/domain.model.ts b/api/src/engine/models/domain.model.ts
index 1cfef22fb86343d0c521ada3e1e7c7ebc5e7e001..9fe826291a9f0932a30c6125e73a5f80d3c15981 100644
--- a/api/src/engine/models/domain.model.ts
+++ b/api/src/engine/models/domain.model.ts
@@ -1,11 +1,11 @@
 import { Field, ObjectType } from '@nestjs/graphql';
 import { Dataset } from './dataset.model';
-import { Entity } from './entity.model';
+import { BaseModel } from './entity.model';
 import { Group } from './group.model';
 import { Variable } from './variable.model';
 
 @ObjectType()
-export class Domain extends Entity {
+export class Domain extends BaseModel {
   @Field({ nullable: true })
   description?: string;
 
diff --git a/api/src/engine/models/entity.model.ts b/api/src/engine/models/entity.model.ts
index 32183fd7e970410a1ee3f479cef4d691d56fb7a7..7641f7b186d79b210a505197d039d71b9dccb6f2 100644
--- a/api/src/engine/models/entity.model.ts
+++ b/api/src/engine/models/entity.model.ts
@@ -2,7 +2,7 @@ import { Field, InputType, ObjectType } from '@nestjs/graphql';
 
 @InputType()
 @ObjectType()
-export class Entity {
+export class BaseModel {
   @Field()
   id: string;
 
diff --git a/api/src/engine/models/group.model.ts b/api/src/engine/models/group.model.ts
index 6a23f1983398f81eeca84731c3d8cfe4b92b599a..11be6a14bd2e671a4363b742f380e6fa54470f1c 100644
--- a/api/src/engine/models/group.model.ts
+++ b/api/src/engine/models/group.model.ts
@@ -1,8 +1,8 @@
 import { Field, ObjectType } from '@nestjs/graphql';
-import { Entity } from './entity.model';
+import { BaseModel } from './entity.model';
 
 @ObjectType()
-export class Group extends Entity {
+export class Group extends BaseModel {
   @Field({ nullable: true })
   description?: string;
 
diff --git a/api/src/engine/models/variable.model.ts b/api/src/engine/models/variable.model.ts
index bd54afed70a025ce6c5673bf0627a657d77926cb..c48a32b127870e08c4fcf48e34d10716e1b1018e 100644
--- a/api/src/engine/models/variable.model.ts
+++ b/api/src/engine/models/variable.model.ts
@@ -1,10 +1,10 @@
 import { Field, ObjectType } from '@nestjs/graphql';
 import { Category } from './category.model';
-import { Entity } from './entity.model';
+import { BaseModel } from './entity.model';
 import { Group } from './group.model';
 
 @ObjectType()
-export class Variable extends Entity {
+export class Variable extends BaseModel {
   @Field({ nullable: true })
   type?: string;
 
diff --git a/api/src/main.ts b/api/src/main.ts
index e33633323795e658f72a120ce67e44dec64a1e1b..6e6fe7b0003a717eba3198989da8e91eaf85afa2 100644
--- a/api/src/main.ts
+++ b/api/src/main.ts
@@ -19,6 +19,6 @@ async function bootstrap() {
 
   app.use(cookieParser());
 
-  await app.listen(process.env.GATEWAY_PORT);
+  await app.listen(process.env.GATEWAY_PORT || 8081);
 }
 bootstrap();
diff --git a/api/src/main/app.module.ts b/api/src/main/app.module.ts
index 1555caaa8bcc0a04abeb20da660200561c83e6d2..56ef2df6fe32a0198a818a8b035418c44e54ad76 100644
--- a/api/src/main/app.module.ts
+++ b/api/src/main/app.module.ts
@@ -1,11 +1,12 @@
 import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo';
 import { Module } from '@nestjs/common';
-import { ConfigModule } from '@nestjs/config';
+import { ConfigModule, ConfigService } from '@nestjs/config';
 import { GraphQLModule } from '@nestjs/graphql';
 import { TypeOrmModule } from '@nestjs/typeorm';
 import { GraphQLError } from 'graphql';
 import { join } from 'path';
 import { AuthModule } from 'src/auth/auth.module';
+import dbConfig from 'src/config/db.config';
 import { EngineModule } from 'src/engine/engine.module';
 import { FilesModule } from 'src/files/files.module';
 import { UsersModule } from 'src/users/users.module';
@@ -17,6 +18,7 @@ import { AppService } from './app.service';
     ConfigModule.forRoot({
       isGlobal: true,
       envFilePath: ['.env', '.env.defaults'],
+      load: [dbConfig],
     }),
     GraphQLModule.forRoot<ApolloDriverConfig>({
       driver: ApolloDriver,
@@ -44,15 +46,16 @@ import { AppService } from './app.service';
       type: process.env.ENGINE_TYPE,
       baseurl: process.env.ENGINE_BASE_URL,
     }),
-    TypeOrmModule.forRoot({
-      type: 'postgres', // type of our database
-      host: process.env.DB_HOST, // database host
-      port: parseInt(process.env.DB_PORT), // database host
-      username: process.env.DB_USERNAME, // username
-      password: process.env.DB_PASSWORD, // user password
-      database: process.env.DB_NAME, // name of our database,
-      autoLoadEntities: true, // models will be loaded automatically
-      synchronize: process.env.NODE_ENV !== 'production', // your entities will be synced with the database(recommended: disable in prod)
+    TypeOrmModule.forRootAsync({
+      inject: [ConfigService],
+      useFactory: (config: ConfigService) => ({
+        ...config.get('database'),
+        migrations: ['dist/migrations/*{.ts,.js}'],
+        migrationsRun: process.env.NODE_ENV !== 'dev',
+        synchronize: process.env.NODE_ENV === 'dev',
+        loggerLevel: 'debug',
+        autoLoadEntities: true,
+      }),
     }),
     AuthModule,
     UsersModule,
diff --git a/api/src/migrations/1648306965760-initSetup.ts b/api/src/migrations/1648306965760-initSetup.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ec93742f987c89ca11ed9da5a7667adedcdd97ee
--- /dev/null
+++ b/api/src/migrations/1648306965760-initSetup.ts
@@ -0,0 +1,15 @@
+import { MigrationInterface, QueryRunner } from 'typeorm';
+
+export class initSetup1648306965760 implements MigrationInterface {
+  name = 'initSetup1648306965760';
+
+  public async up(queryRunner: QueryRunner): Promise<void> {
+    await queryRunner.query(
+      `CREATE TABLE "user" ("id" character varying NOT NULL, "agreeNDA" boolean DEFAULT false, CONSTRAINT "PK_cace4a159ff9f2512dd42373760" PRIMARY KEY ("id"))`,
+    );
+  }
+
+  public async down(queryRunner: QueryRunner): Promise<void> {
+    await queryRunner.query(`DROP TABLE "user"`);
+  }
+}
diff --git a/api/src/users/models/user.model.ts b/api/src/users/models/user.model.ts
index fc6305264def3c8452e8fea306b8679378d90dc6..980d7c1af5d7ca2a15cf997e316fd6ca51c29480 100644
--- a/api/src/users/models/user.model.ts
+++ b/api/src/users/models/user.model.ts
@@ -1,7 +1,7 @@
 import { Field, ObjectType } from '@nestjs/graphql';
 import { Entity, PrimaryColumn, Column } from 'typeorm';
 
-@Entity()
+@Entity({ name: 'user' })
 @ObjectType()
 export class User {
   @PrimaryColumn()
@@ -17,7 +17,7 @@ export class User {
   @Field({ nullable: true })
   email?: string;
 
-  @Column()
+  @Column({ nullable: true, default: false })
   @Field({ nullable: true })
   agreeNDA?: boolean;
 
diff --git a/api/src/users/users.service.ts b/api/src/users/users.service.ts
index 273abf6de249a4f618f1039d4f00bc6cc29cfcd4..d74ca14ce1d5096305d790d189eb6666b032733b 100644
--- a/api/src/users/users.service.ts
+++ b/api/src/users/users.service.ts
@@ -33,11 +33,11 @@ export class UsersService {
    * @returns The updated user.
    */
   async update(id: string, data: UpdateUserInput): Promise<InternalUser> {
-    const test = {
+    const updateData = {
       id,
       ...data,
     };
 
-    return await this.userRepository.save(test);
+    return await this.userRepository.save(updateData);
   }
 }
diff --git a/api/tsconfig.build.json b/api/tsconfig.build.json
index 64f86c6bd2bb30e3d22e752295eb7c7923fc191e..8580c553488175bd3256a4616337e0219afac00c 100644
--- a/api/tsconfig.build.json
+++ b/api/tsconfig.build.json
@@ -1,4 +1,4 @@
 {
   "extends": "./tsconfig.json",
-  "exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
+  "exclude": ["node_modules", "test", "dist", "**/*spec.ts", "ormconfig.ts"]
 }