Skip to content
Gallery
บันทึกการทำ
Share
Explore
Systems

icon picker
Python code + Systemd

ความท้าทายในการทำให้ python code ทำงานเป็น service โดยต้องปิดการเข้ารหัสในการเชื่อมต่อกับ MSSQL
Last edited 214 days ago by System Writer
Python code บน Linux ที่เขียนขึ้นมาเป็น bot รับคำสั่งจาก LINE แล้วไปค้นหาข้อมูลจาก MSSQL บน Windows server version เก่า ซึ่งไม่ได้เปิดการเข้ารหัสการเชื่อมต่อไว้ จึงเกิดปัญหาทำให้ Python code ไม่สามารถที่เรียกข้อมูลจาก MSSQL ได้
จากการค้นหาบนเน็ต และคุยกับ ChatGPT ก็ได้ solution มาประมาณหนึ่ง

สภาพแวดล้อม

Debian 11
Python 3.x + Flask + gunicorn
MS-SQL บน Windows Server

ลงมือทำ

ปิดการเข้ารหัสการเชื่อมต่อ เริ่มจากสร้างไฟล์ openssl_allow.conf โดยภายในไฟล์จะมี code ตามนี้ เป็นการปรับ security level เป็นระดับ 0
openssl_conf = openssl_init

[openssl_init]
ssl_conf = ssl_sect

[ssl_sect]
system_default = system_default_sect

[system_default_sect]
CipherString = DEFAULT@SECLEVEL=0
สร้าง bash script /opt/scripts/linebot_startup.sh สำหรับการ run Python code ด้วย gunicorn ตามรายละเอียดใน code ด้านล่าง ที่ต้องสร้าง bash script เพราะใน systemd ไม่สามารถที่จะใส่คำสั่งได้โดยตรง ปกติแล้วหากไม่ต้องสร้าง system variable สามารถที่จะใช่คำสั่ง gunicorn ได้โดยตรงใน systemd
#!/bin/bash
OPENSSL_CONF=openssl_allow.conf venv/bin/gunicorn -w 4 -b unix:/tmp/linebot.sock wsgi:app
ทำการสร้างไฟล์ /etc/systemd/system/linebot.service ตามรายละเอียดนี้
[Unit]
Description=LINE bot
After=network.target

[Service]
Type=simple
Restart=always
User=www-data
Group=www-data
WorkingDirectory=/apps/linebot
Environment="PATH=/apps/linebot/venv/bin"
ExecStart=/opt/scripts/linebot_startup.sh

[Install]
WantedBy=multi-user.target
คำสั่งนี้จะเป็นการเปิด และสั่งให้ทำงาน
systemctl daemon-reload
systemctl enable linebot.service
systemctl start linebot.service
systemctl status linebot.service
20230718 วันนี้ได้ลองปรึกษา เกี่ยวกับเรื่อง system variable กับ systemd และได้สังเกตุเห็น Environment ที่ปกติใช้อยู่แล้ว ได้ทดสอบใช้ก็ปรากฎว่าทำงานได้ ไม่ต้องสร้าง bash script
[Unit]
Description=LINE bot
After=network.target

[Service]
Type=simple
Restart=always
User=www-data
Group=www-data
WorkingDirectory=/apps/linebot
Environment="PATH=/apps/linebot/venv/bin"
Environment="OPENSSL_CONF=/apps/linebot/openssl_allow.conf"
ExecStart=/opt/scripts/linebot_startup.sh

[Install]
WantedBy=multi-user.target

สิ่งนี้ที่ได้จากการถาม Bard


Want to print your doc?
This is not the way.
Try clicking the ⋯ next to your doc name or using a keyboard shortcut (
CtrlP
) instead.