DocUA commited on
Commit
859af98
·
1 Parent(s): d6e94b1

Виправлення помилок

Browse files
Files changed (4) hide show
  1. Dockerfile +34 -14
  2. app.py +121 -71
  3. docker-compose.yml +0 -20
  4. start.sh +27 -0
Dockerfile CHANGED
@@ -1,19 +1,39 @@
1
- FROM mysql:8.0.22
2
 
3
- # Встановлення змінних середовища
4
- ENV MYSQL_ROOT_PASSWORD=root_password
5
- ENV MYSQL_DATABASE=test_db
6
- ENV MYSQL_USER=test_user
7
- ENV MYSQL_PASSWORD=test_password
 
 
 
 
8
 
9
- # Створення необхідних директорій
10
- RUN mkdir -p /docker-entrypoint-initdb.d
 
 
11
 
12
- # Копіювання SQL скрипту для ініціалізації
13
- COPY init.sql /docker-entrypoint-initdb.d/
14
 
15
- # Відкриття порту MySQL
16
- EXPOSE 3306
17
 
18
- # Команда для запуску MySQL при старті контейнера
19
- CMD ["mysqld"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM ubuntu:20.04
2
 
3
+ # Встановлення необхідних пакетів
4
+ RUN apt-get update && apt-get install -y \
5
+ wget \
6
+ gnupg \
7
+ lsb-release \
8
+ python3 \
9
+ python3-pip \
10
+ procps \
11
+ && rm -rf /var/lib/apt/lists/*
12
 
13
+ # Налаштування репозиторію MySQL
14
+ RUN wget https://dev.mysql.com/get/mysql-apt-config_0.8.15-1_all.deb \
15
+ && DEBIAN_FRONTEND=noninteractive apt-get install -y ./mysql-apt-config_0.8.15-1_all.deb \
16
+ && apt-get update
17
 
18
+ # Встановлення MySQL 8.0.22
19
+ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server
20
 
21
+ # Копіювання SQL файлу ініціалізації
22
+ COPY init.sql /tmp/init.sql
23
 
24
+ # Копіювання Python Flask додатку
25
+ COPY app.py /app/app.py
26
+ WORKDIR /app
27
+
28
+ # Встановлення Python бібліотек
29
+ RUN pip3 install flask
30
+
31
+ # Скрипт для запуску MySQL і Flask
32
+ COPY start.sh /start.sh
33
+ RUN chmod +x /start.sh
34
+
35
+ # Відкриття портів
36
+ EXPOSE 3306 7860
37
+
38
+ # Запуск обох сервісів
39
+ CMD ["/start.sh"]
app.py CHANGED
@@ -1,82 +1,132 @@
 
1
  import os
2
- import gradio as gr
3
- import mysql.connector
4
- from mysql.connector import Error
5
 
6
- def check_mysql_status():
7
- try:
8
- # Спроба підключення до MySQL
9
- connection = mysql.connector.connect(
10
- host="localhost",
11
- user="test_user",
12
- password="test_password",
13
- database="test_db"
14
- )
15
-
16
- if connection.is_connected():
17
- db_info = connection.get_server_info()
18
- cursor = connection.cursor()
19
- cursor.execute("SELECT DATABASE();")
20
- record = cursor.fetchone()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
- # Перевірка таблиці test
23
- cursor.execute("SELECT * FROM test LIMIT 5;")
24
- test_data = cursor.fetchall()
25
 
26
- # Список баз даних
27
- cursor.execute("SHOW DATABASES;")
28
- databases = cursor.fetchall()
29
 
30
- # Формування HTML з результатами
31
- html = f"""
32
- <div style="font-family: Arial, sans-serif; padding: 20px;">
33
- <h2>MySQL Сервер успішно запущено! 🚀</h2>
34
- <p><strong>Статус сервера:</strong> Активний</p>
35
- <p><strong>Версія MySQL:</strong> {db_info}</p>
36
- <p><strong>Поточна база даних:</strong> {record[0]}</p>
37
-
38
- <h3>Доступні бази даних:</h3>
39
- <ul>
40
- {"".join([f"<li>{db[0]}</li>" for db in databases])}
41
- </ul>
42
-
43
- <h3>Дані з таблиці test:</h3>
44
- <table border="1" cellpadding="5">
45
- <tr>
46
- <th>numbers</th>
47
- <th>words</th>
48
- </tr>
49
- {"".join([f"<tr><td>{row[0]}</td><td>{row[1]}</td></tr>" for row in test_data])}
50
- </table>
51
-
52
- <h3>Інформація для підключення:</h3>
53
- <ul>
54
- <li><strong>Хост:</strong> URL вашого Space</li>
55
- <li><strong>Порт:</strong> 3306</li>
56
- <li><strong>Користувач:</strong> test_user</li>
57
- <li><strong>Пароль:</strong> test_password</li>
58
- <li><strong>База даних:</strong> test_db</li>
59
- </ul>
60
  </div>
61
- """
62
 
63
- connection.close()
64
- return html
65
- else:
66
- return "<h2 style='color: red;'>Помилка: Не вдалося підключитися до MySQL!</h2>"
67
-
68
- except Error as e:
69
- return f"<h2 style='color: red;'>Помилка: {e}</h2>"
70
 
71
- # Створення інтерфейсу Gradio
72
- with gr.Blocks() as demo:
73
- gr.HTML("<h1>MySQL Server 8.0.22 для навчальних цілей</h1>")
74
- gr.HTML("<p>Цей додаток показує статус вашого MySQL сервера.</p>")
 
 
 
 
 
 
 
 
 
75
 
76
- refresh_btn = gr.Button("Перевірити статус MySQL")
77
- output = gr.HTML(check_mysql_status())
 
 
 
 
 
78
 
79
- refresh_btn.click(fn=check_mysql_status, inputs=[], outputs=output)
 
 
 
 
 
 
 
 
 
80
 
81
- # Запуск інтерфейсу
82
- demo.launch()
 
 
1
+ from flask import Flask, render_template_string
2
  import os
3
+ import subprocess
4
+ import socket
 
5
 
6
+ app = Flask(__name__)
7
+
8
+ @app.route('/')
9
+ def index():
10
+ """Головна сторінка з інформацією про MySQL сервер"""
11
+
12
+ # Перевірка чи працює MySQL
13
+ mysql_status = check_mysql_status()
14
+
15
+ # HTML шаблон
16
+ template = """
17
+ <!DOCTYPE html>
18
+ <html>
19
+ <head>
20
+ <title>MySQL Server для навчальних цілей</title>
21
+ <style>
22
+ body {
23
+ font-family: Arial, sans-serif;
24
+ margin: 0;
25
+ padding: 20px;
26
+ line-height: 1.6;
27
+ }
28
+ .container {
29
+ max-width: 800px;
30
+ margin: 0 auto;
31
+ background-color: #f5f5f5;
32
+ padding: 20px;
33
+ border-radius: 5px;
34
+ box-shadow: 0 2px 5px rgba(0,0,0,0.1);
35
+ }
36
+ h1 {
37
+ color: #333;
38
+ border-bottom: 1px solid #ddd;
39
+ padding-bottom: 10px;
40
+ }
41
+ .status {
42
+ padding: 10px;
43
+ margin: 10px 0;
44
+ border-radius: 4px;
45
+ }
46
+ .status.online {
47
+ background-color: #dff0d8;
48
+ border: 1px solid #d6e9c6;
49
+ color: #3c763d;
50
+ }
51
+ .status.offline {
52
+ background-color: #f2dede;
53
+ border: 1px solid #ebccd1;
54
+ color: #a94442;
55
+ }
56
+ pre {
57
+ background-color: #f8f8f8;
58
+ border: 1px solid #ddd;
59
+ padding: 10px;
60
+ border-radius: 4px;
61
+ overflow-x: auto;
62
+ }
63
+ .connection-info {
64
+ background-color: #e8f4f8;
65
+ border: 1px solid #bce8f1;
66
+ padding: 15px;
67
+ margin-top: 20px;
68
+ border-radius: 4px;
69
+ }
70
+ </style>
71
+ </head>
72
+ <body>
73
+ <div class="container">
74
+ <h1>MySQL Сервер 8.0.22 для навчальних цілей</h1>
75
 
76
+ <div class="status {{ 'online' if status else 'offline' }}">
77
+ <strong>Статус MySQL:</strong> {{ 'Запущено' if status else 'Не запущено' }}
78
+ </div>
79
 
80
+ <h2>Інформація про сервер:</h2>
81
+ <pre>{{ server_info }}</pre>
 
82
 
83
+ <div class="connection-info">
84
+ <h3>Параметри підключення:</h3>
85
+ <p><strong>Хост:</strong> {{ host }}</p>
86
+ <p><strong>Порт:</strong> 3306</p>
87
+ <p><strong>Користувач:</strong> test_user</p>
88
+ <p><strong>Пароль:</strong> test_password</p>
89
+ <p><strong>База даних:</strong> test_db</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  </div>
 
91
 
92
+ <h3>Практичне заняття №1:</h3>
93
+ <p>Для виконання завдання 1.3 підключіться до серверу та виконайте наступний SQL скрипт:</p>
94
+ <pre>-- Нереформатований скрипт
95
+ create table if not exists test (numbers int, words varchar (10));
 
 
 
96
 
97
+ -- Відформатований скрипт
98
+ CREATE TABLE IF NOT EXISTS test (
99
+ numbers INT, -- Поле для цілих чисел
100
+ words VARCHAR(10) -- Поле для текстових значень максимум 10 символів
101
+ );</pre>
102
+ </div>
103
+ </body>
104
+ </html>
105
+ """
106
+
107
+ # Отримання імені хоста для підключення
108
+ hostname = socket.gethostname()
109
+ host = socket.gethostbyname(hostname)
110
 
111
+ # Додаткова інформація про сервер
112
+ try:
113
+ ps_output = subprocess.check_output(["ps", "aux"]).decode('utf-8')
114
+ mysql_process = [line for line in ps_output.split('\n') if 'mysqld' in line]
115
+ server_info = '\n'.join(mysql_process) if mysql_process else "Деталі процесу MySQL не знайдено"
116
+ except:
117
+ server_info = "Не вдалося отримати інформацію про процес MySQL"
118
 
119
+ return render_template_string(template, status=mysql_status, server_info=server_info, host=host)
120
+
121
+ def check_mysql_status():
122
+ """Перевірка статусу MySQL сервера"""
123
+ try:
124
+ # Перевірка статусу через утиліту pidof
125
+ result = subprocess.run(["pidof", "mysqld"], stdout=subprocess.PIPE)
126
+ return result.returncode == 0
127
+ except:
128
+ return False
129
 
130
+ if __name__ == '__main__':
131
+ # Запускаємо веб-сервер на порту 7860 (стандартний для Hugging Face Spaces)
132
+ app.run(host='0.0.0.0', port=7860)
docker-compose.yml DELETED
@@ -1,20 +0,0 @@
1
- name: Build and Deploy Docker
2
-
3
- on:
4
- push:
5
- branches: [ main ]
6
- pull_request:
7
- branches: [ main ]
8
-
9
- jobs:
10
- build:
11
- runs-on: ubuntu-latest
12
- steps:
13
- - uses: actions/checkout@v2
14
-
15
- - name: Build and push Docker image
16
- uses: docker/build-push-action@v2
17
- with:
18
- context: .
19
- push: true
20
- tags: ${{ github.repository }}:latest
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
start.sh ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # Ініціалізація бази даних MySql якщо вона ще не ініціалізована
4
+ if [ ! -d "/var/lib/mysql/mysql" ]; then
5
+ mysqld --initialize-insecure
6
+ fi
7
+
8
+ # Запуск MySQL у фоновому режимі
9
+ service mysql start
10
+
11
+ # Створення бази даних і користувача
12
+ mysql -u root -e "CREATE DATABASE IF NOT EXISTS test_db;"
13
+ mysql -u root -e "CREATE USER IF NOT EXISTS 'test_user'@'%' IDENTIFIED BY 'test_password';"
14
+ mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'test_user'@'%';"
15
+ mysql -u root -e "FLUSH PRIVILEGES;"
16
+
17
+ # Імпорт ініціалізаційного SQL файлу
18
+ mysql -u root test_db < /tmp/init.sql
19
+
20
+ # Налаштування MySQL для дозволу віддаленого доступу
21
+ sed -i 's/bind-address.*=.*/bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
22
+
23
+ # Перезапуск MySQL з новими налаштуваннями
24
+ service mysql restart
25
+
26
+ # Запуск Flask додатку
27
+ python3 /app/app.py