Dev 8 #10
@@ -28,6 +28,7 @@ ENV PYTHONDONTWRITEBYTECODE=1 \
|
|||||||
# Install runtime dependencies only
|
# Install runtime dependencies only
|
||||||
RUN apt-get update && apt-get upgrade -y && apt-get install -y \
|
RUN apt-get update && apt-get upgrade -y && apt-get install -y \
|
||||||
curl \
|
curl \
|
||||||
|
sqlite3 \
|
||||||
&& rm -rf /var/lib/apt/lists/* \
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
&& apt-get clean
|
&& apt-get clean
|
||||||
|
|
||||||
@@ -37,15 +38,20 @@ RUN groupadd -g 1001 deploy && useradd -u 1001 -g deploy deploy
|
|||||||
# Copy virtual environment from builder
|
# Copy virtual environment from builder
|
||||||
COPY --from=builder /opt/venv /opt/venv
|
COPY --from=builder /opt/venv /opt/venv
|
||||||
ENV PATH="/opt/venv/bin:$PATH"
|
ENV PATH="/opt/venv/bin:$PATH"
|
||||||
RUN chown -R deploy:deploy /opt/venv
|
RUN chown -R 1001:1001 /opt/venv
|
||||||
|
|
||||||
# Create app directory and set permissions
|
# Create app directory and set permissions
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
RUN mkdir -p /app/database /app/logs && \
|
RUN mkdir -p /app/database /app/logs && \
|
||||||
chown -R deploy:deploy /app
|
chown -R 1001:1001 /app
|
||||||
|
|
||||||
# Copy application code
|
# Copy application code
|
||||||
COPY --chown=deploy:deploy . .
|
COPY --chown=1001:1001 . .
|
||||||
|
|
||||||
|
# Initialize SQLite database with schema
|
||||||
|
RUN sqlite3 /app/database/tg-bot-database.db < /app/database/schema.sql && \
|
||||||
|
chown 1001:1001 /app/database/tg-bot-database.db && \
|
||||||
|
chmod 644 /app/database/tg-bot-database.db
|
||||||
|
|
||||||
# Switch to non-root user
|
# Switch to non-root user
|
||||||
USER deploy
|
USER deploy
|
||||||
|
|||||||
110
database/schema.sql
Normal file
110
database/schema.sql
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
-- Telegram Helper Bot Database Schema
|
||||||
|
-- Compatible with Docker container deployment
|
||||||
|
|
||||||
|
-- System table for SQLite auto-increment sequences
|
||||||
|
CREATE TABLE IF NOT EXISTS sqlite_sequence (
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
seq INTEGER NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Users who have listened to audio messages
|
||||||
|
CREATE TABLE IF NOT EXISTS listen_audio_users (
|
||||||
|
file_name TEXT NOT NULL,
|
||||||
|
user_id INTEGER NOT NULL,
|
||||||
|
is_listen BOOLEAN NOT NULL DEFAULT 0
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Reference table for audio messages
|
||||||
|
CREATE TABLE IF NOT EXISTS audio_message_reference (
|
||||||
|
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||||
|
file_name TEXT NOT NULL UNIQUE,
|
||||||
|
author_id INTEGER NOT NULL,
|
||||||
|
date_added DATE NOT NULL,
|
||||||
|
listen_count INTEGER NOT NULL DEFAULT 0,
|
||||||
|
file_id INTEGER NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Database migrations tracking
|
||||||
|
CREATE TABLE IF NOT EXISTS migrations (
|
||||||
|
version INTEGER NOT NULL PRIMARY KEY,
|
||||||
|
script_name TEXT NOT NULL,
|
||||||
|
created_at TEXT NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Bot administrators
|
||||||
|
CREATE TABLE IF NOT EXISTS admins (
|
||||||
|
user_id INTEGER NOT NULL PRIMARY KEY,
|
||||||
|
role TEXT
|
||||||
|
);
|
||||||
|
|
||||||
|
-- User blacklist for banned users
|
||||||
|
CREATE TABLE IF NOT EXISTS blacklist (
|
||||||
|
user_id INTEGER NOT NULL PRIMARY KEY,
|
||||||
|
user_name TEXT,
|
||||||
|
message_for_user TEXT,
|
||||||
|
date_to_unban INTEGER
|
||||||
|
);
|
||||||
|
|
||||||
|
-- User message history
|
||||||
|
CREATE TABLE IF NOT EXISTS user_messages (
|
||||||
|
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||||
|
message_text TEXT,
|
||||||
|
user_id INTEGER,
|
||||||
|
message_id INTEGER NOT NULL,
|
||||||
|
date TEXT NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Suggested posts from Telegram
|
||||||
|
CREATE TABLE IF NOT EXISTS post_from_telegram_suggest (
|
||||||
|
message_id INTEGER NOT NULL PRIMARY KEY,
|
||||||
|
text TEXT,
|
||||||
|
helper_text_message_id INTEGER,
|
||||||
|
author_id INTEGER,
|
||||||
|
created_at TEXT NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Links between posts and content
|
||||||
|
CREATE TABLE IF NOT EXISTS message_link_to_content (
|
||||||
|
post_id INTEGER NOT NULL,
|
||||||
|
message_id INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY (post_id, message_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Content associated with Telegram posts
|
||||||
|
CREATE TABLE IF NOT EXISTS content_post_from_telegram (
|
||||||
|
message_id INTEGER NOT NULL,
|
||||||
|
content_name TEXT NOT NULL,
|
||||||
|
content_type TEXT,
|
||||||
|
PRIMARY KEY (message_id, content_name)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Bot users information
|
||||||
|
CREATE TABLE IF NOT EXISTS our_users (
|
||||||
|
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||||
|
user_id INTEGER NOT NULL UNIQUE,
|
||||||
|
first_name TEXT,
|
||||||
|
full_name TEXT,
|
||||||
|
username TEXT,
|
||||||
|
is_bot BOOLEAN DEFAULT 0,
|
||||||
|
language_code TEXT,
|
||||||
|
has_stickers INTEGER DEFAULT 0 NOT NULL,
|
||||||
|
emoji TEXT,
|
||||||
|
date_added DATE NOT NULL,
|
||||||
|
date_changed DATE NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Audio moderation tracking
|
||||||
|
CREATE TABLE IF NOT EXISTS audio_moderate (
|
||||||
|
user_id INTEGER NOT NULL,
|
||||||
|
message_id INTEGER,
|
||||||
|
PRIMARY KEY (user_id, message_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Create indexes for better performance
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_listen_audio_users_file_name ON listen_audio_users(file_name);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_listen_audio_users_user_id ON listen_audio_users(user_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_audio_message_reference_author_id ON audio_message_reference(author_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_user_messages_user_id ON user_messages(user_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_post_from_telegram_suggest_author_id ON post_from_telegram_suggest(author_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_our_users_user_id ON our_users(user_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_audio_moderate_user_id ON audio_moderate(user_id);
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# Добавляем путь к корневой директории проекта
|
|
||||||
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
|
|
||||||
|
|
||||||
from database.db import BotDB
|
|
||||||
|
|
||||||
# Получаем текущую директорию
|
|
||||||
current_dir = os.path.dirname(__file__)
|
|
||||||
|
|
||||||
# Переходим на уровень выше
|
|
||||||
parent_dir = os.path.dirname(current_dir)
|
|
||||||
|
|
||||||
BotDB = BotDB(parent_dir, 'tg-bot-database.db')
|
|
||||||
|
|
||||||
|
|
||||||
def get_filename():
|
|
||||||
"""Возвращает имя файла без расширения."""
|
|
||||||
filename = os.path.basename(__file__)
|
|
||||||
filename = os.path.splitext(filename)[0]
|
|
||||||
return filename
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
migrations_init = """
|
|
||||||
CREATE TABLE IF NOT EXISTS migrations (
|
|
||||||
version INTEGER PRIMARY KEY NOT NULL,
|
|
||||||
script_name TEXT NOT NULL,
|
|
||||||
created_at TEXT
|
|
||||||
);
|
|
||||||
"""
|
|
||||||
BotDB.create_table(migrations_init)
|
|
||||||
BotDB.update_version(0, get_filename())
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# Добавляем путь к корневой директории проекта
|
|
||||||
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
|
|
||||||
|
|
||||||
from database.db import BotDB
|
|
||||||
|
|
||||||
# Получаем текущую директорию
|
|
||||||
current_dir = os.path.dirname(__file__)
|
|
||||||
|
|
||||||
# Переходим на уровень выше
|
|
||||||
parent_dir = os.path.dirname(current_dir)
|
|
||||||
|
|
||||||
BotDB = BotDB(parent_dir, 'tg-bot-database.db')
|
|
||||||
|
|
||||||
|
|
||||||
def get_filename():
|
|
||||||
"""Возвращает имя файла без расширения."""
|
|
||||||
filename = os.path.basename(__file__)
|
|
||||||
filename = os.path.splitext(filename)[0]
|
|
||||||
return filename
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
# Проверка версии миграций
|
|
||||||
current_version = BotDB.get_current_version() # Добавьте функцию для получения версии
|
|
||||||
|
|
||||||
# Выполнение миграций и проверка последней версии
|
|
||||||
if current_version < 1:
|
|
||||||
# Скрипты миграции
|
|
||||||
create_table_sql_1 = """
|
|
||||||
CREATE TABLE IF NOT EXISTS "admins" (
|
|
||||||
user_id INTEGER NOT NULL,
|
|
||||||
"role" TEXT
|
|
||||||
);
|
|
||||||
"""
|
|
||||||
create_table_sql_2 = """CREATE TABLE IF NOT EXISTS "blacklist"
|
|
||||||
(
|
|
||||||
"user_id" INTEGER NOT NULL UNIQUE,
|
|
||||||
"user_name" INTEGER,
|
|
||||||
"message_for_user" INTEGER,
|
|
||||||
"date_to_unban" INTEGER
|
|
||||||
);
|
|
||||||
"""
|
|
||||||
create_table_sql_3 = """
|
|
||||||
CREATE TABLE IF NOT EXISTS user_messages (
|
|
||||||
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
|
||||||
message_text TEXT,
|
|
||||||
user_id INTEGER,
|
|
||||||
message_id INTEGER NOT NULL,
|
|
||||||
date TEXT
|
|
||||||
);
|
|
||||||
"""
|
|
||||||
# Применение миграции
|
|
||||||
BotDB.create_table(create_table_sql_1)
|
|
||||||
BotDB.create_table(create_table_sql_2)
|
|
||||||
BotDB.create_table(create_table_sql_3)
|
|
||||||
BotDB.add_admin(842766148, 'creator')
|
|
||||||
BotDB.add_admin(920057022, 'admin')
|
|
||||||
filename = get_filename()
|
|
||||||
|
|
||||||
BotDB.update_version(1, filename)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# Добавляем путь к корневой директории проекта
|
|
||||||
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
|
|
||||||
|
|
||||||
from database.db import BotDB
|
|
||||||
|
|
||||||
# Получаем текущую директорию
|
|
||||||
current_dir = os.path.dirname(__file__)
|
|
||||||
|
|
||||||
# Переходим на уровень выше
|
|
||||||
parent_dir = os.path.dirname(current_dir)
|
|
||||||
|
|
||||||
BotDB = BotDB(parent_dir, 'tg-bot-database.db')
|
|
||||||
|
|
||||||
|
|
||||||
def get_filename():
|
|
||||||
"""Возвращает имя файла без расширения."""
|
|
||||||
filename = os.path.basename(__file__)
|
|
||||||
filename = os.path.splitext(filename)[0]
|
|
||||||
return filename
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
# Проверка версии миграций
|
|
||||||
current_version = BotDB.get_current_version() # Добавьте функцию для получения версии
|
|
||||||
|
|
||||||
# Выполнение миграций и проверка последней версии
|
|
||||||
if current_version < 2:
|
|
||||||
# Скрипты миграции
|
|
||||||
create_table_sql_1 = """
|
|
||||||
CREATE TABLE IF NOT EXISTS "post_from_telegram_suggest"
|
|
||||||
(
|
|
||||||
message_id INTEGER not null,
|
|
||||||
text TEXT,
|
|
||||||
helper_text_message_id INTEGER,
|
|
||||||
author_id INTEGER,
|
|
||||||
created_at TEXT
|
|
||||||
);
|
|
||||||
"""
|
|
||||||
create_table_sql_2 = """
|
|
||||||
CREATE TABLE IF NOT EXISTS message_link_to_content (
|
|
||||||
post_id INTEGER NOT NULL,
|
|
||||||
message_id INTEGER NOT NULL
|
|
||||||
);
|
|
||||||
"""
|
|
||||||
create_table_sql_3 = """
|
|
||||||
CREATE TABLE IF NOT EXISTS content_post_from_telegram (
|
|
||||||
message_id INTEGER NOT NULL,
|
|
||||||
content_name TEXT NOT NULL,
|
|
||||||
content_type TEXT
|
|
||||||
);
|
|
||||||
"""
|
|
||||||
# Применение миграции
|
|
||||||
BotDB.create_table(create_table_sql_1)
|
|
||||||
BotDB.create_table(create_table_sql_2)
|
|
||||||
BotDB.create_table(create_table_sql_3)
|
|
||||||
filename = get_filename()
|
|
||||||
|
|
||||||
BotDB.update_version(2, filename)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# Добавляем путь к корневой директории проекта
|
|
||||||
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
|
|
||||||
|
|
||||||
from database.db import BotDB
|
|
||||||
|
|
||||||
# Получаем текущую директорию
|
|
||||||
current_dir = os.path.dirname(__file__)
|
|
||||||
|
|
||||||
# Переходим на уровень выше
|
|
||||||
parent_dir = os.path.dirname(current_dir)
|
|
||||||
|
|
||||||
BotDB = BotDB(parent_dir, 'tg-bot-database.db')
|
|
||||||
|
|
||||||
|
|
||||||
def get_filename():
|
|
||||||
"""Возвращает имя файла без расширения."""
|
|
||||||
filename = os.path.basename(__file__)
|
|
||||||
filename = os.path.splitext(filename)[0]
|
|
||||||
return filename
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
# Проверка версии миграций
|
|
||||||
current_version = BotDB.get_current_version()
|
|
||||||
|
|
||||||
# Выполнение миграций и проверка последней версии
|
|
||||||
if current_version < 3:
|
|
||||||
# Скрипт миграции для создания таблицы our_users
|
|
||||||
create_table_sql = """
|
|
||||||
CREATE TABLE IF NOT EXISTS "our_users" (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
user_id INTEGER NOT NULL UNIQUE,
|
|
||||||
first_name TEXT,
|
|
||||||
full_name TEXT,
|
|
||||||
username TEXT,
|
|
||||||
is_bot BOOLEAN DEFAULT 0,
|
|
||||||
language_code TEXT,
|
|
||||||
date_added TEXT,
|
|
||||||
date_changed TEXT,
|
|
||||||
has_stickers BOOLEAN DEFAULT 0
|
|
||||||
);
|
|
||||||
"""
|
|
||||||
|
|
||||||
# Применение миграции
|
|
||||||
BotDB.create_table(create_table_sql)
|
|
||||||
filename = get_filename()
|
|
||||||
|
|
||||||
BotDB.update_version(3, filename)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user