SSD Nodes Learn 🎉 VPS dari $5.50/bln
Panduan Matt ConnorOleh Matt Connor

Cara Self-Host ERPNext Menggunakan Docker di VPS

Ketahui cara memasang ERPNext di VPS menggunakan Docker Compose. Panduan ini merangkumi pengurusan 11 kontena, konfigurasi TLS, tetapan e-mel, dan strategi sandaran data.

Perkara yang anda persetujui untuk dikendalikan

Self-hosting ERPNext pada VPS ialah tugas operasi, bukan pemasangan satu arahan. Stak Docker Compose rasmi terdiri daripada sebelas kontena, dan ia menyimpan lejar am serta rekod pelanggan anda. Ini meningkatkan standard bagi semua perkara di bawah: sandaran (backup) tidak dianggap sebagai sandaran sehingga anda berjaya memulihkannya, dan tag imej yang tidak dipinkan (unpinned) adalah migrasi skema yang menunggu masa untuk berlaku.

Beberapa nama muncul sepanjang panduan ini. ERPNext ialah aplikasi perniagaan. Frappe ialah kerangka kerja Python di bawahnya. Bench ialah alat baris arahan yang mengurus tapak (site), yang sudah dipasang di dalam kontena. Satu tapak ialah satu penyewa: satu pangkalan data MariaDB ditambah satu direktori fail yang dimuat naik. Hampir setiap arahan di sini dijalankan bench di dalam kontena backend terhadap satu tapak yang dinamakan.

Panduan ini menggunakan repositori frappe_docker, iaitu penempatan (deployment) yang diselenggara oleh projek tersebut. Setiap arahan di bawah telah disemak terhadap repositori itu pada Ogos 2026. Jika Docker Compose merupakan perkara baharu bagi anda, menjalankan Docker Compose pada VPS merangkumi asas yang diandaikan oleh panduan ini.

Berapakah keperluan VPS untuk ERPNext?

ChartCommon published ERPNext sizing tiers (guidance, not a measurement)
The data behind this chart
[
  {
    "label": "Evaluation",
    "vcpu": 2,
    "ram_gb": 4,
    "disk_gb": 40
  },
  {
    "label": "Small production",
    "vcpu": 4,
    "ram_gb": 8,
    "disk_gb": 100
  },
  {
    "label": "Room to grow",
    "vcpu": 4,
    "ram_gb": 16,
    "disk_gb": 160
  }
]

Panduan yang diterbitkan bermula pada 2 vCPU dan 4 GB RAM sebelum seorang pengguna pun log masuk. Ini adalah peringkat penilaian. Angka-angka ini merupakan titik permulaan, bukan ukuran daripada panduan ini, dan jumlah dokumen anda sendiri yang menentukan keperluan sebenar. Baris terakhir bukanlah minimum yang diterbitkan. Ia adalah anggaran tahap di mana memori tidak lagi menjadi perkara yang perlu anda fikirkan.

Bersikap jujur dengan diri sendiri mengenai pelan berspesifikasi rendah. VPS 1 GB atau 2 GB akan memulakan stack tersebut tetapi akan terhenti semasa import pertama atau laporan panjang pertama, kerana sembilan kontena yang berjalan serentak ditambah dengan buffer pool MariaDB serta worker Python yang menjana laporan tidak akan muat dalam memori tersebut. Kegagalan ini tidak berlaku secara lancar. Kernel out of memory killer akan menghentikan kontena, dan docker inspect pada kontena tersebut kemudiannya akan menunjukkan "OOMKilled": true dengan exit code 137. Worker yang terhenti di tengah tugasan akan menyebabkan dokumen yang dihantar mempunyai kerja latar belakang yang tidak selesai.

Bagi syarikat yang menggunakan ERPNext setiap hari, 8 GB RAM dan 4 vCPU dengan 100 GB SSD adalah tahap minimum yang jujur. RAM akan habis digunakan terlebih dahulu. Penggunaan cakera meningkat lebih cepat daripada jangkaan, kerana setiap lampiran dan setiap sandaran tempatan disimpan pada volum yang sama dengan pangkalan data.

Sebelas kontena dan fungsi setiap satunya

Jalankan docker compose ps selepas stack dihidupkan dan sembilan kontena sedang berjalan. Dua lagi, configurator dan create-site, menjalankan tugasnya sekali sahaja lalu berhenti; inilah sebab jumlah keseluruhannya ialah sebelas.

  • backend menjalankan aplikasi Frappe di bawah gunicorn. Di sinilah bench berada.
  • frontend ialah nginx. Ia menyajikan aset statik dan menghantar segala permintaan lain ke backend.
  • queue-short dan queue-long ialah worker RQ (Redis Queue). Ia menjalankan tugasan latar belakang seperti penghantaran e-mel, import dan pembinaan laporan.
  • scheduler mencetuskan tugasan berasaskan masa, termasuk laporan berjadual dan dokumen auto-ulang.
  • websocket ialah proses socket.io yang menyokong kemas kini langsung dalam pelayar.
  • db ialah MariaDB.
  • redis-cache dan redis-queue ialah dua instans Redis yang berasingan, satu untuk cache dan satu lagi untuk baris gilir tugasan.

Pembahagian ini penting untuk difahami kerana ia memberitahu anda log mana yang perlu dibaca. E-mel yang tersekat adalah masalah worker baris gilir, jadi docker compose logs -f queue-short ialah arahan yang betul. Halaman yang dimuatkan tetapi tidak mengemas kini lencana pemberitahuan adalah masalah websocket. Membaca log backend untuk kedua-dua masalah ini hanya akan membuang masa anda.

Pasang menggunakan fail compose pengeluaran, bukan demo

Repositori ini membekalkan pwd.yml, dan README menyatakan dengan jelas: "Persediaan ini bertujuan untuk penilaian jangka pendek sahaja. Anda tidak akan dapat memasang aplikasi tersuai pada persediaan ini." Gunakannya untuk melihat ERPNext selama satu petang. Jangan jalankan syarikat menggunakannya.

sudo apt update && sudo apt install -y git
curl -fsSL https://get.docker.com | bash
git clone https://github.com/frappe/frappe_docker
cd frappe_docker
mkdir -p ~/gitops
cp example.env ~/gitops/erpnext.env

Buka ~/gitops/erpnext.env dan tukar empat nilai. ERPNEXT_VERSION menetapkan tag imej. DB_PASSWORD dibekalkan sebagai 123 dalam fail contoh. SITES_RULE ialah peraturan penghalaan Traefik, dan LETSENCRYPT_EMAIL menerima amaran sijil.

ERPNEXT_VERSION=v16.32.1
DB_PASSWORD=<a long random password>
SITES_RULE=Host(`erp.example.com`)
LETSENCRYPT_EMAIL=ops@example.com

Sekarang, render satu fail compose, kemudian mulakannya.

docker compose --project-name erpnext \
  --env-file ~/gitops/erpnext.env \
  -f compose.yaml \
  -f overrides/compose.mariadb.yaml \
  -f overrides/compose.redis.yaml \
  -f overrides/compose.https.yaml \
  config > ~/gitops/erpnext.yaml

docker compose --project-name erpnext -f ~/gitops/erpnext.yaml up -d

config tidak memulakan apa-apa. Ia menggabungkan fail asas dengan fail ganti (override) dan mencetak hasilnya dengan setiap pemboleh ubah telah digantikan. Anda kemudian menjalankan fail yang telah dirender itu. Langkah tambahan ini berbaloi: stack yang berjalan adalah satu fail yang boleh anda baca dan commit, jadi ia tidak akan berubah secara tiba-tiba apabila seseorang menyunting fail env atau apabila anda menarik (pull) repositori. cara beberapa fail Docker Compose bergabung menjelaskan peraturan penggantian secara terperinci.

Tunggu db bermula dan configurator tamat, yang mengambil masa beberapa saat, kemudian cipta tapak tersebut.

docker compose --project-name erpnext exec backend \
  bench new-site --mariadb-user-host-login-scope=% \
  --db-root-password '<your DB_PASSWORD>' \
  --install-app erpnext \
  --admin-password '<a strong admin password>' \
  erp.example.com

Semak ia:

docker compose --project-name erpnext ps
docker compose --project-name erpnext exec backend bench --site erp.example.com list-apps

list-apps sepatutnya mencetak frappe dan erpnext berserta versinya. ps yang sihat menunjukkan sembilan servis dalam keadaan running dan tiada dalam restarting.

Dua perkara sering berlaku di sini. --mariadb-user-host-login-scope=% bukanlah pilihan di bawah Docker. Kontena aplikasi mencapai MariaDB merentasi rangkaian Docker, jadi ia tiba sebagai hos jauh, dan pengguna pangkalan data yang dihadkan kepada localhost tidak boleh log masuk dari situ. Penciptaan tapak kemudian gagal dengan ralat akses MariaDB dinafikan yang menamakan pengguna root. Skop % memberikan akses kepada pengguna tapak baharu dari mana-mana hos pada rangkaian peribadi tersebut.

Perkara kedua ialah nama tapak. Frontend memilih tapak mana yang hendak dihidangkan daripada header HTTP Host secara lalai, jadi tapak yang dicipta sebagai erpnext tidak boleh dicapai pada erp.example.com walaupun kedua-duanya wujud. Namakan tapak mengikut domain, seperti di atas, atau tetapkan FRAPPE_SITE_NAME_HEADER dalam fail env kepada nama tapak dan render semula fail compose tersebut.

HTTPS, dan syarat yang perlu dipenuhi sebelum ia berfungsi

compose.https.yaml override menjalankan Traefik pada port 443, mengubah hala port 80 kepadanya, dan meminta sijil daripada Let's Encrypt. TLS (transport layer security) ialah mekanisme yang menghalang invois dan kuki sesi daripada dihantar melalui rangkaian dalam teks biasa.

Dua perkara mesti dipenuhi atau sijil tidak akan dikeluarkan. Rekod DNS A bagi erp.example.com mestilah sudah menghala ke VPS. Port 80 dan 443 mestilah boleh dicapai dari internet, kerana Let's Encrypt mengesahkan kawalan anda terhadap nama domain tersebut melalui cabaran HTTP-01 pada port 80. Semak firewall rangkaian pembekal anda serta firewall pada pelayan. Kedua-duanya adalah kawalan yang berasingan, dan firewall pada panel kawalan sering dilupakan oleh pengguna.

Sijil disimpan dalam volum cert-data di /letsencrypt/acme.json. Jika pelayar memaparkan sijil lalai dan bukannya sijil anda, cari nama servis proksi dalam docker compose --project-name erpnext ps dan baca lognya untuk melihat ralat ACME (automatic certificate management environment). Menjalankan aplikasi web lain pada pelayan yang sama? satu instans Traefik di hadapan beberapa aplikasi Docker Compose menunjukkan cara untuk berkongsi proksi tersebut dan bukannya berebut port 443.

E-mel keluar, atau invois tidak pernah meninggalkan pelayan

Ini adalah langkah yang sering dilangkau oleh panduan ERPNext, namun ia menentukan sama ada sistem ini berguna atau tidak. Tanpa e-mel keluar yang berfungsi, tiada invois sampai kepada pelanggan, tiada tetapan semula kata laluan diterima, dan tiada laporan berjadual dihantar. Stak ini tidak mengandungi pelayan e-mel.

Jangan cuba menghantar e-mel terus dari VPS pada port 25. Kebanyakan penyedia menyekat port 25 keluar pada akaun baharu, dan apa sahaja yang berjaya keluar akan ditolak atau difailkan sebagai spam, kerana alamat VPS baharu tidak mempunyai reputasi penghantaran. Gunakan relay yang disahkan pada port 587.

Laluan yang disokong adalah melalui skrin Email Account dalam antara muka ERPNext, yang menyimpan kata laluan dalam bentuk terenkripsi. Anda juga boleh menulis kunci tersebut ke dalam konfigurasi tapak:

docker compose --project-name erpnext exec backend \
  bench --site erp.example.com set-config mail_server smtp.example.com

docker compose --project-name erpnext exec backend \
  bench --site erp.example.com set-config mail_port 587 --parse

docker compose --project-name erpnext exec backend \
  bench --site erp.example.com set-config use_tls 1 --parse

docker compose --project-name erpnext exec backend \
  bench --site erp.example.com set-config mail_login 'erp@example.com'

docker compose --project-name erpnext exec backend \
  bench --site erp.example.com set-config auto_email_id 'erp@example.com'

--parse menyimpan 587 sebagai nombor dan bukannya rentetan "587". Baca semula fail tersebut dan pastikan kedua-dua nilai itu tidak mempunyai tanda petik di sekelilingnya:

docker compose --project-name erpnext exec backend \
  cat sites/erp.example.com/site_config.json

Tetapkan mail_password melalui skrin Email Account dan bukannya pada baris perintah, supaya ia disimpan dalam bentuk terenkripsi dan tidak akan masuk ke dalam sejarah shell anda.

Kemudian, hantar mesej sebenar. Cipta Sales Invoice, e-melkan kepada alamat yang anda kawal, dan pantau baris gilir semasa anda melakukannya:

docker compose --project-name erpnext logs -f queue-short

E-mel keluar adalah kerja latar belakang, jadi mesej yang tidak pernah sampai biasanya akan muncul sebagai kerja yang gagal dalam log tersebut dan bukannya sebagai ralat dalam pelayar. Terbitkan rekod SPF (sender policy framework) dan DKIM (domainkeys identified mail) untuk domain penghantar, kemudian tambah polisi DMARC. Tanpanya, invois yang betul dari segi teknikal masih akan masuk ke dalam folder spam pelanggan. Jika anda lebih suka mengawal keseluruhan laluan, pelayan e-mel Mailcow yang dihoskan sendiri memberikan anda relay yang anda kawal, pada pelayan yang berasingan daripada ERP.

Sandaran yang benar-benar boleh dipulihkan

Satu dump pangkalan data sahaja bukanlah sandaran lengkap untuk ERPNext. Lampiran dan fail peribadi disimpan dalam direktori sites, bukan dalam MariaDB. Jika anda hanya memulihkan pangkalan data, setiap pesanan belian yang dimuat naik akan menjadi pautan rosak.

docker compose --project-name erpnext exec backend \
  bench --site erp.example.com backup --with-files

Perintah tersebut menulis empat fail ke dalam sites/erp.example.com/private/backups di dalam volum sites:

  • satu dump -database.sql.gz
  • satu arkib -files.tar bagi fail awam
  • satu arkib -private-files.tar bagi fail peribadi
  • satu salinan konfigurasi tapak -site_config_backup.json

Fail keempat adalah fail yang sering dibuang oleh pengguna, dan ia merupakan fail yang paling kritikal. Ia menyimpan encryption_key, iaitu kunci yang digunakan oleh Frappe untuk menyulitkan kata laluan yang disimpan: kelayakan akaun e-mel, kunci gerbang pembayaran, dan setiap rahsia integrasi. Jika anda memulihkan pangkalan data tanpa kunci yang sepadan, tapak akan dimuatkan seperti biasa, tetapi penghantaran e-mel akan gagal dengan ralat:

frappe.exceptions.ValidationError: Encryption key is invalid! Please check site_config.json

Sentiasa simpan keempat-empat fail tersebut bersama-sama.

Kemudian, pindahkan fail tersebut keluar dari pelayan. Sandaran yang berada di dalam volum tidak akan terselamat jika pelayan rosak, dan bench juga akan memadamkannya: secara lalai, ia akan memadamkan sandaran yang lebih lama daripada 24 jam dari direktori tersebut.

docker compose --project-name erpnext cp \
  backend:/home/frappe/frappe-bench/sites/erp.example.com/private/backups \
  ~/erpnext-backups

Jalankan perintah tersebut melalui cron, kemudian pindahkan direktori itu ke lokasi yang tidak diuruskan oleh anda. sandaran restic tersulit ke storan luar tapak adalah alat yang tepat, kerana ia menyulitkan data sebelum dimuat naik dan restic check membuktikan bahawa repositori tersebut masih boleh dibaca. Sandaran ERP adalah salinan keseluruhan lejar anda, jadi ia perlu disimpan dalam keadaan tersulit pada perkakasan yang berbeza daripada pelayan asal.

Uji pemulihan sebelum anda memerlukannya

Sandaran yang tidak diuji hanyalah satu andaian. Uji sandaran tersebut ke tapak kedua pada pelayan yang sama, jangan sekali-kali melakukannya pada tapak yang sedang aktif.

docker compose --project-name erpnext exec backend \
  bench new-site --mariadb-user-host-login-scope=% \
  --db-root-password '<your DB_PASSWORD>' \
  --admin-password '<a strong admin password>' \
  restore-test.example.com

docker compose --project-name erpnext exec backend \
  bench --site restore-test.example.com --force restore \
  sites/erp.example.com/private/backups/<stamp>-erp.example.com-database.sql.gz \
  --with-public-files sites/erp.example.com/private/backups/<stamp>-erp.example.com-files.tar \
  --with-private-files sites/erp.example.com/private/backups/<stamp>-erp.example.com-private-files.tar \
  --db-root-password '<your DB_PASSWORD>'

Salin kunci penyulitan daripada konfigurasi yang disandarkan ke dalam tapak yang dipulihkan, jika tidak integrasinya akan terus rosak:

docker compose --project-name erpnext exec backend \
  bench --site restore-test.example.com set-config encryption_key '<value from site_config_backup.json>'

Sekarang, periksa pemulihan tersebut seperti cara seorang akauntan. Buka laporan Akaun Belum Terima dan bandingkan baki penutup dengan tapak yang aktif. Buka invois pembelian terkini dan muat turun lampirannya. Tapak yang sekadar memaparkan halaman log masuk tidak membuktikan apa-apa.

Padamkan tapak ujian apabila anda selesai:

docker compose --project-name erpnext exec backend \
  bench drop-site restore-test.example.com

Mengapa penetapan versi (version pinning) lebih penting untuk ERPNext

Pada laman statik, tag imej yang tidak ditetapkan (unpinned) bermakna permulaan semula yang tidak dijangka. Pada ERPNext, ia bermakna migrasi skema. bench migrate menulis semula jadual pangkalan data dan boleh menulis semula data dokumen, serta tidak mempunyai fungsi buat asal (undo). Melakukan rollback bermakna memulihkan daripada sandaran (backup), bukan sekadar docker compose down.

Oleh itu, tetapkan tag tersebut. ERPNEXT_VERSION=v16.32.1 ialah keluaran yang ditetapkan dalam pwd.yml milik repositori itu sendiri pada Ogos 2026. Jangan bawa nombor tersebut ke hadapan tanpa menyemaknya terlebih dahulu. Keluaran semasa disenaraikan pada halaman keluaran frappe/erpnext, dan tag imej yang wujud ada di Docker Hub. Baca nota untuk versi yang ingin anda tuju sebelum anda beralih.

Proses naik taraf itu sendiri bermula dengan sandaran dan mod penyelenggaraan.

docker compose --project-name erpnext exec backend \
  bench --site erp.example.com backup --with-files

docker compose --project-name erpnext exec backend \
  bench --site erp.example.com set-maintenance-mode on

Sunting ERPNEXT_VERSION dalam ~/gitops/erpnext.env, kemudian lakukan render, pull dan migrate.

docker compose --project-name erpnext \
  --env-file ~/gitops/erpnext.env \
  -f compose.yaml \
  -f overrides/compose.mariadb.yaml \
  -f overrides/compose.redis.yaml \
  -f overrides/compose.https.yaml \
  config > ~/gitops/erpnext.yaml

docker compose --project-name erpnext -f ~/gitops/erpnext.yaml pull
docker compose --project-name erpnext -f ~/gitops/erpnext.yaml up -d

docker compose --project-name erpnext exec backend \
  bench --site erp.example.com migrate

docker compose --project-name erpnext exec backend \
  bench --site erp.example.com set-maintenance-mode off

Mod penyelenggaraan penting kerana migrate mengubah skema semasa ia berjalan. Pengguna yang menghantar dokumen terhadap jadual yang separuh dimigrasi adalah punca anda terpaksa membaiki rekod secara manual.

Beralih satu versi utama pada satu masa, dengan sandaran di antara setiap langkah. Kod migrasi dalam sesuatu keluaran ditulis untuk menaik taraf daripada keluaran sebelumnya, jadi melangkau versi utama akan menjalankan migrasi dalam kombinasi yang tidak diuji oleh sesiapa.

Repositori ini juga membekalkan overrides/compose.migrator.yaml, yang menambah kontena yang menjalankan bench --site all migrate pada setiap permulaan. Ia memang memudahkan. Namun, ia juga bermakna docker compose up dengan tag yang ditukar akan memigrasi pangkalan data pengeluaran anda tanpa pengawasan sesiapa. Pada sistem perniagaan, jalankan migrate sebagai keputusan yang anda buat pada pagi tersebut.

Memperkukuh pelayan yang menyimpan rekod pelanggan

Tukar kata laluan Administrator semasa log masuk pertama. Fail compose penilaian menghantar admin sebagai kata laluan tersebut, dan tabiat ini sering terbawa-bawa ke persekitaran pengeluaran.

Tukar DB_PASSWORD daripada 123 dalam example.env. Nilai tersebut akan berakhir dalam ~/gitops/erpnext.yaml yang dirender dalam bentuk teks biasa, jadi chmod 600 fail tersebut dan pastikan ia tidak dimasukkan ke dalam mana-mana repositori git. Untuk tahap keselamatan yang lebih tinggi, overrides/compose.mariadb-secrets.yaml membaca kata laluan daripada fail rahsia Docker dan bukannya pemboleh ubah persekitaran. mengendalikan fail env dan rahsia dalam Docker Compose membincangkan pertukaran antara kedua-dua kaedah ini.

Terbitkan hanya apa yang diperlukan. Dengan penggantian HTTPS, port 80 dan 443 adalah satu-satunya port yang didedahkan. Jangan tambah pemetaan ports kepada servis db untuk memudahkan sambungan klien pangkalan data: tindakan ini meletakkan MariaDB di internet awam. Gunakan docker compose --project-name erpnext exec backend bench mariadb sebaliknya. Pada hos, benarkan port 22, 80 dan 443, sekat yang lain, dan semak juga tembok api rangkaian berasingan daripada pembekal anda.

Hidupkan pengesahan dua faktor dalam System Settings untuk setiap akaun yang memegang peranan System Manager. Peranan tersebut boleh membaca setiap dokumen dan mengeksport setiap jadual, jadi anggap ia sebagai akaun pentadbir dan bukan sekadar kemudahan. Jika anda menjalankan beberapa aplikasi yang dihoskan sendiri, Authentik sebagai pembekal daftar masuk tunggal yang dihoskan sendiri adalah lebih baik daripada menambah satu lagi kata laluan bagi setiap aplikasi.

Tampal (patch) hos dan but semula untuk kemas kini kernel. Sebelum anda bergantung pada tindanan (stack) untuk kembali berfungsi, semak fail yang dirender untuk polisi restart pada setiap servis, kerana tindanan tanpa polisi tersebut akan kekal mati selepas but semula. memastikan tindanan Docker Compose bermula semula selepas but semula membincangkan aspek systemd.

Apabila ERPNext tidak lagi selesa pada satu VPS

Satu VPS boleh menampung syarikat kecil untuk tempoh yang lama. Tanda-tanda ia tidak lagi mencukupi:

  • Tugasan latar belakang bertimbun, menyebabkan e-mel dan import tiba lewat beberapa minit atau jam.
  • docker inspect melaporkan kontena dengan "OOMKilled": true atau kod keluar 137.
  • Laporan yang mengambil masa dua saat kini mengambil masa tiga puluh saat, dan MariaDB merupakan proses yang memonopoli CPU.
  • Sandaran berjalan terlalu lama sehingga bertindih dengan jadual sandaran seterusnya.

Mulakan dengan memberikan sumber kepada MariaDB yang tidak dikongsi, kerana pangkalan data dan pekerja Python bersaing untuk mendapatkan memori yang sama, dan buffer pool adalah bahagian yang paling memerlukannya. Pelayan aplikasi yang lebih besar kurang membantu berbanding jangkaan ramai. menjalankan pangkalan data dalam Docker atau pada hos merangkumi keputusan tersebut, dan menetapkan had memori dalam Docker Compose menghalang satu kontena daripada melumpuhkan kontena lain semasa anda melakukan perubahan.

Selepas itu, tambah pekerja baris gilir (queue workers) dan bukannya kapasiti web. Kerja perlahan ERPNext adalah kerja latar belakang: penjanaan laporan dan import pukal. Lebih banyak kontena pekerja menelan kos yang lebih rendah berbanding kotak (pelayan) yang lebih besar, dan ia menyelesaikan simptom yang sebenarnya dikeluhkan oleh pengguna.

FAQ

Berapakah jumlah RAM yang diperlukan oleh ERPNext pada VPS?

Panduan yang diterbitkan bermula pada 4 GB dengan 2 vCPU, dan tahap tersebut hanya untuk penilaian. Bagi syarikat yang menggunakannya setiap hari, rancangkan 8 GB dan 4 vCPU dengan 100 GB storan SSD. Di bawah spesifikasi tersebut, kernel out of memory killer akan menghentikan kontena apabila beban meningkat, yang mana docker inspect akan melaporkan sebagai "OOMKilled": true dengan kod keluar 137. Ini hanyalah titik permulaan dan bukannya ukuran tetap, jadi pantau penggunaan memori anda sepanjang bulan pertama.

Bolehkah saya menjalankan pwd.yml dalam persekitaran pengeluaran?

Tidak. README projek tersebut menyatakan bahawa ia hanya bertujuan untuk penilaian jangka pendek, dan menyatakan bahawa anda tidak boleh memasang aplikasi tersuai ke dalamnya. Gunakan compose.yaml bersama override MariaDB, Redis dan HTTPS, render fail tersebut menjadi satu fail tunggal dengan docker compose config, kemudian jalankan fail tersebut.

Mengapakah tapak ERPNext saya tidak boleh dicapai sejurus selepas saya menciptanya?

Frontend memilih tapak untuk dihidangkan berdasarkan header HTTP Host secara lalai, jadi nama tapak mestilah sepadan dengan domain dalam pelayar. Tapak yang dicipta sebagai erpnext tidak akan dihidangkan pada erp.example.com. Sama ada cipta tapak menggunakan domain sebagai namanya, atau tetapkan FRAPPE_SITE_NAME_HEADER dalam fail env kepada nama tapak tersebut, render semula fail compose, dan mulakan semula stack.

Apakah yang perlu ada dalam sandaran ERPNext?

Empat fail yang disimpan bersama: dump -database.sql.gz, arkib -files.tar dan -private-files.tar, serta salinan konfigurasi -site_config_backup.json. Menjalankan bench --site erp.example.com backup --with-files akan menghasilkan kesemua empat fail tersebut. Salinan konfigurasi menyimpan encryption_key, jadi pemulihan tanpa fail ini akan menyebabkan kata laluan integrasi yang disimpan tidak dapat dinyahsulit, yang akan muncul sebagai Encryption key is invalid! Please check site_config.json.

Bagaimanakah cara saya menaik taraf ERPNext tanpa merosakkan data saya?

Lakukan sandaran dengan --with-files, aktifkan mod penyelenggaraan, tukar ERPNEXT_VERSION dalam fail env anda, render semula fail compose, lakukan pull, naikkan stack, kemudian jalankan bench --site erp.example.com migrate dan matikan mod penyelenggaraan. Lakukan naik taraf satu versi utama pada satu masa dan baca nota keluaran terlebih dahulu, kerana migrate menulis semula skema dan data dokumen tanpa pilihan buat asal (undo). Proses rollback bermaksud memulihkan sandaran yang anda ambil pada permulaan tadi.