지금까지 스케줄링이 잘 작동하지 않았습니다.
이유를 확인해보니 cron 등록을 따로 하지 않고 사용하고 있었기 때문이었습니다.
python manage.py cron add
위 명령어를 이용하여 다시 시작하도록 했습니다.
크게 최근 스케줄링을 다시 살린 이유는 크게 두 가지입니다.
각 이유를 하나씩 설명드리겠습니다.
2024년 6월 23일부터 cwbeany.com 주소에 접속이 되지 않는 현상이 발생했습니다.
저는 2024년 6월 27일에 Health Check 겸 cwbeany.com에 접속을 시도했으나, 여전히 접속이 되지 않아 이 문제를 알게 되었습니다.
명확한 이유는 모르겠으나, 현재 서버는 클라우드가 아닌 집 컴퓨터를 이용해 운영 중입니다.
그런데 집의 공유기가 가끔 이상 작동하여 네트워크가 불안정할 때가 있습니다.
이번 접속 불가 문제도 아마 이런 이슈로 인해 발생한 것 같습니다.
이런 상황에서 서버가 정상 작동하는지 확인하는 유일한 방법은 직접 접속해 보는 것뿐이었습니다. 하지만 일상 생활을 하면서 매일 서버에 접속하는 것은 현실적으로 어렵습니다. 그래서 스케줄링을 통해 하루에 한 번씩 서버의 상태를 확인하고, 정상 작동 여부를 이메일로 받는 방법을 생각하게 되었습니다.
이를 위해 Crontab을 사용하여 하루에 한 번 서버가 정상 작동하는지 확인하고, 결과를 이메일로 받는 스케줄링을 설정하기로 했습니다.
config.settings.py
CRONJOBS = [
# UTC Time 기준, 15시 --> 한국 0시
...
('0 0 * * *', 'config.cron.health_check', '>> /var/www/.../health_check.log'),
]
config.cron.py
def health_check():
print("----sending----")
send_email(
f'[Beany 블로그] django-cron health check',
EMAIL_TEMPLATE_MAPPER[HEALTH_CHECK],
{},
['...'],
)
print("----sended----")
데이터 백업은 서버 운영에서 매우 중요한 부분입니다.
중요한 데이터를 정기적으로 백업해 두지 않으면, 예기치 않은 사고로 데이터가 손실될 수 있습니다. 그래서 데이터를 안전하게 보관하기 위해 정기적으로 백업 작업을 수행하고 있습니다.
여기에는 아주 뼈아픈 경험이 있습니다. 현재 블로그를 시작하기 전, 동일한 테마와 형태를 가진 도메인 nulls.co.kr을 이용해 블로그를 운영하고 있었습니다.
당시 서버는 오라클 클라우드에서 관리하고 있었는데, 어느 날 갑자기 오라클 클라우드에서 제 계정을 정지시키고 모든 데이터 접근이 불가능하게 되었습니다. (자세한 내용은 여기에서 확인할 수 있습니다.)
그때 저는 100개 이상의 블로그 글을 작성했지만, 어디에도 데이터를 백업하지 않았습니다. 오라클이라는 브랜드를 믿고 그런 작업을 했던 것이죠. 물론 백업을 하지 않은 저의 잘못도 큽니다. 이러한 경험을 다시 겪지 않기 위해, 스케줄링을 통해 일주일에 한 번 금요일마다 모든 데이터를 SQL로 추출하여 제 이메일로 받도록 작업을 설정했습니다.
config.settings.py
CRONJOBS = [
# UTC Time 기준, 15시 --> 한국 0시
...
('0 15 * * 5', 'config.cron.database_backup', '>> /var/www/.../database_backup.log'),
]
config.cron.py
def database_backup():
"""
데이터 베이스 백업
"""
HOST = settings.DATABASES['default']['HOST']
NAME = settings.DATABASES['default']['NAME']
USER = settings.DATABASES['default']['USER']
PASSWORD = settings.DATABASES['default']['PASSWORD']
print("----backup sql connecting----")
conn = pymysql.connect(
host=HOST,
user=USER,
password=PASSWORD,
database=NAME,
charset='utf8'
)
backup_path = '/var/www/...'
backup_file_name = f'nully_blog_{datetime.date.today().strftime("%Y-%m-%d")}.sql'
os.system(
f'mysqldump -h {HOST} -u {USER} -p{PASSWORD} {NAME} > {backup_path}/{backup_file_name}')
print("----backup sql created----")
conn.close()
print("----backup sql email sending----")
send_email_with_file(
f'[Beany 블로그] {datetime.date.today().strftime("%Y-%m-%d")} 데이터베이스 백업',
EMAIL_TEMPLATE_MAPPER[BACKUP_SQL],
{},
['...'],
backup_path + '/' + backup_file_name,
)
print("----backup sql email sended----")