Added Argo Manifests
This commit is contained in:
@@ -277,7 +277,6 @@ Make sure these are set in your `.env` file:
|
|||||||
```bash
|
```bash
|
||||||
TELETHON_API_ID=your_api_id
|
TELETHON_API_ID=your_api_id
|
||||||
TELETHON_API_HASH=your_api_hash
|
TELETHON_API_HASH=your_api_hash
|
||||||
TELEGRAM_BOT_TOKEN=your_bot_token
|
|
||||||
TELETHON_TOKEN=your_session_token
|
TELETHON_TOKEN=your_session_token
|
||||||
|
|
||||||
MONGODB_URI=mongodb://localhost:27017
|
MONGODB_URI=mongodb://localhost:27017
|
||||||
@@ -328,7 +327,6 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
TELETHON_API_ID: ${TELETHON_API_ID}
|
TELETHON_API_ID: ${TELETHON_API_ID}
|
||||||
TELETHON_API_HASH: ${TELETHON_API_HASH}
|
TELETHON_API_HASH: ${TELETHON_API_HASH}
|
||||||
TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN}
|
|
||||||
TELETHON_TOKEN: ${TELETHON_TOKEN}
|
TELETHON_TOKEN: ${TELETHON_TOKEN}
|
||||||
MONGODB_URI: mongodb://mongo:27017
|
MONGODB_URI: mongodb://mongo:27017
|
||||||
MONGODB_DATABASE: groupfactory
|
MONGODB_DATABASE: groupfactory
|
||||||
|
|||||||
@@ -205,7 +205,6 @@ The telegram-groupfactory bot now has a complete **admin-only configuration syst
|
|||||||
# Telegram
|
# Telegram
|
||||||
TELETHON_API_ID=your_api_id
|
TELETHON_API_ID=your_api_id
|
||||||
TELETHON_API_HASH=your_api_hash
|
TELETHON_API_HASH=your_api_hash
|
||||||
TELEGRAM_BOT_TOKEN=your_bot_token
|
|
||||||
TELETHON_TOKEN=your_session_token
|
TELETHON_TOKEN=your_session_token
|
||||||
|
|
||||||
# MongoDB
|
# MongoDB
|
||||||
|
|||||||
14
README.md
14
README.md
@@ -1,6 +1,6 @@
|
|||||||
# telegram-groupfactory
|
# telegram-groupfactory
|
||||||
|
|
||||||
A Telegram bot for managing user groups with MongoDB backend and admin-only configuration.
|
A Telegram user API service for managing groups with MongoDB backend and admin-only configuration.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
@@ -10,7 +10,7 @@ A Telegram bot for managing user groups with MongoDB backend and admin-only conf
|
|||||||
- ✅ GroupHelp settings backup QR storage for `.importbackup`
|
- ✅ GroupHelp settings backup QR storage for `.importbackup`
|
||||||
- ✅ Interactive admin role selection for group creators
|
- ✅ Interactive admin role selection for group creators
|
||||||
- ✅ Modular architecture with separation of concerns
|
- ✅ Modular architecture with separation of concerns
|
||||||
- ✅ Telegram bot integration using Telethon
|
- ✅ Telegram user API integration using Telethon
|
||||||
|
|
||||||
## Architecture
|
## Architecture
|
||||||
|
|
||||||
@@ -31,7 +31,6 @@ The application follows a modular architecture with the following components:
|
|||||||
```
|
```
|
||||||
TELETHON_API_ID=your_api_id
|
TELETHON_API_ID=your_api_id
|
||||||
TELETHON_API_HASH=your_api_hash
|
TELETHON_API_HASH=your_api_hash
|
||||||
TELEGRAM_BOT_TOKEN=your_bot_token
|
|
||||||
TELETHON_TOKEN=your_session_token
|
TELETHON_TOKEN=your_session_token
|
||||||
|
|
||||||
MONGODB_URI=mongodb://localhost:27017
|
MONGODB_URI=mongodb://localhost:27017
|
||||||
@@ -42,6 +41,15 @@ The application follows a modular architecture with the following components:
|
|||||||
FACTORY_BOT_ID=your_bot_id
|
FACTORY_BOT_ID=your_bot_id
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Generate `TELETHON_TOKEN` with:
|
||||||
|
```bash
|
||||||
|
TELETHON_API_ID=your_api_id TELETHON_API_HASH=your_api_hash \
|
||||||
|
python3 scripts/generate_telegram_session.py
|
||||||
|
```
|
||||||
|
|
||||||
|
The script performs a Telegram user login and prints the `TELETHON_TOKEN`
|
||||||
|
value to store in the Kubernetes Secret.
|
||||||
|
|
||||||
2. Install dependencies:
|
2. Install dependencies:
|
||||||
```bash
|
```bash
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
|
|||||||
18
argocd/application.yaml
Normal file
18
argocd/application.yaml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
apiVersion: argoproj.io/v1alpha1
|
||||||
|
kind: Application
|
||||||
|
metadata:
|
||||||
|
name: groupfactory
|
||||||
|
namespace: argocd
|
||||||
|
spec:
|
||||||
|
project: default
|
||||||
|
source:
|
||||||
|
repoURL: https://github.com/YOUR_ORG/telegram-groupfactory.git
|
||||||
|
targetRevision: main
|
||||||
|
path: k8s
|
||||||
|
destination:
|
||||||
|
server: https://kubernetes.default.svc
|
||||||
|
namespace: groupfactory
|
||||||
|
syncPolicy:
|
||||||
|
syncOptions:
|
||||||
|
- CreateNamespace=true
|
||||||
|
- PruneLast=true
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: groupfactory
|
|
||||||
namespace: groupfactory
|
|
||||||
labels:
|
|
||||||
app: groupfactory
|
|
||||||
spec:
|
|
||||||
replicas: 1
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: groupfactory
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: groupfactory
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- name: groupfactory
|
|
||||||
image: <registry-url>/groupfactory:latest
|
|
||||||
envFrom:
|
|
||||||
- configMapRef:
|
|
||||||
name: telegram-config
|
|
||||||
- secretRef:
|
|
||||||
name: groupfactory-tg-auth
|
|
||||||
env:
|
|
||||||
- name: MONGODB_URI
|
|
||||||
valueFrom:
|
|
||||||
secretKeyRef:
|
|
||||||
name: groupfactory-tg-auth
|
|
||||||
key: MONGODB_URI
|
|
||||||
- name: MONGODB_DATABASE
|
|
||||||
value: "imsuserbot"
|
|
||||||
- name: MONGODB_COLLECTION
|
|
||||||
value: "ghconfig"
|
|
||||||
16
examples/configmap.yaml
Normal file
16
examples/configmap.yaml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: telegram-config
|
||||||
|
namespace: groupfactory
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: groupfactory
|
||||||
|
data:
|
||||||
|
API_HOST: "0.0.0.0"
|
||||||
|
API_PORT: "8000"
|
||||||
|
LOG_LEVEL: "INFO"
|
||||||
|
MONGODB_DATABASE: "imsuserbot"
|
||||||
|
MONGODB_COLLECTION: "ghconfig"
|
||||||
|
TELETHON_API_ID: "123456"
|
||||||
|
STAFF_CHAT_ID: "-1001234567890"
|
||||||
|
FACTORY_BOT_ID: "123456789"
|
||||||
14
examples/secret.yaml
Normal file
14
examples/secret.yaml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: groupfactory-tg-auth
|
||||||
|
namespace: groupfactory
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: groupfactory
|
||||||
|
type: Opaque
|
||||||
|
stringData:
|
||||||
|
API_KEY: "change-me-api-key"
|
||||||
|
MONGODB_URI: "mongodb://mongo:27017"
|
||||||
|
TELETHON_API_HASH: "replace-with-telegram-api-hash"
|
||||||
|
# Generate with: python3 scripts/generate_telegram_session.py
|
||||||
|
TELETHON_TOKEN: "replace-with-telethon-session-token"
|
||||||
66
k8s/deployment.yaml
Normal file
66
k8s/deployment.yaml
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: groupfactory
|
||||||
|
namespace: groupfactory
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: groupfactory
|
||||||
|
app.kubernetes.io/component: app
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app.kubernetes.io/name: groupfactory
|
||||||
|
app.kubernetes.io/component: app
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: groupfactory
|
||||||
|
app.kubernetes.io/component: app
|
||||||
|
spec:
|
||||||
|
securityContext:
|
||||||
|
runAsNonRoot: true
|
||||||
|
seccompProfile:
|
||||||
|
type: RuntimeDefault
|
||||||
|
containers:
|
||||||
|
- name: groupfactory
|
||||||
|
image: registry.example.com/groupfactory:latest
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
containerPort: 8000
|
||||||
|
envFrom:
|
||||||
|
- configMapRef:
|
||||||
|
name: telegram-config
|
||||||
|
- secretRef:
|
||||||
|
name: groupfactory-tg-auth
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health
|
||||||
|
port: http
|
||||||
|
initialDelaySeconds: 10
|
||||||
|
periodSeconds: 10
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health
|
||||||
|
port: http
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
periodSeconds: 20
|
||||||
|
startupProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health
|
||||||
|
port: http
|
||||||
|
failureThreshold: 30
|
||||||
|
periodSeconds: 5
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 100m
|
||||||
|
memory: 128Mi
|
||||||
|
limits:
|
||||||
|
cpu: 500m
|
||||||
|
memory: 512Mi
|
||||||
|
securityContext:
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
capabilities:
|
||||||
|
drop:
|
||||||
|
- ALL
|
||||||
17
k8s/service.yaml
Normal file
17
k8s/service.yaml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: groupfactory
|
||||||
|
namespace: groupfactory
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: groupfactory
|
||||||
|
app.kubernetes.io/component: app
|
||||||
|
spec:
|
||||||
|
type: ClusterIP
|
||||||
|
selector:
|
||||||
|
app.kubernetes.io/name: groupfactory
|
||||||
|
app.kubernetes.io/component: app
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 8000
|
||||||
|
targetPort: http
|
||||||
82
scripts/generate_telegram_session.py
Executable file
82
scripts/generate_telegram_session.py
Executable file
@@ -0,0 +1,82 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Generate a Telethon StringSession for TELETHON_TOKEN.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
TELETHON_API_ID=123456 TELETHON_API_HASH=abc123 \
|
||||||
|
python3 scripts/generate_telegram_session.py
|
||||||
|
|
||||||
|
python3 scripts/generate_telegram_session.py \
|
||||||
|
--api-id 123456 \
|
||||||
|
--api-hash abc123 \
|
||||||
|
--phone +391234567890
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import asyncio
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def parse_args() -> argparse.Namespace:
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Generate a Telethon StringSession for the TELETHON_TOKEN secret."
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--api-id",
|
||||||
|
default=os.environ.get("TELETHON_API_ID"),
|
||||||
|
help="Telegram API ID. Defaults to TELETHON_API_ID.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--api-hash",
|
||||||
|
default=os.environ.get("TELETHON_API_HASH"),
|
||||||
|
help="Telegram API hash. Defaults to TELETHON_API_HASH.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--phone",
|
||||||
|
default=os.environ.get("TELETHON_PHONE"),
|
||||||
|
help="Telegram user phone number. Defaults to TELETHON_PHONE.",
|
||||||
|
)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
if not args.api_id:
|
||||||
|
parser.error("--api-id or TELETHON_API_ID is required")
|
||||||
|
try:
|
||||||
|
args.api_id = int(args.api_id)
|
||||||
|
except ValueError:
|
||||||
|
parser.error("--api-id or TELETHON_API_ID must be an integer")
|
||||||
|
if not args.api_hash:
|
||||||
|
parser.error("--api-hash or TELETHON_API_HASH is required")
|
||||||
|
return args
|
||||||
|
|
||||||
|
|
||||||
|
async def generate_session(args: argparse.Namespace) -> str:
|
||||||
|
from telethon import TelegramClient
|
||||||
|
from telethon.sessions import StringSession
|
||||||
|
|
||||||
|
client = TelegramClient(StringSession(), args.api_id, args.api_hash)
|
||||||
|
try:
|
||||||
|
phone = args.phone or input("Telegram phone number, including country code: ")
|
||||||
|
await client.start(phone=phone)
|
||||||
|
return client.session.save()
|
||||||
|
finally:
|
||||||
|
await client.disconnect()
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
args = parse_args()
|
||||||
|
print(
|
||||||
|
"Starting Telegram user login. The final stdout line is the TELETHON_TOKEN value.",
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
|
session_string = asyncio.run(generate_session(args))
|
||||||
|
if not session_string:
|
||||||
|
print("Failed to generate a session string.", file=sys.stderr)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
print(session_string)
|
||||||
|
print("Store this value as TELETHON_TOKEN in the Kubernetes Secret.", file=sys.stderr)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
raise SystemExit(main())
|
||||||
@@ -2,11 +2,11 @@ import os
|
|||||||
from pymongo import MongoClient
|
from pymongo import MongoClient
|
||||||
from pymongo.errors import ConnectionFailure
|
from pymongo.errors import ConnectionFailure
|
||||||
from telethon import TelegramClient
|
from telethon import TelegramClient
|
||||||
|
from telethon.sessions import StringSession
|
||||||
|
|
||||||
# Telegram configuration
|
# Telegram configuration
|
||||||
TELETHON_TOKEN = os.environ.get("TELETHON_TOKEN")
|
TELETHON_TOKEN = os.environ.get("TELETHON_TOKEN")
|
||||||
TELETHON_API_HASH = os.environ.get("TELETHON_API_HASH")
|
TELETHON_API_HASH = os.environ.get("TELETHON_API_HASH")
|
||||||
TELEGRAM_BOT_TOKEN = os.environ.get("TELEGRAM_BOT_TOKEN")
|
|
||||||
TELETHON_API_ID = int(os.environ.get("TELETHON_API_ID", 0))
|
TELETHON_API_ID = int(os.environ.get("TELETHON_API_ID", 0))
|
||||||
STAFF_CHAT_ID = int(os.environ.get("STAFF_CHAT_ID", 0))
|
STAFF_CHAT_ID = int(os.environ.get("STAFF_CHAT_ID", 0))
|
||||||
FACTORY_BOT_ID = int(os.environ.get("FACTORY_BOT_ID", 0))
|
FACTORY_BOT_ID = int(os.environ.get("FACTORY_BOT_ID", 0))
|
||||||
@@ -19,6 +19,12 @@ MONGODB_COLLECTION = os.environ.get('MONGODB_COLLECTION', '')
|
|||||||
# Logging configuration
|
# Logging configuration
|
||||||
LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO')
|
LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO')
|
||||||
|
|
||||||
|
def get_telegram_session():
|
||||||
|
"""Return a Telethon session backed by TELETHON_TOKEN when configured."""
|
||||||
|
if TELETHON_TOKEN:
|
||||||
|
return StringSession(TELETHON_TOKEN)
|
||||||
|
return 'session'
|
||||||
|
|
||||||
# MongoDB helper functions
|
# MongoDB helper functions
|
||||||
def get_mongo_client():
|
def get_mongo_client():
|
||||||
"""Create and return MongoDB client"""
|
"""Create and return MongoDB client"""
|
||||||
@@ -34,7 +40,7 @@ def get_telegram_client():
|
|||||||
"""Create and return Telegram client"""
|
"""Create and return Telegram client"""
|
||||||
try:
|
try:
|
||||||
client = TelegramClient(
|
client = TelegramClient(
|
||||||
'session',
|
get_telegram_session(),
|
||||||
TELETHON_API_ID,
|
TELETHON_API_ID,
|
||||||
TELETHON_API_HASH
|
TELETHON_API_HASH
|
||||||
)
|
)
|
||||||
@@ -65,7 +71,7 @@ def load_config():
|
|||||||
'telegram': {
|
'telegram': {
|
||||||
'api_id': TELETHON_API_ID,
|
'api_id': TELETHON_API_ID,
|
||||||
'api_hash': TELETHON_API_HASH,
|
'api_hash': TELETHON_API_HASH,
|
||||||
'bot_token': TELEGRAM_BOT_TOKEN,
|
'session': get_telegram_session(),
|
||||||
'session_file': 'session',
|
'session_file': 'session',
|
||||||
'staff_chat_id': STAFF_CHAT_ID,
|
'staff_chat_id': STAFF_CHAT_ID,
|
||||||
'factory_bot_id': FACTORY_BOT_ID
|
'factory_bot_id': FACTORY_BOT_ID
|
||||||
@@ -178,4 +184,4 @@ def get_user_admin_role(user_id: int) -> bool:
|
|||||||
return False
|
return False
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Failed to get user admin role: {e}")
|
print(f"Failed to get user admin role: {e}")
|
||||||
return False
|
return False
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ async def main():
|
|||||||
|
|
||||||
# Create Telegram client
|
# Create Telegram client
|
||||||
client = TelegramClient(
|
client = TelegramClient(
|
||||||
config['telegram']['session_file'],
|
config['telegram']['session'],
|
||||||
config['telegram']['api_id'],
|
config['telegram']['api_id'],
|
||||||
config['telegram']['api_hash']
|
config['telegram']['api_hash']
|
||||||
)
|
)
|
||||||
@@ -350,4 +350,4 @@ async def main():
|
|||||||
logger.info("Application shutdown complete")
|
logger.info("Application shutdown complete")
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
asyncio.run(main())
|
asyncio.run(main())
|
||||||
|
|||||||
Reference in New Issue
Block a user