Docker ja kehitysehdotus

Started by ioxo, 04.02.24 - klo:09:13

Previous topic - Next topic

ioxo

Hei pitkästä aikaa,

Käytin aikoinaan paljon mlinvoice ja sain sillä hyvin hoidettua firman laskut. Nykyään käytän muuta, mutta se ei vähennä arvostustani mlinvoicea kohtaan. Kiitos Erelle isosta ja kovasta panostuksesta. En usko että ohjelma olisi yhtä käyttökelpoinen ilman sinua.

Ajattelin hiukan auttaa, mikäli panoksestani on hyötyä. Kuukauden verran olen tykästynyt dockeriin ja huomannut sen erittäin käteväksi. Siispä tein uuden Dockerfilen, joka on hiukan pienempi. Huomasin että originaali on vajaa 900 Mt ja alpinella pääsin vajaa 200 Mt.

Liiteenä Dockerfile ja lighttpd.mlinvoice, joka sisältää konfin lighttpd:lle. Homman sai aika helposti ja nopeasti käyntiin, mutta hiukan harmaita hiuksia aiheutti puutteellinen dokumentointi, mutta samaan hengenvetoon en ole syyttämässä dokumentointia... itse en jaksaisi tuotakaan määrää tehdä dokumentointiin :).

- mbstring oli hyvä vinkki, ilman sitä homassa olisi mennyt vähän pitempään
- session oli se joka aiheutti murhetta...
- lopuksi ympäristömuuttujat, joihin esitän vaihtoehtoratkaisua

Sain omalla koneellani dockerin rakennettua, käynnnistettyä, ja asennettua. Se mitä tuohon jäin kaipaamaan on kyseiset ympäristömuuttujat  (tai vastaavilla nimittyksillä) ja config.php.sample kikkailun voisi siirtää unholaan... Mitä olen pienissä projekteissa nähnyt niin admin salasana ekaksi annetaan ja vasta ohjelmaan kirjautuneena voit muuttaa sen tietoja. Koko asennuksen voisi tehdä siten, että config.php tiedoston yläosaan syötetään halutut muuttujat ja sen jälkeen mennään "brute forcella" eteenpäin tai vaihtoehtoisesti config lukee tarvittavat ympäristömuuttujat jolloin systeemin tiedostoihin ei tarvitsisi koskea lainkaan. Lopuksi / dokumentoinnissa annetaan vinkki että admin salasana on nimda ja sen voi käydä vaihtamassa Menu -> sieltä -A täältä. Jos tuota haluaa käyttää webhotellista niin tuon filen voi käydä hyvin ekaksi läpi, jonka jälkeen tietää mitä tapahtuu ja odottaa vain sormet ristissä että milloin login ilmestyy ruudulle.

Dockerin puolesta tuohon config.php:hen voisi tehdä jotain seuraavaa


// ohje php:n sisälle kuinka muutat tietoja mikäli tarve...
// jos heittää dokkeriin niin php:tä ei koskaan nää ja osaa tuskin kiinnostaa
// onko php, ruby, javascript vai millä tehty jos homma toimii...
$run_in_docker = false / false  // onko tälle muuttujalle lopuksi edes tarvetta?
$db_server = $_ENV["DB_SERVER"] || 'localhost'
$db_user = $_ENV["DB_USER] || 'mlinvoice'

tai sitten jotain
$db_server = array($_ENV["DB_SERVER"], "localhost")

if ($run_in_docker) {
 $dbserver = $db_server[0];
}
jne...

Tällöin Dockerfilessä ei tarvitsisi luoda www-käyttäjää (ja muuttaa hakemiston oikeuksia) sitä varten että config.php.sample muutetaan config.php:ksi ja homman saisi toimimaan myös siten, että dockeria käytettäessä (tai muuten jossa halutaan syöttää tiedot ympäristömuuttujan kautta) asioihin pystyisi vaikuttamaan.

Config.php / setup.php voisi tehdä tietokantaan tarkistuksen tyyliin 'select * from mlinvoice.version; jos mätsää niin jatketaan käyttöä, muussa tapauksessa kerrotaan että ero on tai ei löydy koko ohjelmaa tietokannasta. Joko kyllä / ei jatketaanko tai sitten teksti että "ota yhteys järjestelmävalvojaan jne... :)"

Tämä mahdollistaisi myös hyvin sen, että jos tietokanta pysyy samana niin dockeria / ohjelmaa voi siirtää helposti koneelta toiselle tekemättä oikeastaan mitään muuta asetusta kuin muutaman ympäristömuuttujan säätäminen ja homma pelittää taas...

Jos joku miettii miten tuon dockerin saa käyntiin niin seuraavasta voinee olla vinkkiä:

tekee hakemiston, johon laittaa Dockerfilen ja lighttpd:mlinvoicen. Oletettuna docker asennettuna.
Dockerfile hakee automaattisesti labs.fi:n tietopalveluista vakaan jakelun. Ellei Ere muuta sijaintia :)

kontinkääntö:
$ docker build -t mli:1 .

verkon luonti
$ docker network create mli

Tässä ei ole tietokantaa mukana vaan se pyörii omana palveluna
docker pull mariadb:latest (veikkaus, run käynnistää pullauksen, jos ei löydy koneelta)

$ docker run -d --name db --network=mli mariadb:latest

mariadb:n ja mlinvoicen on oltava samassa verkossa. DB voi olla useammassakin verkossa.
DB:n porttia ei tarvi bindata hostille vaan sen voi pitää dockerin sisällä (turvallisempi).
Ainoastaan mlinvoicen portti otetaan ulos, tässä tapauksessa 8089 omalla koneella kun dockerin
sisällä se on 80.

Käynnistys esim. (tosin ympäristömuuttujilla ei tee vielä mitään :)
docker run -d -e DB_HOST=db -e DB_USERNAME=mlinvoice -e DB_PASSWORD=mlinvoice -e DB_NAME=mlinvoice -e SECRET_KEY_32=elitism-establish-sevenfold  --name mli --network=mli -p 8089:80 mli:1

Tuon dockerin voi laittaa sitten nginx tai apachen tai vastaavan proxyn taakse jos haluaa.

Sori jos tuli ylimääräisiä kirjaimia kun näppäimistö tekee kuolemaa ja tulee välistä tupla t yms juttuja :).

- Juho Vähäkangas

Edit:
Jäi liittämättä nuo litteet :). Olkaapa hyvät. Dokerin käyttö onistuu siis ilman noita environment asetuksia. Ne ovat käytännössä turhia, mutta tuossa on jonkinlainen aihio niiden käyttöön.
You cannot view this attachment.. You cannot view this attachment. 

Ere Maijala

Moi,

Ja kiitoksia panostuksestasi tähän. Nyt tuli sellainen pläjäys painavaa asiaa, että vähän aikaa pitää sulatella. :)

Yksi puoli tuossa Dockerin pitämisessä mahdollisimman yksinkertaisena on ollut tavoite saada se toimimaan vähän jännemmissäkin ympäristöissä, esim. NAS:ssa. Mutta kun itselläni ei ole mahdollisuutta testailla kaikkia ympäristöjä, niin on jäänyt vähän tällaiseksi "toimii vissiin tarpeeksi hyvin" -tyyppiseksi ratkaisuksi.

Se on kuitenkin selvä, että olisi kivempi, jos config.php olisi paljon lyhyempi ja loput asetuksista olisi käyttöliittymän puolella. Ehkäpä joskus saan tätä parannettua.

--Ere

ioxo

Hei,

Vielä tuli semmoinen mieleen, että jos nuo html asiat pystyisi tuuttaamaan esim Twig templatella ulos niin kehityksessä pystyisi olemaan helposti ulkopuolinen mukana myös semmoinen joka ei osaa niinkään koodata. Nyt html:t on niin pahasti piilotettu että ainakin itsellä kestää selata oikeaa kohtaa kauan... (osaan kumminkin jotenkuten koodata, mutta en juurikaan nyky php:ta... php3 oli tuttu :))

Tarkoitan että kun html:t toisi jollain templatella ulos niin sivun kehittäjän ei tarvitsisi osata lukea php:tä vaan asiat hoituisivat {{muuttujien}} ja {% if muuttuja == muuttuja %} tyyppisesti.

Jos meinaa laittaa sivut templatella niin usein niissä on sitten varjopuolena(?) se että urlien kanssa voi olla erilaisempaa. Ei välttämättä toimi enää hakemistosta, mutta voi olla että toimii (voi olla vähän haaste - en tiedä). Tosin voi myös puntaroida että missä menee raja minkäkin suhteen. Templatessa taas voittaisi sen että siinä voisi helposti käyttää bootstrappia tai tailwindiä yms työkaluja ja eri listoista/taulukoista voisi tehdä komponentteja joita laittaa eri sivuilla ulos tyyliin {{ include "avoimet_laskut.html" data=table_data }}. Nuo esimerkit nyt on django / jinja2 tyyppistä mutta Twig lienee samankaltainen.

Kokeilin siis tuota dockerfileä ja tein sen mallilaskun ja homma toimi. Mitään syvällisempää benchmarkkia en tehny, mutta uskon että toimii. Lighttpd:n konffissa taitaa olla turha se mod_rewrite rivi. Jos tarve niin voin tuosta nginx versionki tehdä. Light tuli vaan kevyistä ekana mieleen :). Tuo palvelin nyt jääkin proxyn taakse jos meinaa julkisesti pyöritellä. Tässä tapauksessa on ihan sama onko se light, nginx vai apache. Riippuu miten paljon haluaa käyttää koneen resursseja tuohon, kaikki tekee saman tehtävän. Apache lienee raskain. Itse pyöritin pitkään nginx + php-fpm:n päällä. Uskon että pyörii vallan mainiosti raspberrypiilläkin. Tosin tietokantaa en ehkä laittaisi raspille jos haluaa luotettavuutta. Mysql palvelun voinee ostaa myös hostattuna ja jos homma pelittää niin mlinvoice:n "moottoria" voi heitellä koneesta toiseen jos tietokanta on hyvin hoidettu.

Jos meinaa tehdä enemmän tuosta "klikkaa ja laita toimimaan" (säätäen vain muutamaa ympäristömuuttujaa) niin vielä enemmän saa varmaan mennä asioita tietokantaan, kuten kaikki sähköpostiasetukset yms... oma taulu kaikille säädöt&settings_table (tuon niminen niin ulkomaalaiset käyttäjät saa tuskailla ääkkösten kanssa :))

Pikaisella silmäyksellä oot tehny ison työn koodin siistimisessä.

-Juho

Ere Maijala

Moi,

Joo, olisihan tuossa koodissa ihan hirveän paljon siistittävää muutenkin. En ole ollenkaan tyytyväinen siihen, millaista sotkua html siellä kaiken muun seassa on, mutta ei tuossa muutenkaan ole kunnollista rakennetta. Moni asia olisi selkeämpi, kun olisi kunnollinen MVC-rakenne, nimiavaruudet kunnossa, autoloader käytössä jne. Muutos vaatisi vain sen verran paljon tekemistä, ettei ole tapahtunut. Ehkä pitäisi koittaa, hoitaisiko tekoäly siistimisen hienosti. :D

Ja olet ihan oikeassa, että suurin osa config-tiedoston sisällöstä pitäisi olla tietokannassa. Oikeastaan config-tiedostossa ei pitäisi olla paljon muuta kuin tietokantayhteyden asetukset, salausavain ja ehkä merkistö (joka saisi kyllä lähteä pois).

--Ere

ioxo

Tulipa tässä mieleen kun välistä kaipaa pientä säätelyä, että olisiko tuohon konfiggiin mahdollista kehittää käyttäen jotain dotenv versiota eli lyhykäisyydessä niin että ne jotka ei pysty hyödyntää ympäristömuuttujia (esim web hotellin asiakkaat) niin samat tiedot voisi laittaa .env tiedotoon ja ne jotka pystyy käytämään (esim docker) niin käyttäisi ympäristömuuttujia. Composerilla löytyy todennäköisesti montakin dotenv pakettia. Toisinsanoen ohjelma palvelis hyvin omalla palvelimella pyörittäviä ja webhotellia käyttävät.

Eli shellissä tyyliin export MUUTTUJA=arvo tai sitten .env tiedostossa
MUUTTUJA=arvo
Tämä helpottaisi koodissa sen että tietokannan tiedot voidaan lukea suoraan $MUUTTUJA tiedosta eikä erillistä config.php:tä tarvita. Tämä myös lienee turvallisempaa jos tietokannan salasanoja viljellään että ne olis ympäristömuuttujissa.

Itseä sekoittaa tuo monen *.sql tiedostot että miksi ei voi olla yhdessä tai sitten  niin että päivitykset erillään ja jos teet tämän ekan kerran niin asenna_tämä.sql (joka sisältää kaiken). Oliko tuosta jokin pieni dokumentointi?

Jos joku php:tä taitava haluaisi ympätä tuon dotenvin niin mielellään voin katsoa tuota dockeria että sen saisi järkeväksi aina uusimmasta gitistä, ettei dockerin tarvitsisi hakea zippiä vaan käyttäisi tuoreinta sorsaa... dockerille vaan aika hirveää jos tiedostot muuttuu dockerin sisällä.

Ere Maijala

Dotenvissä on muutamia ongelmia, joiden ansiosta en hirveästi tykkää siitä. Toinen johtuu siitä, että MUUTTUJA=arvo ei ole kovin ilmaisuvoimainen, mutta se ei toki tässä tarkoituksessa hirveästi haittaa. Toinen ongelma on, että pistetiedostot katoavat helposti näkyvistä, jos ei muista tai tiedä mitä etsiä. Toki configin käsittely voisi silti ymmärtää ympäristömuuttujia, vaikkei dotenviä käytettäisikään.

Osa noista asetuksista kuuluisi jonnekin muualle, jolloin config.php:n sisältämiä voisi vähän vähentää.

sql-tiedostoista ei tarvitse välittää create_database.sql:ää lukuunottamatta. update*.sql ovat muinaisjäännöksiä, ja päivitykset hoidetaan koodissa. Ehkä ne voisikin siirtää tuolta johonkin legacy-kansioon...

--Ere

ioxo

Ymmärrän tuon .envin piiloutumisen, mutta onko siinä muitakin huonoja juttuja? en ole tullut ajatelleeksi.

Dotenv pystytään yleensä lukemaan eri tiedostoista kuten production.env jne...

Sinäänsä konfig tiedosto nyt ei varmaan tarvisi kuin pari kohtaa:
debug=true / false
tai production = true
tai running_mode = production / beta / bleeding-edge
db_dsn =
tai
db_host =
db_port =
db_user =
db_password =

Eka kertalaiselta näytetään ruutu, jossa on "paina nappia asentaaksesi" ja sen jälkeen default asetukset laitetaan tietokantaan (tai kysytään käyttäjältä haluaako hän "demodatan" tietokantaa vai tyhjät kentät). (Hillittömän [ ] I Agree laki dokumenttien jälkeen sitte saadaan tehdä mitä tahansa kun käyttäjä on hyväksynyt kaiken annettavaksi pois yms :).) Tämä mahdollistaa tietokannassa monikategorioisen systeemin rakentamisen kun taas tiedostossa se menee tuohon muuttuja=arvo.

Tämä myös mahdollistaa tietokannan config tauluihin piilottamaan tietoja joita käyttäjän ei tarvitse päästä muuttamaan - esim järjestelmän nimi / versio / tekijä.

Tuo myös mahdollistaa sen että systeemiä voisi ajaa hyvinkin minimaalisella asetuksella jos sql palvelin on vaikka pilvessä. Järjestelmä olisi myös helppo siirtää paikasta toiseen, jos tarve. Meinaan, nykyään dockeria pystyy pyörittämään monessa eri paikassa esim. macos, windows, linux, jotkut nas purkit. Myös sql:t on helpompi varmistaa ja tarvittaessa samaiseen sql kantaan pääsee jos haluaa siirtää dockerin muualle / käynnistää uuden dockerin jossain toisaalla. Docker palveluja voi myös muistaakseni ostaa pilvipalveluina, jos haluaa vain ajaa sitä moottoria (mlinvoicea).

ioxo

Hei, laitoin uuden pull requestin githubiin kun innostuin leikkimään docker-composella...

Laitoin myös asiasta githubiin, mutta se mikä tuossa docker jutussa on se ongelma on se, että ohjelmalle pitää syöttää alku vaiheessa config.php.sample Kun dockerilla tehdään tämä ensimmäisen kerran niin asia ok, mutta kun docker ajetaan alas ja käynnistetään uudelleen niin ongelma on siinä että setup alkaa alusta.

Ratkaisuna olisi se, että config.php tiedosto pysyisi ilman muutoksia ja setupin tarve tarkistettaisiin esim. löytyykö admin-tunnukselle salasanaa ja jos löytyy niin hypätään ja jatketaan ohjelman käyttöä, jos ei niin laitetaan setup ruutu.