Как я могу правильно запустить gunicorn? - PullRequest
0 голосов
/ 13 октября 2019

У меня проблемы с aiohttp. Прежде всего скажу, что я читаю документацию на официальном сайте aiohttp, в частности deploy.

Я создаю бот-телеграмму, где использую aiohttp и asyncio, потому что мне нужен фонзадачи для моего приложения. Ниже я покажу часть кода

from aiohttp import web
import aiohttp
import asyncio
import config
import telebot
import database
import ssl

STATE = ['start', 'chat_id_sp', 'nickname_sp', 'del_sp']

API_TOKEN = config.token

bot = telebot.TeleBot(API_TOKEN)

WEBHOOK_HOST = '***.***.***.***' #*-is IP of my server
WEBHOOK_PORT = 8443  # 443, 80, 88 or 8443 (port need to be 'open')
WEBHOOK_LISTEN = '0.0.0.0'  # In some VPS you may need to put here the IP addr

WEBHOOK_SSL_CERT = './webhook_cert.pem'  # Path to the ssl certificate
WEBHOOK_SSL_PRIV = './webhook_pkey.pem'  # Path to the ssl private key

WEBHOOK_URL_BASE = "https://{}:{}".format(WEBHOOK_HOST, WEBHOOK_PORT)
WEBHOOK_URL_PATH = "/{}/".format(API_TOKEN)

app = web.Application()

# Process webhook calls, BOT PART
async def handle(request):
    if request.match_info.get('token') == bot.token:
        request_body_dict = await request.json()
        update = telebot.types.Update.de_json(request_body_dict)
        bot.process_new_updates([update])
        return web.Response()
    else:
        return web.Response(status=403)

# background tasks
async def check_logs():
    while True:
        database.load_btc_wallets_and_nicknames()
        await asyncio.sleep(59)
        database.update_life_time_of_wallets()
        await asyncio.sleep(1)
        database.delete_wallet_if_time()
        await asyncio.sleep(30)
        database.check_balance_on_wallets()
        await asyncio.sleep(30)

async def start_background_tasks(app):
    app['check_logs'] = app.loop.create_task(check_logs())

async def cleanup_background_tasks(app):
    app['check_logs'].cancel()
    await app['check_logs']

app.router.add_post('/{token}/', handle)
app.on_startup.append(start_background_tasks)
app.on_cleanup.append(cleanup_background_tasks)

# command start to Bot, BOT PART
@bot.message_handler(commands=['start'])
def command(message):
    bot.send_message(message.chat.id, 'Main menu', reply_markup=keyboard)

bot.remove_webhook() 

time.sleep(1)


# Build ssl context
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.load_cert_chain(WEBHOOK_SSL_CERT, WEBHOOK_SSL_PRIV)

bot.set_webhook(url=WEBHOOK_URL_BASE + WEBHOOK_URL_PATH,
                certificate=open(WEBHOOK_SSL_CERT, 'r'))

Если я добавлю эту часть кода:

    web.run_app(
        app,
        host=WEBHOOK_LISTEN,
        port=WEBHOOK_PORT,
        ssl_context=context,
        )

И в venv на моем сервере введите: python3 main.py Все работает отлично. Но когда я хочу начать с gunicorn и просто войти (я удаляю web.run_app при запуске gunicorn) gunicorn main:app --bind localhost:8443 --worker-class aiohttp.GunicornWebWorker Моя фоновая задача работает отлично, но часть бота не работает. В чем может быть моя проблема?

...