pixels_project_deploy
所属分类:Docker
开发工具:Python
文件大小:0KB
下载次数:0
上传日期:2023-12-21 23:43:15
上 传 者:
sh-1993
说明: GoIT,Python WEB,项目。FastAPI。PostgreSQL。码头工人。REST API。ORM SQL炼金术。Pydantic公司。引导CSS。金加。阿伦比克。OAuth2.JWT。雷迪斯。Cloudinary(云)。限制
(GoIT, Python WEB, Project. FastAPI. PostgreSQL. Docker. REST API. ORM SQLAlchemy. Pydantic. Bootstraps CSS. Jinga. Alembic. OAuth2. JWT. Redis. Cloudinary. Limits)
文件列表:
alembic/
doc/
docs/
scripts/
src/
static/
templates/
tests/
Dockerfile
alembic.ini
docker-compose-project.yml
docker-compose-pytest.yml
docker-compose.yml
env-example
env_prod-example
main.py
pyproject.toml
requirements.txt
requirements_stud.txt
run.sh
runtime.txt
# pixels_project
# Технчне завдання на створення застосунку “PhotoShare” (REST API)
## Основний функцонал для REST API виконаний на FastAPI
### Аутентифкаця
- Механзм аутентифкац. JWT токени.
- Користувач мають три рол. Звичайний користувач, модератор, та адмнстратор. Перший користувач в систем завжди адмнстратор
- Для реалзац рзних рвнв доступу (звичайний користувач, модератор адмнстратор) використовуються декоратори FastAPI для переврки токена рол користувача.
### Робота з свтлинами
- Користувач можуть завантажувати свтлини з описом (POST).
- Користувач можуть видаляти свтлини (DELETE).
- Користувач можуть редагувати опис свтлини (PUT).
- Користувач можуть отримувати свтлину за ункальним посиланням (GET).
- Можливсть додавати до 5 тегв пд свтлину. Додавання тегу не обов'язкове при завантаженн свтлини.
- Теги ункальн для всього застосунку. Тег передаться на сервер по мен. Якщо такого тега не сну, то вн створються, якщо сну, то для свтлини береться тег що сну з такою назвою.
- Користувач можуть виконувати базов операц над свтлинами, як дозволя сервс Cloudinary (https://cloudinary.com/documentation/image_transformations). Можливо вибрати обмежений набр трансформацй над свтлинами для свого застосунку з Cloudinary.
- Користувач можуть створювати посилання на трансформоване зображення для перегляду свтлини в вигляд URL та QR-code (https://pypi.org/project/qrcode/). Операця POST, оскльки створються окреме посилання на трансформоване зображення, яке збергаться в баз даних
- Створен посилання збергаються на сервер через мобльний телефон ми можемо вдсканувати QR-code та побачити зображення
- Адмнстратори можуть робить вс CRUD операц з свтлинами користувачв
### Коментування
- Пд кожною свтлиною, блок з коментарями. Користувач можуть коментувати свтлину один одного
- Користувач може редагувати свй коментар, але не видаляти
- Адмнстратори та модератори можуть видаляти коментар.
- Для коментарв обов'язково збергати час створення та час редагування коментаря в баз даних. Для реалзац функцональност коментарв, ми можемо використовувати вдношення "один до багатьох" мж свтлинами коментарями в баз даних. Для тимчасового маркування коментарв, використовувати стовпц "created_at" "updated_at" у таблиц коментарв.
### Додатковий функцонал
- Створити маршрут для профля користувача за його ункальним юзернеймом. Повинна повертатися вся нформаця про користувача. мя, коли зарестрований, кльксть завантажених фото тощо
- Користувач може редагувати нформацю про себе, та бачити нформацю про себе. Це мають бути рзн маршрути з профлем користувача. Профль для всх користувачв, а нформаця для себе - це те що можна редагувати
- Адмнстратор може робити користувачв неактивними (банити). Неактивн користувач не можуть заходити в застосунок
### Додатково по можливост реалзувати наступн задач, якщо дозволя час.
- Реалзувати механзм виходу користувача з застосунку через logout. Access token повинен бути добавлений на час його снування в чорний список.
- Рейтинг
- Користувач можуть виставляти рейтинг свтлин вд 1 до 5 зрок. Рейтинг обчислються як середн значення оцнок всх користувачв.
- Можна тльки раз виставляти оцнку свтлин для користувача.
- Не можливо оцнювати сво свтлини.
- Модератори та адмнстратори можуть переглядати та видаляти оцнки користувачв.
- Пошук та фльтраця
- Користувач може здйснювати пошук свтлин за ключовим словом або тегом. Псля пошуку користувач може вдфльтрувати результати за рейтингом або датою додавання.
- Модератори та адмнстратори можуть виконувати пошук та фльтрацю за користувачами, як додали свтлини.
# Виконання
## Спльна робота
### Органзацйн процеси
#### Склад команди розробникв
1. [Team Lead](https://github.com/SVcheburator) @ SVcheburator
1. [Scrum Master](https://github.com/AlexanderBgit) @AlexanderBgit
1. [Developer](https://github.com/OleksiiHladkov) @OleksiiHladkov
1. [Developer](https://github.com/lexxai) @lexxai
#### Trello Розподлення задач мд розробниками
![](doc/softskill-trelo-01.png)
![](doc/softskill-trelo-02.png)
### Спльний робочий простр розробки Git
#### Розподлення git brach мж розробниками
- Основна глка розробки - built
- main - фнальна для релзв
- кожному розробнику створена власна глка, котру розробник синхронзу з built
![](doc/deploy-github-branch-01.png)
#### Захист git branch
- main - merge only owner
- build - merge require approval by 1 developer
![](doc/deploy-github-protect-01.png)
![](doc/deploy-github-protect-02.png)
#### Переврка перед merge - Git Action - Python Build (СI) (pytest)
![GitHub Action](doc/deploy-github-action-01.png)
![GitHub Action](doc/deploy-github-action-02.png)
## Роздли завдань
## Встановлення
### Завантаження прокту
```
git clone https://github.com/SVcheburator/pixels_project
cd ./pixels_project
git checkout *developer_branch*
```
### Створення змнних оточення для прокту
- На овнов `env-example` створюмо новий файл `.env`
- На овнов `env_prod-example` створюмо новий файл `.env_prod`
### Docker
```
docker-compose --file docker-compose-project.yml --env-file .env_prod up -d
[+] Building 0.0s (0/0) docker:default
[+] Running 3/3
Container pixels-redis-1 Started 0.0s
Container pixels-pg-1 Started 0.0s
Container pixels-code-1 Started 0.0s
```
### Середовище розробника
##### Вртуальне оточення прокту
- venv
```
python -m venv venv
./venv/Script/activate
pip install -r requirements.txt
```
- poetry
```
poetry init
poetry shell
poetry update
```
##### Запуск прокту
```
python ./main.py
INFO: Will watch for changes in these directories: ['...\\Project_group_5\\pixels_project']
INFO: Uvicorn running on http://0.0.0.0:9000 (Press CTRL+C to quit)
INFO: Started reloader process [19228] using WatchFiles
INFO: Started server process [18616]
INFO: Waiting for application startup.
INFO: Application startup complete.
```
##### Пдключення до прокту
Вдкрити браузер за посиланням http://localhost:9000
## Роздли FastAPI реалзац
FastAPI docs (Swagger) - http://localhost:9000/docs
### Аутентифкаця
![](/doc/api-auth-03.png)
![](/doc/api-auth-04.png)
![](/doc/api-auth-01.png)
![](/doc/api-auth-02.png)
### Користувач
![](/doc/api-users-01.png)
##### Користувач пдтвердження Email
![](/doc/auth-02.png)
![](/doc/auth-01.png)
![](/doc/auth-03.png)
### Робота з свтлинами
![](/doc/api-images-01.png)
#### Додавання свтлини для поточного користувача
![post-add](/doc/api-post-01.png)
#### Список свтлин за id користувача
![post-list](/doc/api-post-02.png)
### Коментування
![](/doc/api-comments-01.png)
#### Додавання коментаря до свтлини за id
![comm-add](/doc/api-comments-02.png )
#### Список коментарв до свтлини за id
![comm-list](/doc/api-comments-03.png )
### Додатковий функцонал
## Тестування. Простий Front end. STATIC HTML / JavaScript Auth client.
![](doc/web-index-01.png)
![](doc/web-js-01.png)
JavaScript Client with automatic token update.
![](doc/web-js-02.png)
## DEPLOY
### DOCKER COMPOSE PROJECT PIXELS
#### DOCKER BUILD
`docker-compose --file docker-compose-project.yml --env-file .env_prod build`
```
2023/12/08 22:49:34 http2: server: error reading preface from client //./pipe/docker_engine: file has already been closed
[+] Building 93.9s (14/14) FINISHED docker:default
=> [code internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.17kB 0.0s
=> [code internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [code internal] load metadata for docker.io/library/python:3.11 2.2s
=> [code auth] library/python:pull token for registry-1.docker.io 0.0s
=> [code 1/8] FROM docker.io/library/python:3.11@sha256:0698431f4610b4cad4ccea2b3e2754dfbb61ac4c553bbd2b044d716a917f2cdc 0.0s
=> [code internal] load build context 4.4s
=> => transferring context: 49.90MB 4.3s
=> CACHED [code 2/8] WORKDIR /app 0.0s
=> [code 3/8] COPY . . 1.1s
=> [code 4/8] COPY run.sh run.sh 0.1s
=> [code 5/8] COPY src/ src/ 0.1s
=> [code 6/8] COPY main.py main.py 0.1s
=> [code 7/8] COPY requirements.txt requirements.txt 0.1s
=> [code 8/8] RUN pip install -r requirements.txt 84.3s
=> [code] exporting to image 1.3s
=> => exporting layers 1.3s
=> => writing image sha256:3be444c0e7e6e2131beb8716bc56e072a303b805e08294d247a4e824e764e1e3 0.0s
=> => naming to docker.io/library/pixels-code 0.0s
```
#### DOCKER RUN
`docker-compose --file docker-compose-project.yml --env-file .env_prod up`
```
[+] Building 0.0s (0/0) docker:default
[+] Running 3/3
Container pixels-pg-1 Created 0.0s
Container pixels-redis-1 Created 0.0s
Container pixels-code-1 Recreated 0.8s
Attaching to pixels-code-1, pixels-pg-1, pixels-redis-1
pixels-redis-1 | 1:C 12 Dec 2023 18:34:26.534 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
pixels-redis-1 | 1:C 12 Dec 2023 18:34:26.535 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
pixels-redis-1 | 1:C 12 Dec 2023 18:34:26.535 * Redis version=7.2.3, bits=64, commit=00000000, modified=0, pid=1, just started
pixels-redis-1 | 1:C 12 Dec 2023 18:34:26.535 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
pixels-redis-1 | 1:M 12 Dec 2023 18:34:26.536 * monotonic clock: POSIX clock_gettime
pixels-redis-1 | 1:M 12 Dec 2023 18:34:26.536 * Running mode=standalone, port=6379.
pixels-redis-1 | 1:M 12 Dec 2023 18:34:26.560 * Server initialized
pixels-redis-1 | 1:M 12 Dec 2023 18:34:26.561 * Loading RDB produced by version 7.2.3
pixels-redis-1 | 1:M 12 Dec 2023 18:34:26.561 * RDB age 8 seconds
pixels-redis-1 | 1:M 12 Dec 2023 18:34:26.561 * RDB memory usage when created 0.83 Mb
pixels-redis-1 | 1:M 12 Dec 2023 18:34:26.561 * Done loading RDB, keys loaded: 0, keys expired: 0.
pixels-redis-1 | 1:M 12 Dec 2023 18:34:26.561 * DB loaded from disk: 0.000 seconds
pixels-redis-1 | 1:M 12 Dec 2023 18:34:26.561 * Ready to accept connections tcp
pixels-code-1 | Sleep 5...
pixels-pg-1 |
pixels-pg-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
pixels-pg-1 |
pixels-pg-1 | 2023-12-12 18:34:31.299 UTC [1] LOG: starting PostgreSQL 12.17 (Debian 12.17-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
pixels-pg-1 | 2023-12-12 18:34:31.300 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
pixels-pg-1 | 2023-12-12 18:34:31.301 UTC [1] LOG: listening on IPv6 address "::", port 5432
pixels-pg-1 | 2023-12-12 18:34:31.486 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
pixels-pg-1 | 2023-12-12 18:34:31.714 UTC [27] LOG: database system was shut down at 2023-12-12 18:34:18 UTC
pixels-pg-1 | 2023-12-12 18:34:31.867 UTC [1] LOG: database system is ready to accept connections
pixels-code-1 | INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
pixels-code-1 | INFO [alembic.runtime.migration] Will assume transactional DDL.
pixels-code-1 | INFO [alembic.runtime.migration] Running upgrade -> d1f389de1cc3, 'Init'
pixels-code-1 | INFO [alembic.runtime.migration] Running upgrade d1f389de1cc3 -> 16cee3a17066, BanList
pixels-code-1 | INFO: Started server process [9]
pixels-code-1 | INFO: Waiting for application startup.
pixels-code-1 | INFO: Application startup complete.
pixels-code-1 | INFO: Uvicorn running on http://0.0.0.0:9000 (Press CTRL+C to quit)
pixels-code-1 | INFO: 127.0.0.1:35428 - "GET /api/healthchecker HTTP/1.1" 200 OK
pixels-code-1 | INFO: 127.0.0.1:35586 - "GET /api/healthchecker HTTP/1.1" 200 OK
pixels-code-1 | INFO: 127.0.0.1:34896 - "GET /api/healthchecker HTTP/1.1" 200 OK
pixels-code-1 | INFO: 172.30.0.1:58140 - "GET / HTTP/1.1" 200 OK
pixels-code-1 | INFO: 172.30.0.1:58140 - "GET /docs/ HTTP/1.1" 307 Temporary Redirect
pixels-code-1 | INFO: 172.30.0.1:58140 - "GET /docs HTTP/1.1" 200 OK
pixels-code-1 | INFO: 172.30.0.1:58140 - "GET /openapi.json HTTP/1.1" 200 OK
pixels-code-1 | INFO: 172.30.0.1:58140 - "GET /favicon.ico HTTP/1.1" 404 Not Found
pixels-code-1 | INFO: 172.30.0.1:58140 - "POST /api/auth/login HTTP/1.1" 401 Unauthorized
pixels-code-1 | INFO: 172.30.0.1:58140 - "GET /client/index.html?error=login HTTP/1.1" 200 OK
pixels-code-1 | INFO: 172.30.0.1:58140 - "GET / HTTP/1.1" 200 OK
pixels-code-1 | INFO: 127.0.0.1:58194 - "GET /api/healthchecker HTTP/1.1" 200 OK
pixels-code-1 | INFO: 172.30.0.1:58140 - "GET /docs/ HTTP/1.1" 307 Temporary Redirect
pixels-code-1 | INFO: 172.30.0.1:58140 - "GET /docs HTTP/1.1" 200 OK
pixels-code-1 | INFO: 172.30.0.1:58140 - "GET /openapi.json HTTP/1.1" 200 OK
pixels-code-1 | INFO: 127.0.0.1:53348 - "GET /api/healthchecker HTTP/1.1" 200 OK
pixels-code-1 | INFO: 127.0.0.1:34928 - "GET /api/healthchecker HTTP/1.1" 200 OK
pixels-code-1 | INFO: 127.0.0.1:60840 - "GET /api/healthchecker HTTP/1.1" 200 OK
pixels-code-1 | INFO: 127.0.0.1:55090 - "GET /api/healthchecker HTTP/1.1" 200 OK
pixels-code-1 | INFO: 127.0.0.1:35110 - "GET /api/healthchecker HTTP/1.1" 200 OK
pixels-code-1 | INFO: 127.0.0.1:41156 - "GET /api/healthchecker HTTP/1.1" 200 OK
Gracefully stopping... (pr ... ...
近期下载者:
相关文件:
收藏者: