Självhostad bokföring för svenska företag (Django, BAS, SIE, AGI)
4.8K
Webbplats och användarhandbok: www.saldovibe.se
SaldoVibe är en Django-baserad bokföringsapp för svenska företag (svenskt gränssnitt, BAS-kontoplan, SIE-import/export, efterlevnad av Bokföringslagen och Skatteverkets krav). Repot innehåller en komplett Docker-uppsättning för drift; utveckling sker direkt mot en lokal virtualenv.
Appen är utvecklad för att uppfylla mina egna behov av bokföring, inte för att konkurrera med kommersiella tjänster. Det präglar designen:
web-containern i stället för via en betald molntjänst, och den externa tidsstämplingen av revisionskedjan använder en fri RFC 3161-tjänst.För hur appen används som slutanvändare, se användarhandboken.
Testningen är inte komplett — appen används i verklig bokföring, men räkna med att det finns buggar, särskilt i mindre använda flöden. Granska alltid genererade rapporter och deklarationsunderlag innan de lämnas in.
Buggar rapporteras som issues på GitHub. Beskriv gärna vilket flöde du var i, vad du förväntade dig och vad som hände i stället. Sårbarheter rapporteras privat enligt SECURITY.md.
Färdigbyggda imager (amd64 och arm64) publiceras på Docker Hub som
montegrotto/saldovibe.
Dockerfile bygger produktionsimagen med Python, Node.js, WhiteNoise och Gunicorn;
docker-compose.yml kör appen med PostgreSQL och nginx.
Servern behöver bara docker-compose.yml och .env — ingen utcheckning (nginx-konfigen ligger inline i compose-filen). Skapa miljöfilen från exemplet och sätt riktiga värden innan stacken startas:
cp .env.example .env
Starta produktionsstacken med den publicerade imagen, eller bygg den själv:
docker compose pull && docker compose up -d
docker compose up --build -d # bygger imagen lokalt från repot
Första användaren skapas i appens eget registreringsflöde
(användarhandboken, kapitel 1). Pinna en version med
SALDOVIBE_VERSION=1.0.0 i .env.
Detta startar fyra tjänster:
web för Django + Gunicorn — inklusive lokal OCR-fältföreslagning för uppladdade bilagor (se attachments/extraction_client.py), ingen separat tjänst behövsdb för PostgreSQLnginx som publik ingång för /, /static/ och /media/scheduler — ofelia, som kör den månatliga återställnings-testkörningen och e-postbilagehämtningen var 15:e minut som cron-jobb inuti webAlla inloggningsuppgifter ligger i .env, inte i compose-filen. Exempelvärdena är platshållare endast för lokalt bruk — byt ut dem innan du driftsätter någonstans på riktigt.
Utveckling sker utan Docker, direkt mot sqlite:
python3.13 -m venv .venv && source .venv/bin/activate
pip install -r requirements-dev.lock
cp .env.example .env # avkommentera DJANGO_DEBUG=1
python manage.py runserver
Lint/formatering upprätthålls med ruff (konfiguration i pyproject.toml) och testsviten körs med Djangos testkörare:
pip install -r requirements-dev.lock
ruff check .
ruff format --check .
python scripts/check_dockerfile_apps.py # Dockerfile måste COPY:a varje Django-app
python scripts/check_requirements_lock.py
npm ci # vendorerade frontend-tillgångar, krävs av collectstatic
python manage.py collectstatic --noinput # testerna körs med DEBUG=False och behöver manifestet
python manage.py test
GitHub Actions kör samma kontroller vid varje push och pull request (.github/workflows/ci.yml).
requirements.txt och requirements-dev.txt listar de direkta beroendena och är filerna du
redigerar. requirements.lock och requirements-dev.lock genereras från dem med varje transitiv
version pinnad och sha256-hashad, och är vad Docker, CI och din virtualenv installerar — så en given
commit ger alltid samma miljö, och ett manipulerat paket får installationen att misslyckas i stället
för att skeppas. Generera om båda efter varje beroendeändring:
uv pip compile requirements.txt --generate-hashes --python-version 3.13 \
--output-file requirements.lock
uv pip compile requirements-dev.txt --generate-hashes --python-version 3.13 \
--output-file requirements-dev.lock
scripts/check_requirements_lock.py (körs av CI och pre-commit-hooken) misslyckas om en
requirements-fil och dess lock-fil inte stämmer överens.
För att köra kontrollerna automatiskt via git-hooks (lint vid commit, tester vid push), aktivera de incheckade hookarna en gång per klon:
git config core.hooksPath .githooks
Använd git push --no-verify för att hoppa över testkörningen i nödfall.
All konfiguration bor i .env (kopiera från .env.example) — compose-filen läser den via
env_file, en bar manage.py runserver via python-dotenv, så inget utom fasta flaggor i stil med
DJANGO_DEBUG ligger inline i YAML-filen. Checka bara in .env.example; håll den riktiga .env
ospårad.
ALLOWED_HOSTS och CSRF_TRUSTED_ORIGINS sätts inte direkt — sätt i stället SALDOVIBE_PUBLIC_URL
(t.ex. http://localhost:8000) så härleder Django båda från den. Använd de explicita variablerna
DJANGO_ALLOWED_HOSTS / DJANGO_CSRF_TRUSTED_ORIGINS endast för driftsättningar med flera domäner; se
docs/ops/environment-variables.md för den fullständiga, samlade
referensen över varje variabel appen läser (Django/nätverk, databas, Skatteverkets API).
För backup/återställning i produktion, driftsättningssteg, migreringar och loggning/övervakning, se docs/ops/.
MIT, se LICENSE. BAS-kontoplanen och annat tredjepartsmaterial i repot har egna villkor, se THIRD_PARTY_NOTICES.md. Bidrag: CONTRIBUTING.md.
Content type
Image
Digest
sha256:4941f4cb0…
Size
140.9 MB
Last updated
4 days ago
docker pull montegrotto/saldovibe