diff --git a/Dockerfile.bot b/Dockerfile.bot index ca2dc1d..6c6a02d 100644 --- a/Dockerfile.bot +++ b/Dockerfile.bot @@ -28,6 +28,7 @@ ENV PYTHONDONTWRITEBYTECODE=1 \ # Install runtime dependencies only RUN apt-get update && apt-get upgrade -y && apt-get install -y \ curl \ + sqlite3 \ && rm -rf /var/lib/apt/lists/* \ && apt-get clean @@ -37,15 +38,20 @@ RUN groupadd -g 1001 deploy && useradd -u 1001 -g deploy deploy # Copy virtual environment from builder COPY --from=builder /opt/venv /opt/venv 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 WORKDIR /app RUN mkdir -p /app/database /app/logs && \ - chown -R deploy:deploy /app + chown -R 1001:1001 /app # 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 USER deploy diff --git a/database/schema.sql b/database/schema.sql new file mode 100644 index 0000000..10e1501 --- /dev/null +++ b/database/schema.sql @@ -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); diff --git a/migrations/000_migrations_init.py b/migrations/000_migrations_init.py deleted file mode 100644 index 8c91f0e..0000000 --- a/migrations/000_migrations_init.py +++ /dev/null @@ -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() diff --git a/migrations/001_create_new_tables.py b/migrations/001_create_new_tables.py deleted file mode 100644 index 4d4ab41..0000000 --- a/migrations/001_create_new_tables.py +++ /dev/null @@ -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() diff --git a/migrations/002_create_tables_media_group.py b/migrations/002_create_tables_media_group.py deleted file mode 100644 index 890886d..0000000 --- a/migrations/002_create_tables_media_group.py +++ /dev/null @@ -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() diff --git a/migrations/003_create_our_users_table.py b/migrations/003_create_our_users_table.py deleted file mode 100644 index ad2cfd2..0000000 --- a/migrations/003_create_our_users_table.py +++ /dev/null @@ -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() -