Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
dmitrytavern committed Jun 19, 2024
0 parents commit f7bc25f
Show file tree
Hide file tree
Showing 29 changed files with 978 additions and 0 deletions.
52 changes: 52 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Deploy

on:
push:
branches: [main]
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: pages
cancel-in-progress: false

jobs:
build:
runs-on: ubuntu-latest
name: Build
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Bun
uses: oven-sh/setup-bun@v1

- name: Setup Pages
uses: actions/configure-pages@v4

- name: Install dependencies
run: bun install

- name: Build with VitePress
run: bun run build

- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: .vitepress/dist

deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
needs: build
runs-on: ubuntu-latest
name: Deploy
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
19 changes: 19 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# VitePress dev/build outputs
.vitepress/cache

# Node dependencies
node_modules

# Logs
logs
*.log

# Misc
.DS_Store
.fleet
.idea

# Local env files
.env
.env.*
!.env.example
2 changes: 2 additions & 0 deletions .hooks/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/sh
bun run lint:staged
3 changes: 3 additions & 0 deletions .lintstagedrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"*.{js,jsx,cjs,mjs,ts,tsx,vue,css}": "eslint --fix"
}
61 changes: 61 additions & 0 deletions .vitepress/config.mts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { defineConfig } from 'vitepress'

export default defineConfig({
title: 'Bidaro',
description: 'Bidaro - real web-based open source online auction application',
themeConfig: {
nav: [
{ text: 'О проекте', link: '/about/what-is-it', activeMatch: '/about/' },
{ text: 'Разработка', link: '/about-dev/what-is-dev', activeMatch: '/about-dev/' },
],
sidebar: {
'/about/': [
{
text: 'Начало',
items: [
{ text: 'Что это такое?', link: '/about/what-is-it' },
{ text: 'Предметная область', link: '/about/subject-area' },
{ text: 'Бизнес анализ', link: '/about/business-analysis' },
{ text: 'Предыстория', link: '/about/prehistory' },
],
},
{
text: 'Продукт',
items: [
{ text: 'Общее видение', link: '/about/product/shared-vision' },
{ text: 'Бизнес модель', link: '/about/product/business-model' },
{ text: 'План разработки', link: '/about/product/development-plan' },
],
},
{
text: 'Функционал',
items: [
{ text: 'Аутентификация', link: '/about/feature/authentication' },
{ text: 'Авторизация', link: '/about/feature/authorization' },
{ text: 'Профили', link: '/about/feature/profiles' },
{ text: 'Торги', link: '/about/feature/bidding' },
{ text: 'Каталог', link: '/about/feature/catalog' },
{ text: 'Обслуживание', link: '/about/feature/maintenance' },
],
},
{
text: 'Будущее',
items: [
{ text: 'Изображения', link: '/about/future/images' },
{ text: 'Чатинг', link: '/about/future/chating' },
],
},
],
'/about-dev/': [
{
text: 'Разработка',
items: [
{ text: 'Что такое разработка?', link: '/about-dev/what-is-dev' },
{ text: 'Инфраструктура', link: '/about-dev/infrastructure' },
{ text: 'Тестирование', link: '/about-dev/testing' },
],
},
],
},
},
})
5 changes: 5 additions & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"recommendations": [
"dbaeumer.vscode-eslint"
]
}
46 changes: 46 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{
// Enable the ESlint flat config support
"eslint.experimental.useFlatConfig": true,

// Disable the default formatter, use eslint instead
"prettier.enable": false,
"editor.formatOnSave": false,

// Auto fix
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.organizeImports": "never"
},

// Silent the stylistic rules in you IDE, but still auto fix them
"eslint.rules.customizations": [
{ "rule": "style/*", "severity": "off" },
{ "rule": "*-indent", "severity": "off" },
{ "rule": "*-spacing", "severity": "off" },
{ "rule": "*-spaces", "severity": "off" },
{ "rule": "*-order", "severity": "off" },
{ "rule": "*-dangle", "severity": "off" },
{ "rule": "*-newline", "severity": "off" },
{ "rule": "*quotes", "severity": "off" },
{ "rule": "*semi", "severity": "off" }
],

// Enable eslint for all supported languages
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue",
"css",
"less",
"scss",
"pcss",
"postcss",
"html",
"markdown",
"json",
"jsonc",
"yaml"
]
}
67 changes: 67 additions & 0 deletions about-dev/infrastructure.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# Инфраструктура

Под инфраструктурой понимается все компоненты и технологии, необходимые для разработки, развертывания и поддержки продукта в продакшен окружении.

## Сервер

Под сервером понимается кластер серверов под управлением kubernetes. Из вне, через IP-адресс, приходит запрос и попадает на ingress узел с load балансером, который далее определяет узел для обработки запроса и перенаправляет его туда.

Каждый узел кластера имеет поднятный контейнер с основным приложением.

Так же выделятся ряд узлов для основных хранилищ продукта.

## Основное приложение

Основное приложение продукта, с которым взаимодействуют пользователи, написано на фреймворке Nuxt 3 и совмещает в себе Frontend и Backend части.

Пользовательская часть приложения посылает все запросы на серверную часть.

Серверная часть приложения подключается ко внешним сервисам (основные хранилища, smtp сервер и т.д), принимает запросы от пользователей и производит необходимые манипуляции с данными (чтение, добавление, переадресацию и т.д.) при этом не сохраняя никакого состояния внутри себя.

## Основные хранилища

Для сохранения данных продукта (пользователи, лоты, токены, изображения и т.д.) используются специализированные хранилища запущеные в кластере kubernetes.

- Для сохранения временных или часто используемых данных будет использоваться Redis как хранилище кеша.

- Для сохранения всех остальных данных будет использоваться PostgreSQL как основная база данных.

- Для сохранения резервных копий данных приложения будет использоваться отдельное внешнее файловое хранилище Google Drive.

## DevOps и CI/CD

Когда выходит новая версия основного приложения, запускаются процессы поставки новой версии на сервер в GitHub Actions.

Что происходит на сервере:

- Сервер переводится в maintenance режим. Все внешние запросы будут переводится на приложение с выдачей информации о техническом обслуживании продукта.

- Удаляются все работающие экземпляры основного приложения.

- Запускается процесс обновления контейнеров основного приложения и приложения для миграции.

- Запускается обновленное приложения для миграции базы данных.

- Запускаются экземпляры основного приложения.

- Сервер переводится в рабочий режим.

## Внешние интеграции

### Сетевые компоненты

Все, без исключения, пользователи будут взаимодействовать с продуктом через доменное имя (DNS, например auction.ua.com). Оно переводит пользователя по нашему IP адресу, где его принимает наш сервер.

### Безопасность сети

При создании соединения между пользователем и сервером, будет производится обмен SSL/TLS сертификатами от Let's Encrypt, которые будут шифровать передачу логинов, паролей и других важных данный.

### Внешнее хранилище

- Для сохранения полноценных файлов и изображений будет использоваться S3-совместимое объектное хранилище.

### Внешние сервисы

- Для произведения оплаты услуг пользователем, будет использоватся платежный сервис Fondy.

- Для отправки рассылки пользователям, будет использоваться email провайдер Gmail.
57 changes: 57 additions & 0 deletions about-dev/testing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Тестирование

Чтобы удостоверится в правильной работе продукта, в основные моменты изменения кода будет проходит его тестирование. Это поможет отловить баги и проблемы на ранних этапах и оперативно их исправить.

Когда происходит тестирование:

- При внесении изменений в исходный код. Запускаются unit и integration тесты на стороне разработчика, чтобы не допустить мелких ошибок с его стороны.

- При создании запроса на слитие кода в develop ветку. Запускаются все виды тестов на стороне GitHub Actions.

Таким образом достигается состояния, когда код из develop ветки может в любой момент выйти в релиз, так как все изменения прошли полное тестирование.

## Виды тестов

### Unit-тесты

Чтобы протестировать маленькие части приложения, например composables фукнции, утилиты, хранилища и другое, используется unit тесты.

Они выполняются очень быстро и это позволяет убедится в том, что функции которые могут быть на всех уровнях приложения работают без ошибок.

### Integration-тесты

Чтобы протестировать компоненты с которыми взаимодействует пользователь, например формы, используется интеграционные (или компонентные) тесты.

### End-to-End тесты

Задачей e2e тестов является протестировать основной поток пользователя, чтобы убедится что там нет ошибок.

Например, что аутентификация с правильными данными работает так, как задуманно и пользователь попадает попадет в свой профиль.

### End-to-End API тесты

Задачей e2e тестов для API является проверка того, что запросы на серверную часть ожидаемо правильно обрабатываются.

Например, что запрос на получение данных без токена возвращает ошибку, или запрос на вход в профиль с правильными данными возвращает успех.

## Запуск тестов локально

Когда разработчик запускает тесты на своем компютере, с unit и integration тестами проблем не возникает, так как они не выходят за рамки приложения, а все внешние запросы подменяются. А вот для e2e тестов внешние сервисы уже необходимы.

Чтобы запустить такие тесты, на стороне разработчика нужно:

- Поднять все внешние сервисы через docker

- Создать копию `.env` с названием `.env.test`

- Сделать миграцию базы данных через migrator

После всех этих манипуляций, e2e тесты запустятся

::: warning Важно!
В `.env.test` адреса сервисов могут быть равны с `.env`, но названия базы данных или бакета s3 хранилища должны быть разными. Перед началом тестирования происходит полное удаление всех данных, чтобы ничего не мешало отслеживать эффекты от запуса тестов.
:::

## Запуск тестов через CI/CD

Если запуск тестов локально требует вручную поднять docker контейнеры приложения, то через GitHub Actions достаточно будет [прописать сервисы в workflow файле](https://docs.github.com/en/actions/using-containerized-services/about-service-containers).
1 change: 1 addition & 0 deletions about-dev/what-is-dev.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Что такое разработка
Loading

0 comments on commit f7bc25f

Please sign in to comment.