ការដំណើរការម៉ាស៊ីនមេ
ការដំឡើងម៉ាស៊ីនមេ
របៀបដំឡើង និងដំណើរការម៉ាស៊ីនមេ 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/ នៃឃ្លាំងកូដ។
ទិដ្ឋភាពរួម
ការពន្យល់ដ្យាក្រាម
- តំបន់បី៖ អ្នកប្រើនៅលើអ៊ីនធឺណិត → 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 ដែរ |
| Domain | domain មួយដែលអ្នកអាចកែ DNS បាន (A record) |
| មធ្យោបាយបញ្ជូនលេខកូដចុះឈ្មោះ | គណនី SMS (Twilio · Solapi · webhook) ឬអ៊ីមែល (SMTP) មួយ |
| Mac | Mac មួយសម្រាប់ build កម្មវិធី (Pabal.app) សម្រាប់ម៉ាស៊ីនមេនេះ |
ច្រក (port)
| ច្រក | អ្នកណា | បើក | ការពិពណ៌នា |
|---|---|---|---|
| 22/tcp | ប្រតិបត្តិករ | ណែនាំឲ្យបើកតែ IP ប្រតិបត្តិករ | SSH |
| 80/tcp | Caddy | ទាំងអស់ | ចេញវិញ្ញាបនបត្រ · បញ្ជូនទៅ HTTPS |
| 443/tcp, 443/udp | Caddy | ទាំងអស់ | គេហទំព័រ · ឯកសារ · Bot API (udp សម្រាប់ HTTP/3) |
| 8443/tcp | ម៉ាស៊ីនមេ | ទាំងអស់ | ការតភ្ជាប់របស់កម្មវិធី (MTProto) |
| 8080/tcp | ម៉ាស៊ីនមេ | មិនបើក | ទំព័រគ្រប់គ្រង · health check — តែនៅ 127.0.0.1 របស់ម៉ាស៊ីនមេ |
| 5432/tcp | PostgreSQL | មិនបើក | តែក្នុងបណ្តាញខាងក្នុងរបស់ container |
ច្រក 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 បើក (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/keys | private.pem (សោឯកជន RSA របស់ម៉ាស៊ីនមេ), private.pem.pub | ត្រូវ build និងចែកចាយកម្មវិធីទាំងអស់ឡើងវិញ |
pabal_server/data | /app/data | រូបថត (media/), admin-token, operations.json (ការកំណត់លេខកូដចុះឈ្មោះ SMS និង SMTP រួមទាំងតម្លៃសម្ងាត់) | រូបថត និងការកំណត់ប្រតិបត្តិការ |
pabal_server/logs | /app/logs | log របស់ម៉ាស៊ីនមេ (បង្ហាប់រៀងរាល់ថ្ងៃ) | តែកំណត់ត្រា |
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"
| តម្លៃ | អ្វីដែលត្រូវដាក់ | កំណត់ចំណាំ |
|---|---|---|
DOMAIN | domain របស់គេហទំព័រ | តំណដែលកម្មវិធីបង្កើត (pabal.me/ឈ្មោះអ្នកប្រើ) អាសយដ្ឋានឯកសារ និងការមើលតំណជាមុន ក៏ប្រើអាសយដ្ឋាននេះដែរ |
PUBLIC_IP | IPv4 សាធារណៈរបស់ម៉ាស៊ីនមេ | បើជា cloud គឺ IP សាធារណៈដែលបង្ហាញក្នុង console (មិនមែន IP ឯកជនក្នុងម៉ាស៊ីនមេទេ) |
POSTGRES_PASSWORD | តម្លៃចៃដន្យ | សូមកំណត់មុនពេលបើកជាលើកដំបូង។ PostgreSQL ប្រើតម្លៃនេះតែពេលបង្កើតថតទិន្នន័យជាលើកដំបូងប៉ុណ្ណោះ |
PABAL_HOME | /srv/pabal | ថតនៅជំហានទី 3 |
PABAL_SOURCE | .. | ឃ្លាំងកូដដែលប្រើសម្រាប់ build image ម៉ាស៊ីនមេ៖ .. បើឯកសារ compose នៅក្នុង deploy/ នៃឃ្លាំង បើមិនដូច្នោះទេ គឺផ្លូវទៅកាន់កូដប្រភព |
PABAL_NETWORK | ssemiya-net | បណ្ដាញ Docker ដែលកុងតឺន័រទាំងបីចូលរួម។ ត្រូវបង្កើតជាមុន (ជំហានទី 6) |
MTPROTO_PORT | 8443 | បើប្តូរ ត្រូវប្តូរជញ្ជាំងភ្លើង និងការ build កម្មវិធីជាមួយផង |
ADMIN_TOKEN | ទុកទទេ | បើទុកទទេ វានឹងត្រូវបង្កើតក្នុង pabal_server/data/admin-token ពេលបើកជាលើកដំបូង។ បើចង់កំណត់ដោយខ្លួនឯង ត្រូវមាន 16 តួឡើងទៅ |
JAVA_OPTS | តម្លៃលំនាំដើម | បើអង្គចងចាំមិនគ្រប់ សូមបង្កើន -Xmx (រហូតដល់ប្រហែលពាក់កណ្តាលនៃអង្គចងចាំម៉ាស៊ីនមេ) |
ឯកសារ compose សម្រាប់ផលិតកម្ម បើកម៉ាស៊ីនមេដោយបិទលេខសាកល្បង (TELEGRAM_TEST_NUMBERS=false)។ តម្លៃកំណត់ទាំងអស់ដែលម៉ាស៊ីនមេអាន មាននៅក្នុង ការគ្រប់គ្រង និងការកំណត់ — អថេរបរិស្ថាន។
5. DNS
| ឈ្មោះ | ប្រភេទ | តម្លៃ |
|---|---|---|
pabal.me | A | 203.0.113.10 |
www.pabal.me | A | 203.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/ ក្នុងកម្មវិធីរុករក ហើយបញ្ចូលតូខឹន។ ការកំណត់ដែលត្រូវតែធ្វើមុនដំណើរការពិត (លម្អិតនៅក្នុង ការគ្រប់គ្រង និងការកំណត់)៖
- កំណត់វិធីបញ្ជូនលេខកូដ (코드 전달 방식) ជា SMS ឬអ៊ីមែល។ វិធី "ទំព័រគ្រប់គ្រង" (관리 화면) តម្រូវឲ្យប្រតិបត្តិករប្រាប់លេខកូដម្តងមួយៗ។
- បញ្ចូលតម្លៃ SMS ឬអ៊ីមែល (SMTP) (이메일) ហើយរក្សាទុក → ពិនិត្យថាវាមកដល់ពិតប្រាកដ ដោយការផ្ញើសាកល្បង (테스트 발송)។
- ពិនិត្យថាលេខសាកល្បង (테스트 번호) ត្រូវបានបិទ។ បើបើក អ្នកណាក៏អាចចូលគណនីដោយលេខ
+99966…បាន។ - បើចាំបាច់ ចាប់ផ្តើមដោយបិទអនុញ្ញាតការចុះឈ្មោះថ្មី (새 가입 허용) ហើយទទួលតែមនុស្សដែលអ្នកអញ្ជើញជាមុនសិន។
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 |
| កំហុសវិញ្ញាបនបត្រ HTTPS | DNS មិនទាន់ចង្អុលមកម៉ាស៊ីនមេនេះ ឬច្រក 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/Caddyfile | HTTPS ការរារាំងផ្លូវគ្រប់គ្រង ការបញ្ជូនបន្តគេហទំព័រ ឯកសារ និង Bot API |
deploy/.env.example | គំរូការកំណត់ → deploy/.env |
deploy/backup.sh | dump DB + រក្សាទុកសោ និងទិន្នន័យ សម្អាតការបម្រុងទុកចាស់ៗ |
Dockerfile | image ម៉ាស៊ីនមេ (build → JRE 21, uid 1000) |