From 71815a65330eb4f7109c23a1bd801c6efa486318 Mon Sep 17 00:00:00 2001 From: ImAlpha Date: Thu, 8 Aug 2024 10:00:24 -0700 Subject: [PATCH] added backend folder and began flask, update gitignore --- backend/.gitignore | 1 + backend/Dockerfile | 18 ++++++++++++++++++ backend/config.py | 29 +++++++++++++++++++++++++++++ backend/main.py | 21 +++++++++++++++++++++ backend/requirements.txt | 7 +++++++ backend/templates/index.html | 32 ++++++++++++++++++++++++++++++++ frontend/Dockerfile | 18 ++++++++++++++++++ frontend/bun.lockb | Bin 149032 -> 159440 bytes frontend/package.json | 1 + frontend/tsconfig.json | 2 +- 10 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 backend/.gitignore create mode 100644 backend/Dockerfile create mode 100644 backend/config.py create mode 100644 backend/main.py create mode 100644 backend/requirements.txt create mode 100644 backend/templates/index.html create mode 100644 frontend/Dockerfile diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..6df097b --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1 @@ +/ven \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..6bd73d4 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,18 @@ +FROM python:3.12-alpine3.20 + +WORKDIR /app + +ENV FLASK_APP=main.py + +# Change app to development server +# ENV FLASK_APP=main.py + +COPY ./requirements.txt . + +RUN pip install -r ./requirements.txt + +COPY . . + +EXPOSE 5080 + +CMD ["python", "main.py"] diff --git a/backend/config.py b/backend/config.py new file mode 100644 index 0000000..aaf4a7d --- /dev/null +++ b/backend/config.py @@ -0,0 +1,29 @@ +from flask import Flask, jsonify +from flask_sqlalchemy import SQLAlchemy +from flask_cors import CORS +from dotenv import load_dotenv +import os +from flask_bcrypt import Bcrypt +import redis +from flask_session import Session + +app = Flask(__name__) +CORS(app, supports_credentials=True) +load_dotenv() +bcrypt = Bcrypt(app) + + +app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///mydatabase.db" +app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False +app.config["SQLALCHEMY_ECHO"] = True +app.config["SECRET_KEY"] = os.environ["SECRET_KEY"] +app.config["SESSION_TYPE"] = 'redis' +app.config["SESSION_PERMANENT"] = False +app.config["SESSION_USE_SIGNER"] = True +app.config["SESSION_REDIS"] = redis.from_url("redis://192.168.50.107:6379") +# app.config["REDIS_PASSWORD"] = os.environ["REDIS_PASSWORD"] + +db = SQLAlchemy(app) + +server_session = Session(app) +# 22:16 \ No newline at end of file diff --git a/backend/main.py b/backend/main.py new file mode 100644 index 0000000..73c4320 --- /dev/null +++ b/backend/main.py @@ -0,0 +1,21 @@ +from flask import Flask, render_template, request + + +@app.route('/') +def index(): + return render_template('index.html') + +@app.route('/api/upload', methods=['POST']) +def upload(): + file = request.files['file'] + + # save the file + file.save(f'uploads/{file.filename}') + +# Main +if __name__ == "__main__": + # Initialize database connection + with app.app_context(): + db.create_all() + + app.run(debug=True, port=5080) \ No newline at end of file diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..ed950a5 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,7 @@ +flask +flask-sqlalchemy +flask-bcrypt +flask-cors +python-dotenv +flask-session +redis \ No newline at end of file diff --git a/backend/templates/index.html b/backend/templates/index.html new file mode 100644 index 0000000..9e73d78 --- /dev/null +++ b/backend/templates/index.html @@ -0,0 +1,32 @@ + + + + + + + File Uploads + + + +
+ +
+
+ + + +
+ + + +
+ +
+ + + +
+ +
+ + \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..638706f --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,18 @@ +FROM node:20 + +WORKDIR /user/src/app + +COPY ./package.json ./ +COPY ./bun.lockb ./ + +RUN npm install -g bun +RUN bun install + +COPY . . + +# EXPOSE 3000 +EXPOSE 3003 + +RUN bun run build +# CMD ["bun", "dev", "--host"] +CMD ["bun", "run", "start", "--host", "0.0.0.0"] \ No newline at end of file diff --git a/frontend/bun.lockb b/frontend/bun.lockb index 08edcbac03bc0b7334ec67f9aba17b14c90cd918..8f7e3834f2ca07695cdab927ca7e10ce2ee48fe9 100755 GIT binary patch delta 30068 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 CZQ|Sj diff --git a/frontend/package.json b/frontend/package.json index 74fbc89..409d054 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -15,6 +15,7 @@ "next": "14.1.4", "react": "^18", "react-dom": "^18", + "sharp": "^0.33.4", "tailwind-merge": "^2.2.2", "tailwindcss-animate": "^1.0.7" }, diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index c23c824..deb52d6 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -18,7 +18,7 @@ } ], "paths": { - "@/*": ["frontend/src/*"] + "@/*": ["./frontend/src/*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],