다운타임 검증
이어서 다운타임 검증을 해봅시다. 검증기간은 3일간으로 하겠습니다. 다음이 검증에 사용한 소스코드입니다.
다운타임 측정 방법
Discord의 설정이나, 소스 코드의 내용에 대해 가볍게 설명하겠습니다. (관심이 없는 분은 안 보셔도 무방합니다.) 먼저 프라이빗 채널을 만들고 거기에 Bot을 추가합니다. 이렇게 해두면 다운타임의 검증을 병행해 실시할 수 있게 되고, Bot의 부하 경감도 예상해볼 수 있습니다(소속되어 있는 채널의 메시지 밖에 취득할 수 없기 때문에).또, 프라이빗 채널 이외의 메시지에는 반응하지 않도록 설정되어 있습니다. 사용할 파일은 send.py, main.py, chk.py, chk.sh 입니다. send.py 와 chk.py 를 Raspberry Pi 상에서 서비스로서 움직이고, main.py 를 Railway 상에서 움직이고 있습니다. 전부 같은 Bot을 이용하고 있습니다. 덧붙여 이 검증에서는 Raspberry Pi 상에서 다운타임이나 에러등은 발생하지 않는 것을 전제로 하고 있습니다. chk.sh 은 다운타임을 확인하기 위한 파일성형 스크립트가 됩니다 (bash로 쓰고 있기 때문에 성능적으로 느릴 수도 있습니다. 단 12만 줄의 파일 처리에 2시간 반이나 걸렸습니다.그냥 방치하고 있으면 되니까 마음이 내키면 파일 처리 방법을 변경할까 생각중입니다. Python으로 쓸 걸 그랬나봅니다. 집필 중 ChatGPT 를 이용하여 쉘 스크립트의 코드를 Python의 코드로 변환받았는데, 50초 정도면 처리가 끝났습니다. 빠르네요.그쪽도 올려놓겠습니다). 보기 어렵지만 간단한 플로우 차트를 만들어 보았습니다(더 예쁘게 보여줄 수 있는 도식화가 있다면 알려주세요.).
동작은 다음처럼 됩니다.
send.py 의 역할이 생각보다 간단해서 프라이빗 채널에서 "test" 메시지를 2초 간격으로 계속 보내는 것만 합니다.
#!/usr/bin/env python3
import discord
import time
# 適宜置き換えて下さい
TOKEN = 'YourAccessToken'
CHANNEL_ID = 11111111
intents = discord.Intents.none()
intents.guilds = True
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print('ログインしました')
channel = client.get_channel(CHANNEL_ID)
while True:
await channel.send("test")
time.sleep(2)
client.run(TOKEN)
이어서 main.py 의 역할에 대해 설명하겠습니다. send.py 에서 보내온 "test" 메시지를 수신하면 "test" 메시지를 삭제하고 특정 메시지의 리액션 유무에 따라 리액션 추가/삭제를 수행합니다. 특정 메시지라고 하는 것은 gif 화상에서 말하는 "Main_Test" 메시지입니다. "CHANNEL_ID"는 프라이빗 채널의 ID를, "MESSAGE_ID"는 특정 메시지("Main_Test")의 ID를, "MEMBER_ID"는 main.py 를 움직이는 Bot 아이디가 되겠습니다.intents에 대해서는 부하 경감을 위해 최소한으로 하고 있습니다.intents에 대해서는 기사로 정리하고 있기 때문에 신경이 쓰이는 분은 참고해 보세요.
import discord
import os
intents = discord.Intents.none()
intents.messages = True
intents.guilds = True
intents.message_content = True
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print('ログインしました')
# Bot が所属しているチャンネルにメッセージがされた時に動作する処理
# プライベートチャンネルを用意しそこに Bot を追加している
@client.event
async def on_message(msg):
# メッセージのチャンネルがプライベートチャンネルに該当しない場合
# メッセージを無視する
txt_channel = client.get_channel(CHANNEL_ID)
if txt_channel != msg.channel:
return
# メッセージの内容が "test" の場合削除する
if msg.content == "test":
await msg.delete()
# 特定のメッセージの状態取得
message = await txt_channel.fetch_message(MESSAGE_ID)
emoji = "👍"
# 1度のみ実行
if get_flag():
global member
id = MEMBER_ID
member = await message.guild.fetch_member(id)
# リアクションの有無に応じてリアクションの追加/削除を行う
if not message.reactions:
await message.add_reaction(emoji)
else:
await message.remove_reaction(emoji,member)
# 初回の呼び出し時のみ True を返しそれ以降は False を返す
def get_flag():
global get_flag
def get_flag():
return False
return True
TOKEN = os.getenv("DISCORD_TOKEN")
CHANNEL_ID = int(os.getenv("CHANNEL_ID"))
MESSAGE_ID = int(os.getenv("MESSAGE_ID"))
MEMBER_ID = int(os.getenv("MEMBER_ID"))
client.run(TOKEN)
다음으로 chk.py 의 역할에 대해 설명하겠습니다.리액션 추가/삭제된 시간을 얻음으로써 리액션이 추가된 시간과 삭제된 시간을 time.log 파일로 출력합니다.
#!/usr/bin/env python3
import discord
import time
import datetime
# 適宜置き換えて下さい
TOKEN = 'YourAccessToken'
MESSAGE_ID = 111111
intents = discord.Intents.none()
intents.reactions = True
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print('ログインしました')
# リアクションが追加された時の処理
@client.event
async def on_raw_reaction_add(payload):
if payload.message_id != MESSAGE_ID:
return
global t_add
t_add = time.time()
diff = t_add - t_remove
func(diff)
# リアクションが削除された時の処理
@client.event
async def on_raw_reaction_remove(payload):
if payload.message_id != MESSAGE_ID:
return
global t_remove
t_remove = time.time()
# リアクションが削除された時間と追加された時間の書き出し
def func(diff):
dt = datetime.datetime.now()
f = open("./time.log","a")
f.write("logout:" + str(dt - datetime.timedelta(seconds=diff)) + "\n")
f.write("login :" + str(dt) + "\n")
f.close()
client.run(TOKEN)
마지막으로 chk.sh 파일에 대한 설명입니다. 리액션이 추가된 시간과 삭제된 시간의 차이를 취하고, 그 차이가 10초 이상일 때 다운타임으로 간주하고 있습니다. 파이썬 코드에 새로 쓴 것도 올려놓겠습니다. 당연하지만 Python에서 쓴 코드가 처리 속도는 더 빠릅니다.
#!/bin/sh
file="time.out"
echo -n > $file
date=`cat time.log|cut -c 8-|rev|cut -c 8-|rev`
declare -a ary=(); declare -a ary=($date)
size=`expr ${#ary[*]} - 1`
for i in `seq 0 2 $size`
do
echo $i $size
j=`expr $i + 1`
logdate=`echo ${ary[$i]} ${ary[$j]}`
if [ $j -eq $size ]; then
echo $logdate 1 >> $file
break
fi
k=`expr $j + 2`
t_old=`date -d "${ary[$i]} ${ary[$j]}" +%s`
t_new=`date -d "${ary[$i]} ${ary[$k]}" +%s`
diff=`expr $t_new - $t_old`
echo $logdate 1 >> $file
for l in `seq 2 $diff`
do
t=`expr $t_old + $l - 1`
datetime=`date -d @$t +"%Y-%m-%d %H:%M:%S"`
if [ $diff -gt 10 ]; then
echo $datetime 0 >> $file
else
echo $datetime 1 >> $file
fi
done
done
#!/usr/bin/env python3
import subprocess
import datetime
file = "time.out"
open(file, 'w').close()
date = subprocess.check_output("cut -c 8- time.log | rev | cut -c 8- | rev", shell=True)
ary = date.decode().split()
size = len(ary) - 1
for i in range(0, size, 2):
print(i, size)
j = i + 1
logdate = f"{ary[i]} {ary[j]}"
if j == size:
with open(file, 'a') as f:
f.write(f"{logdate} 1\n")
break
k = j + 2
t_old = datetime.datetime.strptime(logdate, "%Y-%m-%d %H:%M:%S").timestamp()
t_new = datetime.datetime.strptime(f"{ary[i]} {ary[k]}", "%Y-%m-%d %H:%M:%S").timestamp()
diff = int(t_new - t_old)
with open(file, "a") as f:
f.write(f"{logdate} 1\n")
for l in range(2, diff + 1):
t = int(t_old + l - 1)
dt = datetime.datetime.fromtimestamp(t).strftime("%Y-%m-%d %H:%M:%S")
if diff > 10:
f.write(f"{dt} 0\n")
else:
f.write(f"{dt} 1\n")
다운타임 검증결과
Railway로 약 3일 Bot을 움직여봤습니다. 다음이 그 때의 다운타임 도식이 됩니다. 다운되어 있는 것이 2회로, 각각 48초와 37초가 됩니다(알기 어렵지만 Bot을 구동하고 거의 바로 다운되어 있습니다). 상당히 안정적으로 가동해 주고 있는 것은 아닐까요?역시 24/7로 가동할 수 있다고 써있던 대로군요.
다운타임 검증 시 Discord의 채널 모습은 다음과 같습니다. 6회 "test"의 삭제가 늦어진 것을 알 수 있습니다. 2초에 한 번씩 "test" 메시지를 보내고 있기 때문에 다운타임 시간으로 따지자면 더 많이 있어도 좋다고 생각합니다만, Railway 상에서 렉이 있어서 삭제되었거나 Raspberry Pi 상에서 "test" 메시지를 보내지 않았나 하는 추측을 할 수 있습니다.Raspberry Pi 상에서 journalctl-u 서비스명으로 실행해도 특별히 에러등이 없이 가동하고 있는 것을 확인했습니다만, Raspberry Pi 상에서 "test" 메시지가 보내지 않았을 가능성이 더 높을 것 같습니다(즉, 다운타임은 거의 없는 것은 아닐까 합니다.).
또, 구동시키고 있을 때에 아래와 같은 에러가 나고 있었습니다..API 요청 제한에 걸려있는 오류입니다.
[2023-02-26 05:57:13] [WARNING ] discord.http: We are being rate limited. DELETE https://discord.com/api/v10/channels/1075739041112281120/messages/1079280900484902983 responded with 429. Retrying in 3.00 seconds.
[2023-02-26 05:57:15] [ERROR ] discord.client: Ignoring exception in on_message
Traceback (most recent call last):
File "/opt/venv/lib/python3.11/site-packages/discord/client.py", line 409, in _run_event
await coro(*args, **kwargs)
File "/app/main.py", line 18, in on_message
await msg.delete()
File "/opt/venv/lib/python3.11/site-packages/discord/message.py", line 805, in delete
await self._state.http.delete_message(self.channel.id, self.id)
File "/opt/venv/lib/python3.11/site-packages/discord/http.py", line 759, in request
raise HTTPException(response, data)
discord.errors.HTTPException: 429 Too Many Requests (error code: 40062): Service resource is being rate limited.
다음의 에러는 Discord 서버에 액세스 할 수 없다고 나오는 것입니다.
[2023-02-26 14:26:56] [ERROR ] discord.client: Ignoring exception in on_message
Traceback (most recent call last):
File "/opt/venv/lib/python3.11/site-packages/discord/client.py", line 409, in _run_event
await coro(*args, **kwargs)
File "/app/main.py", line 18, in on_message
await msg.delete()
File "/opt/venv/lib/python3.11/site-packages/discord/message.py", line 805, in delete
await self._state.http.delete_message(self.channel.id, self.id)
File "/opt/venv/lib/python3.11/site-packages/discord/http.py", line 624, in request
async with self.__session.request(method, url, **kwargs) as response:
File "/opt/venv/lib/python3.11/site-packages/aiohttp/client.py", line 1141, in __aenter__
self._resp = await self._coro
^^^^^^^^^^^^^^^^
File "/opt/venv/lib/python3.11/site-packages/aiohttp/client.py", line 560, in _request
await resp.start(conn)
File "/opt/venv/lib/python3.11/site-packages/aiohttp/client_reqrep.py", line 899, in start
message, payload = await protocol.read() # type: ignore[union-attr]
^^^^^^^^^^^^^^^^^^^^^
File "/opt/venv/lib/python3.11/site-packages/aiohttp/streams.py", line 616, in read
await self._waiter
aiohttp.client_exceptions.ClientOSError: [Errno 104] Connection reset by peer
마지막으로 send.py 과 chk.py 의 서비스 로그를 올려두겠습니다. journalctl-u 서비스명으로 로그를 확인할 수 있습니다. 경고가 나오고 있습니다만, 별 이슈 없이 가동시켜주고 있습니다.
서비스 로그
send.py
Feb 24 17:09:24 localhost.localdomain systemd[1]: Started test.
Feb 24 17:09:24 localhost.localdomain send.py[1188]: [2023-02-24 17:09:24] [INFO ] discord.client: logging in using static token
Feb 24 17:09:31 localhost.localdomain send.py[1188]: [2023-02-24 17:09:31] [INFO ] discord.gateway: Shard ID None has connected to Gateway (Session ID: 1cad9a20f6f03513e0835c4461a31348).
Feb 24 18:56:27 localhost.localdomain send.py[1188]: [2023-02-24 18:56:27] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 24 19:36:18 localhost.localdomain send.py[1188]: [2023-02-24 19:36:18] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 24 20:45:26 localhost.localdomain send.py[1188]: [2023-02-24 20:45:26] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 24 21:27:41 localhost.localdomain send.py[1188]: [2023-02-24 21:27:41] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 24 21:57:43 localhost.localdomain send.py[1188]: [2023-02-24 21:57:43] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 24 23:11:15 localhost.localdomain send.py[1188]: [2023-02-24 23:11:15] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 25 00:58:12 localhost.localdomain send.py[1188]: [2023-02-25 00:58:12] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 25 01:26:08 localhost.localdomain send.py[1188]: [2023-02-25 01:26:08] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 25 01:28:20 localhost.localdomain send.py[1188]: [2023-02-25 01:28:20] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 25 03:20:08 localhost.localdomain send.py[1188]: [2023-02-25 03:20:08] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 25 05:08:34 localhost.localdomain send.py[1188]: [2023-02-25 05:08:34] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 25 06:49:13 localhost.localdomain send.py[1188]: [2023-02-25 06:49:13] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 25 09:04:01 localhost.localdomain send.py[1188]: [2023-02-25 09:04:01] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 25 09:22:41 localhost.localdomain send.py[1188]: [2023-02-25 09:22:41] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 25 12:34:14 localhost.localdomain send.py[1188]: [2023-02-25 12:34:14] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 25 14:15:04 localhost.localdomain send.py[1188]: [2023-02-25 14:15:04] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 25 14:41:53 localhost.localdomain send.py[1188]: [2023-02-25 14:41:53] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 25 16:14:21 localhost.localdomain send.py[1188]: [2023-02-25 16:14:21] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 25 18:36:02 localhost.localdomain send.py[1188]: [2023-02-25 18:36:02] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 25 19:22:54 localhost.localdomain send.py[1188]: [2023-02-25 19:22:54] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 25 22:02:46 localhost.localdomain send.py[1188]: [2023-02-25 22:02:46] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 25 23:56:33 localhost.localdomain send.py[1188]: [2023-02-25 23:56:33] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 26 03:02:04 localhost.localdomain send.py[1188]: [2023-02-26 03:02:04] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 26 04:57:43 localhost.localdomain send.py[1188]: [2023-02-26 04:57:43] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 26 06:38:54 localhost.localdomain send.py[1188]: [2023-02-26 06:38:54] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 1cad9a20f6f03513e0835c4461a31348.
Feb 26 09:03:34 localhost.localdomain send.py[1188]: [2023-02-26 09:03:34] [INFO ] discord.gateway: Shard ID None session has been invalidated.
Feb 26 09:03:46 localhost.localdomain send.py[1188]: [2023-02-26 09:03:46] [INFO ] discord.gateway: Shard ID None has connected to Gateway (Session ID: adc5a05990c5d655620b72c2794d2895).
Feb 26 11:54:51 localhost.localdomain send.py[1188]: [2023-02-26 11:54:51] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session adc5a05990c5d655620b72c2794d2895.
Feb 26 13:00:38 localhost.localdomain send.py[1188]: [2023-02-26 13:00:38] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session adc5a05990c5d655620b72c2794d2895.
Feb 26 14:53:04 localhost.localdomain send.py[1188]: [2023-02-26 14:53:04] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 15:34:24 localhost.localdomain send.py[1188]: [2023-02-26 15:34:24] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session adc5a05990c5d655620b72c2794d2895.
Feb 26 16:28:45 localhost.localdomain send.py[1188]: [2023-02-26 16:28:45] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 16:29:29 localhost.localdomain send.py[1188]: [2023-02-26 16:29:29] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 17:43:44 localhost.localdomain send.py[1188]: [2023-02-26 17:43:44] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 17:50:20 localhost.localdomain send.py[1188]: [2023-02-26 17:50:20] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 17:51:05 localhost.localdomain send.py[1188]: [2023-02-26 17:51:05] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 17:51:49 localhost.localdomain send.py[1188]: [2023-02-26 17:51:49] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 17:52:33 localhost.localdomain send.py[1188]: [2023-02-26 17:52:33] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 17:53:17 localhost.localdomain send.py[1188]: [2023-02-26 17:53:17] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 17:54:01 localhost.localdomain send.py[1188]: [2023-02-26 17:54:01] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 17:54:45 localhost.localdomain send.py[1188]: [2023-02-26 17:54:45] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 17:55:29 localhost.localdomain send.py[1188]: [2023-02-26 17:55:29] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 17:56:13 localhost.localdomain send.py[1188]: [2023-02-26 17:56:13] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 18:03:24 localhost.localdomain send.py[1188]: [2023-02-26 18:03:24] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session adc5a05990c5d655620b72c2794d2895.
Feb 26 21:15:12 localhost.localdomain send.py[1188]: [2023-02-26 21:15:12] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 21:15:56 localhost.localdomain send.py[1188]: [2023-02-26 21:15:56] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 21:16:40 localhost.localdomain send.py[1188]: [2023-02-26 21:16:40] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 21:17:24 localhost.localdomain send.py[1188]: [2023-02-26 21:17:24] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 21:18:09 localhost.localdomain send.py[1188]: [2023-02-26 21:18:09] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 21:24:45 localhost.localdomain send.py[1188]: [2023-02-26 21:24:45] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 26 21:55:55 localhost.localdomain send.py[1188]: [2023-02-26 21:55:55] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session adc5a05990c5d655620b72c2794d2895.
Feb 26 22:35:30 localhost.localdomain send.py[1188]: [2023-02-26 22:35:30] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session adc5a05990c5d655620b72c2794d2895.
Feb 27 02:17:03 localhost.localdomain send.py[1188]: [2023-02-27 02:17:03] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session adc5a05990c5d655620b72c2794d2895.
Feb 27 03:41:26 localhost.localdomain send.py[1188]: [2023-02-27 03:41:26] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session adc5a05990c5d655620b72c2794d2895.
Feb 27 05:15:51 localhost.localdomain send.py[1188]: [2023-02-27 05:15:51] [INFO ] discord.gateway: Shard ID None session has been invalidated.
Feb 27 05:16:17 localhost.localdomain send.py[1188]: [2023-02-27 05:16:17] [INFO ] discord.gateway: Shard ID None has connected to Gateway (Session ID: 91e5d75478fc300c3f684999054cd473).
Feb 27 05:44:50 localhost.localdomain send.py[1188]: [2023-02-27 05:44:50] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 91e5d75478fc300c3f684999054cd473.
Feb 27 08:40:14 localhost.localdomain send.py[1188]: [2023-02-27 08:40:14] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 91e5d75478fc300c3f684999054cd473.
Feb 27 09:11:57 localhost.localdomain send.py[1188]: [2023-02-27 09:11:57] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 91e5d75478fc300c3f684999054cd473.
Feb 27 09:45:12 localhost.localdomain send.py[1188]: [2023-02-27 09:45:12] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 91e5d75478fc300c3f684999054cd473.
Feb 27 13:12:28 localhost.localdomain send.py[1188]: [2023-02-27 13:12:28] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 91e5d75478fc300c3f684999054cd473.
Feb 27 14:25:21 localhost.localdomain send.py[1188]: [2023-02-27 14:25:21] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 46.1s behind.
Feb 27 15:14:11 localhost.localdomain send.py[1188]: [2023-02-27 15:14:11] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 27 15:14:57 localhost.localdomain send.py[1188]: [2023-02-27 15:14:57] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 46.1s behind.
Feb 27 15:15:41 localhost.localdomain send.py[1188]: [2023-02-27 15:15:41] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 44.1s behind.
Feb 27 15:16:27 localhost.localdomain send.py[1188]: [2023-02-27 15:16:27] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 46.1s behind.
Feb 27 16:16:35 localhost.localdomain send.py[1188]: [2023-02-27 16:16:35] [WARNING ] discord.gateway: Can't keep up, shard ID None websocket is 46.1s behind.
Feb 27 16:47:32 localhost.localdomain send.py[1188]: [2023-02-27 16:47:32] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session 91e5d75478fc300c3f684999054cd473.
chk.py log
Feb 24 17:09:23 localhost.localdomain systemd[1]: Started test2.
Feb 24 17:09:24 localhost.localdomain chk.py[1182]: [2023-02-24 17:09:24] [INFO ] discord.client: logging in using static token
Feb 24 17:09:25 localhost.localdomain chk.py[1182]: [2023-02-24 17:09:25] [INFO ] discord.gateway: Shard ID None has connected to Gateway (Session ID: c422723bdf1d66ffbbfe84418c38a5d0).
Feb 24 17:09:33 localhost.localdomain chk.py[1182]: [2023-02-24 17:09:33] [ERROR ] discord.client: Ignoring exception in on_raw_reaction_add
Feb 24 17:09:33 localhost.localdomain chk.py[1182]: Traceback (most recent call last):
Feb 24 17:09:33 localhost.localdomain chk.py[1182]: File "/usr/local/lib/python3.11/site-packages/discord/client.py", line 409, in _run_event
Feb 24 17:09:33 localhost.localdomain chk.py[1182]: await coro(*args, **kwargs)
Feb 24 17:09:33 localhost.localdomain chk.py[1182]: File "/home/web/discord/downtimetest/railway/chk.py", line 22, in on_raw_reaction_add
Feb 24 17:09:33 localhost.localdomain chk.py[1182]: diff = t_add - t_remove
Feb 24 17:09:33 localhost.localdomain chk.py[1182]: ^^^^^^^^
Feb 24 17:09:33 localhost.localdomain chk.py[1182]: NameError: name 't_remove' is not defined
Feb 24 21:05:04 localhost.localdomain chk.py[1182]: [2023-02-24 21:05:04] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 24 22:21:36 localhost.localdomain chk.py[1182]: [2023-02-24 22:21:36] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 25 01:42:46 localhost.localdomain chk.py[1182]: [2023-02-25 01:42:46] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 25 05:19:51 localhost.localdomain chk.py[1182]: [2023-02-25 05:19:51] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 25 06:19:04 localhost.localdomain chk.py[1182]: [2023-02-25 06:19:04] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 25 08:29:03 localhost.localdomain chk.py[1182]: [2023-02-25 08:29:03] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 25 12:28:49 localhost.localdomain chk.py[1182]: [2023-02-25 12:28:49] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 25 16:14:43 localhost.localdomain chk.py[1182]: [2023-02-25 16:14:43] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 25 19:29:03 localhost.localdomain chk.py[1182]: [2023-02-25 19:29:03] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 25 20:14:56 localhost.localdomain chk.py[1182]: [2023-02-25 20:14:56] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 25 23:06:45 localhost.localdomain chk.py[1182]: [2023-02-25 23:06:45] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 25 23:51:35 localhost.localdomain chk.py[1182]: [2023-02-25 23:51:35] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 26 03:06:28 localhost.localdomain chk.py[1182]: [2023-02-26 03:06:28] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 26 04:16:59 localhost.localdomain chk.py[1182]: [2023-02-26 04:16:59] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 26 06:23:23 localhost.localdomain chk.py[1182]: [2023-02-26 06:23:23] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 26 09:52:53 localhost.localdomain chk.py[1182]: [2023-02-26 09:52:53] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 26 11:11:11 localhost.localdomain chk.py[1182]: [2023-02-26 11:11:11] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 26 13:44:11 localhost.localdomain chk.py[1182]: [2023-02-26 13:44:11] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 26 15:00:55 localhost.localdomain chk.py[1182]: [2023-02-26 15:00:55] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 26 18:26:15 localhost.localdomain chk.py[1182]: [2023-02-26 18:26:15] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 26 22:02:40 localhost.localdomain chk.py[1182]: [2023-02-26 22:02:40] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 27 01:36:20 localhost.localdomain chk.py[1182]: [2023-02-27 01:36:20] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 27 03:08:43 localhost.localdomain chk.py[1182]: [2023-02-27 03:08:43] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 27 03:37:04 localhost.localdomain chk.py[1182]: [2023-02-27 03:37:04] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 27 05:59:27 localhost.localdomain chk.py[1182]: [2023-02-27 05:59:27] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 27 07:06:08 localhost.localdomain chk.py[1182]: [2023-02-27 07:06:08] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 27 09:39:44 localhost.localdomain chk.py[1182]: [2023-02-27 09:39:44] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 27 12:40:56 localhost.localdomain chk.py[1182]: [2023-02-27 12:40:56] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 27 16:16:21 localhost.localdomain chk.py[1182]: [2023-02-27 16:16:21] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 27 18:54:17 localhost.localdomain chk.py[1182]: [2023-02-27 18:54:17] [INFO ] discord.gateway: Shard ID None has successfully RESUMED session c422723bdf1d66ffbbfe84418c38a5d0.
Feb 27 20:30:34 localhost.localdomain systemd[1]: Stopping test2...
Feb 27 20:30:34 localhost.localdomain systemd[1]: test2.service: Succeeded.
Feb 27 20:30:34 localhost.localdomain systemd[1]: Stopped test2.
마치며
사용해 본 소감으로 UI가 심플해서 굉장히 사용하기 쉬웠습니다. 다운타임도 거의 없고, 무료로 Discord Bot을 이용한다면 제1후보로 거론되지 않을까요? 성능도 좋고요.또, 디플로이한 앱의 실행 로그가 모두 남아 있어, 조금 감동했습니다(Heroku라면 남지 않기 때문에).게다가 Discord 커뮤니티가 상당히 활발해서 질문을 하자마자 답변이 돌아왔습니다. 모르는 것이 있으면(스스로 조사해 보는 것이 전제입니다만), 커뮤니티에 물어보는 것이 좋을지도 모릅니다. 매뉴얼은 그렇게까지 충실하지 않아 조금 알기 어렵다고 느꼈습니다만, 사용하는 데에 있어서는 문제 없을 것입니다.
출처1: Railway Documents
Railway Docs
Documentation for Railway
docs.railway.app