Det här sätter du upp
ERPNext är ett affärssystem med öppen källkod: bokföring, fakturor, kunder, leverantörer, lager, inköp, projekt och personal, i webbläsaren. Det bygger på ramverket Frappe, och allt stannar på din server.
Här körs det som en pod med åtta containrar under en egen användare som heter erpnext, bakom Caddy från Podman-guiden: MariaDB, två Redis-servrar och ERPNexts webbserver, worker för bakgrundsjobb, schemaläggare, realtidsserver och webbfront.
Varje steg nedan har körts på en VC-P Alloy (2 vCPU, 8 GB) hos Melonslab med Debian 13:
- ERPNext 16.35.0 installerades, och för ett företag i Sverige valde installationsguiden själv SEK och den svenska kontoplanen BAS 2024, med momsmallar för 25, 12, 6 och 0 procent.
- En kund, en artikel och en faktura skapades, och fakturan laddades ner som PDF.
- ERPNext loggade varje inloggning med besökarens riktiga adress, och dess realtidsserver svarade via Caddy.
- ERPNext uppdaterades till 16.36.0 enligt steg 10, med all data i behåll, och allt startade igen av sig självt efter en omstart av servern.
ERPNext använde omkring 710 MB minne med ett företag och få användare. ERPNext-projektet rekommenderar 2 vCPU och 4 GB för en server som kör det.
Innan du börjar
Du behöver:
- en server uppsatt som i Podman-guiden, med Caddy igång och minst 4 GB minne;
- en A-post och en AAAA-post för
erp.example.comsom pekar på din server.
Exemplen använder erp.example.com för ERPNext och 203.0.113.10 för serverns IPv4-adress, som ip -brief address show eth0 visar. Byt ut dem genomgående.
1. Skapa användaren
Som root:
useradd -m -s /bin/bash erpnext
loginctl enable-linger erpnext
machinectl shell erpnext@
Allt från och med nu körs som erpnext, utom steg 7.
2. Skapa databaslösenordet
openssl rand -hex 24 | tr -d '\n' | podman secret create erpnext-db-root-password -
Det här är lösenordet för MariaDB:s root-användare. ERPNext använder det en gång, i steg 6, för att skapa sin egen databas och databasanvändare.
3. Definiera podden
mkdir -p ~/.config/containers/systemd
cd ~/.config/containers/systemd
Skapa erpnext.pod:
[Pod]
PodName=erpnext
# Only Caddy, on this server, can reach ERPNext: the port is not open to the internet.
PublishPort=127.0.0.1:8093:8080
# ERPNext fetches its own pages when it makes PDFs: reach them through the host.
AddHost=erp.example.com:host-gateway
[Install]
WantedBy=default.target
Skapa erpnext-db.container:
[Container]
ContainerName=erpnext-db
Image=docker.io/library/mariadb:11.8
Pod=erpnext.pod
Volume=erpnext-db:/var/lib/mysql
Environment=MARIADB_AUTO_UPGRADE=1
Secret=erpnext-db-root-password,type=env,target=MARIADB_ROOT_PASSWORD
Exec=--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --skip-character-set-client-handshake
AutoUpdate=registry
[Service]
Restart=always
Skapa erpnext-redis-cache.container:
[Container]
ContainerName=erpnext-redis-cache
Image=docker.io/library/redis:8.6-alpine
Pod=erpnext.pod
AutoUpdate=registry
[Service]
Restart=always
Skapa erpnext-redis-queue.container:
[Container]
ContainerName=erpnext-redis-queue
Image=docker.io/library/redis:8.6-alpine
Pod=erpnext.pod
Volume=erpnext-redis-queue:/data
# The cache already uses the default port in the pod.
Exec=redis-server --port 6380
AutoUpdate=registry
[Service]
Restart=always
De fem ERPNext-containrarna kör alla samma avbild, med samma volym sites, där ERPNext sparar sina inställningar och uppladdade filer. Skapa erpnext-backend.container, webbservern:
[Unit]
After=erpnext-db.service
[Container]
ContainerName=erpnext-backend
Image=docker.io/frappe/erpnext:v16.36.0
Pod=erpnext.pod
Volume=erpnext-sites:/home/frappe/frappe-bench/sites
[Service]
Restart=always
Skapa erpnext-worker.container, som kör bakgrundsjobb:
[Unit]
After=erpnext-db.service
[Container]
ContainerName=erpnext-worker
Image=docker.io/frappe/erpnext:v16.36.0
Pod=erpnext.pod
Volume=erpnext-sites:/home/frappe/frappe-bench/sites
Exec=bench worker --queue long,default,short
[Service]
Restart=always
Skapa erpnext-scheduler.container, som startar schemalagda jobb:
[Unit]
After=erpnext-db.service
[Container]
ContainerName=erpnext-scheduler
Image=docker.io/frappe/erpnext:v16.36.0
Pod=erpnext.pod
Volume=erpnext-sites:/home/frappe/frappe-bench/sites
Exec=bench schedule
[Service]
Restart=always
Skapa erpnext-websocket.container, som skickar uppdateringar i realtid till webbläsarna:
[Unit]
After=erpnext-db.service
[Container]
ContainerName=erpnext-websocket
Image=docker.io/frappe/erpnext:v16.36.0
Pod=erpnext.pod
Volume=erpnext-sites:/home/frappe/frappe-bench/sites
Exec=node /home/frappe/frappe-bench/apps/frappe/socketio.js
[Service]
Restart=always
Och erpnext-frontend.container, webbfronten som Caddy pratar med:
[Unit]
After=erpnext-db.service
[Container]
ContainerName=erpnext-frontend
Image=docker.io/frappe/erpnext:v16.36.0
Pod=erpnext.pod
Volume=erpnext-sites:/home/frappe/frappe-bench/sites
Exec=nginx-entrypoint.sh
Environment=BACKEND=127.0.0.1:8000 SOCKETIO=127.0.0.1:9000
# Caddy's connections reach the pod from the server's own IPv4 address.
Environment=UPSTREAM_REAL_IP_ADDRESS=203.0.113.10
[Service]
Restart=always
I podden delar containrarna ett nätverk, så de når varandra på 127.0.0.1, och den andra Redis-servern flyttar till port 6380. ERPNext-avbilden är låst till en exakt version, eftersom varje uppdatering också kräver ett steg i databasen, som steg 10 visar.
4. Starta den
systemctl --user daemon-reload
systemctl --user start erpnext-pod
podman ps
Första starten laddar ner avbilderna, som tar omkring 3,4 GB disk. När podman ps listar nio containrar, inklusive poddens egen erpnext-infra, är det dags för nästa steg. Tills nästa steg är gjort startar worker-, schemaläggar- och websocket-containrarna om gång på gång.
5. Berätta för ERPNext var allt finns
podman exec erpnext-backend bash -c "bench set-config -g db_host 127.0.0.1 && bench set-config -gp db_port 3306 && bench set-config -g redis_cache redis://127.0.0.1:6379 && bench set-config -g redis_queue redis://127.0.0.1:6380 && bench set-config -g redis_socketio redis://127.0.0.1:6380 && bench set-config -gp socketio_port 9000 && bench set-config -g chromium_path /usr/bin/chromium-headless-shell"
systemctl --user restart erpnext-pod
Kommandot skriver in adresserna till databasen och Redis i common_site_config.json i volymen sites, som varje ERPNext-container läser.
6. Skapa din site
ERPNext kallar varje installation för en site, uppkallad efter sin adress. Skriv först ut databaslösenordet, eftersom nästa kommando frågar efter det:
podman secret inspect --showsecret --format '{{.SecretData}}' erpnext-db-root-password; echo
podman exec -it erpnext-backend bench new-site erp.example.com --mariadb-user-host-login-scope='%' --install-app erpnext --set-default
Kommandot frågar efter tre saker:
Enter mysql super user [root]:tryck på Enter;MySQL root password:klistra in databaslösenordet;Set Administrator password:välj ett lösenord för ERPNexts användareAdministrator.
Installationen tog omkring 12 minuter på 2 vCPU. Slå sedan på schemaläggaren, som är avstängd för en ny site, och ge ERPNext dess publika adress, som den använder i länkar och e-post:
podman exec erpnext-backend bench --site erp.example.com enable-scheduler
podman exec erpnext-backend bench --site erp.example.com set-config host_name https://erp.example.com
7. Sätt Caddy framför
Gå tillbaka till root med exit, byt till machinectl shell caddy@ och lägg till det här blocket sist i ~/Caddyfile:
erp.example.com {
reverse_proxy 127.0.0.1:8093
}
Starta om Caddy med systemctl --user restart caddy.
8. Kör installationsguiden
Öppna https://erp.example.com och logga in som Administrator med lösenordet från steg 6. Installationsguiden har fyra steg:
- Welcome: kontrollera Your Language, Your Country, Time Zone och Currency, som ERPNext gissar utifrån var du befinner dig.
- Ditt eget konto: Full Name, Email Address och Password. Från och med nu loggar du in med den e-postadressen.
- Fyra frågor om din verksamhet och vilka moduler du tänker använda.
- Setup your organization: Company Name, Company Abbreviation, Chart of Accounts och Financial Year Begins On. För ett företag i Sverige väljer ERPNext BAS 2024 med Nummer, den svenska standardkontoplanen.
Välj Complete Setup. Efter omkring en minut öppnar ERPNext sitt skrivbord, med Accounting, Selling, Buying, Stock och de andra modulerna. Spara lösenordet för Administrator för underhållsarbete, och använd annars ditt eget konto.
9. Vad du gör sedan
Några bra första steg, som du hittar genom att skriva namnet i sökfältet högst upp i ERPNext:
- User List: lägg till dina kollegor, var och en med de roller de behöver;
- Email Account: sätt upp utgående e-post, så att fakturor kan skickas från ERPNext;
- Sales Taxes and Charges Template: gå igenom momsmallarna som följde med kontoplanen, till exempel
Försäljning Moms 25%, tillsammans med din redovisningskonsult.
10. Håll den uppdaterad
Slå på Podmans dagliga uppdateringar för MariaDB och Redis:
systemctl --user enable --now podman-auto-update.timer
ERPNext uppdaterar du för hand, eftersom databasen måste migreras till varje ny version. Nya versioner av ERPNext 16 släpps varje eller varannan vecka och listas på ERPNexts GitHub-sida under Releases. Säkerhetskopiera först, som i steg 11, och kör sedan följande, med den nya versionen i stället för v16.37.0:
podman pull docker.io/frappe/erpnext:v16.37.0
sed -i 's|frappe/erpnext:v16.36.0|frappe/erpnext:v16.37.0|' ~/.config/containers/systemd/erpnext-*.container
systemctl --user daemon-reload
systemctl --user restart erpnext-pod
podman exec erpnext-backend bench --site all migrate
podman image prune -a -f
Eftersom avbilden laddas ner först blir avbrottet kort, och det sista kommandot tar bort den gamla avbilden, som tar 3 GB. bench version i backend-containern visar vilken version du kör. En ny huvudversion, som 17, har egna uppgraderingsanvisningar: läs dem innan du byter tagg.
11. Säkerhetskopiera
Som erpnext:
mkdir -p ~/backup
podman exec erpnext-backend bench --site all backup --with-files
podman cp erpnext-backend:/home/frappe/frappe-bench/sites/erp.example.com/private/backups/. ~/backup/
Varje säkerhetskopia har fyra filer: databasen, de publika och de privata filerna, och sitens inställningar med dess krypteringsnyckel, som behövs för att återställa sparade lösenord. Kopiera ~/backup till en annan maskin och förvara den säkert: den innehåller hela din bokföring.
Felsökning
Det går inte att ladda ner en PDF, och felmeddelandet innehåller wkhtmltopdf reported an error med ConnectionRefusedError. Raden AddHost i erpnext.pod saknas, eller anger ett annat värdnamn. ERPNext hämtar sin egen adress när det skapar en PDF.
Worker-, schemaläggar- eller websocket-containern startar om gång på gång. Steg 5 är inte gjort, eller så startades podden inte om efter det.
Schemalagda jobb, som återkommande fakturor eller e-post, körs aldrig. Kör kommandot enable-scheduler från steg 6.