Skip to content

Commit c54e178

Browse files
committed
initial commit
0 parents  commit c54e178

29 files changed

+978
-0
lines changed

.github/workflows/deploy.yml

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
name: Deploy
2+
3+
on:
4+
push:
5+
branches: [main]
6+
workflow_dispatch:
7+
8+
permissions:
9+
contents: read
10+
pages: write
11+
id-token: write
12+
13+
concurrency:
14+
group: pages
15+
cancel-in-progress: false
16+
17+
jobs:
18+
build:
19+
runs-on: ubuntu-latest
20+
steps:
21+
- name: Checkout
22+
uses: actions/checkout@v4
23+
24+
- name: Setup Bun
25+
uses: oven-sh/setup-bun@v1
26+
27+
- name: Setup Pages
28+
uses: actions/configure-pages@v4
29+
30+
- name: Install dependencies
31+
run: bun install
32+
33+
- name: Build with VitePress
34+
run: bun run build
35+
36+
- name: Upload artifact
37+
uses: actions/upload-pages-artifact@v3
38+
with:
39+
path: .vitepress/dist
40+
41+
deploy:
42+
environment:
43+
name: github-pages
44+
url: ${{ steps.deployment.outputs.page_url }}
45+
needs: build
46+
runs-on: ubuntu-latest
47+
name: Deploy
48+
steps:
49+
- name: Deploy to GitHub Pages
50+
id: deployment
51+
uses: actions/deploy-pages@v4

.gitignore

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# VitePress dev/build outputs
2+
.vitepress/cache
3+
4+
# Node dependencies
5+
node_modules
6+
7+
# Logs
8+
logs
9+
*.log
10+
11+
# Misc
12+
.DS_Store
13+
.fleet
14+
.idea
15+
16+
# Local env files
17+
.env
18+
.env.*
19+
!.env.example

.hooks/pre-commit

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#!/bin/sh
2+
bun run lint:staged

.lintstagedrc

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"*.{js,jsx,cjs,mjs,ts,tsx,vue,css}": "eslint --fix"
3+
}

.vitepress/config.mts

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { defineConfig } from 'vitepress'
2+
3+
export default defineConfig({
4+
base: '/docs/',
5+
title: 'Bidaro',
6+
description: 'Макет реального веб-приложения в предметной области продажи товаров в форме английского онлайн-аукциона',
7+
themeConfig: {
8+
nav: [
9+
{ text: 'О проекте', link: '/about/what-is-it', activeMatch: '/about/' },
10+
{ text: 'Разработка', link: '/about-dev/what-is-dev', activeMatch: '/about-dev/' },
11+
],
12+
sidebar: {
13+
'/about/': [
14+
{
15+
text: 'Начало',
16+
items: [
17+
{ text: 'Что это такое?', link: '/about/what-is-it' },
18+
{ text: 'Предметная область', link: '/about/subject-area' },
19+
{ text: 'Бизнес анализ', link: '/about/business-analysis' },
20+
{ text: 'Предыстория', link: '/about/prehistory' },
21+
],
22+
},
23+
{
24+
text: 'Продукт',
25+
items: [
26+
{ text: 'Общее видение', link: '/about/product/shared-vision' },
27+
{ text: 'Бизнес модель', link: '/about/product/business-model' },
28+
{ text: 'План разработки', link: '/about/product/development-plan' },
29+
],
30+
},
31+
{
32+
text: 'Функционал',
33+
items: [
34+
{ text: 'Аутентификация', link: '/about/feature/authentication' },
35+
{ text: 'Авторизация', link: '/about/feature/authorization' },
36+
{ text: 'Профили', link: '/about/feature/profiles' },
37+
{ text: 'Торги', link: '/about/feature/bidding' },
38+
{ text: 'Каталог', link: '/about/feature/catalog' },
39+
{ text: 'Обслуживание', link: '/about/feature/maintenance' },
40+
],
41+
},
42+
{
43+
text: 'Будущее',
44+
items: [
45+
{ text: 'Изображения', link: '/about/future/images' },
46+
{ text: 'Чатинг', link: '/about/future/chating' },
47+
],
48+
},
49+
],
50+
'/about-dev/': [
51+
{
52+
text: 'Разработка',
53+
items: [
54+
{ text: 'Что такое разработка?', link: '/about-dev/what-is-dev' },
55+
{ text: 'Инфраструктура', link: '/about-dev/infrastructure' },
56+
{ text: 'Тестирование', link: '/about-dev/testing' },
57+
],
58+
},
59+
],
60+
},
61+
},
62+
})

.vscode/extensions.json

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"recommendations": [
3+
"dbaeumer.vscode-eslint"
4+
]
5+
}

.vscode/settings.json

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{
2+
// Enable the ESlint flat config support
3+
"eslint.experimental.useFlatConfig": true,
4+
5+
// Disable the default formatter, use eslint instead
6+
"prettier.enable": false,
7+
"editor.formatOnSave": false,
8+
9+
// Auto fix
10+
"editor.codeActionsOnSave": {
11+
"source.fixAll": "explicit",
12+
"source.organizeImports": "never"
13+
},
14+
15+
// Silent the stylistic rules in you IDE, but still auto fix them
16+
"eslint.rules.customizations": [
17+
{ "rule": "style/*", "severity": "off" },
18+
{ "rule": "*-indent", "severity": "off" },
19+
{ "rule": "*-spacing", "severity": "off" },
20+
{ "rule": "*-spaces", "severity": "off" },
21+
{ "rule": "*-order", "severity": "off" },
22+
{ "rule": "*-dangle", "severity": "off" },
23+
{ "rule": "*-newline", "severity": "off" },
24+
{ "rule": "*quotes", "severity": "off" },
25+
{ "rule": "*semi", "severity": "off" }
26+
],
27+
28+
// Enable eslint for all supported languages
29+
"eslint.validate": [
30+
"javascript",
31+
"javascriptreact",
32+
"typescript",
33+
"typescriptreact",
34+
"vue",
35+
"css",
36+
"less",
37+
"scss",
38+
"pcss",
39+
"postcss",
40+
"html",
41+
"markdown",
42+
"json",
43+
"jsonc",
44+
"yaml"
45+
]
46+
}

about-dev/infrastructure.md

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Инфраструктура
2+
3+
Под инфраструктурой понимается все компоненты и технологии, необходимые для разработки, развертывания и поддержки продукта в продакшен окружении.
4+
5+
## Сервер
6+
7+
Под сервером понимается кластер серверов под управлением kubernetes. Из вне, через IP-адресс, приходит запрос и попадает на ingress узел с load балансером, который далее определяет узел для обработки запроса и перенаправляет его туда.
8+
9+
Каждый узел кластера имеет поднятный контейнер с основным приложением.
10+
11+
Так же выделятся ряд узлов для основных хранилищ продукта.
12+
13+
## Основное приложение
14+
15+
Основное приложение продукта, с которым взаимодействуют пользователи, написано на фреймворке Nuxt 3 и совмещает в себе Frontend и Backend части.
16+
17+
Пользовательская часть приложения посылает все запросы на серверную часть.
18+
19+
Серверная часть приложения подключается ко внешним сервисам (основные хранилища, smtp сервер и т.д), принимает запросы от пользователей и производит необходимые манипуляции с данными (чтение, добавление, переадресацию и т.д.) при этом не сохраняя никакого состояния внутри себя.
20+
21+
## Основные хранилища
22+
23+
Для сохранения данных продукта (пользователи, лоты, токены, изображения и т.д.) используются специализированные хранилища запущеные в кластере kubernetes.
24+
25+
- Для сохранения временных или часто используемых данных будет использоваться Redis как хранилище кеша.
26+
27+
- Для сохранения всех остальных данных будет использоваться PostgreSQL как основная база данных.
28+
29+
- Для сохранения резервных копий данных приложения будет использоваться отдельное внешнее файловое хранилище Google Drive.
30+
31+
## DevOps и CI/CD
32+
33+
Когда выходит новая версия основного приложения, запускаются процессы поставки новой версии на сервер в GitHub Actions.
34+
35+
Что происходит на сервере:
36+
37+
- Сервер переводится в maintenance режим. Все внешние запросы будут переводится на приложение с выдачей информации о техническом обслуживании продукта.
38+
39+
- Удаляются все работающие экземпляры основного приложения.
40+
41+
- Запускается процесс обновления контейнеров основного приложения и приложения для миграции.
42+
43+
- Запускается обновленное приложения для миграции базы данных.
44+
45+
- Запускаются экземпляры основного приложения.
46+
47+
- Сервер переводится в рабочий режим.
48+
49+
## Внешние интеграции
50+
51+
### Сетевые компоненты
52+
53+
Все, без исключения, пользователи будут взаимодействовать с продуктом через доменное имя (DNS, например auction.ua.com). Оно переводит пользователя по нашему IP адресу, где его принимает наш сервер.
54+
55+
### Безопасность сети
56+
57+
При создании соединения между пользователем и сервером, будет производится обмен SSL/TLS сертификатами от Let's Encrypt, которые будут шифровать передачу логинов, паролей и других важных данный.
58+
59+
### Внешнее хранилище
60+
61+
- Для сохранения полноценных файлов и изображений будет использоваться S3-совместимое объектное хранилище.
62+
63+
### Внешние сервисы
64+
65+
- Для произведения оплаты услуг пользователем, будет использоватся платежный сервис Fondy.
66+
67+
- Для отправки рассылки пользователям, будет использоваться email провайдер Gmail.

about-dev/testing.md

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Тестирование
2+
3+
Чтобы удостоверится в правильной работе продукта, в основные моменты изменения кода будет проходит его тестирование. Это поможет отловить баги и проблемы на ранних этапах и оперативно их исправить.
4+
5+
Когда происходит тестирование:
6+
7+
- При внесении изменений в исходный код. Запускаются unit и integration тесты на стороне разработчика, чтобы не допустить мелких ошибок с его стороны.
8+
9+
- При создании запроса на слитие кода в develop ветку. Запускаются все виды тестов на стороне GitHub Actions.
10+
11+
Таким образом достигается состояния, когда код из develop ветки может в любой момент выйти в релиз, так как все изменения прошли полное тестирование.
12+
13+
## Виды тестов
14+
15+
### Unit-тесты
16+
17+
Чтобы протестировать маленькие части приложения, например composables фукнции, утилиты, хранилища и другое, используется unit тесты.
18+
19+
Они выполняются очень быстро и это позволяет убедится в том, что функции которые могут быть на всех уровнях приложения работают без ошибок.
20+
21+
### Integration-тесты
22+
23+
Чтобы протестировать компоненты с которыми взаимодействует пользователь, например формы, используется интеграционные (или компонентные) тесты.
24+
25+
### End-to-End тесты
26+
27+
Задачей e2e тестов является протестировать основной поток пользователя, чтобы убедится что там нет ошибок.
28+
29+
Например, что аутентификация с правильными данными работает так, как задуманно и пользователь попадает попадет в свой профиль.
30+
31+
### End-to-End API тесты
32+
33+
Задачей e2e тестов для API является проверка того, что запросы на серверную часть ожидаемо правильно обрабатываются.
34+
35+
Например, что запрос на получение данных без токена возвращает ошибку, или запрос на вход в профиль с правильными данными возвращает успех.
36+
37+
## Запуск тестов локально
38+
39+
Когда разработчик запускает тесты на своем компютере, с unit и integration тестами проблем не возникает, так как они не выходят за рамки приложения, а все внешние запросы подменяются. А вот для e2e тестов внешние сервисы уже необходимы.
40+
41+
Чтобы запустить такие тесты, на стороне разработчика нужно:
42+
43+
- Поднять все внешние сервисы через docker
44+
45+
- Создать копию `.env` с названием `.env.test`
46+
47+
- Сделать миграцию базы данных через migrator
48+
49+
После всех этих манипуляций, e2e тесты запустятся
50+
51+
::: warning Важно!
52+
В `.env.test` адреса сервисов могут быть равны с `.env`, но названия базы данных или бакета s3 хранилища должны быть разными. Перед началом тестирования происходит полное удаление всех данных, чтобы ничего не мешало отслеживать эффекты от запуса тестов.
53+
:::
54+
55+
## Запуск тестов через CI/CD
56+
57+
Если запуск тестов локально требует вручную поднять docker контейнеры приложения, то через GitHub Actions достаточно будет [прописать сервисы в workflow файле](https://docs.github.com/en/actions/using-containerized-services/about-service-containers).

about-dev/what-is-dev.md

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Что такое разработка

0 commit comments

Comments
 (0)