From 4b8d075bfeb94271647c1d39f588a4399f9004fe Mon Sep 17 00:00:00 2001 From: Ske087 Date: Wed, 22 Jan 2025 16:33:00 +0200 Subject: [PATCH] image created --- Dockerfile | 50 ++++++++++++++++++++++++++++++++ __pycache__/app.cpython-311.pyc | Bin 19538 -> 29670 bytes app.py | 13 +++++++-- clear_db.py | 10 +++++++ docker-compose.yml | 16 ++++++++++ init_db.py | 20 +++++++++++++ instance/dashboard.db | Bin 49152 -> 49152 bytes requirements.txt | 4 ++- templates/dashboard.html | 5 ++++ 9 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 Dockerfile create mode 100644 clear_db.py create mode 100644 docker-compose.yml create mode 100644 init_db.py diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..050df56 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,50 @@ +# Use the official Python image from the Docker Hub +FROM python:3.11-slim AS build + +# Set the working directory in the container +WORKDIR /app + +# Install build tools and libraries +RUN apt-get update && apt-get install -y \ + build-essential \ + libffi-dev \ + libssl-dev \ + python3-dev \ + cargo \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# Install Rust +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y +ENV PATH="/root/.cargo/bin:${PATH}" + +# Copy the current directory contents into the container at /app +COPY . /app + +# Install any needed packages specified in requirements.txt +RUN pip install --no-cache-dir -r requirements.txt + +# Stage 2: Runtime stage +FROM python:3.11-slim + +# Set the working directory in the container +WORKDIR /app + +# Copy only the necessary files from the build stage +COPY --from=build /app /app +COPY --from=build /root/.cargo /root/.cargo + +# Install runtime dependencies +RUN apt-get update && apt-get install -y \ + libffi-dev \ + libssl-dev \ + && rm -rf /var/lib/apt/lists/* + +# Install Gunicorn +RUN pip install gunicorn + +# Make port 5000 available to the world outside this container +EXPOSE 5000 + +# Run the clear_db script, then the initialization script, and then Gunicorn +CMD ["sh", "-c", "python clear_db.py && python init_db.py && gunicorn -w 4 -b 0.0.0.0:5000 app:app"] \ No newline at end of file diff --git a/__pycache__/app.cpython-311.pyc b/__pycache__/app.cpython-311.pyc index 0c17199fc7c9a008d6538be2fa59b43718800ba1..035afd5e9180104df2e9523b5f4f9141cde55cf4 100644 GIT binary patch literal 29670 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 diff --git a/app.py b/app.py index 7c64a35..f57292e 100644 --- a/app.py +++ b/app.py @@ -9,8 +9,8 @@ from flask_migrate import Migrate app = Flask(__name__) -# Set the secret key to a fixed value -app.config['SECRET_KEY'] = 'Ana_Are_Multe_Mere-Si_Nu_Are_Pere' +# Set the secret key from environment variable or use a default value +app.config['SECRET_KEY'] = os.getenv('SECRET_KEY', 'Ana_Are_Multe_Mere-Si_Nu_Are_Pere') # Configurare baza de date SQLite app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///dashboard.db' @@ -239,6 +239,15 @@ def delete_group_content(content_id): db.session.commit() return redirect(url_for('manage_group', group_id=group_id)) +@app.route('/group//delete', methods=['POST']) +@login_required +@admin_required +def delete_group(group_id): + group = Group.query.get_or_404(group_id) + db.session.delete(group) + db.session.commit() + return redirect(url_for('dashboard')) + @app.route('/player/') @login_required def player_page(player_id): diff --git a/clear_db.py b/clear_db.py new file mode 100644 index 0000000..6988a70 --- /dev/null +++ b/clear_db.py @@ -0,0 +1,10 @@ +from app import app, db + +def clear_database(): + with app.app_context(): + db.drop_all() + db.create_all() + print("Database cleared and structure recreated.") + +if __name__ == '__main__': + clear_database() \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..a95f6d5 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3.8' + +services: + web: + image: digi_signage_server_app:latest + ports: + - "7100:5000" + environment: + - FLASK_APP=app.py + - FLASK_RUN_HOST=0.0.0.0 + - ADMIN_USER=admin + - ADMIN_PASSWORD=Matei + - SECRET_KEY=Ma_Duc_Dupa_Merele_Lui_Ana + volumes: + - .:/app + command: sh -c "python clear_db.py && python init_db.py && gunicorn -w 4 -b 0.0.0.0:5000 app:app" \ No newline at end of file diff --git a/init_db.py b/init_db.py new file mode 100644 index 0000000..d05e9e9 --- /dev/null +++ b/init_db.py @@ -0,0 +1,20 @@ +import os +from app import app, db, User, bcrypt + +def create_admin_user(): + admin_username = os.getenv('ADMIN_USER', 'admin') + admin_password = os.getenv('ADMIN_PASSWORD', 'admin') + hashed_password = bcrypt.generate_password_hash(admin_password).decode('utf-8') + + if not User.query.filter_by(username=admin_username).first(): + admin_user = User(username=admin_username, password=hashed_password, role='admin') + db.session.add(admin_user) + db.session.commit() + print(f"Admin user '{admin_username}' created with password '{admin_password}'") + else: + print(f"Admin user '{admin_username}' already exists") + +if __name__ == '__main__': + with app.app_context(): + db.create_all() + create_admin_user() \ No newline at end of file diff --git a/instance/dashboard.db b/instance/dashboard.db index 9c5bd0d49e7527b04dd6a6b0859f5dbc3e1cc93f..f79e5f32cd4f31144f1dc38da42f55a25d48b0d8 100644 GIT binary patch delta 528 zcmZo@U~Xt&o**sg%D}+D1H?=~%m~D?6LpLgT^aO}8F{(c8Mrt;F>uLno#1ETKhNjE zcac|&`!vsGj!zpKGB|j-e>0i@bpSz=y3pi*+)|7@nmK#;sNF+ zR)NVHylRXbll^(`GYU@D=d&>5_ z%*M7Uu*@@B$?m1b~9S_}M^;pzKKsEKHb8 PR26KS*(UsxhbaR9z&(9g delta 1019 zcmZ{j-EPxJ6vt=m_$yy05$d|A?KVJ3K_Vdz&?XW{gc3-$Ep0;rq)13k<0eBJC+pZn z$xV}p2Y~fHz~1fkQm%La#05fPA7B>*7u8Bop|V0^Z+7ekBrdo(Gtz&4=YP)3v3otX z*JB@yg`)@|KMjTkrXf8%b>>JE#n*5E#*tUtMZtRTL*RHY=KIel`2O^cd!LEBfAs32 zGEjVieE2ZFf5B8Mn_6pA?P$iq>YpoQGsSGAn7Oo&jT}7?kJ>RfZ}$Vw>qB)`-Lxx zIs0GV-yFxwi_`WC@2I^O-yx-y`8i$fDy7AR?9#QwT(hg!^BJwXs+X-wXTEej zJ(r%jSz6C#tcLT^EYNz?OjfH6q7Ti8GLt3R(wTT--C8YOD|K!Z(pyVSwS70Eo}E9j zk-l}coX=kE*6Ztqg8B36)@)5*Ca!}sRtB8O!zVhH*KkN;W$bp!h^#ER(4z;Qh{(Wg z1W(~Mz0(qG6IMhMvFSdCt`MVbMv6C#7Kv3!jkHNkS8G~QNhjmVOe&s;E3>I#qq%#t zxo+~(%_Stl!n<&;{^H_s)^vn0g`Xfif^ d47D}-J5(d)meGoSw^k~h*NI6~bu*zH`5zbt5q$sv diff --git a/requirements.txt b/requirements.txt index d11fd33..87f0dab 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ bcrypt==4.2.1 blinker==1.9.0 click==8.1.8 Flask==3.1.0 -Flask-Bcrypt==1.0.1 + Flask-Login==0.6.3 Flask-Migrate==4.1.0 Flask-SQLAlchemy==3.1.1 @@ -15,3 +15,5 @@ MarkupSafe==3.0.2 SQLAlchemy==2.0.37 typing_extensions==4.12.2 Werkzeug==3.1.3 +gunicorn==20.1.0 +Flask-Bcrypt==1.0.1 \ No newline at end of file diff --git a/templates/dashboard.html b/templates/dashboard.html index 03bc970..e86e88f 100644 --- a/templates/dashboard.html +++ b/templates/dashboard.html @@ -81,6 +81,11 @@
Manage Group Full Screen + {% if current_user.role == 'admin' %} +
+ +
+ {% endif %}
{% endfor %}