Skip to content
This repository has been archived by the owner on Oct 15, 2023. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
nfilin480 committed Oct 14, 2023
2 parents b9e9878 + a34245c commit fddddc8
Show file tree
Hide file tree
Showing 10 changed files with 548 additions and 127 deletions.
56 changes: 55 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,57 @@
# MASSter
# Обложкер

[![Deploy frontend](https://github.com/Dungeon-MASSters/MASSter/actions/workflows/deploy-frontend.yml/badge.svg)](https://github.com/Dungeon-MASSters/MASSter/actions/workflows/deploy-frontend.yml)

## Инструкции для локального запуска

http://localhost:8080/ - веб приложение

http://localhost:8090/ - BaaS pocketbase

Все сервисы приложения упакованы в Docker compose, для запуска необходимо
выполнить следующие действия:

### 1. Отредактировать пароли в docker-composer.yaml

Указать данные для подключения с Pocketbase. Для сервисов preprocessor и
generator указать переменные окружения (можно использовать значения по
умолчанию):

```bash
[email protected]
PB_PWD=1234567890
```

### 2. Собрать докер образы

Для сборки выполнить команду:

```bash
docker compose build # docker-compose build для более старых версий Docker
```

### 3. Запустить сервисы

Для запуска выполнить команду:

```bash
docker compose up # docker-compose up для более старых версий Docker
```

### 4. Создать пользователя Pocketbase

Зайти в админ панель Pocketbase по адресу:

http://localhost:8090/_

Создать первого пользователя с логином и паролем ранее указанным в
docker-compose.yaml

### 5. Настроить Oauth

В админ панели Pocketbase в меню `Settings/Auth providers` добавить провайдера
Vk или Yandex

### 6. Готово

Веб-приложение доступно на http://localhost:8080/
22 changes: 20 additions & 2 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,20 +27,38 @@ services:

preprocessor:
build:
context: model/preprocessor/docker
context: model/generator/
dockerfile: docker/Dockerfile

environment:
- PB_LINK=http://pocketbase:8090/
- [email protected]
- PB_PWD=1234567890
- COL_NAME=text_generation_mvp

deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]

generator:
build:
context: model/generator/docker
context: model/generator/
dockerfile: docker/Dockerfile

environment:
- PB_LINK=http://pocketbase:8090/
- [email protected]
- PB_PWD=1234567890
- COL_NAME=text_generation_mvp

deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
2 changes: 1 addition & 1 deletion frontend/MASSter-frontend/.env.production
Original file line number Diff line number Diff line change
@@ -1 +1 @@
VITE_PB_HOST="http://pocketbase:8090"
VITE_PB_HOST="http://localhsot:8090"
102 changes: 78 additions & 24 deletions frontend/MASSter-frontend/src/components/avatar-prompt.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {
ACCEPTED_IMAGE_TYPES,
ACCEPTED_VIDEO_TYPES,
STYLES
} from "@/lib/consts";
Expand Down Expand Up @@ -169,24 +170,24 @@ export function AvatarAdvancedPromptForm({
prompt: z.string().min(3).max(500),
negativePrompt: z.string().max(500).optional(),
style: z.string().default("Нет"),
// inputImage: z
// .custom<File>((v) => v instanceof File, {
// message: "Нужно загрузить картинки для референса"
// })
// .refine(
// (v) => ACCEPTED_IMAGE_TYPES.includes(v.type),
// "Пока мы поддерживаем только .png и .jpg изображения"
// )
// .optional(),
// video: z
// .custom<File>((v) => v instanceof File, {
// message: "Нужно загрузить видеоролик"
// })
// .refine(
// (v) => ACCEPTED_VIDEO_TYPES.includes(v.type),
// "Пока мы поддерживаем только .mp4 видеоролики :("
// )
// .optional(),
inputImage: z
.custom<File>((v) => v instanceof File, {
message: "Нужно загрузить картинки для референса"
})
.refine(
(v) => ACCEPTED_IMAGE_TYPES.includes(v.type),
"Пока мы поддерживаем только .png и .jpg изображения"
)
.optional(),
video: z
.custom<File>((v) => v instanceof File, {
message: "Нужно загрузить видеоролик"
})
.refine(
(v) => ACCEPTED_VIDEO_TYPES.includes(v.type),
"Пока мы поддерживаем только .mp4 видеоролики :("
)
.optional(),
numImages: z.coerce.number().min(1).max(7)
});

Expand All @@ -207,12 +208,12 @@ export function AvatarAdvancedPromptForm({
formData.append("type", "avatar");
formData.append("num_images", `${data.numImages}`);

// if (data.inputImage) {
// formData.append("input_image", data.inputImage);
// }
// if (data.video) {
// formData.append("video", data.video);
// }
if (data.inputImage) {
formData.append("input_image", data.inputImage);
}
if (data.video) {
formData.append("video", data.video);
}
return formData;
};

Expand Down Expand Up @@ -331,6 +332,59 @@ export function AvatarAdvancedPromptForm({
</FormItem>
)}
/>
<FormField
control={form.control}
name="inputImage"
render={({ field }) => (
<FormItem>
<FormLabel>Референс</FormLabel>
<FormControl>
<Input
type="file"
multiple={true}
onBlur={field.onBlur}
onChange={(e) =>
field.onChange(
e.target.files?.[0]
)
}
/>
</FormControl>
<FormDescription>
Изображение похожее на желаемый
результат
</FormDescription>
<FormMessage />
</FormItem>
)}
/>

<FormField
control={form.control}
name="video"
render={({ field }) => (
<FormItem>
<FormLabel>Видеоролик</FormLabel>
<FormControl>
<Input
type="file"
accept="video/mp4"
onBlur={field.onBlur}
onChange={(e) =>
field.onChange(
e.target.files?.[0]
)
}
/>
</FormControl>
<FormDescription>
Видеоролик, на основе которого
будет сгенирована аватарка
</FormDescription>
<FormMessage />
</FormItem>
)}
/>

<FormField
control={form.control}
Expand Down
56 changes: 40 additions & 16 deletions frontend/MASSter-frontend/src/components/banner-prompt.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
import {
ACCEPTED_VIDEO_TYPES,
STYLES
} from "@/lib/consts";
import { ACCEPTED_VIDEO_TYPES, STYLES } from "@/lib/consts";
import { pb } from "@/lib/pb-client";
import { zodResolver } from "@hookform/resolvers/zod";
import { RecordAuthResponse, RecordModel } from "pocketbase";
Expand Down Expand Up @@ -178,15 +175,15 @@ export function BannerAdvancedPromptForm({
// "Пока мы поддерживаем только .png и .jpg изображения"
// )
// .optional(),
// video: z
// .custom<File>((v) => v instanceof File, {
// message: "Нужно загрузить видеоролик"
// })
// .refine(
// (v) => ACCEPTED_VIDEO_TYPES.includes(v.type),
// "Пока мы поддерживаем только .mp4 видеоролики :("
// )
// .optional(),
video: z
.custom<File>((v) => v instanceof File, {
message: "Нужно загрузить видеоролик"
})
.refine(
(v) => ACCEPTED_VIDEO_TYPES.includes(v.type),
"Пока мы поддерживаем только .mp4 видеоролики :("
)
.optional(),
numImages: z.coerce.number().min(1).max(3)
});

Expand All @@ -210,9 +207,9 @@ export function BannerAdvancedPromptForm({
// if (data.inputImage) {
// formData.append("input_image", data.inputImage);
// }
// if (data.video) {
// formData.append("video", data.video);
// }
if (data.video) {
formData.append("video", data.video);
}
return formData;
};

Expand Down Expand Up @@ -332,6 +329,33 @@ export function BannerAdvancedPromptForm({
)}
/>

<FormField
control={form.control}
name="video"
render={({ field }) => (
<FormItem>
<FormLabel>Видеоролик</FormLabel>
<FormControl>
<Input
type="file"
accept="video/mp4"
onBlur={field.onBlur}
onChange={(e) =>
field.onChange(
e.target.files?.[0]
)
}
/>
</FormControl>
<FormDescription>
Видеоролик, на основе которого
будет сгенирован баннер
</FormDescription>
<FormMessage />
</FormItem>
)}
/>

<FormField
control={form.control}
name="numImages"
Expand Down
29 changes: 15 additions & 14 deletions frontend/MASSter-frontend/src/components/video-cover-prompt.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import {
ACCEPTED_IMAGE_TYPES,
ACCEPTED_VIDEO_TYPES,
STYLES
} from "@/lib/consts";
Expand Down Expand Up @@ -161,15 +160,15 @@ export function VideoCoverAdvancedPromptForm({
prompt: z.string().min(3).max(500),
negativePrompt: z.string().max(500).optional(),
style: z.string().default("Нет"),
inputImage: z
.custom<File>((v) => v instanceof File, {
message: "Нужно загрузить картинки для референса"
})
.refine(
(v) => ACCEPTED_IMAGE_TYPES.includes(v.type),
"Пока мы поддерживаем только .png и .jpg изображения"
)
.optional(),
// inputImage: z
// .custom<File>((v) => v instanceof File, {
// message: "Нужно загрузить картинки для референса"
// })
// .refine(
// (v) => ACCEPTED_IMAGE_TYPES.includes(v.type),
// "Пока мы поддерживаем только .png и .jpg изображения"
// )
// .optional(),
video: z
.custom<File>((v) => v instanceof File, {
message: "Нужно загрузить видеоролик"
Expand Down Expand Up @@ -199,9 +198,9 @@ export function VideoCoverAdvancedPromptForm({
formData.append("type", "video");
formData.append("num_images", `${data.numImages}`);

if (data.inputImage) {
formData.append("input_image", data.inputImage);
}
// if (data.inputImage) {
// formData.append("input_image", data.inputImage);
// }
if (data.video) {
formData.append("video", data.video);
}
Expand Down Expand Up @@ -323,6 +322,7 @@ export function VideoCoverAdvancedPromptForm({
</FormItem>
)}
/>
{/*
<FormField
control={form.control}
name="inputImage"
Expand All @@ -335,7 +335,7 @@ export function VideoCoverAdvancedPromptForm({
onBlur={field.onBlur}
onChange={(e) =>
field.onChange(
e.target.files
e.target.files?.[0]
)
}
/>
Expand All @@ -348,6 +348,7 @@ export function VideoCoverAdvancedPromptForm({
</FormItem>
)}
/>
*/}
<FormField
control={form.control}
name="video"
Expand Down
Loading

0 comments on commit fddddc8

Please sign in to comment.