Spaces:
Runtime error
Runtime error
macrdel
commited on
Commit
·
92678a7
1
Parent(s):
023f2e5
add nginx grafana workflows
Browse files- .github/deploy.yml +44 -0
- Dockerfile +2 -2
- app/api.py +6 -0
- config/nginx.conf +11 -0
- docker-compose-ci.yml +50 -0
- prometheus.yml +7 -0
- requirements.txt +0 -0
- tests/test_main.py +13 -0
.github/deploy.yml
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: Deploy to Hugging Face Spaces
|
| 2 |
+
|
| 3 |
+
on:
|
| 4 |
+
push:
|
| 5 |
+
branches:
|
| 6 |
+
- main
|
| 7 |
+
|
| 8 |
+
jobs:
|
| 9 |
+
test-and-deploy:
|
| 10 |
+
runs-on: ubuntu-latest
|
| 11 |
+
|
| 12 |
+
steps:
|
| 13 |
+
- name: Checkout code
|
| 14 |
+
uses: actions/checkout@v2
|
| 15 |
+
|
| 16 |
+
- name: Set up Docker Buildx
|
| 17 |
+
uses: docker/setup-buildx-action@v1
|
| 18 |
+
|
| 19 |
+
- name: Login to DockerHub
|
| 20 |
+
uses: docker/login-action@v1
|
| 21 |
+
with:
|
| 22 |
+
username: ${{ secrets.DOCKER_USERNAME }}
|
| 23 |
+
password: ${{ secrets.DOCKER_PASSWORD }}
|
| 24 |
+
|
| 25 |
+
- name: Run tests
|
| 26 |
+
run: |
|
| 27 |
+
docker build --target test -t macrdel/sentiment-summarize-youtube-comments-backend:latest .
|
| 28 |
+
docker run --rm macrdel/sentiment-summarize-youtube-comments-backend:latest pytest /tests
|
| 29 |
+
|
| 30 |
+
- name: Build Docker image
|
| 31 |
+
if: success()
|
| 32 |
+
run: docker build -t macrdel/sentiment-summarize-youtube-comments-backend:latest .
|
| 33 |
+
|
| 34 |
+
- name: Push Docker image
|
| 35 |
+
if: success()
|
| 36 |
+
run: docker push macrdel/sentiment-summarize-youtube-comments-backend:latest
|
| 37 |
+
|
| 38 |
+
- name: Deploy to Hugging Face Spaces
|
| 39 |
+
if: success()
|
| 40 |
+
env:
|
| 41 |
+
HF_TOKEN: ${{ secrets.HF_TOKEN }}
|
| 42 |
+
HF_USER: ${{ secrets.HF_USER }}
|
| 43 |
+
run: git push --force https://$HF_USER:[email protected]/spaces/$HF_USER/sentiment-summarize-youtube-comms main
|
| 44 |
+
|
Dockerfile
CHANGED
|
@@ -4,7 +4,7 @@ WORKDIR /code
|
|
| 4 |
|
| 5 |
COPY ./requirements.txt /code/requirements.txt
|
| 6 |
|
| 7 |
-
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
|
| 8 |
|
| 9 |
RUN useradd -m -u 1000 user
|
| 10 |
USER user
|
|
@@ -15,4 +15,4 @@ WORKDIR $HOME/app
|
|
| 15 |
|
| 16 |
COPY --chown=user . $HOME/app
|
| 17 |
|
| 18 |
-
CMD ["
|
|
|
|
| 4 |
|
| 5 |
COPY ./requirements.txt /code/requirements.txt
|
| 6 |
|
| 7 |
+
RUN apt-get update && apt-get install -y nginx && apt-get clean && pip install --no-cache-dir --upgrade -r /code/requirements.txt
|
| 8 |
|
| 9 |
RUN useradd -m -u 1000 user
|
| 10 |
USER user
|
|
|
|
| 15 |
|
| 16 |
COPY --chown=user . $HOME/app
|
| 17 |
|
| 18 |
+
CMD ["sh", "-c", "service nginx start && uvicorn app.main:app --host 0.0.0.0 --port 8000"]
|
app/api.py
CHANGED
|
@@ -5,6 +5,7 @@ from fastapi import FastAPI
|
|
| 5 |
from pydantic import BaseModel
|
| 6 |
# from transformers import pipeline
|
| 7 |
# import uvicorn
|
|
|
|
| 8 |
import pandas as pd
|
| 9 |
import os
|
| 10 |
|
|
@@ -15,6 +16,7 @@ SENT_API_URL = f"https://api-inference.huggingface.co/models/{config.sentiment_m
|
|
| 15 |
SUM_API_URL = f"https://api-inference.huggingface.co/models/{config.sum_model}"
|
| 16 |
|
| 17 |
app = FastAPI()
|
|
|
|
| 18 |
|
| 19 |
class YouTubeUrl(BaseModel):
|
| 20 |
url_video: str
|
|
@@ -40,6 +42,10 @@ def get_summarize():
|
|
| 40 |
if f"{config.NAME_DATA}" in os.listdir(f"{config.PATH_DATA}"):
|
| 41 |
data = pd.read_csv(f"{config.DATA_FILE}")
|
| 42 |
return pipeline_summarize(data['text_comment'], headers, SUM_API_URL)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
|
| 44 |
|
| 45 |
#if __name__ == '__main__':
|
|
|
|
| 5 |
from pydantic import BaseModel
|
| 6 |
# from transformers import pipeline
|
| 7 |
# import uvicorn
|
| 8 |
+
from prometheus_client import start_http_server, Summary
|
| 9 |
import pandas as pd
|
| 10 |
import os
|
| 11 |
|
|
|
|
| 16 |
SUM_API_URL = f"https://api-inference.huggingface.co/models/{config.sum_model}"
|
| 17 |
|
| 18 |
app = FastAPI()
|
| 19 |
+
REQUEST_TIME = Summary('request_processing_seconds', 'Time spent processing request')
|
| 20 |
|
| 21 |
class YouTubeUrl(BaseModel):
|
| 22 |
url_video: str
|
|
|
|
| 42 |
if f"{config.NAME_DATA}" in os.listdir(f"{config.PATH_DATA}"):
|
| 43 |
data = pd.read_csv(f"{config.DATA_FILE}")
|
| 44 |
return pipeline_summarize(data['text_comment'], headers, SUM_API_URL)
|
| 45 |
+
|
| 46 |
+
@app.lifespan("startup")
|
| 47 |
+
def startup_event():
|
| 48 |
+
start_http_server(8000)
|
| 49 |
|
| 50 |
|
| 51 |
#if __name__ == '__main__':
|
config/nginx.conf
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
upstream backend {
|
| 2 |
+
server app:8000;
|
| 3 |
+
}
|
| 4 |
+
|
| 5 |
+
server {
|
| 6 |
+
listen 80;
|
| 7 |
+
|
| 8 |
+
location / {
|
| 9 |
+
proxy_pass http://backend;
|
| 10 |
+
}
|
| 11 |
+
}
|
docker-compose-ci.yml
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version: '3.7'
|
| 2 |
+
|
| 3 |
+
services:
|
| 4 |
+
app:
|
| 5 |
+
build: .
|
| 6 |
+
container_name: sentiment-summarize-youtube-comments
|
| 7 |
+
ports:
|
| 8 |
+
- "8000:8000"
|
| 9 |
+
depends_on:
|
| 10 |
+
- prometheus
|
| 11 |
+
networks:
|
| 12 |
+
- custom
|
| 13 |
+
|
| 14 |
+
nginx:
|
| 15 |
+
image: nginx:latest
|
| 16 |
+
container_name: nginx
|
| 17 |
+
ports:
|
| 18 |
+
- "80:80"
|
| 19 |
+
volumes:
|
| 20 |
+
- ./config/nginx.conf:/etc/nginx/nginx.conf:ro
|
| 21 |
+
depends_on:
|
| 22 |
+
- app
|
| 23 |
+
networks:
|
| 24 |
+
- custom
|
| 25 |
+
|
| 26 |
+
prometheus:
|
| 27 |
+
image: prom/prometheus
|
| 28 |
+
container_name: prometheus
|
| 29 |
+
volumes:
|
| 30 |
+
- ./prometheus.yml:/etc/prometheus/prometheus.yml
|
| 31 |
+
ports:
|
| 32 |
+
- "9090:9090"
|
| 33 |
+
networks:
|
| 34 |
+
- custom
|
| 35 |
+
|
| 36 |
+
grafana:
|
| 37 |
+
image: grafana/grafana
|
| 38 |
+
container_name: grafana
|
| 39 |
+
ports:
|
| 40 |
+
- "3000:3000"
|
| 41 |
+
environment:
|
| 42 |
+
- GF_SECURITY_ADMIN_PASSWORD=admin
|
| 43 |
+
depends_on:
|
| 44 |
+
- prometheus
|
| 45 |
+
networks:
|
| 46 |
+
- custom
|
| 47 |
+
|
| 48 |
+
networks:
|
| 49 |
+
custom:
|
| 50 |
+
driver: bridge
|
prometheus.yml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
global:
|
| 2 |
+
scrape_interval: 15s
|
| 3 |
+
|
| 4 |
+
scrape_configs:
|
| 5 |
+
- job_name: 'sentiment-summarize-youtube-comments'
|
| 6 |
+
static_configs:
|
| 7 |
+
- targets: ['app:8000']
|
requirements.txt
CHANGED
|
Binary files a/requirements.txt and b/requirements.txt differ
|
|
|
tests/test_main.py
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from fastapi.testclient import TestClient
|
| 2 |
+
from app.api import app
|
| 3 |
+
|
| 4 |
+
client = TestClient(app)
|
| 5 |
+
|
| 6 |
+
def test_read_root():
|
| 7 |
+
response = client.get("/")
|
| 8 |
+
assert response.status_code == 200
|
| 9 |
+
assert response.json() == {'message': 'FastAPI+HuggingFace app sentiment + summarize YouTube comments'}
|
| 10 |
+
|
| 11 |
+
#def test_get_comments():
|
| 12 |
+
# response = client.post("/comments", json={"url_video" : "https://www.youtube.com/watch?v=ITEfXK2J3Gw"})
|
| 13 |
+
# assert response.status_code == 200
|