create-vitnode-app 0.0.10-canary.2 → 0.0.10-canary.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +31 -31
- package/package.json +8 -8
- package/templates/basic/README.md +3 -1
- package/templates/basic/apps/backend/src/app.module.ts +1 -3
- package/templates/basic/apps/backend/src/database/database.service.ts +1 -1
- package/templates/basic/apps/backend/src/main.ts +1 -2
- package/templates/basic/apps/backend/tsconfig.json +2 -1
- package/templates/basic/apps/backend/uploads/public/assets/favicon.ico +0 -0
- package/templates/basic/apps/frontend/global.d.ts +3 -3
- package/templates/basic/apps/frontend/next.config.ts +1 -1
- package/templates/basic/apps/frontend/public/sw.js +3 -0
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/[...slug]/page.tsx +10 -0
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/layout.tsx +1 -5
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/{(vitnode)/page.tsx → page.tsx} +4 -6
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/layout.tsx +1 -8
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/[...slug]/page.tsx +12 -0
- package/templates/basic/apps/frontend/src/app/{[locale]/(main)/global.css → global.css} +2 -7
- package/templates/basic/apps/frontend/src/app/layout.tsx +2 -0
- package/templates/basic/apps/frontend/src/middleware.ts +1 -1
- package/templates/basic/apps/frontend/src/plugins/admin/langs/en.json +109 -36
- package/templates/basic/apps/frontend/src/plugins/core/langs/en.json +28 -17
- package/templates/basic/apps/frontend/src/plugins/welcome/langs/en.json +2 -4
- package/templates/basic/apps/frontend/src/plugins/welcome/templates/default-page.tsx +1 -1
- package/templates/basic/apps/frontend/tsconfig.json +20 -6
- package/templates/basic/apps/shared/plugins/welcome/example.dto.ts +0 -0
- package/templates/basic/apps/shared/tsconfig.json +15 -0
- package/templates/basic/turbo.json +6 -7
- package/templates/docker/apps/backend/DockerFile +31 -0
- package/templates/docker/apps/frontend/DockerFile +37 -0
- package/templates/docker/deploy.sh +213 -0
- package/templates/docker/docker-compose.yml +54 -0
- package/templates/eslint/apps/shared/eslint.config.mjs +4 -0
- package/templates/basic/.npmrc_template +0 -1
- package/templates/basic/apps/frontend/codegen.ts +0 -10
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/(vitnode)/[...slug]/page.tsx +0 -5
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/(vitnode)/legal/[code]/page.tsx +0 -12
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/(vitnode)/legal/page.tsx +0 -10
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/(vitnode)/login/layout.tsx +0 -9
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/(vitnode)/login/page.tsx +0 -10
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/(vitnode)/profile/[id]/page.tsx +0 -5
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/(vitnode)/register/confirm-email/page.tsx +0 -12
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/(vitnode)/register/layout.tsx +0 -9
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/(vitnode)/register/page.tsx +0 -10
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/(vitnode)/settings/devices/page.tsx +0 -10
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/(vitnode)/settings/files/page.tsx +0 -12
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/(vitnode)/settings/layout.tsx +0 -13
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/(vitnode)/settings/page.tsx +0 -5
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/error.tsx +0 -9
- package/templates/basic/apps/frontend/src/app/[locale]/(main)/not-found.tsx +0 -5
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/[...slug]/page.tsx +0 -7
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/advanced/files/page.tsx +0 -12
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/dashboard/page.tsx +0 -5
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/diagnostic/page.tsx +0 -10
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/langs/page.tsx +0 -12
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/plugins/[code]/dev/layout.tsx +0 -12
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/plugins/[code]/dev/nav/page.tsx +0 -7
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/plugins/[code]/dev/page.tsx +0 -7
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/plugins/[code]/dev/permissions-admin/page.tsx +0 -7
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/plugins/layout.tsx +0 -9
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/plugins/page.tsx +0 -12
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/settings/ai/page.tsx +0 -10
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/settings/authorization/page.tsx +0 -10
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/settings/email/layout.tsx +0 -9
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/settings/email/logs/page.tsx +0 -12
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/settings/email/page.tsx +0 -10
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/settings/legal/page.tsx +0 -12
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/settings/main/page.tsx +0 -10
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/settings/metadata/page.tsx +0 -10
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/settings/security/page.tsx +0 -10
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/styles/editor/page.tsx +0 -10
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/core/styles/nav/page.tsx +0 -10
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/members/groups/page.tsx +0 -12
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/members/staff/administrators/page.tsx +0 -12
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/members/users/[id]/page.tsx +0 -12
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/members/users/layout.tsx +0 -9
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(auth)/(vitnode)/members/users/page.tsx +0 -12
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(vitnode)/core/styles/theme-editor/page.tsx +0 -10
- package/templates/basic/apps/frontend/src/app/[locale]/admin/(vitnode)/install/page.tsx +0 -11
- package/templates/basic/apps/frontend/src/app/[locale]/admin/global.css +0 -94
- package/templates/basic/apps/frontend/src/app/[locale]/admin/layout.tsx +0 -10
- package/templates/basic/apps/frontend/src/graphql/types.ts +0 -1381
- /package/templates/basic/apps/frontend/src/app/[locale]/admin/{(vitnode)/page.tsx → page.tsx} +0 -0
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"core": {
|
|
3
3
|
"global": {
|
|
4
|
+
"sidebar": {
|
|
5
|
+
"title": "Sidebar",
|
|
6
|
+
"desc": "Manage your sidebar settings.",
|
|
7
|
+
"toggle": "Toggle Sidebar"
|
|
8
|
+
},
|
|
4
9
|
"loading": "Loading...",
|
|
5
10
|
"optional": "Optional",
|
|
6
11
|
"yes": "Yes",
|
|
@@ -83,9 +88,11 @@
|
|
|
83
88
|
"admin_cp": "Admin Panel"
|
|
84
89
|
},
|
|
85
90
|
"mobile_nav": {
|
|
91
|
+
"home": "Home",
|
|
86
92
|
"back": "Back",
|
|
87
93
|
"search": "Search",
|
|
88
|
-
"menu": "Menu"
|
|
94
|
+
"menu": "Menu",
|
|
95
|
+
"desc": "Mobile Menu with navigation and user settings."
|
|
89
96
|
},
|
|
90
97
|
"icon_picker": {
|
|
91
98
|
"title": "Choose an icon",
|
|
@@ -107,6 +114,7 @@
|
|
|
107
114
|
"horizontal_rule": "Horizontal Rule",
|
|
108
115
|
"more": "More",
|
|
109
116
|
"align": "Align",
|
|
117
|
+
"upload_files": "Upload Files",
|
|
110
118
|
"link": {
|
|
111
119
|
"title": "Link",
|
|
112
120
|
"text": "Text",
|
|
@@ -156,7 +164,6 @@
|
|
|
156
164
|
}
|
|
157
165
|
},
|
|
158
166
|
"files": {
|
|
159
|
-
"attach": "Attach Files",
|
|
160
167
|
"state": {
|
|
161
168
|
"loading": "Uploading...",
|
|
162
169
|
"error": "Oops! Something went wrong. {error}"
|
|
@@ -166,7 +173,7 @@
|
|
|
166
173
|
"images_videos": "Images & Videos",
|
|
167
174
|
"images": "Images",
|
|
168
175
|
"errors": {
|
|
169
|
-
"max_storage_extended": "Max storage exceeded.
|
|
176
|
+
"max_storage_extended": "Max storage exceeded. Max storage is {size}.",
|
|
170
177
|
"invalid_file_type": "Invalid file type! Allowed types: {types}."
|
|
171
178
|
}
|
|
172
179
|
},
|
|
@@ -177,6 +184,7 @@
|
|
|
177
184
|
"title": "Settings",
|
|
178
185
|
"desc": "Manage your account settings.",
|
|
179
186
|
"open_sheet": "Open Menu",
|
|
187
|
+
"open_sheet_desc": "You can change your account settings here.",
|
|
180
188
|
"change_avatar": {
|
|
181
189
|
"title": "Change Avatar",
|
|
182
190
|
"desc": "Choose one option to change your avatar.",
|
|
@@ -224,14 +232,15 @@
|
|
|
224
232
|
"sign_in": {
|
|
225
233
|
"title": "Login",
|
|
226
234
|
"desc": "You don't have an account? <link></link>.",
|
|
235
|
+
"or": "or",
|
|
227
236
|
"sign_up": "Sign Up",
|
|
228
237
|
"email": "Email",
|
|
229
238
|
"password": "Password",
|
|
230
|
-
"remember": {
|
|
231
|
-
"label": "Remember me",
|
|
232
|
-
"desc": "Not recommended on shared computers."
|
|
233
|
-
},
|
|
234
239
|
"submit": "Log In",
|
|
240
|
+
"sso_first_login": {
|
|
241
|
+
"title": "Almost there!",
|
|
242
|
+
"desc": "Please complete your registration by entering your name."
|
|
243
|
+
},
|
|
235
244
|
"error": {
|
|
236
245
|
"title": "Invalid credentials",
|
|
237
246
|
"desc": "The email address or password was incorrect. Please try again (make sure your caps lock is off)."
|
|
@@ -245,8 +254,6 @@
|
|
|
245
254
|
"title": "Register",
|
|
246
255
|
"desc": "You already have an account? <link></link>.",
|
|
247
256
|
"sign_in": "Sign In",
|
|
248
|
-
"week_password": "Week",
|
|
249
|
-
"strong_password": "Strong",
|
|
250
257
|
"email_invalid": "This email address is invalid.",
|
|
251
258
|
"name": {
|
|
252
259
|
"label": "Nickname",
|
|
@@ -261,7 +268,11 @@
|
|
|
261
268
|
},
|
|
262
269
|
"password": {
|
|
263
270
|
"label": "Password",
|
|
264
|
-
"desc": "
|
|
271
|
+
"desc": "Password must have:",
|
|
272
|
+
"min_length": "At least 8 characters",
|
|
273
|
+
"uppercase": "At least one uppercase letter",
|
|
274
|
+
"number": "At least one number",
|
|
275
|
+
"special_char": "At least one special character"
|
|
265
276
|
},
|
|
266
277
|
"terms": {
|
|
267
278
|
"label": "Accept terms and conditions",
|
|
@@ -316,12 +327,12 @@
|
|
|
316
327
|
"dashboard": "Dashboard",
|
|
317
328
|
"settings": "Settings",
|
|
318
329
|
"settings_main": "Main",
|
|
319
|
-
"settings_security": "Security",
|
|
320
330
|
"settings_metadata": "Metadata",
|
|
321
331
|
"settings_email": "Email",
|
|
322
332
|
"settings_authorization": "Authorization",
|
|
323
333
|
"settings_legal": "Legal & Policies",
|
|
324
|
-
"
|
|
334
|
+
"security": "Security",
|
|
335
|
+
"security_spam": "Spam Protection",
|
|
325
336
|
"plugins": "Plugins",
|
|
326
337
|
"styles": "Styles",
|
|
327
338
|
"styles_theme-editor": "Theme Editor",
|
|
@@ -336,13 +347,13 @@
|
|
|
336
347
|
"can_manage_diagnostic_tools": "Can manage diagnostic tools?",
|
|
337
348
|
"settings": "Settings",
|
|
338
349
|
"can_manage_settings_main": "Can manage main settings?",
|
|
339
|
-
"can_manage_settings_security": "Can manage security settings?",
|
|
340
350
|
"can_manage_settings_metadata": "Can manage metadata settings?",
|
|
341
351
|
"can_manage_settings_email": "Can manage email settings?",
|
|
342
352
|
"can_manage_settings_authorization": "Can manage authorization settings?",
|
|
343
353
|
"can_manage_settings_legal": "Can manage legal settings?",
|
|
344
|
-
"can_manage_settings_ai": "Can manage AI settings?",
|
|
345
354
|
"can_manage_plugins": "Can manage plugins?",
|
|
355
|
+
"security": "Security",
|
|
356
|
+
"can_manage_security_spam": "Can manage spam protection?",
|
|
346
357
|
"styles": "Styles",
|
|
347
358
|
"can_manage_styles_theme-editor": "Can manage theme editor?",
|
|
348
359
|
"can_manage_styles_nav": "Can manage navigation?",
|
|
@@ -358,15 +369,15 @@
|
|
|
358
369
|
"users": "Users List",
|
|
359
370
|
"groups": "Groups",
|
|
360
371
|
"staff": "Staff",
|
|
361
|
-
"
|
|
362
|
-
"
|
|
372
|
+
"staff_mod": "Moderators",
|
|
373
|
+
"staff_admin": "Administrators"
|
|
363
374
|
},
|
|
364
375
|
"admin_permissions": {
|
|
365
376
|
"users": "Users",
|
|
366
377
|
"can_manage_users": "Can manage users?",
|
|
367
378
|
"can_manage_groups": "Can manage groups?",
|
|
368
379
|
"staff": "Staff",
|
|
369
|
-
"
|
|
380
|
+
"can_manage_staff_admin": "Can manage administrators?"
|
|
370
381
|
}
|
|
371
382
|
}
|
|
372
383
|
}
|
|
@@ -7,7 +7,7 @@ export default function DefaultPage() {
|
|
|
7
7
|
const t = useTranslations('welcome.home');
|
|
8
8
|
|
|
9
9
|
return (
|
|
10
|
-
<main className="container
|
|
10
|
+
<main className="container flex max-w-5xl flex-wrap items-center justify-between gap-8 px-8 py-10">
|
|
11
11
|
<div className="max-w-md space-y-4">
|
|
12
12
|
<h1 className="text-balance text-3xl font-bold tracking-tight md:text-4xl">
|
|
13
13
|
{t('title')}
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://json.schemastore.org/tsconfig",
|
|
3
|
-
"extends": "eslint-config-typescript-vitnode/tsconfig.next.json",
|
|
4
2
|
"compilerOptions": {
|
|
5
|
-
"target": "
|
|
6
|
-
"module": "ESNext",
|
|
7
|
-
"baseUrl": "./",
|
|
3
|
+
"target": "ES2017",
|
|
8
4
|
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"jsx": "preserve",
|
|
15
|
+
"incremental": true,
|
|
9
16
|
"plugins": [
|
|
10
17
|
{
|
|
11
18
|
"name": "next"
|
|
@@ -15,5 +22,12 @@
|
|
|
15
22
|
"@/*": ["./src/*"]
|
|
16
23
|
}
|
|
17
24
|
},
|
|
18
|
-
"include": [
|
|
25
|
+
"include": [
|
|
26
|
+
"next-env.d.ts",
|
|
27
|
+
"**/*.ts",
|
|
28
|
+
"**/*.tsx",
|
|
29
|
+
".next/types/**/*.ts",
|
|
30
|
+
"public/sw.js"
|
|
31
|
+
],
|
|
32
|
+
"exclude": ["node_modules"]
|
|
19
33
|
}
|
|
File without changes
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/tsconfig",
|
|
3
|
+
"extends": "eslint-config-typescript-vitnode/tsconfig.nest.json",
|
|
4
|
+
"compilerOptions": {
|
|
5
|
+
"target": "ESNext",
|
|
6
|
+
"module": "commonjs",
|
|
7
|
+
"moduleResolution": "Node",
|
|
8
|
+
"outDir": "./dist",
|
|
9
|
+
"rootDir": "./plugins",
|
|
10
|
+
"esModuleInterop": true,
|
|
11
|
+
"declaration": true,
|
|
12
|
+
"tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo"
|
|
13
|
+
},
|
|
14
|
+
"include": ["plugins/**/*"]
|
|
15
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://turbo.build/schema.json",
|
|
3
|
+
"ui": "tui",
|
|
4
|
+
"globalDependencies": [".env"],
|
|
3
5
|
"tasks": {
|
|
4
6
|
"build": {
|
|
5
7
|
"outputs": [".next/**", "!.next/cache/**", "dist/**"],
|
|
@@ -10,19 +12,16 @@
|
|
|
10
12
|
"dependsOn": ["^start"],
|
|
11
13
|
"persistent": true
|
|
12
14
|
},
|
|
13
|
-
"codegen": {
|
|
14
|
-
"dependsOn": ["^codegen"],
|
|
15
|
-
"cache": false
|
|
16
|
-
},
|
|
17
|
-
"config:init": {
|
|
18
|
-
"dependsOn": ["^config:init"]
|
|
19
|
-
},
|
|
20
15
|
"lint": {
|
|
21
16
|
"dependsOn": ["^lint"]
|
|
22
17
|
},
|
|
23
18
|
"lint:fix": {
|
|
24
19
|
"dependsOn": ["^lint:fix"]
|
|
25
20
|
},
|
|
21
|
+
"config:init": {
|
|
22
|
+
"dependsOn": ["^config:init"],
|
|
23
|
+
"cache": false
|
|
24
|
+
},
|
|
26
25
|
"db": {
|
|
27
26
|
"dependsOn": ["^db"],
|
|
28
27
|
"cache": false
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
FROM node:22-alpine AS base
|
|
2
|
+
RUN apk update
|
|
3
|
+
RUN apk add --no-cache libc6-compat
|
|
4
|
+
RUN npm i -g pnpm
|
|
5
|
+
|
|
6
|
+
FROM base AS builder
|
|
7
|
+
WORKDIR /app
|
|
8
|
+
RUN npm i -g turbo@^2
|
|
9
|
+
COPY . .
|
|
10
|
+
RUN turbo telemetry disable
|
|
11
|
+
RUN turbo prune backend --docker
|
|
12
|
+
|
|
13
|
+
FROM base AS installer
|
|
14
|
+
WORKDIR /app
|
|
15
|
+
COPY --from=builder /app/out/json/ .
|
|
16
|
+
RUN pnpm i
|
|
17
|
+
COPY --from=builder /app/out/full/ .
|
|
18
|
+
RUN pnpm config:init -- --skip-database
|
|
19
|
+
RUN pnpm turbo build --filter=backend...
|
|
20
|
+
|
|
21
|
+
FROM base AS runner
|
|
22
|
+
WORKDIR /app
|
|
23
|
+
RUN addgroup --system --gid 1001 nodejs
|
|
24
|
+
RUN adduser --system --uid 1001 nestjs
|
|
25
|
+
USER nestjs
|
|
26
|
+
|
|
27
|
+
COPY --from=installer --chown=nestjs:nodejs /app/ ./
|
|
28
|
+
|
|
29
|
+
EXPOSE 8080
|
|
30
|
+
ENV PORT 8080
|
|
31
|
+
ENV HOSTNAME "0.0.0.0"
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
FROM node:22-alpine AS base
|
|
2
|
+
RUN apk update
|
|
3
|
+
RUN apk add --no-cache libc6-compat
|
|
4
|
+
RUN npm i -g pnpm
|
|
5
|
+
|
|
6
|
+
FROM base AS builder
|
|
7
|
+
WORKDIR /app
|
|
8
|
+
RUN npm i -g turbo@^2
|
|
9
|
+
COPY . .
|
|
10
|
+
RUN turbo prune frontend --docker
|
|
11
|
+
|
|
12
|
+
FROM base AS installer
|
|
13
|
+
WORKDIR /app
|
|
14
|
+
COPY --from=builder /app/out/json/ .
|
|
15
|
+
RUN pnpm i --ignore-scripts
|
|
16
|
+
COPY --from=builder /app/out/full/ .
|
|
17
|
+
COPY --from=builder /app/.prettierrc.mjs ./
|
|
18
|
+
|
|
19
|
+
ARG NEXT_PUBLIC_BACKEND_URL
|
|
20
|
+
ENV NEXT_PUBLIC_BACKEND_URL=${NEXT_PUBLIC_BACKEND_URL}
|
|
21
|
+
ARG NEXT_PUBLIC_BACKEND_CLIENT_URL
|
|
22
|
+
ENV NEXT_PUBLIC_BACKEND_CLIENT_URL=${NEXT_PUBLIC_BACKEND_CLIENT_URL}
|
|
23
|
+
ARG NEXT_PUBLIC_FRONTEND_URL
|
|
24
|
+
ENV NEXT_PUBLIC_FRONTEND_URL=${NEXT_PUBLIC_FRONTEND_URL}
|
|
25
|
+
|
|
26
|
+
RUN pnpm turbo run build --filter=frontend...
|
|
27
|
+
|
|
28
|
+
FROM base AS runner
|
|
29
|
+
WORKDIR /app
|
|
30
|
+
RUN addgroup --system --gid 1001 nodejs
|
|
31
|
+
RUN adduser --system --uid 1001 nextjs
|
|
32
|
+
USER nextjs
|
|
33
|
+
|
|
34
|
+
COPY --from=installer --chown=nextjs:nodejs /app/apps/frontend/.next/standalone ./
|
|
35
|
+
COPY --from=installer --chown=nextjs:nodejs /app/apps/frontend/.next/static ./apps/frontend/.next/static
|
|
36
|
+
|
|
37
|
+
CMD node apps/frontend/server.js
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Environment variables
|
|
4
|
+
DOMAIN_MAIN_NAME="your_website.com"
|
|
5
|
+
DOMAIN_FRONTEND_NAME="your_website.com"
|
|
6
|
+
DOMAIN_BACKEND_NAME="backend.your_website.com"
|
|
7
|
+
EMAIL="contact@your_website.com"
|
|
8
|
+
DB_USER=$(openssl rand -base64 8) # Generate a random 8-character username
|
|
9
|
+
DB_PASSWORD=$(openssl rand -base64 12) # Generate a random 12-character password
|
|
10
|
+
DB_DATABASE="vitnode"
|
|
11
|
+
LOGIN_TOKEN_SECRET=$(openssl rand -base64 32) # Generate a random 32-character secret
|
|
12
|
+
|
|
13
|
+
# Other variables (do not change unless you know what you are doing)
|
|
14
|
+
SWAP_SIZE="1G" # Swap size of 1GB
|
|
15
|
+
|
|
16
|
+
# ================================
|
|
17
|
+
# ================================
|
|
18
|
+
# ================================
|
|
19
|
+
|
|
20
|
+
# Update package list and upgrade existing packages
|
|
21
|
+
sudo apt update && sudo apt upgrade -y
|
|
22
|
+
|
|
23
|
+
# Add Swap Space
|
|
24
|
+
if ! sudo swapon --show | grep -q '/swapfile'; then
|
|
25
|
+
sudo fallocate -l $SWAP_SIZE /swapfile
|
|
26
|
+
sudo chmod 600 /swapfile
|
|
27
|
+
sudo mkswap /swapfile
|
|
28
|
+
sudo swapon /swapfile
|
|
29
|
+
|
|
30
|
+
# Make swap permanent
|
|
31
|
+
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
|
|
32
|
+
else
|
|
33
|
+
echo "Swap file already exists and is active."
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
# ================================
|
|
37
|
+
# Install Nginx
|
|
38
|
+
sudo apt install nginx -y
|
|
39
|
+
|
|
40
|
+
# Delete the default Nginx configuration file if it exists
|
|
41
|
+
if [ -f /etc/nginx/sites-available/default ]; then
|
|
42
|
+
sudo rm -f /etc/nginx/sites-available/default
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
if [ -L /etc/nginx/sites-enabled/default ]; then
|
|
46
|
+
sudo rm -f /etc/nginx/sites-enabled/default
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
# Stop Nginx temporarily to allow Certbot to run in standalone mode
|
|
50
|
+
sudo systemctl stop nginx
|
|
51
|
+
|
|
52
|
+
# Obtain SSL certificate using Certbot standalone mode
|
|
53
|
+
sudo apt install certbot -y
|
|
54
|
+
sudo certbot certonly --standalone -d $DOMAIN_FRONTEND_NAME -d $DOMAIN_BACKEND_NAME --non-interactive --agree-tos -m contact@vitnode.com --cert-name $DOMAIN_MAIN_NAME
|
|
55
|
+
|
|
56
|
+
# Ensure SSL files exist or generate them
|
|
57
|
+
if [ ! -f /etc/letsencrypt/options-ssl-nginx.conf ]; then
|
|
58
|
+
sudo wget https://raw.githubusercontent.com/certbot/certbot/main/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf -P /etc/letsencrypt/
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
if [ ! -f /etc/letsencrypt/ssl-dhparams.pem ]; then
|
|
62
|
+
sudo openssl dhparam -out /etc/letsencrypt/ssl-dhparams.pem 2048
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
# Create Nginx config with reverse proxy, SSL support, rate limiting, and streaming support for both frontend and backend
|
|
66
|
+
sudo tee /etc/nginx/sites-available/vitnode > /dev/null <<EOL
|
|
67
|
+
limit_req_zone \$binary_remote_addr zone=mylimit:10m rate=10r/s;
|
|
68
|
+
|
|
69
|
+
# Frontend Server Block
|
|
70
|
+
server {
|
|
71
|
+
listen 80;
|
|
72
|
+
server_name $DOMAIN_FRONTEND_NAME;
|
|
73
|
+
|
|
74
|
+
# Redirect all HTTP requests to HTTPS
|
|
75
|
+
return 301 https://\$host\$request_uri;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
server {
|
|
79
|
+
listen 443 ssl;
|
|
80
|
+
server_name $DOMAIN_FRONTEND_NAME;
|
|
81
|
+
|
|
82
|
+
ssl_certificate /etc/letsencrypt/live/$DOMAIN_MAIN_NAME/fullchain.pem;
|
|
83
|
+
ssl_certificate_key /etc/letsencrypt/live/$DOMAIN_MAIN_NAME/privkey.pem;
|
|
84
|
+
include /etc/letsencrypt/options-ssl-nginx.conf;
|
|
85
|
+
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
|
|
86
|
+
|
|
87
|
+
# Enable rate limiting
|
|
88
|
+
limit_req zone=mylimit burst=20 nodelay;
|
|
89
|
+
|
|
90
|
+
location / {
|
|
91
|
+
proxy_pass http://localhost:3000;
|
|
92
|
+
proxy_http_version 1.1;
|
|
93
|
+
proxy_set_header Upgrade \$http_upgrade;
|
|
94
|
+
proxy_set_header Connection 'upgrade';
|
|
95
|
+
proxy_set_header Host \$host;
|
|
96
|
+
proxy_cache_bypass \$http_upgrade;
|
|
97
|
+
|
|
98
|
+
# Disable buffering for streaming support
|
|
99
|
+
proxy_buffering off;
|
|
100
|
+
proxy_set_header X-Accel-Buffering no;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
# Backend Server Block
|
|
105
|
+
server {
|
|
106
|
+
listen 80;
|
|
107
|
+
server_name $DOMAIN_BACKEND_NAME;
|
|
108
|
+
|
|
109
|
+
# Redirect all HTTP requests to HTTPS
|
|
110
|
+
return 301 https://\$host\$request_uri;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
server {
|
|
114
|
+
listen 443 ssl;
|
|
115
|
+
server_name $DOMAIN_BACKEND_NAME;
|
|
116
|
+
|
|
117
|
+
ssl_certificate /etc/letsencrypt/live/$DOMAIN_MAIN_NAME/fullchain.pem;
|
|
118
|
+
ssl_certificate_key /etc/letsencrypt/live/$DOMAIN_MAIN_NAME/privkey.pem;
|
|
119
|
+
include /etc/letsencrypt/options-ssl-nginx.conf;
|
|
120
|
+
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
|
|
121
|
+
|
|
122
|
+
# Enable rate limiting
|
|
123
|
+
limit_req zone=mylimit burst=20 nodelay;
|
|
124
|
+
|
|
125
|
+
location / {
|
|
126
|
+
proxy_pass http://localhost:8080;
|
|
127
|
+
proxy_http_version 1.1;
|
|
128
|
+
proxy_set_header Upgrade \$http_upgrade;
|
|
129
|
+
proxy_set_header Connection 'upgrade';
|
|
130
|
+
proxy_set_header Host \$host;
|
|
131
|
+
proxy_cache_bypass \$http_upgrade;
|
|
132
|
+
|
|
133
|
+
# Disable buffering for streaming support
|
|
134
|
+
proxy_buffering off;
|
|
135
|
+
proxy_set_header X-Accel-Buffering no;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
EOL
|
|
139
|
+
|
|
140
|
+
# Create symbolic link if it doesn't already exist
|
|
141
|
+
if [ ! -f /etc/nginx/sites-enabled/vitnode ]; then
|
|
142
|
+
sudo ln -s /etc/nginx/sites-available/vitnode /etc/nginx/sites-enabled/vitnode
|
|
143
|
+
fi
|
|
144
|
+
|
|
145
|
+
# Restart Nginx to apply the new configuration
|
|
146
|
+
sudo systemctl restart nginx
|
|
147
|
+
|
|
148
|
+
# ================================
|
|
149
|
+
|
|
150
|
+
# Add Docker's official GPG key:
|
|
151
|
+
sudo apt-get update
|
|
152
|
+
sudo apt-get install ca-certificates curl
|
|
153
|
+
sudo install -m 0755 -d /etc/apt/keyrings
|
|
154
|
+
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
|
|
155
|
+
sudo chmod a+r /etc/apt/keyrings/docker.asc
|
|
156
|
+
|
|
157
|
+
# Add the repository to Apt sources:
|
|
158
|
+
echo \
|
|
159
|
+
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
|
|
160
|
+
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
|
|
161
|
+
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
|
162
|
+
sudo apt-get update
|
|
163
|
+
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
|
164
|
+
|
|
165
|
+
# Install Docker Compose
|
|
166
|
+
sudo rm -f /usr/local/bin/docker-compose
|
|
167
|
+
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
# Wait for the file to be fully downloaded before proceeding
|
|
171
|
+
if [ ! -f /usr/local/bin/docker-compose ]; then
|
|
172
|
+
echo "Docker Compose download failed. Exiting."
|
|
173
|
+
exit 1
|
|
174
|
+
fi
|
|
175
|
+
|
|
176
|
+
sudo chmod +x /usr/local/bin/docker-compose
|
|
177
|
+
|
|
178
|
+
# Ensure Docker Compose is executable and in path
|
|
179
|
+
sudo ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose
|
|
180
|
+
|
|
181
|
+
# Verify Docker Compose installation
|
|
182
|
+
docker-compose --version
|
|
183
|
+
if [ $? -ne 0 ]; then
|
|
184
|
+
echo "Docker Compose installation failed. Exiting."
|
|
185
|
+
exit 1
|
|
186
|
+
fi
|
|
187
|
+
|
|
188
|
+
# Ensure Docker starts on boot and start Docker service
|
|
189
|
+
sudo systemctl enable docker
|
|
190
|
+
sudo systemctl start docker
|
|
191
|
+
|
|
192
|
+
# Create a .env file
|
|
193
|
+
if [ ! -f "./.env" ]; then
|
|
194
|
+
echo "LOGIN_TOKEN_SECRET=$LOGIN_TOKEN_SECRET" > "./.env"
|
|
195
|
+
echo "NEXT_PUBLIC_BACKEND_CLIENT_URL=https://$DOMAIN_BACKEND_NAME" >> "./.env"
|
|
196
|
+
echo "NEXT_PUBLIC_FRONTEND_URL=https://$DOMAIN_FRONTEND_NAME" >> "./.env"
|
|
197
|
+
echo "DB_USER=$DB_USER" >> "./.env"
|
|
198
|
+
echo "DB_PASSWORD=$DB_PASSWORD" >> "./.env"
|
|
199
|
+
echo "DB_DATABASE=$DB_DATABASE" >> "./.env"
|
|
200
|
+
else
|
|
201
|
+
echo ".env file already exists. Skipping creation."
|
|
202
|
+
fi
|
|
203
|
+
|
|
204
|
+
sudo docker-compose -f ./docker-compose.yml -p vitnode up --build -d
|
|
205
|
+
|
|
206
|
+
sudo chown -R 1001:1001 ./apps/backend/src/plugins/core
|
|
207
|
+
sudo chown -R 1001:1001 ./apps/backend/uploads
|
|
208
|
+
|
|
209
|
+
# Check if Docker Compose started correctly
|
|
210
|
+
if ! sudo docker-compose ps | grep "Up"; then
|
|
211
|
+
echo "Docker containers failed to start. Check logs with 'docker-compose logs'."
|
|
212
|
+
exit 1
|
|
213
|
+
fi
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
database:
|
|
5
|
+
container_name: vitnode_database
|
|
6
|
+
image: postgres:16.3-alpine
|
|
7
|
+
restart: unless-stopped
|
|
8
|
+
environment:
|
|
9
|
+
POSTGRES_USER: ${DB_USER}
|
|
10
|
+
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
|
11
|
+
POSTGRES_DB: ${DB_DATABASE:-vitnode}
|
|
12
|
+
ports:
|
|
13
|
+
- '${DB_PORT:-5432}:${DB_PORT:-5432}'
|
|
14
|
+
volumes:
|
|
15
|
+
- ./docker/prod/database:/var/lib/postgresql/data
|
|
16
|
+
networks:
|
|
17
|
+
- vitnode
|
|
18
|
+
backend:
|
|
19
|
+
container_name: vitnode_backend
|
|
20
|
+
build:
|
|
21
|
+
context: .
|
|
22
|
+
dockerfile: ./apps/backend/DockerFile
|
|
23
|
+
restart: unless-stopped
|
|
24
|
+
depends_on:
|
|
25
|
+
- database
|
|
26
|
+
environment:
|
|
27
|
+
DB_HOST: ${DB_HOST:-database}
|
|
28
|
+
env_file:
|
|
29
|
+
- .env
|
|
30
|
+
command: sh -c "cd apps/backend && npm run config:init && node dist/main.js"
|
|
31
|
+
ports:
|
|
32
|
+
- '8080:8080'
|
|
33
|
+
volumes:
|
|
34
|
+
- ./apps/backend/uploads:/app/apps/backend/uploads # uploads
|
|
35
|
+
- ./apps/backend/src/plugins/core:/app/apps/backend/src/plugins/core # core
|
|
36
|
+
networks:
|
|
37
|
+
- vitnode
|
|
38
|
+
frontend:
|
|
39
|
+
container_name: vitnode_frontend
|
|
40
|
+
build:
|
|
41
|
+
context: .
|
|
42
|
+
dockerfile: ./apps/frontend/DockerFile
|
|
43
|
+
args:
|
|
44
|
+
- NEXT_PUBLIC_BACKEND_URL=${NEXT_PUBLIC_BACKEND_URL:-http://backend:8080}
|
|
45
|
+
- NEXT_PUBLIC_BACKEND_CLIENT_URL=${NEXT_PUBLIC_BACKEND_CLIENT_URL:-http://localhost:8080}
|
|
46
|
+
- NEXT_PUBLIC_FRONTEND_URL=${NEXT_PUBLIC_FRONTEND_URL:-http://localhost:3000}
|
|
47
|
+
restart: unless-stopped
|
|
48
|
+
ports:
|
|
49
|
+
- '3000:3000'
|
|
50
|
+
networks:
|
|
51
|
+
- vitnode
|
|
52
|
+
|
|
53
|
+
networks:
|
|
54
|
+
vitnode:
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
package-manager-strict=false
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { join } from 'path';
|
|
2
|
-
|
|
3
|
-
import { codegenConfig } from 'vitnode-frontend/codegen';
|
|
4
|
-
import { CodegenConfig } from '@graphql-codegen/cli';
|
|
5
|
-
|
|
6
|
-
const config: CodegenConfig = codegenConfig({
|
|
7
|
-
pathOutGql: join(process.cwd(), '..', 'frontend', 'src', 'graphql'),
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
export default config;
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
generateMetadataItemLegal,
|
|
3
|
-
ItemLegalView,
|
|
4
|
-
} from 'vitnode-frontend/views/theme/views/legal/item/item-legal-view';
|
|
5
|
-
|
|
6
|
-
export const generateMetadata = generateMetadataItemLegal;
|
|
7
|
-
|
|
8
|
-
export default function Page(
|
|
9
|
-
props: React.ComponentProps<typeof ItemLegalView>,
|
|
10
|
-
) {
|
|
11
|
-
return <ItemLegalView {...props} />;
|
|
12
|
-
}
|
package/templates/basic/apps/frontend/src/app/[locale]/(main)/(layout)/(vitnode)/login/layout.tsx
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { TranslationsProvider } from 'vitnode-frontend/components/translations-provider';
|
|
2
|
-
|
|
3
|
-
export default function Layout({ children }: { children: React.ReactNode }) {
|
|
4
|
-
return (
|
|
5
|
-
<TranslationsProvider namespaces="core.sign_in">
|
|
6
|
-
{children}
|
|
7
|
-
</TranslationsProvider>
|
|
8
|
-
);
|
|
9
|
-
}
|