From 9f8f23d8caccf679282cf87d8cbe5b9771058184 Mon Sep 17 00:00:00 2001 From: itschip Date: Tue, 30 Apr 2024 16:10:51 +0200 Subject: [PATCH 01/18] feat: add docker-compose --- docker-compose.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100755 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100755 index 00000000..0b4722f7 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,27 @@ +services: + postgres: + image: postgres:latest + container_name: "dokploy-postgres" + environment: + POSTGRES_DB: dokploy + POSTGRES_USER: dokploy + POSTGRES_PASSWORD: amukds4wi9001583845717ad2 + volumes: + - ./.docker/postgres_data:/var/lib/postgresql/data + ports: + - "5432:5432" + networks: + - "dokploy-network" + + redis: + image: redis:latest + ports: + - "6379:6379" + volumes: + - ./.docker/redis_data:/data + networks: + - "dokploy-network" + +networks: + dokploy-network: + driver: "bridge" From ed05018074ed3cd17113b3984974f6fa4eb42577 Mon Sep 17 00:00:00 2001 From: itschip Date: Tue, 30 Apr 2024 18:23:37 +0200 Subject: [PATCH 02/18] feat: add traefik to docker-compose --- docker-compose.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 0b4722f7..c113d883 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,6 +22,20 @@ services: networks: - "dokploy-network" + traefik: + image: traefik:v2.5 + container_name: "dokploy-traefik" + volumes: + - "./.docker/dokploy/traefik.yml:/etc/dokploy/traefik/traefik.yml" + - "./.docker/dokploy/traefik/dynamic/:/etc/dokploy/traefik/dynamic" + - "/var/run/docker.sock:/var/run/docker.sock" + ports: + - "443:443" + - "80:80" + - "8080:8080" + networks: + - dokploy-network + networks: dokploy-network: driver: "bridge" From 6c5e1eab44e597290404f42eababa317081402bb Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:59:54 -0600 Subject: [PATCH 03/18] fix: redirect to a valid route --- components/auth/login-2fa.tsx | 2 +- .../[projectId]/services/application/[applicationId].tsx | 2 +- .../project/[projectId]/services/mariadb/[mariadbId].tsx | 2 +- .../dashboard/project/[projectId]/services/mongo/[mongoId].tsx | 2 +- .../dashboard/project/[projectId]/services/mysql/[mysqlId].tsx | 2 +- .../project/[projectId]/services/postgres/[postgresId].tsx | 2 +- .../dashboard/project/[projectId]/services/redis/[redisId].tsx | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/components/auth/login-2fa.tsx b/components/auth/login-2fa.tsx index 46d82cbe..17b2d483 100644 --- a/components/auth/login-2fa.tsx +++ b/components/auth/login-2fa.tsx @@ -65,7 +65,7 @@ export const Login2FA = ({ authId }: Props) => { duration: 2000, }); - push("/dashboard"); + push("/dashboard/projects"); }) .catch(() => { toast.error("Signin failed", { diff --git a/pages/dashboard/project/[projectId]/services/application/[applicationId].tsx b/pages/dashboard/project/[projectId]/services/application/[applicationId].tsx index 33e4dd08..2ea8a8cc 100644 --- a/pages/dashboard/project/[projectId]/services/application/[applicationId].tsx +++ b/pages/dashboard/project/[projectId]/services/application/[applicationId].tsx @@ -242,7 +242,7 @@ export async function getServerSideProps( return { redirect: { permanent: false, - destination: "/dashboard", + destination: "/dashboard/projects", }, }; } diff --git a/pages/dashboard/project/[projectId]/services/mariadb/[mariadbId].tsx b/pages/dashboard/project/[projectId]/services/mariadb/[mariadbId].tsx index 2f9d4cf3..a820b940 100644 --- a/pages/dashboard/project/[projectId]/services/mariadb/[mariadbId].tsx +++ b/pages/dashboard/project/[projectId]/services/mariadb/[mariadbId].tsx @@ -211,7 +211,7 @@ export async function getServerSideProps( return { redirect: { permanent: false, - destination: "/dashboard", + destination: "/dashboard/projects", }, }; } diff --git a/pages/dashboard/project/[projectId]/services/mongo/[mongoId].tsx b/pages/dashboard/project/[projectId]/services/mongo/[mongoId].tsx index 2b88686c..9d7f6eac 100644 --- a/pages/dashboard/project/[projectId]/services/mongo/[mongoId].tsx +++ b/pages/dashboard/project/[projectId]/services/mongo/[mongoId].tsx @@ -213,7 +213,7 @@ export async function getServerSideProps( return { redirect: { permanent: false, - destination: "/dashboard", + destination: "/dashboard/projects", }, }; } diff --git a/pages/dashboard/project/[projectId]/services/mysql/[mysqlId].tsx b/pages/dashboard/project/[projectId]/services/mysql/[mysqlId].tsx index 095fcd6c..e5c191b6 100644 --- a/pages/dashboard/project/[projectId]/services/mysql/[mysqlId].tsx +++ b/pages/dashboard/project/[projectId]/services/mysql/[mysqlId].tsx @@ -212,7 +212,7 @@ export async function getServerSideProps( return { redirect: { permanent: false, - destination: "/dashboard", + destination: "/dashboard/projects", }, }; } diff --git a/pages/dashboard/project/[projectId]/services/postgres/[postgresId].tsx b/pages/dashboard/project/[projectId]/services/postgres/[postgresId].tsx index 222a7298..9d1cda3d 100644 --- a/pages/dashboard/project/[projectId]/services/postgres/[postgresId].tsx +++ b/pages/dashboard/project/[projectId]/services/postgres/[postgresId].tsx @@ -212,7 +212,7 @@ export async function getServerSideProps( return { redirect: { permanent: false, - destination: "/dashboard", + destination: "/dashboard/projects", }, }; } diff --git a/pages/dashboard/project/[projectId]/services/redis/[redisId].tsx b/pages/dashboard/project/[projectId]/services/redis/[redisId].tsx index e2200133..f6acf186 100644 --- a/pages/dashboard/project/[projectId]/services/redis/[redisId].tsx +++ b/pages/dashboard/project/[projectId]/services/redis/[redisId].tsx @@ -205,7 +205,7 @@ export async function getServerSideProps( return { redirect: { permanent: false, - destination: "/dashboard", + destination: "/dashboard/projects", }, }; } From 05995fcdad799aeebda6f1daf1bcdd406a14f87b Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 1 May 2024 00:01:19 -0600 Subject: [PATCH 04/18] chore: add script to setup the project --- package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package.json b/package.json index 5b66a28c..36fe8197 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,14 @@ "start": "node dist/server.mjs", "build-server": "tsx esbuild.config.ts", "build-next": "next build", + "setup": "tsx -r dotenv/config setup.ts && sleep 5 && pnpm run migration:run", "reset-password": "node dist/reset-password.mjs", "dev": "tsx watch -r dotenv/config ./server/server.ts --project tsconfig.server.json ", "migration:generate": "drizzle-kit generate:pg --config ./server/db/drizzle.config.ts", "migration:run": "tsx -r dotenv/config migration.ts", "migration:drop": "drizzle-kit drop --config ./server/db/drizzle.config.ts", "db:push": "drizzle-kit push:pg --config ./server/db/drizzle.config.ts", + "db:truncate": "tsx -r dotenv/config ./server/db/reset.ts", "db:studio": "drizzle-kit studio", "lint": "biome lint", "db:seed": "dotenv tsx ./server/db/seed.ts", From 3231edb22a8fd8cebbbc237166a2cdc47d76c44a Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 1 May 2024 00:01:44 -0600 Subject: [PATCH 05/18] feat: add migrate file to run the migrations trought the npm command --- migration.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 migration.ts diff --git a/migration.ts b/migration.ts new file mode 100644 index 00000000..ff1b31d0 --- /dev/null +++ b/migration.ts @@ -0,0 +1,20 @@ +import { drizzle } from "drizzle-orm/postgres-js"; +import { migrate } from "drizzle-orm/postgres-js/migrator"; +import postgres from "postgres"; + +const connectionString = process.env.DATABASE_URL || ""; + +const sql = postgres(connectionString, { max: 1 }); +const db = drizzle(sql); + +await migrate(db, { migrationsFolder: "drizzle" }) + .then(() => { + console.log("Migration complete"); + sql.end(); + }) + .catch((error) => { + console.log("Migration failed", error); + }) + .finally(() => { + sql.end(); + }); From 2ab8b30394341e20f45fcd5e75a9228d74daecd9 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 1 May 2024 00:02:03 -0600 Subject: [PATCH 06/18] chore: exclude migration and setup files --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index e766f6a2..bad94c9c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -39,5 +39,5 @@ ".next/types/**/*.ts", "env.js" , "next.config.mjs" ], - "exclude": ["node_modules", "dokploy", "config", "dist","webpack.config.server.js"] + "exclude": ["node_modules", "dokploy", "config", "dist","webpack.config.server.js","migration.ts","setup.ts"] } From 89bab3acf06695618966e000e93401139d04d20a Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 1 May 2024 00:02:10 -0600 Subject: [PATCH 07/18] remove compose file --- docker-compose.yml | 41 ----------------------------------------- 1 file changed, 41 deletions(-) delete mode 100755 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100755 index c113d883..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,41 +0,0 @@ -services: - postgres: - image: postgres:latest - container_name: "dokploy-postgres" - environment: - POSTGRES_DB: dokploy - POSTGRES_USER: dokploy - POSTGRES_PASSWORD: amukds4wi9001583845717ad2 - volumes: - - ./.docker/postgres_data:/var/lib/postgresql/data - ports: - - "5432:5432" - networks: - - "dokploy-network" - - redis: - image: redis:latest - ports: - - "6379:6379" - volumes: - - ./.docker/redis_data:/data - networks: - - "dokploy-network" - - traefik: - image: traefik:v2.5 - container_name: "dokploy-traefik" - volumes: - - "./.docker/dokploy/traefik.yml:/etc/dokploy/traefik/traefik.yml" - - "./.docker/dokploy/traefik/dynamic/:/etc/dokploy/traefik/dynamic" - - "/var/run/docker.sock:/var/run/docker.sock" - ports: - - "443:443" - - "80:80" - - "8080:8080" - networks: - - dokploy-network - -networks: - dokploy-network: - driver: "bridge" From 3eaa8156dd59ac8683b2f25d2906f2413495c545 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 1 May 2024 00:03:01 -0600 Subject: [PATCH 08/18] refactor: move initialization of services to prod env --- server/server.ts | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/server/server.ts b/server/server.ts index 92c788ac..20af88ad 100644 --- a/server/server.ts +++ b/server/server.ts @@ -34,31 +34,32 @@ void app.prepare().then(async () => { handle(req, res); }); - setupDirectories(); - createDefaultMiddlewares(); - await initializeNetwork(); - await initializeSwarm(); - createDefaultTraefikConfig(); - createDefaultServerTraefikConfig(); - await initializeTraefik(); - await initializeRedis(); - await initializePostgres(); - // WEBSOCKET setupDeploymentLogsWebSocketServer(server); setupDockerContainerLogsWebSocketServer(server); setupDockerContainerTerminalWebSocketServer(server); setupTerminalWebSocketServer(server); setupDockerStatsMonitoringSocketServer(server); + if (process.env.NODE_ENV === "production") { - // Cron Jobs + setupDirectories(); + createDefaultMiddlewares(); + await initializeSwarm(); + await initializeNetwork(); + createDefaultTraefikConfig(); + createDefaultServerTraefikConfig(); + await initializeTraefik(); + await initializeRedis(); + await initializePostgres(); initCronJobs(); welcomeServer(); + // Timeout to wait for the database to be ready await new Promise((resolve) => setTimeout(resolve, 7000)); await migration(); } server.listen(PORT); + console.log("Server Started:", PORT); deploymentWorker.run(); } catch (e) { console.error("Main Server Error", e); From 25f8ba943dc9bc98c6eea54a0b42431fe6f7a5df Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 1 May 2024 00:03:11 -0600 Subject: [PATCH 09/18] refactor: remove logs --- server/setup/postgres-setup.ts | 1 - server/setup/setup.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/server/setup/postgres-setup.ts b/server/setup/postgres-setup.ts index dbdaaa29..ce5bfccc 100644 --- a/server/setup/postgres-setup.ts +++ b/server/setup/postgres-setup.ts @@ -56,7 +56,6 @@ export const initializePostgres = async () => { console.log("Postgres Started ✅"); } catch (error) { - console.log(error); await docker.createService(settings); console.log("Postgres Not Found: Starting ✅"); } diff --git a/server/setup/setup.ts b/server/setup/setup.ts index dd693e04..c5987702 100644 --- a/server/setup/setup.ts +++ b/server/setup/setup.ts @@ -19,7 +19,6 @@ export const dockerSwarmInitialized = async () => { return true; } catch (e) { - console.log(e); return false; } }; From c96d3e866382f607d43b3b5094a0986635321c94 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 1 May 2024 00:03:35 -0600 Subject: [PATCH 10/18] refactor: add drizzle schema when truncate the whole db --- server/db/reset.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/db/reset.ts b/server/db/reset.ts index 108c1d19..dc731a20 100644 --- a/server/db/reset.ts +++ b/server/db/reset.ts @@ -10,9 +10,10 @@ const db = drizzle(pg); const clearDb = async (): Promise => { try { - const tablesQuery = sql`DROP SCHEMA public CASCADE; CREATE SCHEMA public;`; + const tablesQuery = sql`DROP SCHEMA public CASCADE; CREATE SCHEMA public; DROP schema drizzle CASCADE;`; const tables = await db.execute(tablesQuery); console.log(tables); + await pg.end(); } catch (error) { console.error("Error to clean database", error); } finally { From 69122573aa82e216a76a48bd7d7cd8cb8d29d1f8 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 1 May 2024 00:03:58 -0600 Subject: [PATCH 11/18] feat: add setup file to spin up the necessary files and services --- setup.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 setup.ts diff --git a/setup.ts b/setup.ts new file mode 100644 index 00000000..09eb57bb --- /dev/null +++ b/setup.ts @@ -0,0 +1,26 @@ +import { + createDefaultMiddlewares, + createDefaultServerTraefikConfig, + createDefaultTraefikConfig, + initializeTraefik, +} from "./server/setup/traefik-setup"; +import { initializeRedis } from "./server/setup/redis-setup"; +import { initializePostgres } from "./server/setup/postgres-setup"; +import { setupDirectories } from "./server/setup/config-paths"; +import { initializeNetwork, initializeSwarm } from "./server/setup/setup"; + +(async () => { + try { + setupDirectories(); + createDefaultMiddlewares(); + await initializeSwarm(); + await initializeNetwork(); + createDefaultTraefikConfig(); + createDefaultServerTraefikConfig(); + await initializeTraefik(); + await initializeRedis(); + await initializePostgres(); + } catch (e) { + console.error("Error to setup dokploy", e); + } +})(); From 4c2bfb95e32e90130160971615c1a07f4b0c6fdc Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 1 May 2024 00:04:20 -0600 Subject: [PATCH 12/18] chore: update instructions to run the project properly --- CONTRIBUTING.md | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8d0a2d44..06467b18 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -51,10 +51,12 @@ feat: add new feature ## Setup +We use Node `18.18.0` and pnpm `8.15.4` to run the project. + ```bash git clone https://github.com/dokploy/dokploy.git cd dokploy -npm install +pnpm install cp .env.example .env ``` @@ -62,28 +64,46 @@ cp .env.example .env Is required to have **Docker** installed on your machine. + +### Setup + +We need to create the file system of dokploy and give the permissions. + ```bash -npm run dev +sudo mkdir -p /etc/dokploy && sudo chmod 777 /etc/dokploy ``` +Now we can run the command that will spin up all the required services and files. + +```bash +pnpm run setup +``` + +Now run the development server. + +```bash +pnpm run dev +``` + + Go to http://localhost:3000 to see the development server ## Build ```bash -npm run build +pnpm run build ``` ## Docker To build the docker image ```bash -npm run docker:build +pnpm run docker:build ``` To push the docker image ```bash -npm run docker:push +pnpm run docker:push ``` ## Password Reset From 0e63eb77c0002cc0d057b231f3ec9b1174510bc9 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 1 May 2024 01:09:04 -0600 Subject: [PATCH 13/18] refactor: remove console log --- pages/dashboard/settings/server.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/pages/dashboard/settings/server.tsx b/pages/dashboard/settings/server.tsx index c08b607a..8eedf299 100644 --- a/pages/dashboard/settings/server.tsx +++ b/pages/dashboard/settings/server.tsx @@ -38,7 +38,6 @@ export async function getServerSideProps( }, }; } - console.log(user); if (user.rol === "user") { return { redirect: { From 9f2b5a9728facfeb97535b9e35bcf5912269c29a Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 1 May 2024 01:09:28 -0600 Subject: [PATCH 14/18] chore: add engines to package json --- .gitignore | 1 + package.json | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 71a3816e..c1b996d0 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ .pnp.js /redis-data traefik.yml +.docker # testing /coverage diff --git a/package.json b/package.json index 36fe8197..5a6cdfd9 100644 --- a/package.json +++ b/package.json @@ -129,6 +129,7 @@ "initVersion": "7.25.2" }, "engines": { - "node": "18.x" - } + "node": "^18.18.0", + "pnpm": "^8.15.4" +} } From 944d89f6d2aa9e8e900b8b2dfa7d21367d8af1ae Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 1 May 2024 01:11:36 -0600 Subject: [PATCH 15/18] refactor: add current directory + .docker dir in dev --- server/constants/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/constants/index.ts b/server/constants/index.ts index fe3f9fa6..4c7cd5a5 100644 --- a/server/constants/index.ts +++ b/server/constants/index.ts @@ -1,6 +1,10 @@ import Docker from "dockerode"; +import path from "node:path"; -export const BASE_PATH = "/etc/dokploy"; +export const BASE_PATH = + process.env.NODE_ENV === "production" + ? "/etc/dokploy" + : path.join(process.cwd(), ".docker"); export const MAIN_TRAEFIK_PATH = `${BASE_PATH}/traefik`; export const DYNAMIC_TRAEFIK_PATH = `${BASE_PATH}/traefik/dynamic`; export const LOGS_PATH = `${BASE_PATH}/logs`; From bec71c9c7ae7933376e7dbabfe3e2f704886daed Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 1 May 2024 01:12:20 -0600 Subject: [PATCH 16/18] chore: remove instructions --- .gitignore | 1 + CONTRIBUTING.md | 8 -------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index c1b996d0..bfbda236 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ /redis-data traefik.yml .docker +.env.production # testing /coverage diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 06467b18..77c0fef0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -51,8 +51,6 @@ feat: add new feature ## Setup -We use Node `18.18.0` and pnpm `8.15.4` to run the project. - ```bash git clone https://github.com/dokploy/dokploy.git cd dokploy @@ -67,12 +65,6 @@ Is required to have **Docker** installed on your machine. ### Setup -We need to create the file system of dokploy and give the permissions. - -```bash -sudo mkdir -p /etc/dokploy && sudo chmod 777 /etc/dokploy -``` - Now we can run the command that will spin up all the required services and files. ```bash From 39dc661890ab0acade9ffe7fcf08425fb2497755 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 1 May 2024 01:28:39 -0600 Subject: [PATCH 17/18] refactor: assign directory inside of container --- server/setup/traefik-setup.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/setup/traefik-setup.ts b/server/setup/traefik-setup.ts index 55abe3db..916495fa 100644 --- a/server/setup/traefik-setup.ts +++ b/server/setup/traefik-setup.ts @@ -133,7 +133,7 @@ export const createDefaultTraefikConfig = () => { }, }), file: { - directory: DYNAMIC_TRAEFIK_PATH, + directory: "/etc/dokploy/traefik/dynamic", watch: true, }, }, From 24f751284078be77ead375d0812552e78aaddd68 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 1 May 2024 01:29:35 -0600 Subject: [PATCH 18/18] chore: remove text --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 77c0fef0..84c57c7f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -65,7 +65,7 @@ Is required to have **Docker** installed on your machine. ### Setup -Now we can run the command that will spin up all the required services and files. +Run the command that will spin up all the required services and files. ```bash pnpm run setup