ឯកសារអ្នកអភិវឌ្ឍន៍
ភាសាខ្មែរ

ការដំណើរការម៉ាស៊ីនមេ

ការដំឡើងម៉ាស៊ីនមេ

របៀបដំឡើង និងដំណើរការម៉ាស៊ីនមេ Pabal លើម៉ាស៊ីនមេមួយគ្រឿងដែលបើកចំហលើអ៊ីនធឺណិត ដោយប្រើ Docker Compose។

នេះជារបៀបដំឡើងម៉ាស៊ីនមេ Pabal លើម៉ាស៊ីនមេមួយគ្រឿងដែលបើកចំហលើអ៊ីនធឺណិត។ យើងដំណើរការ container បី — ម៉ាស៊ីនមេ Pabal · PostgreSQL · Caddy (HTTPS) — ដោយ Docker Compose ហើយទិន្នន័យទាំងអស់ដែលមិនត្រូវបាត់ ត្រូវបានbind ទៅថតនៅលើម៉ាស៊ីន (host)។ គ្រាន់តែធ្វើតាមលំដាប់ពីលើចុះក្រោម។

តម្លៃឧទាហរណ៍ក្នុងឯកសារនេះ

domain pabal.me, IP សាធារណៈរបស់ម៉ាស៊ីនមេ 203.0.113.10 (អាសយដ្ឋានសម្រាប់ពន្យល់ — សូមអានជំនួសដោយ IP ពិតរបស់អ្នក), ទីតាំងកូដប្រភព /opt/pabal, ទីតាំងទិន្នន័យ /srv/pabal, ប្រព័ន្ធប្រតិបត្តិការ Ubuntu 24.04 LTS។ ឯកសារដែលត្រូវការ មាននៅក្នុងថត deploy/ នៃឃ្លាំងកូដ។

ទិដ្ឋភាពរួម

អ៊ីនធឺណិត docker compose · ssemiya-net /srv/pabal (bind mount) កម្មវិធី PabalPabal.app កម្មវិធីរុករក · បូតគេហទំព័រ · Bot API ប្រតិបត្តិករSSH pabal-server MTProto :8443 វេប·Bot API·គ្រប់គ្រង :8080 uid 1000 · JRE 21 webhook → បូត (HTTPS) pabal-caddy:80 · :443 TLS ស្វ័យប្រវត្តិ pabal-postgres 16បណ្តាញខាងក្នុង · គ្មានច្រក pabal_server/keys · សោ RSA pabal_server/data · រូប·ការកំណត់ pabal_server/logs postgres_data/ · ការសន្ទនា caddy/ · វិញ្ញាបនបត្រ backups/ · backup.sh MTProto :8443 (អ៊ិនគ្រីបខ្លួនឯង) HTTPS :443 SSH tunnel → 127.0.0.1:8080/admin/
ម៉ាស៊ីនមេមួយ container បី ហើយអ្វីដែលត្រូវរក្សាទុក ស្ថិតនៅក្នុង /srv/pabal ទាំងអស់

ការពន្យល់ដ្យាក្រាម

  • តំបន់បី៖ អ្នកប្រើនៅលើអ៊ីនធឺណិត → container បីនៅលើម៉ាស៊ីនមេផលិតកម្ម → ថត bind នៅលើថាសរបស់ម៉ាស៊ីន (host)។ container អាចលុប និងបង្កើតឡើងវិញនៅពេលណាក៏បាន ហើយអ្វីដែលត្រូវរក្សាទុក ស្ថិតនៅក្នុង /srv/pabal ទាំងអស់
  • មានច្រកចូលតែពីរប៉ុណ្ណោះ៖ កម្មវិធីភ្ជាប់ទៅម៉ាស៊ីនមេដោយផ្ទាល់តាមច្រក MTProto (មិនត្រូវការ HTTPS ព្រោះវាអ៊ិនគ្រីបដោយខ្លួនឯង) ហើយគេហទំព័រ ឯកសារ និង Bot API ឆ្លងកាត់ច្រក 443 របស់ Caddy។ Caddy រារាំងផ្លូវសម្រាប់ការគ្រប់គ្រង (/admin, /health …) ហើយបញ្ជូនបន្តតែផ្លូវផ្សេងទៀត។
  • បន្ទាត់ដាច់ៗពណ៌ក្រហម ជាផ្លូវសម្រាប់តែប្រតិបត្តិករ។ ទំព័រគ្រប់គ្រងបើកតែនៅ 127.0.0.1:8080 របស់ម៉ាស៊ីនមេ ដូច្នេះអាចចូលបានតែតាម SSH tunnel។ PostgreSQL គ្មានច្រកបើកទៅខាងក្រៅតែម្តង។
  • ប្រអប់ក្រហមពីរ គឺជាទិន្នន័យសំខាន់បំផុត។ សោ RSA ក្នុង pabal_server/keys ត្រូវបានបង្កប់ក្នុងកម្មវិធីពេល build ដូច្នេះបើបាត់ ត្រូវចែកចាយកម្មវិធីទាំងអស់ឡើងវិញ ហើយ postgres_data/ មានគណនី និងការសន្ទនាទាំងអស់។ ទាំងពីរនេះជាអាទិភាពទីមួយនៃការបម្រុងទុក។
  • ព្រួញពណ៌ប្រផេះ គឺជាការរក្សាទុក៖ ម៉ាស៊ីនមេសរសេរសោ រូបថត ការកំណត់ និង log, PostgreSQL សរសេរព្រឹត្តិការណ៍ (event) ហើយ Caddy សរសេរវិញ្ញាបនបត្រ ទៅក្នុងថតរៀងៗខ្លួន។

អ្វីដែលត្រូវរៀបចំ

ធាតុខ្លឹមសារ
ម៉ាស៊ីនមេUbuntu 24.04 LTS សម្រាប់ចាប់ផ្តើម 2 vCPU · 4 GB RAM · 40 GB SSD។ ពេលអ្នកប្រើ និងសារកើនឡើង សូមបង្កើនអង្គចងចាំជាមុនសិន
IPv4 សាធារណៈIP ថេរ។ កម្មវិធីត្រូវបាន build ដោយកាន់អាសយដ្ឋានម៉ាស៊ីនមេជា IP ហើយម៉ាស៊ីនមេក៏ប្រាប់កម្មវិធីជា IP ដែរ
Domaindomain មួយដែលអ្នកអាចកែ DNS បាន (A record)
មធ្យោបាយបញ្ជូនលេខកូដចុះឈ្មោះគណនី SMS (Twilio · Solapi · webhook) ឬអ៊ីមែល (SMTP) មួយ
MacMac មួយសម្រាប់ build កម្មវិធី (Pabal.app) សម្រាប់ម៉ាស៊ីនមេនេះ

ច្រក (port)

ច្រកអ្នកណាបើកការពិពណ៌នា
22/tcpប្រតិបត្តិករណែនាំឲ្យបើកតែ IP ប្រតិបត្តិករSSH
80/tcpCaddyទាំងអស់ចេញវិញ្ញាបនបត្រ · បញ្ជូនទៅ HTTPS
443/tcp, 443/udpCaddyទាំងអស់គេហទំព័រ · ឯកសារ · Bot API (udp សម្រាប់ HTTP/3)
8443/tcpម៉ាស៊ីនមេទាំងអស់ការតភ្ជាប់របស់កម្មវិធី (MTProto)
8080/tcpម៉ាស៊ីនមេមិនបើកទំព័រគ្រប់គ្រង · health check — តែនៅ 127.0.0.1 របស់ម៉ាស៊ីនមេ
5432/tcpPostgreSQLមិនបើកតែក្នុងបណ្តាញខាងក្នុងរបស់ container
ហេតុអ្វីច្រករបស់កម្មវិធីមិនមែន 443

ច្រក 443 ត្រូវបានប្រើដោយគេហទំព័រ (HTTPS)។ MTProto មិនមែនជា HTTP ឬ TLS ទេ ដូច្នេះមិនអាចចែកទទួលលើច្រកតែមួយបានទេ។ បើអ្នកចង់ឲ្យកម្មវិធីក៏ទទួលតាម 443 ដែរ ដោយសារបណ្តាញក្រុមហ៊ុន ឬសាលារៀនដែលរារាំងច្រកមិនសូវប្រើ សូមទទួលIP មួយទៀត ហើយផ្តល់ច្រក 443 នៃ IP នោះឲ្យម៉ាស៊ីនមេ (ក្នុង .env កំណត់ PUBLIC_IP ជា IP ទីពីរ MTPROTO_PORT=443 ហើយបែងចែកដោយភ្ជាប់ IP ទៅនឹងច្រកក្នុងឯកសារ compose)។ ដោយសារម៉ាស៊ីនមេប្រាប់កម្មវិធីថា "សូមភ្ជាប់តាមច្រកនេះនៃ IP នេះ" សូមរក្សាច្រកកម្មវិធីខាងក្នុង និងខាងក្រៅ container ឲ្យដូចគ្នា។

1. រៀបចំម៉ាស៊ីនមេ

sudo apt update && sudo apt -y upgrade
timedatectl                      # ពិនិត្យថាបង្ហាញ "System clock synchronized: yes"

ការធ្វើសមកាលកម្មពេលវេលាគឺចាំបាច់។ ដោយសារលេខសារ MTProto បង្កើតចេញពីពេលវេលា បើនាឡិការបស់ម៉ាស៊ីនមេខុស កម្មវិធីនឹងភ្ជាប់ម្តងហើយម្តងទៀត។ បើជា no សូមដំណើរការ sudo timedatectl set-ntp true

# ជញ្ជាំងភ្លើង
sudo ufw allow OpenSSH           # បើអាច៖ sudo ufw allow from <IP ប្រតិបត្តិករ> to any port 22
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 443/udp
sudo ufw allow 8443/tcp
sudo ufw enable

# Docker (script ដំឡើងផ្លូវការ)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER     # ចូលម្តងទៀត ដើម្បីប្រើ docker ដោយគ្មាន sudo
docker compose version            # v2 ឡើងទៅ
Docker និង ufw

ច្រកដែល Docker បើក (ports:) ត្រូវបានបើកដោយមិនគិតពីច្បាប់ ufw ទេ។ ដូច្នេះឯកសារ compose បើកតែច្រកដែលត្រូវបើកចំហ (80 · 443 · 8443) បើកច្រកគ្រប់គ្រងតែនៅ 127.0.0.1:8080 ហើយមិនបើក PostgreSQL ទេ។ សូមចងចាំចំណុចនេះ ពេលកែ ports:

2. ទាញយកកូដប្រភព

sudo mkdir -p /opt/pabal && sudo chown $USER: /opt/pabal
git clone <អាសយដ្ឋានឃ្លាំងកូដ> /opt/pabal

បើចម្លងពីកុំព្យូទ័រអភិវឌ្ឍ កុំផ្ញើសោ ទិន្នន័យ និង log (rsync --exclude 'keys/' --exclude 'data/' --exclude 'logs/' --exclude '**/target/')។ សោ RSA របស់ម៉ាស៊ីនមេផលិតកម្ម ត្រូវបានបង្កើតថ្មី ពេលម៉ាស៊ីនមេផលិតកម្មបើកជាលើកដំបូង — បើប្រើសោអភិវឌ្ឍក្នុងផលិតកម្ម កុំព្យូទ័រអភិវឌ្ឍនោះនឹងក្លាយជាកន្លែងដែលអាចឌិគ្រីបចរាចរណ៍ផលិតកម្មបាន។

3. ថតទិន្នន័យ (bind mount)

sudo mkdir -p /srv/pabal/{postgres_data,pabal_server/keys,pabal_server/data,pabal_server/logs,caddy/data,caddy/config,backups}
sudo chown -R 1000:1000 /srv/pabal/pabal_server        # container ម៉ាស៊ីនមេដំណើរការជា uid 1000
sudo chown -R $USER: /srv/pabal/backups
sudo chmod 700 /srv/pabal/pabal_server/keys /srv/pabal/backups
ថតក្នុង containerអ្វីដែលមានបើបាត់
pabal_server/keys/app/keysprivate.pem (សោឯកជន RSA របស់ម៉ាស៊ីនមេ), private.pem.pubត្រូវ build និងចែកចាយកម្មវិធីទាំងអស់ឡើងវិញ
pabal_server/data/app/dataរូបថត (media/), admin-token, operations.json (ការកំណត់លេខកូដចុះឈ្មោះ SMS និង SMTP រួមទាំងតម្លៃសម្ងាត់)រូបថត និងការកំណត់ប្រតិបត្តិការ
pabal_server/logs/app/logslog របស់ម៉ាស៊ីនមេ (បង្ហាប់រៀងរាល់ថ្ងៃ)តែកំណត់ត្រា
postgres_data/var/lib/postgresql/dataគណនី ការសន្ទនា សារ ការចូលគណនី បូត និងការកំណត់ webhook ទាំងអស់សេវាទាំងមូល
caddy/data, caddy/config/data, /configវិញ្ញាបនបត្រ HTTPSនឹងត្រូវចេញឡើងវិញ
backups(សម្រាប់តែ host)លទ្ធផលនៃ backup.sh

4. ឯកសារកំណត់ .env

cd /opt/pabal/deploy
cp .env.example .env
chmod 600 .env
openssl rand -base64 30 | tr -d '/+=' | cut -c1-32     # ដាក់តម្លៃដែលចេញមក ក្នុង POSTGRES_PASSWORD
nano .env
DOMAIN=pabal.me
PUBLIC_IP=203.0.113.10
POSTGRES_PASSWORD=(តម្លៃដែលបានបង្កើតខាងលើ)
PABAL_HOME=/srv/pabal
PABAL_SOURCE=..
PABAL_NETWORK=ssemiya-net
MTPROTO_PORT=8443
HTTP_PORT=80
HTTPS_PORT=443
ADMIN_PORT=8080
ADMIN_TOKEN=
JAVA_OPTS="-Xms512m -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=100"
តម្លៃអ្វីដែលត្រូវដាក់កំណត់ចំណាំ
DOMAINdomain របស់គេហទំព័រតំណដែលកម្មវិធីបង្កើត (pabal.me/ឈ្មោះអ្នកប្រើ) អាសយដ្ឋានឯកសារ និងការមើលតំណជាមុន ក៏ប្រើអាសយដ្ឋាននេះដែរ
PUBLIC_IPIPv4 សាធារណៈរបស់ម៉ាស៊ីនមេបើជា cloud គឺ IP សាធារណៈដែលបង្ហាញក្នុង console (មិនមែន IP ឯកជនក្នុងម៉ាស៊ីនមេទេ)
POSTGRES_PASSWORDតម្លៃចៃដន្យសូមកំណត់មុនពេលបើកជាលើកដំបូង។ PostgreSQL ប្រើតម្លៃនេះតែពេលបង្កើតថតទិន្នន័យជាលើកដំបូងប៉ុណ្ណោះ
PABAL_HOME/srv/pabalថតនៅជំហានទី 3
PABAL_SOURCE..ឃ្លាំងកូដដែលប្រើសម្រាប់ build image ម៉ាស៊ីនមេ៖ .. បើឯកសារ compose នៅក្នុង deploy/ នៃឃ្លាំង បើមិនដូច្នោះទេ គឺផ្លូវទៅកាន់កូដប្រភព
PABAL_NETWORKssemiya-netបណ្ដាញ Docker ដែលកុងតឺន័រទាំងបីចូលរួម។ ត្រូវបង្កើតជាមុន (ជំហានទី 6)
MTPROTO_PORT8443បើប្តូរ ត្រូវប្តូរជញ្ជាំងភ្លើង និងការ build កម្មវិធីជាមួយផង
ADMIN_TOKENទុកទទេបើទុកទទេ វានឹងត្រូវបង្កើតក្នុង pabal_server/data/admin-token ពេលបើកជាលើកដំបូង។ បើចង់កំណត់ដោយខ្លួនឯង ត្រូវមាន 16 តួឡើងទៅ
JAVA_OPTSតម្លៃលំនាំដើមបើអង្គចងចាំមិនគ្រប់ សូមបង្កើន -Xmx (រហូតដល់ប្រហែលពាក់កណ្តាលនៃអង្គចងចាំម៉ាស៊ីនមេ)

ឯកសារ compose សម្រាប់ផលិតកម្ម បើកម៉ាស៊ីនមេដោយបិទលេខសាកល្បង (TELEGRAM_TEST_NUMBERS=false)។ តម្លៃកំណត់ទាំងអស់ដែលម៉ាស៊ីនមេអាន មាននៅក្នុង ការគ្រប់គ្រង និងការកំណត់ — អថេរបរិស្ថាន

5. DNS

ឈ្មោះប្រភេទតម្លៃ
pabal.meA203.0.113.10
www.pabal.meA203.0.113.10
dig +short pabal.me        # ត្រូវតែបង្ហាញ 203.0.113.10 (ការអនុវត្តចំណាយពេលពីប៉ុន្មាននាទី ដល់ប៉ុន្មានម៉ោង)

អ្នកអាចបើកម៉ាស៊ីនមេមុនពេល DNS ចង្អុលមកម៉ាស៊ីនមេក៏បាន។ Caddy នឹងព្យាយាមម្តងទៀតដោយខ្លួនឯង រហូតដល់ទទួលបានវិញ្ញាបនបត្រ។

6. build ហើយបើក

cd /opt/pabal/deploy
docker network inspect ssemiya-net >/dev/null 2>&1 || docker network create ssemiya-net   # តែម្ដងប៉ុណ្ណោះ
docker compose up -d --build       # លើកដំបូងចំណាយពេលប៉ុន្មាននាទី (Maven ទាញយកបណ្ណាល័យ)
docker compose ps                  # pabal-server, pabal-postgres, pabal-caddy គឺ running (healthy)
docker compose logs -f pabal-server      # ចុច Ctrl+C ដើម្បីចេញ

ពេលបើកជាលើកដំបូង បន្ទាត់ទាំងនេះនឹងបង្ហាញក្នុង log។

WARN  ServerKeys - Generated a new RSA key at /app/keys/private.pem (fingerprint -3898654385185406269). Clients must embed /app/keys/private.pem.pub
INFO  TelegramServer - JDBC persistence active (jdbc:postgresql://pabal-postgres:5432/pabal)
INFO  BotFather - BotFather is user 100000
INFO  AdminToken - Created the admin token in /app/data/admin-token
INFO  TelegramServer - Website: http://0.0.0.0:8080/ (published at https://pabal.me/)
  • បន្ទាត់ទីមួយជា WARN ប៉ុន្តែវាធម្មតាទេ (ជាការជូនដំណឹងថាសោត្រូវបានបង្កើតតែម្តងលើកដំបូង)។ ចាប់ពីលើកក្រោយ នឹងបង្ហាញ Loaded RSA key … (fingerprint …)។ fingerprint ខុសគ្នាតាមម៉ាស៊ីនមេនីមួយៗ។
  • តារាងត្រូវបានបង្កើតដោយម៉ាស៊ីនមេខ្លួនឯង ពេលវាបើក។

7. ការពិនិត្យ

# ពីខាងក្រៅ (កុំព្យូទ័ររបស់ខ្ញុំ)
curl -sI https://pabal.me/ | head -1                              # HTTP/2 200
curl -s -o /dev/null -w '%{http_code}\n' https://pabal.me/docs/    # 200 — ឯកសារនេះ
curl -s -o /dev/null -w '%{http_code}\n' https://pabal.me/admin/   # 404 — ទំព័រគ្រប់គ្រងមិនបើកចំហ
curl -s https://pabal.me/docs/server-key.pem | head -1             # -----BEGIN RSA PUBLIC KEY-----
nc -vz 203.0.113.10 8443                                          # succeeded — ច្រករបស់កម្មវិធី

# នៅលើម៉ាស៊ីនមេ
curl -s http://127.0.0.1:8080/health          # {"status":"UP",…}
ls -l /srv/pabal/pabal_server/keys                  # private.pem(600), private.pem.pub

8. ទំព័រគ្រប់គ្រង និងការកំណត់ដំបូង

# នៅលើកុំព្យូទ័ររបស់ខ្ញុំ (ទុកឲ្យដំណើរការ)
ssh -N -L 8080:127.0.0.1:8080 <អ្នកប្រើ>@203.0.113.10

# តូខឹន (នៅលើម៉ាស៊ីនមេ)
sudo cat /srv/pabal/pabal_server/data/admin-token

បើក http://localhost:8080/admin/ ក្នុងកម្មវិធីរុករក ហើយបញ្ចូលតូខឹន។ ការកំណត់ដែលត្រូវតែធ្វើមុនដំណើរការពិត (លម្អិតនៅក្នុង ការគ្រប់គ្រង និងការកំណត់)៖

  1. កំណត់វិធីបញ្ជូនលេខកូដ (코드 전달 방식) ជា SMS ឬអ៊ីមែល។ វិធី "ទំព័រគ្រប់គ្រង" (관리 화면) តម្រូវឲ្យប្រតិបត្តិករប្រាប់លេខកូដម្តងមួយៗ។
  2. បញ្ចូលតម្លៃ SMSអ៊ីមែល (SMTP) (이메일) ហើយរក្សាទុក → ពិនិត្យថាវាមកដល់ពិតប្រាកដ ដោយការផ្ញើសាកល្បង (테스트 발송)។
  3. ពិនិត្យថាលេខសាកល្បង (테스트 번호) ត្រូវបានបិទ។ បើបើក អ្នកណាក៏អាចចូលគណនីដោយលេខ +99966… បាន។
  4. បើចាំបាច់ ចាប់ផ្តើមដោយបិទអនុញ្ញាតការចុះឈ្មោះថ្មី (새 가입 허용) ហើយទទួលតែមនុស្សដែលអ្នកអញ្ជើញជាមុនសិន។

9. ភ្ជាប់កម្មវិធីទៅម៉ាស៊ីនមេនេះ

កម្មវិធីត្រូវបាន build ដោយបង្កប់IP · ច្រក · សោសាធារណៈរបស់ម៉ាស៊ីនមេក្នុងខ្លួន។ ត្រូវ build ម្តងទៀតជាមួយសោសាធារណៈរបស់ម៉ាស៊ីនមេនេះ ទើបវាភ្ជាប់ទៅម៉ាស៊ីនមេនេះបាន។ នៅលើ Mac៖

# 1. សោសាធារណៈរបស់ម៉ាស៊ីនមេនេះ (សោសាធារណៈ មិនមែនសោឯកជនទេ — អាចទាញយកពីគេហទំព័រឯកសារក៏បាន)
curl -s -o keys/production.pem.pub https://pabal.me/docs/server-key.pem

# 2. ឲ្យកូដប្រភពកម្មវិធីចង្អុលទៅម៉ាស៊ីនមេនេះ + អនុវត្តម៉ាក
python3 scripts/tdesktop/point_to_server.py ~/Developer/tdesktop \
    --host 203.0.113.10 --port 8443 --key keys/production.pem.pub
python3 scripts/tdesktop/apply_branding.py ~/Developer/tdesktop

បន្ទាប់មក ធ្វើជំហានទី 5 (configure) និងជំហានទី 6 (build) នៃ docs/tdesktop-build-guide.md ក្នុងឃ្លាំងកូដ។ សូមចម្លងលទ្ធផល out/Debug/Pabal.app ទុកក្រោមឈ្មោះផ្សេង — បើ build កូដប្រភពដដែលម្តងទៀតសម្រាប់ម៉ាស៊ីនមេផ្សេង វានឹងត្រូវសរសេរជាន់ពីលើ។

មុនពេលចែកកម្មវិធីទៅអ្នកដទៃ

build បច្ចុប្បន្នជាdebug build ដែលគ្មានហត្ថលេខា និងការបញ្ជាក់ (notarization) ដូច្នេះអ្នកទទួលត្រូវចុចកណ្តុរស្តាំ → បើក ពេលបើកជាលើកដំបូង។ debug build ទុកទិន្នន័យក្នុងថតក្បែរកម្មវិធី (tdata/) ហើយបើមិនអាចសរសេរទៅទីនោះបាន វានឹងប្រើថតទិន្នន័យដូចគ្នានឹង Telegram Desktop ពិតប្រាកដ។ សូមណែនាំឲ្យទុកកម្មវិធីក្នុងថតអ្នកប្រើ (ឧ. ~/Applications/Pabal/)។ release build សម្រាប់ការចែកចាយទូទៅ (ថតទិន្នន័យដាច់ដោយឡែក ហត្ថលេខា និងការបញ្ជាក់របស់ Apple) គឺជាការងារដាច់ដោយឡែក។

ប្រតិបត្តិការ

ស្ថានភាព និង log

cd /opt/pabal/deploy
docker compose ps
docker compose logs --since 1h pabal-server
tail -f /srv/pabal/pabal_server/logs/telegram-server.log

ការធ្វើបច្ចុប្បន្នភាព

cd /opt/pabal && git pull
cd deploy
./backup.sh                                     # បម្រុងទុកជាមុនសិន
docker compose up -d --build pabal-server             # ប្តូរតែម៉ាស៊ីនមេជាមួយ image ថ្មី
docker compose logs --since 5m pabal-server | grep -E "Website|ERROR"

ក្នុងរយៈពេលប៉ុន្មានដប់វិនាទី ដែលម៉ាស៊ីនមេកំពុងបើកឡើងវិញ កម្មវិធីនឹងដាច់ ហើយភ្ជាប់ឡើងវិញដោយខ្លួនឯងដោយមិនចាំបាច់ចូលគណនីម្តងទៀត។ ការផ្លាស់ប្តូរតារាងត្រូវបានអនុវត្តដោយស្វ័យប្រវត្តិ ពេលម៉ាស៊ីនមេបើក។ ថត bind មិនពាក់ព័ន្ធនឹង image ទេ ដូច្នេះ docker compose down ឬការលុប image មិនលុបទិន្នន័យទេ — គ្រាន់តែកុំលុប /srv/pabal

ការបម្រុងទុក

./backup.sh            # → /srv/pabal/backups/<កាលបរិច្ឆេទ-ម៉ោង>/{pabal.dump, server-keys-data.tar.gz}
crontab -e             # រៀងរាល់ថ្ងៃម៉ោង 03:00៖
# 0 3 * * * /opt/pabal/deploy/backup.sh >> /srv/pabal/backups/backup.log 2>&1
  • ការបម្រុងទុកដែលលើស 14 ថ្ងៃ ត្រូវបានលុបដោយស្វ័យប្រវត្តិ (អាចប្តូរបាន ដូចជា KEEP_DAYS=30 ./backup.sh)។
  • សូមចម្លងទៅកន្លែងផ្សេងផងដែរ។ ការបម្រុងទុកនៅលើថាសដដែល មិនអាចទប់ទល់នឹងការខូចថាសបានទេ។
  • ការបម្រុងទុកមានសោឯកជន RSA និងតម្លៃសម្ងាត់ SMS និង SMTP។ សូមការពារកន្លែងរក្សាទុក ឲ្យបានដូចម៉ាស៊ីនមេដែរ។

ការស្តារ

cd /opt/pabal/deploy
B=/srv/pabal/backups/20260920-030000            # ការបម្រុងទុកដែលត្រូវស្តារ
docker compose stop pabal-server pabal-caddy
docker compose exec -T pabal-postgres dropdb -U pabal pabal
docker compose exec -T pabal-postgres createdb -U pabal pabal
docker compose exec -T pabal-postgres pg_restore -U pabal -d pabal --no-owner < $B/pabal.dump
sudo tar -C /srv/pabal/pabal_server -xzf $B/server-keys-data.tar.gz
sudo chown -R 1000:1000 /srv/pabal/pabal_server
docker compose up -d

ពេលផ្លាស់ទៅម៉ាស៊ីនមេថ្មី ក៏ដូចគ្នាដែរ៖ ធ្វើជំហាន 1 ដល់ 5 រួច ធ្វើការស្តារខាងលើជំនួសឲ្យជំហានទី 6 ហើយបើក។ បើស្តារសោដដែល មិនចាំបាច់ build កម្មវិធីម្តងទៀតទេ (បើ IP ម៉ាស៊ីនមេប្តូរ ត្រូវ build ម្តងទៀត)។

ការបើក និងបិទ

docker compose restart pabal-server       # ចាប់ផ្តើមតែម៉ាស៊ីនមេឡើងវិញ
docker compose stop                 # បញ្ឈប់ទាំងអស់ (ទិន្នន័យនៅដដែល)
docker compose up -d                # បើកម្តងទៀត

ទោះបីចាប់ផ្តើមម៉ាស៊ីនមេឡើងវិញ (reboot) ក៏ container បើកឡើងវិញដោយខ្លួនឯង ព្រោះមាន restart: unless-stopped

បញ្ជីត្រួតពិនិត្យសុវត្ថិភាព

  • សិទ្ធិ .env គឺ 600 ហើយ POSTGRES_PASSWORD ជាតម្លៃចៃដន្យ
  • សិទ្ធិ /srv/pabal/pabal_server/keys គឺ 700 ហើយសោឯកជនមិនមាននៅកន្លែងផ្សេង ក្រៅពីការបម្រុងទុក
  • ជញ្ជាំងភ្លើង៖ តែ 22 (បើអាច តែ IP ប្រតិបត្តិករ) · 80 · 443 · 8443
  • ពីខាងក្រៅ https://domain/admin/ ឆ្លើយ 404
  • ទំព័រគ្រប់គ្រង៖ លេខសាកល្បង (테스트 번호) បិទ វិធីបញ្ជូនលេខកូដ (코드 전달 방식) ជា SMS ឬអ៊ីមែល ការផ្ញើសាកល្បង (테스트 발송) ជោគជ័យ
  • មិនបើក TELEGRAM_WEBHOOK_ALLOW_LOCAL (ដើម្បីកុំឲ្យ webhook របស់បូតទៅបណ្តាញខាងក្នុង)
  • SSH៖ បិទការចូលដោយពាក្យសម្ងាត់ ប្រើតែសោ
  • ពិនិត្យ cron បម្រុងទុក និងការចម្លងទៅខាងក្រៅ ហើយហាត់ការស្តារម្តង
  • ការធ្វើបច្ចុប្បន្នភាពសុវត្ថិភាពស្វ័យប្រវត្តិរបស់ OS ម៉ាស៊ីនមេ (unattended-upgrades)

ការដោះស្រាយបញ្ហា

រោគសញ្ញាមូលហេតុ → ដំណោះស្រាយ
កម្មវិធីជាប់នៅ "កំពុងភ្ជាប់…"① ច្រក 8443 ត្រូវបានរារាំង → nc -vz IP 8443 ពិនិត្យ ufw និង security group របស់ cloud ② កម្មវិធីត្រូវបាន build ជាមួយសោសាធារណៈផ្សេង → ធ្វើជំហានទី 9 ម្តងទៀតជាមួយសោរបស់ម៉ាស៊ីនមេនេះ ③ PUBLIC_IP ខុស → កែ .env ហើយ docker compose up -d pabal-server
ភ្ជាប់បានដំបូង តែដាច់ភ្លាមៗកម្មវិធីផ្លាស់ទៅអាសយដ្ឋានដែលម៉ាស៊ីនមេប្រាប់ (PUBLIC_IP:MTPROTO_PORT) ប៉ុន្តែអាសយដ្ឋាននោះខុស → ពិនិត្យ PUBLIC_IP
កំហុសវិញ្ញាបនបត្រ HTTPSDNS មិនទាន់ចង្អុលមកម៉ាស៊ីនមេនេះ ឬច្រក 80 ត្រូវបានរារាំង → dig +short domain, docker compose logs pabal-caddy
server ចាប់ផ្តើមឡើងវិញជាបន្តបន្ទាប់ password authentication failedបានប្តូរ POSTGRES_PASSWORD ក្រោយពេលទិន្នន័យត្រូវបានបង្កើត → ប្តូរត្រឡប់ទៅតម្លៃដើម ឬដំណើរការ ALTER USER pabal PASSWORD '…' ក្នុង DB
AccessDeniedException: /app/keys/…ម្ចាស់ថត bind → sudo chown -R 1000:1000 /srv/pabal/pabal_server
OutOfMemoryError, យឺតបង្កើន -Xmx ក្នុង JAVA_OPTS ហើយ docker compose up -d pabal-server
លេខកូដចុះឈ្មោះមិនមកដល់ស្ថានភាពផ្ញើ និងមូលហេតុបរាជ័យ ក្នុងផ្ទាំង លេខកូដចុះឈ្មោះ (가입 코드) នៃទំព័រគ្រប់គ្រង → តម្លៃ SMS និង SMTP ក្នុងការកំណត់ (설정) និងការផ្ញើសាកល្បង (테스트 발송)
ចូលទំព័រគ្រប់គ្រងមិនបានពិនិត្យថា SSH tunnel កំពុងដំណើរការ ឬកម្មវិធីផ្សេងកំពុងប្រើច្រក 8080 នៃកុំព្យូទ័ររបស់អ្នក (ប្តូរជា -L 18080:127.0.0.1:8080 ហើយប្រើ localhost:18080)
network ssemiya-net declared as external, but could not be foundបណ្ដាញមិនទាន់បានបង្កើត → docker network create ssemiya-net (ឬឈ្មោះផ្សេងតាម PABAL_NETWORK ក្នុង .env)

ដែនកំណត់ដែលដឹងរួច

  • នេះជារចនាសម្ព័ន្ធម៉ាស៊ីនមេមួយគ្រឿង។ ពេលបើក វាផ្ទុកគណនី ការសន្ទនា និងសារទាំងអស់ទៅក្នុងអង្គចងចាំ។ ការពង្រីកផ្តេក (បែងចែកទៅម៉ាស៊ីនច្រើន) មិនទាន់អាចធ្វើបានទេ ហើយពេលទិន្នន័យកើនឡើង ត្រូវបង្កើនអង្គចងចាំ។
  • លេខកូដចុះឈ្មោះដែលកំពុងរង់ចាំ និង update របស់បូតដែលមិនទាន់ទាញយក ស្ថិតនៅក្នុងអង្គចងចាំ ដូច្នេះវានឹងបាត់ពេលម៉ាស៊ីនមេចាប់ផ្តើមឡើងវិញ។
  • សំណើលេខកូដចុះឈ្មោះមានចន្លោះពេល និងដែនកំណត់ក្នុងមួយថ្ងៃ ប៉ុន្តែមិនទាន់មានការកំណត់ល្បឿនសម្រាប់សំណើផ្សេងៗទាំងអស់ទេ។ ក្រោយបើកចំហភ្លាម សូមពិនិត្យ log និងផ្ទាំង Dashboard (대시보드) ឲ្យបានញឹកញាប់។
  • មិនទាន់មានកម្មវិធីទូរស័ព្ទ និងការជូនដំណឹង push។ ឯកសារភ្ជាប់ក្នុងសារ មានតែរូបថត។ ឆានែល supergroup និងការផ្ទៀងផ្ទាត់ 2 ជំហាន មិនទាន់មានទេ។
  • auth key ត្រូវបានរក្សាទុកក្នុង DB ជាអត្ថបទធម្មតា (មិនអ៊ិនគ្រីប) (ចាំបាច់សម្រាប់ឲ្យម៉ាស៊ីនមេឌិគ្រីប)។ សូមការពារ DB និងការបម្រុងទុក ឲ្យបានដូចសោ RSA ដែរ។

ឯកសារ

ឯកសារតួនាទី
deploy/docker-compose.ymlរចនាសម្ព័ន្ធផលិតកម្ម (pabal-server · pabal-postgres · pabal-caddy, bind mount)
deploy/CaddyfileHTTPS ការរារាំងផ្លូវគ្រប់គ្រង ការបញ្ជូនបន្តគេហទំព័រ ឯកសារ និង Bot API
deploy/.env.exampleគំរូការកំណត់ → deploy/.env
deploy/backup.shdump DB + រក្សាទុកសោ និងទិន្នន័យ សម្អាតការបម្រុងទុកចាស់ៗ
Dockerfileimage ម៉ាស៊ីនមេ (build → JRE 21, uid 1000)