Webapplikasjon for å registrere arbeid gjort for ukelønn, og registrere utbetalinger av ukelønn.

Steinar Bang b331b92843 Merge branch 'work/using-react-with-bootstrap4' 1 nedēļu atpakaļ
.github 140595b6ee Replace java 17 with java 21 in github actions CI build 1 nedēļu atpakaļ
docker 87000200e2 Make it possible to set the HTTP port of the ukelonn docker image by setting the environment variable PORT 3 gadi atpakaļ
jacoco-coverage-report 92d0b41004 Replace artifactId "parent" of ukelonn with "ukelonn" which looks more meaningful in sonar reports, in the jacoco-coverage-report pom 4 gadi atpakaļ
karaf 4a75baeefc Add karaf feature ukelonn-with-derby-and-provided-authservice 2 gadi atpakaļ
ukelonn.backend e5cea31fe6 Reorder modifiers to comply with Java Language Specification 2 nedēļas atpakaļ
ukelonn.db.as.authservicedb 233e5a8435 Use var for local variables in tests 10 mēneši atpakaļ
ukelonn.db.liquibase 410e224852 Catch SQLException rather than Exception for changelist close failure 2 nedēļas atpakaļ
ukelonn.db.liquibase.production 532b3134c1 Return value directly without assigning to local variable 2 nedēļas atpakaļ
ukelonn.db.liquibase.test cdaca9bc06 Remove declaration of exception that can't be thrown from method 2 nedēļas atpakaļ
ukelonn.services f9d89e042d Re-add the Transaction.name property to the Transaction record type 2 mēneši atpakaļ
ukelonn.tests abf1259056 Add @Override annotation 2 nedēļas atpakaļ
ukelonn.testutils 8eddaa3816 Convert streams to lists with .toList() instead of .collect(Collectors.toList()) 6 mēneši atpakaļ
ukelonn.web.frontend 5191ac5b5a Load application CSS file from path provided by vite (outside of index.js) 2 mēneši atpakaļ
ukelonn.web.security 7a3cdeebbe Use LiquibaseClassPathChangeLogRunner to run liquibase change lists 6 mēneši atpakaļ
ukelonn.web.services 8e98c2ec2c Simplify logic in stream expression 2 nedēļas atpakaļ
.editorconfig 391149b656 Add an editor config file that sets 4 space no tabs indentation. 7 gadi atpakaļ
.gitignore 5a36d0ceaa Ignore eclipse workspace data 2 gadi atpakaļ
LICENSE d6ef6bd282 Add 2018 as a copyright year. 6 gadi atpakaļ
README.org b10ea5ac63 Make the coveralls badge of the README point correctly to the ukelonn project 2 gadi atpakaļ
pom.xml a1754fb3a9 Upgrade parent to use liquibase 4.30.0, postgresql jdbc 42.7.4, shiro 2.0.2, bang-servlet 1.8.1 and authservice 2.0.4 1 nedēļu atpakaļ

README.org

Ukelonn: en webapplikasjon for ukelønn

Tanken er at ungene skal kunne registrere jobber de gjør i hjemmet og at foreldrene kan registrere utbetalinger av ukelønn og andre måter lønna blir betalt på (f.eks. utlegg/lån og ekstra datapakker til mobil).

Webapplikasjonen er skrevet for å bli kjørt i en OSGi runtime, og er ment å være responsive slik at den er lett å kjøre på mobiltelefoner og nettbrett.

Dette er en Webapplikasjon istedenfor en app, fordi resten av familien kjører iDingser og det er ikke så lett å få egenskrevne app'er inn på iDingser.

Instruksjoner for installasjon, finner du i: ukelonn en webapp for ukelønn.

English summary

This is a web application for keeping track of my kids' allowance.

There is a "user" GUI where they can register the chores they do and check their balance and money owed. Since my kids mostly interact through their iThings, the webapps GUI needs to be mobile friendly. This is currently accomplished by using react.js with material design lite to create a responsive GUI (not as "app-like" as the previous version using vaadin TouchKit, but close enough. TouchKit was more or less dead which is why it was left. There was an attempt to port to the open sourced TouchKit 5 and Vaadin 8, but that stopped in issues with TouchKit 5, specifically the table formatting of TouchKit 5).

There is also an admin GUI where we can register allowance payments, and add chores and adjust the payment for the chores.

    The webapplication is intended to run inside [[https://karaf.apache.org][apache karaf]] and is installed using karaf's maven magic, basically:
  1. Install apache karaf
  2. From the karaf console command line, do some configuration
  3. Also from the karaf console command line, run commands to install the application from maven repositories

The application also uses Liquibase to create and set up the database, all that is needed is a blank PostgreSQL database that can be reached by the karaf server with a JDBC URL.

The code (classnames, variable names etc.) and comments and commit messages are all in English.

The README is in Norwegian (except for this summary).

Configuring English as the default language

By default the GUI language is Norwegian.

Changing the locale setting is persisted in a cookie in the browser, but to avoid needing to do the change, it is possible to set the default to something else in the karaf configuration.

To set the default to English, and to get English text on the prepopulated database entries, do the following commands in the karaf console, before installing the application:

config:edit no.priv.bang.ukelonn.backend.UkelonnServiceProvider config:property-set defaultlocale en_GB config:update config:edit no.priv.bang.ukelonn.db.liquibase.test.ProductionLiquibaseRunner config:property-set databaselanguage en_GB config:update

Docker image

There is a docker image of the demo version of the application at docker hub: ukelonn-demo.

Start with:

docker pull steinarb/ukelonn-demo:latest docker run -p 8101:8101 -p 8181:8181 -d steinarb/ukelonn-demo:latest

hen connect to http://docker-container-host:8181/ukelonn with a web browser (replace docker-container-host with whatever host docker is running on), possible logins are
username password comment
admin admin Admin user, can add new users and work tasks
jad 1ad Regular user, can register work done

The demo version use an in-container derby databse that works while the container is up but dies with the container.

Status

file:https://github.com/steinarb/ukelonn/actions/workflows/ukelonn-maven-ci-build.yml/badge.svg file:https://coveralls.io/repos/github/steinarb/ukelonn/badge.svg file:https://sonarcloud.io/api/project_badges/measure?project=steinarb_ukelonn&metric=alert_status#.svg

file:https://sonarcloud.io/images/project_badges/sonarcloud-white.svg

file:https://sonarcloud.io/api/project_badges/measure?project=steinarb_ukelonn&metric=sqale_index#.svg file:https://sonarcloud.io/api/project_badges/measure?project=steinarb_ukelonn&metric=coverage#.svg file:https://sonarcloud.io/api/project_badges/measure?project=steinarb_ukelonn&metric=ncloc#.svg file:https://sonarcloud.io/api/project_badges/measure?project=steinarb_ukelonn&metric=code_smells#.svg file:https://sonarcloud.io/api/project_badges/measure?project=steinarb_ukelonn&metric=sqale_rating#.svg file:https://sonarcloud.io/api/project_badges/measure?project=steinarb_ukelonn&metric=security_rating#.svg file:https://sonarcloud.io/api/project_badges/measure?project=steinarb_ukelonn&metric=bugs#.svg file:https://sonarcloud.io/api/project_badges/measure?project=steinarb_ukelonn&metric=vulnerabilities#.svg file:https://sonarcloud.io/api/project_badges/measure?project=steinarb_ukelonn&metric=duplicated_lines_density#.svg file:https://sonarcloud.io/api/project_badges/measure?project=steinarb_ukelonn&metric=reliability_rating#.svg

Lisens

Lisensen er Apache Public License v 2.0.

Se fila LICENSE for teksten på lisensen.

Hva ligger på de forskjellige branchene

    I øyeblikket er det fire hoved-brancher:
  1. master
  2. Dette er branchen som er i produksjon. Hver push av denne branchen forårsaker [[https://travis-ci.org/steinarb/ukelonn][et bygg på travis-ci]] (dette er den eneste branchen med en [[https://github.com/steinarb/ukelonn/blob/master/.travis.yml][.travis.yml]]-fil) med snapshot deploy til et eget maven-repository, som er [[Oppsett av webappen på en server med debian GNU/linux][det som brukes til å installere applikasjonen i karaf-instansen på produksjonsserveren]]. Det som ligger på master er i øyeblikket work/using-react-with-bootstrap4
  3. using-react
  4. Denne branchen har et GUI basert på [[https://reactjs.org][react.js]] med navigasjon mellom skjermbilder besørget av [[https://reactjs.org][react-router v4]], datamodell i [[https://reactjs.org][redux]], med REST-API-kommunikasjon gjort av [[https://reactjs.org][saga]] og [[https://reactjs.org][axios]]. Denne branchen er uten styling
  5. work/using-react-with-bootstrap4 er using-react stylet opp som en "responsive" mobilvennlig webapp, med bootstrap v4
  6. work/using-react-with-material-design som er using-react stylet opp som en "responsive" mobilvennlig webapp, med material design lite
  7. using-vaadin
  8. Denne branchen bruker [[https://vaadin.com/home][vaadin]]. Her brukes Vaadins [[https://vaadin.com/docs/-/part/touchkit/mobile-components.html][Mobile User Interface Components]] for å få noe som ser "app-aktig" ut, iallefall på registrering av jobber, gjort av ungene. Admin-grensesnittet er også blitt mer mobilt men vil trives bedre på en tablet enn på en mobil (det er mer som skal vises fram). Denne branchen er i skrivende stund "i produksjon" i heimen (i den litt eldre versjonen som ligger på master). Denne branchen bruker [[http://ops4j.github.io/pax/web/SNAPSHOT/User-Guide.html#whiteboard-extender][Pax web whiteboard extender]] der servlet'er og filtre blir publisert som OSGi-servicer som blir plukket opp av pax web. For å lage servicene som plukkes opp av Pax Web, brukes OSGi Declarative Services (DS).
  9. using-primefaces
  10. Denne branchen bruker [[https://en.wikipedia.org/wiki/JavaServer_Faces][JSF]] med [[http://www.primefaces.org/][primefaces]] og var den første som var ferdig. Jeg støtte på [[https://github.com/primefaces/primefaces/issues/1864][en bug]] i primefaces mobile som gjorde at versjonen som kjører nå ikke er så pen (siden jeg ikke kunne bruke primefaces mobile så måtte jeg gjøre et triks med å blåse opp fontene for at ting ikke skulle være uleselig på mobil, så sluttresultatet så litt rart ut). Branchen bygger fortsatt og har fått alle databasendringene men har mest historisk interesse idag
  11. using-rendersnake
  12. Denne branchen var ment å være "back to basic" og bruke [[http://rendersnake.org/][rendersnake]] sammen med en REST-ful backend, men den er i skrivende stund ikke forbi "hello world"-stadiet. Denne branchen var utgangspunktet for using-react og er i øyeblikket i praksis død

Jeg har også plan om å lage en branch med en versjon som bruker spark med angular.js, men denne er foreløpig på plan-stadiet. Spark er allerede en OSGi-bundle, så det burde la seg gjøre å få den til å spille i Karaf på en sånn måte at jeg kan beholde database-laget (der all business-intelligensen er), mens jeg fjerner alt som har med servlets å gjøre. Har gjort et forsøk på å dra spark inn i karaf men har ikke lykkes ennå. Forhåpentligvis kan jeg også beholde Shiro for å håndtere autentisering og autorisasjon.

Kjapp test av programvaren uten å bygge koden

Det er flere muligheter til å teste programvaren uten å sjekke ut og bygge kode.

Med dummy-data i en derby-database

I denne testen kjører man mot en derby-database som settes opp med dummy-data.

Kjøring i docker-container

    Framgangsmåten er som følger:
  1. Følge Apache Karaf quick start guide https://karaf.apache.org/manual/latest/quick-start.html
  2. Fra kommandolinja til karaf (aka. "karaf console") legg til et maven-repo som inneholder ukelonn bygd fra travis-ci
  3. #+BEGIN_EXAMPLE config:edit org.ops4j.pax.url.mvn config:property-append org.ops4j.pax.url.mvn.repositories ", https://maven.bang.priv.no/repository/@id=ukelonn@snapshots" config:property-set org.ops4j.pax.url.mvn.globalUpdatePolicy always config:update #+END_EXAMPLE
  4. Fortsatt fra kommandolinja til karaf, innstaller ukelonn-appen med følgende kommandoer (applikasjonen ukelonn og alle dens avhengigheter blir dratt med hjelp av maven)
  5. #+BEGIN_EXAMPLE feature:repo-add mvn:no.priv.bang.ukelonn/karaf/LATEST/xml/features feature:install ukelonn-with-derby #+END_EXAMPLE
  6. Åpne http://localhost:8181/ukelonn i en nettleser
  7. For en vanlig bruker, brukernavn/passord: jad/1ad
  8. Vanlig bruker kan registrere nye jobber og sjekke saldo
  9. For en administrator-bruker, brukernavn/passord: admin/admin
  10. Administrator-bruker kan registrere utbetalinger, legge inn nye jobbtyper og endre eksisterende, legge inn nye utbetalinger og justere på eksisterende, og legge inn brukere og endre på eksisterende brukere

Demo-image med dummy-data

Dette docker-image't bruker samme dummy-database som Med dummy-data i en derby-database.

Last ned image fra docker hub og start image med:

docker pull steinarb/ukelonn-demo:latest docker run -p 8101:8101 -p 8181:8181 -d steinarb/ukelonn-demo:latest

pne en nettleser mot http://docker-container-host:8181/ukelonn (erstatt docker-container-host med maskinen docker kjører på), mulige testbrukere, er
brukernavn passord kommentar
admin admin Admin-bruker, kan legge til nye brukere, nye arbeidsoppgaver og registrere utbetalinger
jad 1ad Vanlig bruker, kan registrere utførte arbeidsoppgaver

Databasen som kjører er en ekte SQL-database men kjører kun i minnet så endringer blir ikke persistert og blir borte når karaf-prosessen blir stoppet.

Docker-image med PostgreSQL-database

Dette imaget trenger en blank PostgresSQL-database og vil sette opp skjema og fylle den opp med initielle data.

    Framgangsmåten er som følger:
  1. Gå til ElephantSQL og enten lag en bruker der eller logg inn med en github-bruker og opprett en database
  2. Ta vare på oppkoblingsinformasjonen for databasen, f.eks.
  3. | url | jdbc:postgresql://lazzie.db.elephantsql.com:5432/mrpdrgft | | user | mrpdrgft | | password | 78TPpFgp7NFwFmF1nVr1F2LnzKR_1TfT | | default database | mrpdrgft |
  4. Last ned image fra docker hub og start image med:
  5. #+begin_example docker pull steinarb/ukelonn:latest docker run --env JDBC_URL=jdbc:postgresql://lazzie.db.elephantsql.com:5432/mrpdrgft --env JDBC_USER=mrpdrgft --env JDBC_PASSWORD=78TPpFgp7NFwFmF1nVr1F2LnzKR_1TfT -p 8181:8181 -d steinarb/ukelonn:latest #+end_example
  6. Åpne en nettleser mot port 8181 på vertsmaskinen http://myhost.mydomain.com:8181/ukelonn
  7. Logg inn med:
  8. | user | password | |-------+----------| | admin | admin |
  9. Opprett den/de admin-brukerene du vil ha og den/de vanlige brukerene du vil ha

Beskrivelse av koden

(Beskriver versjonen fra master)

    Prosjektet er et maven-prosjekt med følgende struktur:
  • pom.xml
  • Dette er topp-prosjektet som definerer alle versjoner av programvare som brukes og alle versjoner av avhengigheter og felles-oppsett for plugins.
  • ukelonn.services/pom.xml
  • Dette er en OSGi-bundle som definerer to OSGi-servicer: UkelonnService og UkelonnDatabase
  • UkelonnDatabase gjør database-laget pluggbart
  • UkelonnService definerer alle operasjoner som REST-APIet tilbyr. Alle beans som brukes i REST-APIet er også definert her
  • ukelonn.db.liquibase/pom.xml
  • Denne bundle'n inneholder skjemaet for ukelonn-webappen som et liquibase changeset som ressurser og kode som laster ressursen fra lokal classpath og kjører dem mot databasen
  • ukelonn.db.derbytest/pom.xml
  • Dette er en ikke-persistent SQL-database i minnet som setter opp forventet skjema og fyller opp databasen med test-data (dataene fylles opp som liquibase changesets så det er ok å starte denne basen mange ganger uten at det blir duplikat i dataene) Dette er en fullt funksjonell database, men ingenting blir persistert mellom kjøringer. Den brukes til test både av webappen i gogoshell og brukes som en vanlig jar-fil i enhetstestene i ukelonn.bundle
  • ukelonn.db.postgresql/pom.xml
  • Dette er en OSGi-bundle som forventer å finne en PostgreSQL-base som brukeren som kjører webappen har rettigheter til og som har en database "ukelonn". Databasen "ukelonn" vil få riktig skjema og en admin-bruker ved første gangs kjøring.
  • ukelonn.backend/pom.xml
  • Dette er implementasjonen av UkelonnService. Inneholder applikasjonens business-logikk. Trenger en OSGi-service av type UkelonnDatabase
  • ukelonn.web.security/pom.xml
  • Dette er en DS-komponent som kobler Shiro-autentisering inn i web whiteboard
  • ukelonn.web.services/pom.xml
  • Dette er en DS-komponent som lager et REST-API og plugger inn i web whiteboard
  • ukelonn.web.frontend/pom.xml
  • Dette er en react-applikasjon som plugger seg inn i web whiteboard
  • karaf/pom.xml
  • Dette er en POM som lager en "feature"-fil for [[http://karaf.apache.org/][Apache karaf]], noen viktige features: | Feature | Beskrivelse | |-------------------------+-------------------------------------------------------------------------------------------------------------------------------| | ukelonn-with-derby | Laster inn webapplikasjonen sammen med en derby-database med dummy-data som kjører i minnet | | ukelonn-with-postgresql | Laster inn webapplikasjonen sammen med en JDBC-connection mot PostgreSQL (venter å finne en database som karaf kan aksessere) |
    Forholdet mellom features og OSGi-bundle'r i Apache karaf ligner på forholdet mellom APT og dpkg-pakker i debian GNU/linux. Features gir en robust måte å installere noe og sørge for at alle avhengigheter er på plass
  • ukelonn.tests/pom.xml
  • Dette er en Pax Exam integrasjonstest som sjekker at OSGi-bundlene starter og at de tilbyr riktig service.

Bygg applikasjonen fra kildekode og kjør applikasjonen

For å teste og debugge, så kan man kjøre med samme database som enhetstestene og integrasjonstestene bruker. Derby-databasen kjører i minnet og blir satt opp med faste data ved hjelp av liquibase, hver gang den blir startet.

    Dette trengs for å bygge og kjøre programvaren
  1. Installer det som trengs:
  2. git: https://git-scm.com/download/win
  3. Java SDK 1.8: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
  4. Apache maven:
  5. Download: https://maven.apache.org/download.cgi
  6. Install: https://maven.apache.org/install.html
  7. Run: https://maven.apache.org/run.html
  8. I et kommandolinjevindu, gjør en klon av git-repositoriet
  9. #+BEGIN_EXAMPLE mkdir git cd git git clone https://github.com/steinarb/ukelonn.git #+END_EXAMPLE
  10. I kommandolinje-vinduet, bygg applikasjonen med følgende kommandoer:
  11. #+BEGIN_EXAMPLE cd ukelonn mvn clean install #+END_EXAMPLE
  12. Følge Apache Karaf quick start guide https://karaf.apache.org/manual/latest/quick-start.html
  13. Installer applikasjonen med følgende kommandoer fra "karaf console":
  14. #+BEGIN_EXAMPLE feature:repo-add mvn:no.priv.bang.ukelonn/karaf/LATEST/xml/features feature:install ukelonn-with-derby bundle:watch * #+END_EXAMPLE (kommandoen "bundle:watch *" får karaf til å lytte i local maven repo og plukke opp og oppdatere installerte bundler som blir bygd på nytt med "mvn install" eller "mvn clean install")
  15. Koble en nettleser mot http://localhost:8181/ukelonn/
  16. For en vanlig bruker, brukernavn/passord: jad/1ad
  17. Vanlig bruker kan registrere nye jobber og sjekke saldo
  18. For en administrator-bruker, brukernavn/passord: admin/admin
  19. Administrator-bruker kan registrere utbetalinger, legge inn nye jobbtyper og endre eksisterende, legge inn nye utbetalinger og justere på eksisterende, og legge inn brukere og endre på eksisterende brukere

Kjøring på apache karaf med PostgreSQL

Derbydatabasen i Kjøring på apache karaf med derby gjør det mulig å kjøre alt i webappen. Men ettersom den kun kjører i minnet så er den ikke noe særlig å lagre data i.

For å faktisk bruke webappen så må man ha en database og database-systemet jeg har valgt er PostgreSQL.

    PostgreSQL er gratis og fri software og er lett å installere
  1. På windows, last ned installeren og kjør den
  2. På debian GNU/linux, gi følgende kommando som root:
  3. #+BEGIN_EXAMPLE apt-get install postgresql #+END_EXAMPLE

Å finne ut av hvordan det gjøres på andre system overlates til leseren... men det er neppe hverken veldig forskjellig fra eksemplene over, eller mer enn et googlesøk unna.

Litt om PostgreSQL, denne webappen og sikkerhet

OSGi-servicen som implementerer kobling mot PostgreSQL hardkoder en kobling mot localhost på default-porten til PostgreSQL (dvs. port 5432) og har ikke noe brukernavn eller passord lagret i seg.

    Dette betyr:
  1. PostgreSQL-serveren må kjøre på samme datamaskin som webappen kjøres på (jeg kjører selv alt på en enkelt "Virtual Private Server" (VPS) hos Bytemark så dette er ikke restriksjon som plager meg)
  2. Det må være en PostgreSQL-bruker med samme navn som brukernavnet som webappen kjøres som, dvs. når jeg kjører karaf som min egen bruker "sb", så må jeg ha en postgresql-bruker "sb":
  3. #+BEGIN_EXAMPLE /bin/sudo -s /bin/bash postgres createuser sb #+END_EXAMPLE og når jeg kjører karaf som brukeren "karaf" (dvs. når jeg kjører karaf som en service installert med apt-get på debian GNU/linux), så må jeg ha en postgresql-bruker "karaf": #+BEGIN_EXAMPLE /bin/sudo -s /bin/bash postgres createuser karaf #+END_EXAMPLE
  4. PostgreSQL-serveren må ha en database som heter "ukelonn" og som er eid av brukeren karaf kjøres som, lagd f.eks. slik:
  5. #+BEGIN_EXAMPLE /bin/sudo -s /bin/bash postgres createdb -O sb ukelonn #+END_EXAMPLE
  6. Autentisering av oppkoblingen må gjøres på en måte som ikke trenger et passord lagret i OSGi-servicen, dvs. en av disse:
  7. [https://www.postgresql.org/docs/9.6/static/auth-methods.html#AUTH-TRUST][Trust authentication]] dvs. PostgreSQL stoler på at klienten er brukeren som den sier at den er. Ikke veldig sikkert, men greit nok for å teste mot PostgreSQL under utvikling
  8. [https://www.postgresql.org/docs/9.6/static/auth-methods.html#AUTH-IDENT][Ident authentication]] stol på at svaret på port 113 ("ident", RFC 1413) om hvilken bruker som har åpnet en forbindelse på en gitt port. Dette er måten jeg bruker på GNU/linux og er rimelig grei, så lenge jeg kjører alt på en og samme server
  9. [https://www.postgresql.org/docs/9.6/static/auth-methods.html#AUTH-PEER][Peer authentication]] Spør OSet om brukeren til prosessen som kobler seg til (fungerer kun for lokale forbindelser som f.eks. unix sockets, og unix sockets støttes ikke av PostgreSQL JDBC-driver)
  10. [https://www.postgresql.org/docs/9.6/static/auth-methods.html#GSSAPI-AUTH][GSSAPI Authentication]] bruker kerberos og er notorisk vanskelig å sette opp og få til å fungere (men veldig fint når det er på plass)

Oppsettet videre antar "trust authentication" for kjøring mot PostgreSQL under utvikling og "ident authentication" for kjøring på en debian-server.

Kjøring av webappen mot postgres lokalt på utviklingsmaskinen

    Dette krever at man har en lokal PostgreSQL-installasjon med følgende innstillinger:
  1. En database med navn "ukelonn" der brukeren karaf kjører med har alle rettigheter (i eksempelet under er dette min egen bruker "sb"):
  2. #+BEGIN_EXAMPLE /usr/bin/sudo -u postgres createuser sb /usr/bin/sudo -u postgres createdb -O sb ukelonn #+END_EXAMPLE (kommandoeksempler fra debian, kommandoer kjørt som root)
  3. [https://www.postgresql.org/docs/9.6/static/auth-methods.html#AUTH-TRUST][Sett opp autentiseringsmetode trust i PostgreSQL]]

Oppsett av webappen på en server med debian GNU/linux

    Framgangsmåte:
  1. Klon og bygg webapplikasjonen (kommandoeksemplene er fra bash på GNU/linux):
  2. #+BEGIN_EXAMPLE mkdir -p ~/git cd ~/git git clone https://github.com/steinarb/ukelonn.git cd ~/git/ukelonn mvn clean install #+END_EXAMPLE
  3. [http://karaf.apache.org/download.html][Last ned Karaf]], pakk ut den nedlastede distribusjonen og start karaf fra kommandlinja (karaf vil da kjøre som din egen bruker som stemmer med PostgreSQL-oppsettet i starten av dette avsnittet):
  4. #+BEGIN_EXAMPLE cd /tmp wget http://www.apache.org/dyn/closer.lua/karaf/4.2.5/apache-karaf-4.2.5.tar.gz cd ~ tar xvfz /tmp/apache-karaf-4.2.5.tar.gz cd apache-karaf-4.2.5 bin/karaf #+END_EXAMPLE
  5. Gjør ukelonn-webapplikasjonen tilgjengelig for karaf, som "karaf features", hentet fra maven:
  6. #+BEGIN_EXAMPLE feature:repo-add mvn:no.priv.bang.ukelonn/karaf/LATEST/xml/features #+END_EXAMPLE
  7. Installer webapplikasjonen:
  8. #+BEGIN_EXAMPLE feature:install ukelonn-with-postgresql #+END_EXAMPLE
  9. Koble en nettleser mot http://localhost:8181/ukelonn/
  10. Admin-bruker, brukernavn/passord: admin/admin
  11. Denne brukeren blir satt opp når man først kobler seg opp mot en tom PostgreSQL-database: Da sørger liquibase for at skjemaet (tabeller og views) blir satt opp og for at en admin-bruker og noen transaksjonstyper blir lagt inn
  12. Administrator-bruker kan registrere utbetalinger, legge inn nye jobbtyper og endre eksisterende, legge inn nye utbetalinger og justere på eksisterende, og legge inn brukere og endre på eksisterende brukere
  13. En grei måte å starte på, er:
  14. Endre passord på admin-brukeren
  15. Lage en ny vanlig bruker

NB! Har ikke med oppsett av brannmur og oppsett av nginx eller apache med revers-proxy.

(Normalt så vil port 8181 som webappen opererer på være sperret av brannmur på en webserver som står på internett, så man må sette opp en revers-proxy fra nginx eller apache (som lytter på portene 80 og 443) til karaf som lytter på localhost:8181)

    Prosedyre (alle kommandolinje-eksempler gjort i bash, logget inn som root):
  1. Legg til nøkkel for apt-repo'et som inneholder karaf
  2. #+BEGIN_EXAMPLE wget -O - https://apt.bang.priv.no/apt_pub.gpg | apt-key add - #+END_EXAMPLE
  3. Legg til følgende linjer i /etc/apt/sources.list :
  4. #+BEGIN_EXAMPLE # APT archive for apache karaf deb http://apt.bang.priv.no/public stable main #+END_EXAMPLE
  5. Installer nødvendig software:
  6. #+BEGIN_EXAMPLE apt-get update apt-get install postgresql karaf #+END_EXAMPLE
  7. Sett opp bruker og database i PostgreSQL:
  8. #+BEGIN_EXAMPLE /usr/bin/sudo -u postgres createuser karaf /usr/bin/sudo -u postgres createdb -O karaf ukelonn #+END_EXAMPLE (kommandoen blir her kjørt som bruker postgres som ikke kan logges inn til (derfor "-s /bin/bash"), men har de riktige rettighetene til å sette opp ting i postgres)
  9. Ta ssh inn til karaf:
  10. #+BEGIN_EXAMPLE ssh -p 8101 karaf@localhost #+END_EXAMPLE (passord "karaf" (uten anførselstegn))
  11. I karaf kommando-skall, legg til maven-repo som holder snapshots av ukelonn, bygd fra travis CI-bygg av det som blir pushet til master:
  12. #+BEGIN_EXAMPLE config:edit org.ops4j.pax.url.mvn config:property-append org.ops4j.pax.url.mvn.repositories ", https://maven.bang.priv.no/repository/@id=ukelonn@snapshots" config:property-set org.ops4j.pax.url.mvn.globalUpdatePolicy always config:update #+END_EXAMPLE
  13. I karaf kommando-skall, gi følgende kommandoer:
  14. #+BEGIN_EXAMPLE feature:repo-add mvn:no.priv.bang.ukelonn/karaf/LATEST/xml/features feature:install ukelonn-with-postgresql #+END_EXAMPLE

Nå kjører webappen mot http://localhost:8181/ukelonn/ og databasen har blitt satt opp med admin-bruker, med brukernavn/passord: admin/admin.

Det kan være lurt å starte med å endre passordet her så fort som mulig.

Det kan også være lurt å sette opp en nattlig backup av denne databasen til en annen maskin.

Merk: Nye snapshots blir bygd og deployet til dette maven-repoet hver gang noe blir pushet til master på github.

For å oppdatere til nyeste snapshot, ta "ssh -p 8101 karaf@localhost" og gi følgende kommandoer:


  bundle:update no.priv.bang.ukelonn.services; bundle:update no.priv.bang.ukelonn.db.liquibase; bundle:update no.priv.bang.ukelonn.db.postgresql; bundle:update no.priv.bang.ukelonn

(Merk: Man kan ikke bruke "bundle:watch *" etter å ha installert -snapshot-versjoner fra et maven-repository man når med http, fordi "hundle:watch *" fungerer kun for automatisk oppdatering av snapshot-versjoner installert i det lokale maven-repoet i ~karaf/.m2/repository/ )

Koble webapp mot database på en annen maskin

Uansett hvilken setting man bruker PostgreSQL i (utvikler-oppsett eller oppsett på server), så er det mulig å peke på en PostgreSQL-database som kjører på en annen server.

    Framgangsmåte:
  1. Sørg for at PostgreSQL godtar tilkoblinger fra alle nettverksadresser (ut av boksen på debian, så godtar PostgreSQL kun tilkoblinger fra localhost):
  2. su til bruker postgres for å få riktig eierskap på filene
  3. #+BEGIN_EXAMPLE su - postgres #+END_EXAMPLE
  4. Endre fila /etc/postgresql/9.6/main/postgresql.conf, utkommenter linja med listen_address line og endre den til den ser sånn ut
  5. #+BEGIN_SRC conf listen_addresses = '*' # what IP address(es) to listen on; #+END_SRC
  6. Endre fila /etc/postgresql/9.6/main/pg_hba.conf, og legg til følgende linjer
  7. #+BEGIN_SRC conf # IPv4 network connection allow password authentication host all all 0.0.0.0/0 md5 #+END_SRC
  8. Logg ut som bruker postgres (bare root kan ta omstart av postgresql):
  9. #+BEGIN_EXAMPLE exit #+END_EXAMPLE
  10. Ta omstart av postgresql
  11. #+BEGIN_EXAMPLE systemctl restart postgresql #+END_EXAMPLE
  12. Fra karaf-konsollet, gi følgende kommandoer:
  13. #+BEGIN_EXAMPLE config:edit org.ops4j.datasource-ukelonn-production config:property-set osgi.jdbc.driver.name "PostgreSQL JDBC Driver" config:property-set dataSourceName "jdbc/ukelonn" config:property-set ops4j.preHook "ukelonndb" config:property-set org.apache.karaf.features.configKey "org.ops4j.datasource-ukelonn-production" config:property-set url "jdbc:postgresql://lorenzo.hjemme.lan/ukelonn" config:property-set user "karaf" config:property-set password "karaf" config:update #+END_EXAMPLE