diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..3b41682
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+/mvnw text eol=lf
+*.cmd text eol=crlf
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a464eb0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,64 @@
+# ---> Java
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+*.gz
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+replay_pid*
+
+# Vue: gitignore template for Vue.js projects
+
+# Recommended template: Node.gitignore
+
+# Root
+/upload/
+/.idea
+*.iml
+
+# Backnend module
+/backend/app/src/main/resources/application-dev.yaml
+/backend/app/src/main/resources/public/
+/backend/app/upload/
+/backend/**/target/
+
+# Frontend module
+/frontend/dist
+/frontend/upload
+/frontend/node_modules/*
+/frontend/node
+/frontend/**/target/
+/frontend/components.d.ts
+/frontend/tsconfig.app.tsbuildinfo
+/frontend/.vite
+/frontend/.turbo
+
+# Файлы сборки/компиляции для модулей
+/frontend/src/modules/*/dist/
+/frontend/src/modules/*/node_modules/
+/frontend/src/modules/*.tsbuildinfo
+/frontend/tsconfig.tsbuildinfo
+
+# Игнорим lock-файлы всех модулей
+/frontend**/package-lock.json
+
+# Исключаем лок-файл самого приложения
+!/frontend/package-lock.json
\ No newline at end of file
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..c0bcafe
--- /dev/null
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,3 @@
+wrapperVersion=3.3.4
+distributionType=only-script
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..0ab850b
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,17 @@
+FROM eclipse-temurin:25.0.2_10-jre-alpine-3.23
+
+WORKDIR /app
+
+ARG PROFILE
+ARG PORT
+ARG DB_HOST
+ARG DB_PASSWORD
+
+ENV PROFILE $PROFILE
+ENV PORT $PORT
+ENV DB_HOST $DB_HOST
+ENV DB_PASSWORD $DB_PASSWORD
+
+COPY backend/app/target/app-1.0.0.jar /app/backend.jar
+
+ENTRYPOINT ["java","-jar","/app/backend.jar"]
\ No newline at end of file
diff --git a/README.md b/README.md
deleted file mode 100644
index ead8b38..0000000
--- a/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# supp-forms-based-app
-
-Базовый репозиторий для форка новых проектов, базирующихся на supp-forms
\ No newline at end of file
diff --git a/backend/app/pom.xml b/backend/app/pom.xml
new file mode 100644
index 0000000..a88e29e
--- /dev/null
+++ b/backend/app/pom.xml
@@ -0,0 +1,150 @@
+
+
+ 4.0.0
+
+ app
+ jar
+
+
+ org.itprom
+ backend
+ 1.0.0
+
+
+
+
+ Sergey Verbitsky
+ It-prom
+
+
+
+
+ true
+
+ 25
+ 25
+ UTF-8
+
+
+
+
+
+ org.itprom
+ backend
+ 1.0.0
+ pom
+ import
+
+
+
+
+
+
+
+ org.postgresql
+ postgresql
+
+
+
+
+
+
+ org.itprom
+ base-config
+ ${project.version}
+
+
+
+
+ org.itprom
+ core
+ ${project.version}
+
+
+
+
+ org.itprom
+ log
+ ${project.version}
+
+
+
+
+ org.itprom
+ menu
+ ${project.version}
+
+
+
+
+ org.itprom
+ l10n
+ ${project.version}
+
+
+
+
+ org.itprom
+ notification
+ ${project.version}
+
+
+
+
+ ${project.basedir}/src/main/java
+ ${project.basedir}/src/test/java
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ 4.0.3
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
+
+ repackage
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-resources-plugin
+ 3.4.0
+
+
+ copy Vue.js frontend content
+ generate-resources
+
+ copy-resources
+
+
+ src/main/resources/public
+ true
+
+
+ ../../frontend/target/dist
+
+ index.html
+ favicon.ico
+ company_logo.png
+ static/**
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/backend/app/src/main/java/org/itprom/suppforms/SuppFormsApplication.java b/backend/app/src/main/java/org/itprom/suppforms/SuppFormsApplication.java
new file mode 100644
index 0000000..784c236
--- /dev/null
+++ b/backend/app/src/main/java/org/itprom/suppforms/SuppFormsApplication.java
@@ -0,0 +1,29 @@
+package org.itprom.suppforms;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.persistence.autoconfigure.EntityScan;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+/**
+ * Точка входа в основное приложение.
+ *
+ * @author Sergey Verbitsky
+ * @since 15.12.2025
+ */
+
+@ConfigurationPropertiesScan
+@EnableConfigurationProperties
+@SpringBootApplication
+@EnableJpaRepositories("org.itprom")
+@EntityScan("org.itprom")
+@ComponentScan("org.itprom")
+public class SuppFormsApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SuppFormsApplication.class, args);
+ }
+}
diff --git a/backend/app/src/main/resources/application.yaml b/backend/app/src/main/resources/application.yaml
new file mode 100644
index 0000000..ed035d9
--- /dev/null
+++ b/backend/app/src/main/resources/application.yaml
@@ -0,0 +1,59 @@
+server:
+ port: 9001
+spring:
+ profiles:
+ active: ${PROFILE:dev}
+ servlet:
+ multipart:
+ enabled: true
+ max-file-size: 10MB
+ max-request-size: 15MB
+ file-size-threshold: 2KB
+ sql:
+ init:
+ mode: always
+ schema-locations:
+ - classpath*:db/**/*.sql
+ jpa:
+ defer-datasource-initialization: true
+ mvc:
+ pathmatch:
+ matching-strategy: ant_path_matcher
+springdoc:
+ api-docs:
+ path: /api-docs
+ swagger-ui:
+ url: /api-docs
+jwt:
+ private.key: classpath:/jwk/supp-5.key
+ public.key: classpath:/jwk/supp-5.pub
+ expiration: 86400
+
+management:
+ endpoints:
+ web:
+ exposure:
+ include: health, info, metrics, prometheus
+ metrics:
+ distribution:
+ percentiles-histogram:
+ http.server.requests: true
+ tags:
+ application: supp-forms
+
+#- SUPP ------------------------------------------------------
+supp:
+ defaultRoles:
+ - name: Administrator
+ - name: SuppUser
+ pages:
+ - num: 2
+ access: [ read, write ]
+ enablePathRegistryLog: false
+ websocket:
+ allowedOrigins:
+ - "http://localhost:9001"
+ - "http://localhost:5173"
+ - "http://127.0.0.1:5173"
+file:
+ upload-dir: ./upload
\ No newline at end of file
diff --git a/backend/pom.xml b/backend/pom.xml
new file mode 100644
index 0000000..2855d1e
--- /dev/null
+++ b/backend/pom.xml
@@ -0,0 +1,139 @@
+
+
+ 4.0.0
+
+ org.itprom
+ supp-forms-based-app
+ 1.0.0
+ ../pom.xml
+
+
+ backend
+ pom
+ backend
+
+
+
+ Sergey Verbitsky
+ It-prom
+
+
+
+
+ app
+
+
+
+
+ true
+
+ 25
+ UTF-8
+ 4.0.3
+ 1.18.42
+ 3.20.0
+ 1.21.2
+ 2.2.23
+ 1.9.23
+ 42.7.8
+ 2.2.224
+ 3.0.0
+ 2.14.0
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+ org.jsoup
+ jsoup
+ ${jsoup.version}
+
+
+
+ io.swagger.core.v3
+ swagger-annotations
+ ${swagger-annotations.version}
+
+
+
+ org.aspectj
+ aspectjrt
+ ${aspectj.version}
+
+
+
+ org.aspectj
+ aspectjweaver
+ ${aspectj.version}
+
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+
+
+ org.postgresql
+ postgresql
+ ${postgresql.version}
+
+
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+ ${springdoc.version}
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.11.0
+
+ ${java.version}
+ ${java.version}
+ ${project.build.sourceEncoding}
+ true
+
+
+ org.projectlombok
+ lombok
+ 1.18.42
+
+
+
+
+
+
+
+
diff --git a/frontend/env.d.ts b/frontend/env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/frontend/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js
new file mode 100644
index 0000000..2cda976
--- /dev/null
+++ b/frontend/eslint.config.js
@@ -0,0 +1,95 @@
+import globals from 'globals';
+import js from '@eslint/js';
+
+export default [
+ // Игнорируемые файлы и папки
+ {
+ ignores: [
+ '**/node_modules/**', // пакеты
+ '**/dist/**', // сборка
+ '**/build/**', // сборка
+ '**/*.d.ts', // типы TS
+ '**/*.d.ts.map' // sourcemap типовых файлов
+ ]
+ },
+ // Конфиг для JS файлов
+ {
+ files: ['**/*.{js,jsx}'], // проверяем только JS/JSX
+ ...js.configs.recommended, // базовые правила ESLint
+ languageOptions: {
+ ecmaVersion: 'latest', // современный JS
+ sourceType: 'module', // ES модули
+ globals: { // глобальные переменные
+ ...globals.browser,
+ ...globals.node
+ }
+ },
+ rules: {
+ 'no-console': 'off', // консоль разрешена
+ 'no-debugger': process.env.NODE_ENV === 'production'
+ ? 'error'
+ : 'warn', // debugger в dev — warn, в prod — error
+ 'semi': ['error', 'always'], // точка с запятой обязательна
+ 'quotes': ['error', 'single', { avoidEscape: true }] // одинарные кавычки, экранирование разрешено
+ }
+ },
+ // Конфиг для TypeScript файлов
+ {
+ files: ['**/*.{ts,tsx}'],
+ languageOptions: {
+ parser: await import('@typescript-eslint/parser').then(m => m.default),
+ parserOptions: {
+ ecmaVersion: 'latest',
+ sourceType: 'module'
+ },
+ globals: {
+ ...globals.browser,
+ ...globals.node
+ }
+ },
+ plugins: {
+ '@typescript-eslint': await import('@typescript-eslint/eslint-plugin').then(m => m.default)
+ },
+ rules: {
+ 'no-console': 'off', // консоль разрешена
+ 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'warn',
+ 'semi': ['error', 'always'], // обязательные точки с запятой
+ 'quotes': ['error', 'single', {
+ avoidEscape: true,
+ allowTemplateLiterals: true
+ }], // одинарные кавычки, шаблонные строки разрешены
+ 'no-unused-vars': 'off', // TS не ругается на неиспользуемые переменные
+ '@typescript-eslint/no-unused-vars': 'off',
+ '@typescript-eslint/no-explicit-any': 'off' // any разрешен
+ }
+ },
+ // Конфиг для Vue файлов
+ {
+ files: ['**/*.vue'], // проверка только Vue
+ languageOptions: {
+ parser: await import('vue-eslint-parser').then(m => m.default),
+ parserOptions: {
+ parser: await import('@typescript-eslint/parser').then(m => m.default), // TS внутри
+