Lìu Văn Quyết 5 months ago
parent b102d47639
commit d52744d921
  1. 2
      .env
  2. 23
      app.py
  3. 16
      data/services.json
  4. 180
      output.log
  5. 78
      static/style.css
  6. 11
      templates/index.html

@ -0,0 +1,2 @@
SECRET_KEY=your_super_secret_key
NGINX_PROJECT_PATH=/projects/nginx

@ -4,9 +4,13 @@ import os
import time
from flask import Flask, render_template, request, Response, jsonify, redirect, url_for, session
from datetime import timedelta
from dotenv import load_dotenv
# Load biến môi trường từ file .env
load_dotenv()
app = Flask(__name__)
app.secret_key = "your_secret_key"
app.secret_key = os.getenv("SECRET_KEY", "default_secret_key") # Lấy từ .env hoặc đặt giá trị mặc định
app.permanent_session_lifetime = timedelta(days=1)
# Danh sách tài khoản & mật khẩu
@ -30,7 +34,7 @@ def home():
if "user" not in session:
return redirect(url_for("login"))
listService = load_services()
listService = [s for s in load_services() if s.get("status", "active") == "active"]
return render_template("index.html", listService=listService)
@app.route("/login", methods=["GET", "POST"])
@ -71,20 +75,17 @@ def run_shell_command(command_str):
if process.returncode == 0:
yield f"data: SUCCESS\n\n"
else:
yield f"data: []\n\n"
yield f"data: ERROR\n\n"
def generate_output(command_list):
"""Chạy command từ JSON, sau đó restart Nginx"""
# Chuyển danh sách command thành chuỗi
command_str = " ".join(command_list)
yield from run_shell_command(command_str)
yield from run_shell_command(command_str) # Chạy command chính
# Sau khi chạy command xong, restart Nginx
nginx_command = "cd /projects/nginx && docker compose down && docker compose up -d"
nginx_project_path = os.getenv("NGINX_PROJECT_PATH", "/projects/nginx")
nginx_command = f"cd {nginx_project_path} && docker compose down && docker compose up -d"
yield f"data: === Restarting Nginx ===\n\n"
yield from run_shell_command(nginx_command) # Chạy lệnh restart Nginx
yield from run_shell_command(nginx_command)
@app.route("/run-command", methods=["GET"])
def run_command():
@ -92,7 +93,7 @@ def run_command():
if "user" not in session:
return jsonify({"error": "Unauthorized"}), 401
command_list = request.args.getlist("command[]") # Nhận danh sách lệnh từ frontend
command_list = request.args.getlist("command[]")
if not command_list:
return jsonify({"error": "No command provided"}), 400

@ -3,24 +3,32 @@
"name": "Service",
"url": "http://service.sundayenglish.com",
"description": "Sunday English Service",
"command": ["cd", "/projects/service-se", "&&", "docker", "compose", "down", "&&", "docker", "compose", "up", "-d"]
"command": ["cd", "/projects/service-se", "&&", "docker", "compose", "down", "&&", "docker", "compose", "up", "-d"],
"active": true,
"status": "active"
},
{
"name": "Exercise",
"url": "http://exercise.sundayenglish.com",
"description": "Sunday English Exercise",
"command": ["cd", "/projects/exercise-se", "&&", "docker", "compose", "down", "&&", "docker", "compose", "up", "-d"]
"command": ["cd", "/projects/exercise-se", "&&", "docker", "compose", "down", "&&", "docker", "compose", "up", "-d"],
"active": true,
"status": "active"
},
{
"name": "Oauth",
"url": "https://oauth2.sundayenglish.com",
"description": "Oauth",
"command": ["cd", "/projects/gk_oauth", "&&", "docker", "compose", "down", "&&", "docker", "compose", "up", "-d"]
"command": ["cd", "/projects/gk_oauth", "&&", "docker", "compose", "down", "&&", "docker", "compose", "up", "-d"],
"active": true,
"status": "active"
},
{
"name": "Julius",
"url": null,
"description": "Julius",
"command": ["cd", "/projects/julius", "&&", "docker", "compose", "down", "&&", "docker", "compose", "up", "-d"]
"command": ["cd", "/projects/julius", "&&", "docker", "compose", "down", "&&", "docker", "compose", "up", "-d"],
"active": false,
"status": "inactive"
}
]

@ -9,21 +9,165 @@ Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 112-654-638
14.231.189.200 - - [19/Feb/2025 17:03:40] "GET / HTTP/1.1" 200 -
14.231.189.200 - - [19/Feb/2025 17:03:40] "GET /static/style.css HTTP/1.1" 304 -
14.231.189.200 - - [19/Feb/2025 17:03:41] "GET /static/script.js HTTP/1.1" 304 -
14.231.189.200 - - [19/Feb/2025 17:03:41] "GET / HTTP/1.1" 200 -
14.231.189.200 - - [19/Feb/2025 17:03:41] "GET /static/style.css HTTP/1.1" 304 -
14.231.189.200 - - [19/Feb/2025 17:03:41] "GET /static/script.js HTTP/1.1" 304 -
14.231.189.200 - - [19/Feb/2025 17:03:42] "GET / HTTP/1.1" 200 -
14.231.189.200 - - [19/Feb/2025 17:03:42] "GET /static/style.css HTTP/1.1" 304 -
14.231.189.200 - - [19/Feb/2025 17:03:42] "GET / HTTP/1.1" 200 -
14.231.189.200 - - [19/Feb/2025 17:03:42] "GET /static/script.js HTTP/1.1" 304 -
14.231.189.200 - - [19/Feb/2025 17:03:42] "GET /static/style.css HTTP/1.1" 304 -
14.231.189.200 - - [19/Feb/2025 17:03:42] "GET /static/script.js HTTP/1.1" 200 -
14.231.189.200 - - [19/Feb/2025 17:03:42] "GET / HTTP/1.1" 200 -
14.231.189.200 - - [19/Feb/2025 17:03:42] "GET /static/style.css HTTP/1.1" 304 -
14.231.189.200 - - [19/Feb/2025 17:03:42] "GET /static/script.js HTTP/1.1" 304 -
14.231.189.200 - - [19/Feb/2025 17:03:42] "GET / HTTP/1.1" 200 -
14.231.189.200 - - [19/Feb/2025 17:03:42] "GET /static/style.css HTTP/1.1" 304 -
14.231.189.200 - - [19/Feb/2025 17:03:42] "GET /static/script.js HTTP/1.1" 304 -
172.18.0.25 - - [20/Feb/2025 08:20:57] "GET / HTTP/1.0" 302 -
172.18.0.25 - - [20/Feb/2025 08:20:58] "GET /login HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:20:58] "GET /favicon.ico HTTP/1.0" 404 -
172.18.0.25 - - [20/Feb/2025 08:20:58] "GET /login HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:21:01] "POST /login HTTP/1.0" 302 -
172.18.0.25 - - [20/Feb/2025 08:21:01] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:21:01] "GET /static/script.js HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:21:01] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:21:04] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:21:04] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:21:04] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:21:05] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:21:05] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:21:05] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:21:05] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:21:05] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:21:05] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:21:05] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:21:05] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:21:05] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:21:05] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:21:05] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:21:05] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:21:05] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:21:05] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:21:05] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:21:05] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:21:06] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:21:06] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:21:06] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:21:14] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:21:19] "GET /run-command?command[]=cd&command[]=/projects/service-se&command[]=%26%26&command[]=docker&command[]=compose&command[]=down&command[]=%26%26&command[]=docker&command[]=compose&command[]=up&command[]=-d HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:23:06] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:23:08] "GET /static/style.css HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:23:09] "GET /static/script.js HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:23:26] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:23:26] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:23:26] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:24:02] "GET / HTTP/1.0" 302 -
172.18.0.25 - - [20/Feb/2025 08:24:02] "GET /login HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:24:02] "GET /favicon.ico HTTP/1.0" 404 -
172.18.0.25 - - [20/Feb/2025 08:24:10] "POST /login HTTP/1.0" 302 -
172.18.0.25 - - [20/Feb/2025 08:24:10] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:24:10] "GET /static/script.js HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:24:10] "GET /static/style.css HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:53] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:53] "GET /static/style.css HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:53] "GET /static/script.js HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:53] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:53] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:53] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:54] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:54] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:54] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:54] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:54] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:54] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:54] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:54] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:54] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:54] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:54] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:54] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:54] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:54] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:54] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:55] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:55] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:55] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:55] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:55] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:55] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:55] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:55] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:55] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:55] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:55] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:55] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:55] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:55] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:55] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:56] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:56] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:56] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:56] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:56] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:56] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:58] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:58] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:58] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:58] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:58] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:58] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:58] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:58] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:58] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:58] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:58] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:58] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:59] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:59] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:59] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:59] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:26:59] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:26:59] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:27:00] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:27:00] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:27:00] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:27:01] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:27:01] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:27:01] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:27:33] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:27:33] "GET /static/style.css HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:27:33] "GET /static/script.js HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:27:34] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:27:34] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:27:34] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:27:34] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:27:34] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:27:34] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:27:34] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:27:34] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:27:34] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:27:34] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:27:35] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:27:35] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:27:35] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:27:35] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:27:35] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:27:53] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:27:54] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:27:54] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:28:01] "GET /run-command?command[]=cd&command[]=/projects/service-se&command[]=%26%26&command[]=docker&command[]=compose&command[]=down&command[]=%26%26&command[]=docker&command[]=compose&command[]=up&command[]=-d HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:28:20] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:28:26] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:28:28] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:28:28] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:28:55] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:28:57] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:28:57] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:29:01] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:29:03] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:29:03] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:29:08] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:29:10] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:29:10] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:29:20] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:29:22] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:29:22] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:29:32] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:29:32] "GET /static/style.css HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:29:32] "GET /static/script.js HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:30:09] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:30:11] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:30:11] "GET /static/script.js HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:30:14] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:30:14] "GET /static/style.css HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:30:14] "GET /static/script.js HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:30:27] "GET /run-command?command[]=cd&command[]=/projects/service-se&command[]=%26%26&command[]=docker&command[]=compose&command[]=down&command[]=%26%26&command[]=docker&command[]=compose&command[]=up&command[]=-d HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:31:02] "GET / HTTP/1.0" 200 -
172.18.0.25 - - [20/Feb/2025 08:31:04] "GET /static/style.css HTTP/1.0" 304 -
172.18.0.25 - - [20/Feb/2025 08:31:04] "GET /static/script.js HTTP/1.0" 304 -

@ -1,60 +1,100 @@
/* Nền Gradient Đẹp & Hài Hòa */
/* 🌟 Nền Gradient Đẹp & Hài Hòa */
body {
background: linear-gradient(135deg, #1E2A38, #4C6EF5); /* Xanh đậm sang xanh dương */
background: linear-gradient(135deg, #1E2A38, #4C6EF5);
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: white;
font-family: 'Arial', sans-serif;
margin: 0;
}
/* Tăng độ mờ của container */
/* 🪟 Hiệu ứng kính mờ đẹp mắt */
.container {
background: rgba(255, 255, 255, 0.1); /* Màu trắng nhẹ */
backdrop-filter: blur(15px); /* Hiệu ứng kính mờ */
background: rgba(255, 255, 255, 0.15);
backdrop-filter: blur(20px);
border-radius: 12px;
padding: 20px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
padding: 25px;
box-shadow: 0 6px 25px rgba(0, 0, 0, 0.4);
max-width: 95%;
width: 900px;
transition: all 0.3s ease-in-out;
}
.container:hover {
transform: translateY(-3px);
}
/* Bảng hiển thị đẹp hơn với chữ màu đen */
/* 📋 Bảng hiển thị với màu sắc rõ ràng */
table {
background: rgba(255, 255, 255, 0.9); /* Nền trắng rõ ràng */
background: rgba(255, 255, 255, 0.95);
border-radius: 8px;
overflow: hidden;
color: #000; /* Đặt màu chữ đen */
color: #000;
width: 100%;
border-collapse: collapse;
}
/* 🌟 Header bảng */
th {
background: rgba(0, 0, 0, 0.8); /* Header màu đen đậm */
color: #ffffff; /* Chữ trắng để nổi bật trên nền đen */
background: #222;
color: white;
padding: 12px;
font-weight: bold;
text-transform: uppercase;
}
/* ✏ Hàng trong bảng */
td {
color: #000; /* Màu chữ đen */
color: #000;
padding: 10px;
text-align: center;
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
}
/* Khi hover vào hàng trong bảng */
/* 🖱 Hiệu ứng hover khi rê chuột vào hàng */
tbody tr:hover {
background: rgba(0, 0, 0, 0.1); /* Nhấn mạnh dòng khi rê chuột */
background: rgba(0, 0, 0, 0.1);
transition: all 0.2s ease-in-out;
}
/* Tăng độ nổi bật khi hover */
/* 🔘 Nút chạy lệnh */
.run-btn {
transition: all 0.3s ease-in-out;
padding: 8px 12px;
border: none;
border-radius: 6px;
background: #4CAF50;
color: white;
font-weight: bold;
cursor: pointer;
}
.run-btn:hover {
transform: scale(1.1);
background: #45a049;
}
/* 📱 Responsive: Bảng cuộn ngang trên màn hình nhỏ */
@media (max-width: 768px) {
.container {
width: 100%;
padding: 15px;
}
table {
display: block;
overflow-x: auto;
white-space: nowrap;
}
}
/* Footer nổi bật & chuyên nghiệp */
/* 👣 Footer đẹp và chuyên nghiệp */
footer {
background: rgba(0, 0, 0, 0.85);
padding: 20px 0;
padding: 15px 0;
text-align: center;
width: 100%;
margin-top: auto;

@ -31,17 +31,18 @@
<thead class="table-dark">
<tr>
<th>Service Name</th>
<th>Description</th>
<!-- <th>Description</th> -->
<th>URL</th>
<th>Command</th>
<!-- <th>Command</th> -->
<th>Action</th>
</tr>
</thead>
<tbody>
{% for service in listService %}
{% if service.status == "active" %}
<tr>
<td><strong>{{ service.name }}</strong></td>
<td>{{ service.description }}</td>
<!-- <td>{{ service.description }}</td> -->
<td>
{% if service.url %}
<a href="{{ service.url }}" target="_blank" class="btn btn-link">🔗 Visit</a>
@ -49,7 +50,7 @@
<span class="text-muted">N/A</span>
{% endif %}
</td>
<td><code class="text-primary">{{ service.command }}</code></td>
<!-- <td><code class="text-primary">{{ service.command }}</code></td> -->
<td>
<button class="btn btn-success btn-sm run-btn"
data-command='{{ service.command | tojson | safe }}'>
@ -57,8 +58,10 @@
</button>
</td>
</tr>
{% endif %}
{% endfor %}
</tbody>
</table>
</div>

Loading…
Cancel
Save