mirror of
				https://github.com/civsocit/olgram.git
				synced 2025-10-30 00:43:25 +00:00 
			
		
		
		
	add server
This commit is contained in:
		
							parent
							
								
									fc9280881c
								
							
						
					
					
						commit
						c1d29f4d8c
					
				|  | @ -7,6 +7,8 @@ services: | ||||||
|       - release.env |       - release.env | ||||||
|     volumes: |     volumes: | ||||||
|       - database:/var/lib/postgresql/data |       - database:/var/lib/postgresql/data | ||||||
|  |     networks: | ||||||
|  |       - traefik | ||||||
|   redis: |   redis: | ||||||
|     image: 'bitnami/redis:latest' |     image: 'bitnami/redis:latest' | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|  | @ -16,11 +18,21 @@ services: | ||||||
|       - redis-db:/bitnami/redis/data |       - redis-db:/bitnami/redis/data | ||||||
|     env_file: |     env_file: | ||||||
|       - release.env |       - release.env | ||||||
|  |     networks: | ||||||
|  |       - traefik | ||||||
|   olgram: |   olgram: | ||||||
|     image: ghcr.io/civsocit/olgram/bot:stable |     image: ghcr.io/civsocit/olgram/bot:stable | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|  |     networks: | ||||||
|  |       - traefik | ||||||
|     labels: |     labels: | ||||||
|       - 'com.centurylinklabs.watchtower.enable="true"' |       - 'com.centurylinklabs.watchtower.enable="true"' | ||||||
|  |       - "traefik.enable=true" | ||||||
|  |       - "traefik.http.routers.static.rule=Host(`test.civsoc.it`)" | ||||||
|  |       - "traefik.http.routers.static.tls=true" | ||||||
|  |       - "traefik.http.routers.static.tls.certresolver=le" | ||||||
|  |       - "traefik.http.routers.static.entrypoints=websecure" | ||||||
|  |       - "traefik.docker.network=traefik" | ||||||
|     env_file: |     env_file: | ||||||
|       - release.env |       - release.env | ||||||
|     depends_on: |     depends_on: | ||||||
|  | @ -32,8 +44,40 @@ services: | ||||||
|       - /var/run/docker.sock:/var/run/docker.sock |       - /var/run/docker.sock:/var/run/docker.sock | ||||||
|       - ./config.json:/config.json |       - ./config.json:/config.json | ||||||
|     command: --interval 30 |     command: --interval 30 | ||||||
|  |     networks: | ||||||
|  |       - traefik | ||||||
|  | 
 | ||||||
|  |   traefik: | ||||||
|  |     image: traefik:v2.4 | ||||||
|  |     container_name: olgram_traefik | ||||||
|  |     restart: unless-stopped | ||||||
|  |     ports: | ||||||
|  |       - "80:80" | ||||||
|  |       - "443:443" | ||||||
|  |     networks: | ||||||
|  |       - traefik | ||||||
|  |     volumes: | ||||||
|  |       - /etc/localtime:/etc/localtime:ro | ||||||
|  |       - /var/run/docker.sock:/var/run/docker.sock:ro | ||||||
|  |       - ./acme:/acme | ||||||
|  |     command: | ||||||
|  |       - --entrypoints.web.address=:80 | ||||||
|  |       - --entrypoints.websecure.address=:443 | ||||||
|  |       - --providers.docker=true | ||||||
|  |       - --providers.docker.endpoint=unix:///var/run/docker.sock | ||||||
|  |       - --providers.docker.exposedByDefault=false | ||||||
|  |       - --providers.docker.network=traefik | ||||||
|  |       - --certificatesresolvers.le.acme.email=youmustfly@civsoc.it | ||||||
|  |       - --certificatesresolvers.le.acme.storage=/acme/acme.json | ||||||
|  |       - --certificatesresolvers.le.acme.tlschallenge=false | ||||||
|  |       - --certificatesresolvers.le.acme.httpchallenge=true | ||||||
|  |       - --certificatesresolvers.le.acme.httpchallenge.entrypoint=web | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| volumes: | volumes: | ||||||
|   database: |   database: | ||||||
|   redis-db: |   redis-db: | ||||||
|  | 
 | ||||||
|  | networks: | ||||||
|  |   traefik: | ||||||
|  |     driver: bridge | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| #!/bin/sh | #!/bin/sh | ||||||
| set -e | set -e | ||||||
| 
 | 
 | ||||||
|  | sleep 20 | ||||||
| aerich upgrade | aerich upgrade | ||||||
| python main.py | python main.py | ||||||
							
								
								
									
										3
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								main.py
									
									
									
									
									
								
							|  | @ -9,6 +9,8 @@ import olgram.commands.start  # noqa: F401 | ||||||
| import olgram.commands.menu  # noqa: F401 | import olgram.commands.menu  # noqa: F401 | ||||||
| import olgram.commands.bot_actions  # noqa: F401 | import olgram.commands.bot_actions  # noqa: F401 | ||||||
| 
 | 
 | ||||||
|  | from server.server import main as server_main | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| async def init_database(): | async def init_database(): | ||||||
|     await Tortoise.init(config=TORTOISE_ORM) |     await Tortoise.init(config=TORTOISE_ORM) | ||||||
|  | @ -22,6 +24,7 @@ def main(): | ||||||
|     loop.run_until_complete(init_database()) |     loop.run_until_complete(init_database()) | ||||||
| 
 | 
 | ||||||
|     loop.create_task(dp.start_polling()) |     loop.create_task(dp.start_polling()) | ||||||
|  |     loop.create_task(server_main().start()) | ||||||
| 
 | 
 | ||||||
|     loop.run_forever() |     loop.run_forever() | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										5
									
								
								olgram/migrations/models/1_20210909220512_update.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								olgram/migrations/models/1_20210909220512_update.sql
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | ||||||
|  | -- upgrade -- | ||||||
|  | CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; | ||||||
|  | ALTER TABLE "bot" ADD "code" UUID NOT NULL DEFAULT uuid_generate_v4(); | ||||||
|  | -- downgrade -- | ||||||
|  | ALTER TABLE "bot" DROP COLUMN "code"; | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| from tortoise.models import Model | from tortoise.models import Model | ||||||
| from tortoise import fields | from tortoise import fields | ||||||
| 
 | from uuid import uuid4 | ||||||
| from textwrap import dedent | from textwrap import dedent | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -9,6 +9,7 @@ class Bot(Model): | ||||||
|     token = fields.CharField(max_length=50, unique=True) |     token = fields.CharField(max_length=50, unique=True) | ||||||
|     owner = fields.ForeignKeyField("models.User", related_name="bots") |     owner = fields.ForeignKeyField("models.User", related_name="bots") | ||||||
|     name = fields.CharField(max_length=33) |     name = fields.CharField(max_length=33) | ||||||
|  |     code = fields.UUIDField(default=uuid4, index=True) | ||||||
|     start_text = fields.TextField(default=dedent(""" |     start_text = fields.TextField(default=dedent(""" | ||||||
|     Здравствуйте! |     Здравствуйте! | ||||||
|     Напишите ваш вопрос и мы ответим вам в ближайшее время. |     Напишите ваш вопрос и мы ответим вам в ближайшее время. | ||||||
|  |  | ||||||
|  | @ -38,6 +38,14 @@ class ServerSettings(AbstractSettings): | ||||||
|     def hook_port(cls) -> int: |     def hook_port(cls) -> int: | ||||||
|         return int(cls._get_env("WEBHOOK_PORT")) |         return int(cls._get_env("WEBHOOK_PORT")) | ||||||
| 
 | 
 | ||||||
|  |     @classmethod | ||||||
|  |     def app_host(cls) -> str: | ||||||
|  |         return "olgram" | ||||||
|  | 
 | ||||||
|  |     @classmethod | ||||||
|  |     def app_port(cls) -> int: | ||||||
|  |         return 80 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| class BotSettings(AbstractSettings): | class BotSettings(AbstractSettings): | ||||||
|     @classmethod |     @classmethod | ||||||
|  |  | ||||||
|  | @ -1,26 +1,31 @@ | ||||||
| from aiogram import Bot | from aiogram import Bot as AioBot, Dispatcher | ||||||
| import hashlib | from aiogram.dispatcher.webhook import SendMessage, WebhookRequestHandler | ||||||
|  | from olgram.models.models import Bot | ||||||
|  | from aiohttp import web | ||||||
|  | import asyncio | ||||||
|  | import aiohttp | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| from olgram.settings import ServerSettings | from olgram.settings import ServerSettings | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def path_for_bot(token: str) -> str: | def path_for_bot(bot: Bot) -> str: | ||||||
|     return "/" + hashlib.md5(token.encode("UTF-8")).hexdigest() |     return "/" + bot.code | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def url_for_bot(token: str) -> str: | def url_for_bot(bot: Bot) -> str: | ||||||
|     return f"https://{ServerSettings.hook_host()}:{ServerSettings.hook_port()}" + path_for_bot(token) |     return f"https://{ServerSettings.hook_host()}:{ServerSettings.hook_port()}" + path_for_bot(bot) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| async def register_token(token: str) -> bool: | async def register_token(bot: Bot) -> bool: | ||||||
|     """ |     """ | ||||||
|     Зарегистрировать токен |     Зарегистрировать токен | ||||||
|     :param token: токен |     :param bot: Бот | ||||||
|     :return: получилось ли |     :return: получилось ли | ||||||
|     """ |     """ | ||||||
|     bot = Bot(token) |     a_bot = AioBot(bot.token) | ||||||
|     res = await bot.set_webhook(url_for_bot(token)) |     res = await a_bot.set_webhook(url_for_bot(bot)) | ||||||
|     await bot.session.close() |     await a_bot.session.close() | ||||||
|     return res |     return res | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -30,5 +35,42 @@ async def unregister_token(token: str): | ||||||
|     :param token: токен |     :param token: токен | ||||||
|     :return: |     :return: | ||||||
|     """ |     """ | ||||||
|     bot = Bot(token) |     bot = AioBot(token) | ||||||
|     await bot.delete_webhook() |     await bot.delete_webhook() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | async def cmd_start(message, *args, **kwargs): | ||||||
|  |     return SendMessage(chat_id=message.chat.id, text=f'Hi from webhook, bot {message.via_bot}', | ||||||
|  |                        reply_to_message_id=message.message_id) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class CustomRequestHandler(WebhookRequestHandler): | ||||||
|  |     def get_dispatcher(self): | ||||||
|  |         """ | ||||||
|  |         Get Dispatcher instance from environment | ||||||
|  | 
 | ||||||
|  |         :return: :class:`aiogram.Dispatcher` | ||||||
|  |         """ | ||||||
|  |         key = self.request.url.path[1:] | ||||||
|  | 
 | ||||||
|  |         bot = await Bot.filter(code=key).first() | ||||||
|  |         if not bot: | ||||||
|  |             return None | ||||||
|  | 
 | ||||||
|  |         dp = Dispatcher(AioBot(bot.token)) | ||||||
|  | 
 | ||||||
|  |         dp.register_message_handler(cmd_start, commands=['start']) | ||||||
|  | 
 | ||||||
|  |         return dp | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     loop = asyncio.get_event_loop() | ||||||
|  | 
 | ||||||
|  |     app = web.Application() | ||||||
|  |     app.router.add_route('*', r"/{name}", CustomRequestHandler, name='webhook_handler') | ||||||
|  | 
 | ||||||
|  |     runner = aiohttp.web.AppRunner(app) | ||||||
|  |     loop.run_until_complete(runner.setup()) | ||||||
|  |     site = aiohttp.web.TCPSite(runner, host=ServerSettings.app_host(), port=ServerSettings.app_port()) | ||||||
|  |     return site | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user