احتواء بوت تيليجرام المكتوب بلغة Go: الدروس والنجاحات والمشاكل
مرحباً بالجميع! 👋
في الفترة الأخيرة، أخذت على عاتقي مهمة احتواء مشروع بوت تيليجرام مبني بلغة Go، وأحببت أن أشارككم كيف سارت هذه التجربة. البوت الذي أطلقت عليه اسم socdownbro هو بوت تيليجرام لجلب وتنزيل مقاطع فيديو من منصات التواصل الاجتماعي. يعتمد على Telegram Bot API Framework ويستخدم yt-dlp وffmpeg مع بعض التعديلات المخصصة. ورغم أن كود Go كان متيناً، إلا أن تحويله إلى صورة Docker نظيفة وقابلة لإعادة الاستخدام تطلب بعض المهارة.
إليكم شرحاً تفصيلياً لتجربتي — بما في ذلك Dockerfile الخاص بي، وdocker-compose.yaml، وبعض الدروس القيّمة التي تعلمتها على الطريق.
🏗️ الخطوة الأولى: بناء Dockerfile
إليكم Dockerfile الكامل الذي انتهيت إليه:
# استخدام صورة مصغّرة لتشغيل التطبيق
FROM golang:1.24-alpine AS builder
# CGO_ENABLED ضروري لبناء go-sqlite3
RUN apk add --no-cache --update go gcc g++
# تعيين مجلد العمل
WORKDIR /usr/src/app
ENV CGO_ENABLED=1
# تخزين الاعتماديات مؤقتاً
COPY go.mod go.sum ./
RUN go mod download
RUN go mod verify
# نسخ الكود المصدري
COPY . .
# تشغيل الاختبارات (لأن CI/CD يجري في عروقي 💉)
RUN go test -v ./...
# بناء الملف الثنائي
RUN go build -v -o socdownbro .
# الصورة النهائية المصغّرة
FROM alpine:latest
# إضافة ffmpeg و yt-dlp لمعالجة الفيديو
RUN apk --no-cache add ffmpeg yt-dlp
WORKDIR /bot
COPY --from=builder /usr/src/app/socdownbro .
COPY --from=builder /usr/src/app/config.json .
COPY res ./res/
CMD ["/bot/socdownbro"]
💡 لماذا البناء متعدد المراحل؟
البناء متعدد المراحل يبقي صورتي خفيفة. أُجري الترجمة البرمجية بالكامل في مرحلة البناء (مع سلسلة أدوات Go الكاملة والثقيلة)، ثم أشحن فقط ما أحتاجه — الملف الثنائي، والإعدادات، والموارد — إلى الصورة النهائية. نظيفة وصغيرة. وصورة Alpine تساعد أيضاً!
🧩 الخطوة الثانية: التنسيق مع Docker Compose
للحفاظ على قابلية الإدارة والتكرار، استخدمت Docker Compose لربط كل شيء، بما في ذلك قاعدة بيانات PostgreSQL وخادم Telegram Bot API.
إليكم docker-compose.yaml:
services:
socialdownbro-bot:
container_name: socialdownbro-bot
build:
context: .
dockerfile: Dockerfile
environment:
- DB_DATABASE=${DB_NAME}
- DB_USERNAME=${DB_USERNAME}
- DB_PASSWORD=${DB_PASSWORD}
- DB_HOST=${DB_HOST}
- DB_PORT=${DB_PORT}
- DB_SCHEMA=${DB_SCHEMA}
volumes:
- videos:/bot/videos:rw
depends_on:
- botanium-db
- telegram-bot-api
restart: unless-stopped
telegram-bot-api:
image: aiogram/telegram-bot-api:latest
environment:
TELEGRAM_API_ID: "${TELEGRAM_API_ID}"
TELEGRAM_API_HASH: "${TELEGRAM_API_HASH}"
volumes:
- telegram-bot-api-data:/var/lib/telegram-bot-api
ports:
- "8081:8081"
restart: unless-stopped
botanium-db:
image: postgres:17-alpine
environment:
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_NAME}
ports:
- "127.0.0.1:5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
restart: unless-stopped
volumes:
telegram-bot-api-data:
pgdata:
videos:
🔍 أبرز النقاط
depends_on: يضمن أن قاعدة البيانات و Telegram API يبدآن قبل البوت.- وحدات التخزين (Volumes):
videosيُستخدم لحفظ التنزيلات.pgdataيحتفظ بملفات قاعدة البيانات.telegram-bot-api-dataيحافظ على استقرار بيانات Telegram API بين عمليات إعادة التشغيل.
🧠 ما تعلمته
✅ النجاحات
- الملفات الثنائية لـ Go هي أفضل صديق لـ Docker: تطبيق Go مُترجم ترجمة ثابتة سهل للغاية حَاوَنَتُه. لا حاجة لـ JVM أو مترجمات. فقط انسخ وشغّل.
- البناء متعدد المراحل يُغيّر قواعد اللعبة. فصل واضح للمسؤوليات، وإعادة بناء أسرع، وصور أصغر.
- الاختبار المحلي كان سهلاً: بفضل Compose، يمكنني تشغيل البيئة بأكملها بأمر واحد. مثالي للتطوير السريع.
⚠️ المشاكل
- SQLite في Docker: كان عليّ تفعيل
CGO_ENABLED=1وتضمين أدوات البناء بسبب اعتماديةgo-sqlite3. وصورة Alpine لا تتضمن glibc، لذا تطلب الأمر بعض التعديلات. - yt-dlp و ffmpeg في Alpine: حاولت في البداية استخدام الإصدارات المتوفرة في Alpine، لكنها أحياناً تكون متأخرة. إذا واجهت أي أخطاء غريبة، قد أنتقل لاحقاً إلى صورة مبنية على Debian.
- خدمة Telegram Bot API: تشغيل نسختك الخاصة يمنحك تحكماً أكبر، لكن كن مستعداً لمراقبتها — خاصةً لمشاكل TLS والمصادقة إذا كنت تنشرها علناً.
🤓 الخلاصة
كانت احتواء بوت تيليجرام تجربة مُرضية جداً. الآن يمكنني النشر في أي مكان — على جهاز التطوير الخاص بي، أو خادم VPS، أو حتى Kubernetes مستقبلاً. بالإضافة إلى ذلك، أحصل على بيئات متسقة وقابلة للتنبؤ. انتهت أيام “يعمل على جهازي”.
إذا كنت تبني بوتات بـ Go (أو أي شيء آخر حقاً)، أنصح بشدة بتجربة Docker. ليست مخيفة كما تبدو، وبمجرد أن تعتاد عليها، ستكون وكأنك تمتلك قدرة خارقة. 🦸♂️
أخبروني إذا أردتم أن أفتح مصدر socdownbro أو أكتب مقالاً متابعاً عن نشره على السحابة. حتى ذلك الحين — برمجة سعيدة! 💻✨