Skip to main content

[MyFood] Docker – api, web, loadbalancing, ssl (darmowy),mysql – pełny config

Nadszedł czas wdrożenia środowiska developerskiego, oraz środowiska produkcyjnego. Od początku moim planem było wykorzystanie dockera. Dzięki niemu łatwo wszystko postawić na nowym serwerze. Najtrudniejsze jak zwykle było stworzenie pierwszy raz kompleksowej konfiguracji, z wszystkimi elementami, które są potrzebne w każdym projekcie.

Co to docker przeczytać możesz tutaj: 1, 23

Spis wszystkich kontenerów

  • serwer api
  • serwer api2 (drugi serwer do testu loadbalancingu – normalnie w swoim projekcie nie używam, dlatego jest to kopiuj / wklej api)
  • serwer web
  • baza danych (mysql)
  • phpmyadmin (tylko dla dev)
  • haproxy
  • letsencrypt (odnawiany 90 dniowy certyfikat SSL)

Dlaczego tyle kontenerów i w czym problem

Zasadą w świecie dockera jest „1 kontener = 1 zadanie” . A więc nie powinno w jednym kontenerze instalować się kilku funkcjonalności: serwer www, skrypty (np php), baza danych. Bardzo ciężko pilnować gdy coś się popsuje , oraz ciężko wgrać aktualizacje do systemu. Dlatego wszystko wydzielamy do kontenerów, która lista jest powyżej.

Problem:

Nie można do kilku kontenerów przydzielić tego samego portu.

Czyli nie można jak niżej:

  • web – nasłuchuje na porcie 80
  • api – nasłuchuje na porcie 80

Przy próbie odpalenia pojawi się błąd:

Co oznacza tyle że port już jest używany i nie można odpalić kontenera. Jest to oczywiście logiczne, bo jak wchodzimy np na localhost, to system by nie wiedział na który kontener przekierować ruch.

Kolejny problem to domeny. Konfiguracja dockera nie używa takiego pojęcia jak domena / subdomena. Każdy kontener sam powinien rozpoznawać domenę, i serwować odpowiednie dane.

W konfiguracji dockera nie możemy podzielić ruchu dla danej domeny i dla danego portu.

Jak to zrobić?

Musimy sami to obsłużyć prz pomocy serwera proxy. Użytkownik wchodzi na stronę w danej domenie, to serwer proxy wyświetla mu dane z odpowiedniego kontenera dockera.

Serwer proxy rozpoznaje domene, oraz port, i odpowiednio serwuje dane.

Rozwiązań jest kilka, np:

  • na serwerze (host) instalujemy proxy i w konfiguracji ustawiamy i przekierowujemy domenę na dany kontener (1)
  • wykorzystujemy tylko kontenery dockerowe, i serwer proxy również jest w nim (2)

Wybieram rozwiązanie 2. – dobrze jest mieć porządek :)

Serwer Proxy – HAProxy – Load Balancing – SSL

Postawienie proxy, pozwala nam zainstalować również certyfikaty SSL, i je odpowiednio skonfigurować. Nie trzeba tego robić w każdym kontenerze. Wystarczy w jednym :)

Wykorzystamy tutaj certyfikaty „Let’s encrypt” https://letsencrypt.org/ – pozwala nam to za DARMO posiadać na swojej domenie ssl.

Certyfikat jest ważny 90 dni. Całe generowanie i pobieranie jest automatyczne, więc nie musimy się o to martwić.  PEŁNA AUTOMATYKA !

Serwer proxy również umożliwia wykorzystanie loadbalancingu. Co to jest? Jeśli ustawimy dla danego adresu np: https://api.myfood.love/ dwa kontenery. To proxy dzieli ruch po połowie i wysyła go to kontenera. Jak wejdziesz na testowy serwer api to po odświeżeniu strony będą się na przemiennie pojawiać informacje:

Ip:xxx.xxx.xxx.xxx Host: 8ca086de8527

oraz

Ip: xxx.xxx.xxx.xxx Host: cccc89c4b35c

Dla przykładu wyświetlam ip oraz host. Host się zmienia w zależności od wybranego kontenera.

Po co load balancing?

Jeśli strona posiada duży ruch i maszyna nie wytrzymuje, to można dodać kolejną maszynę i obsłużyć dwa razy większy ruch. Klient nawet nie zauważy że ruch idzie z dwóch maszyn.

Konfiguracja środowiska – docker-compose.yml

Wszystkie obrazy jakie wykorzystuje znajdują się w pliku docker-compose.yml. Dzięki temu wystarczy odpalić jedno polecenie (docker-compose up -d) i dzieje się magia.

Oddzielnie stworze post z poleceniami, trickami itp, więc tutaj tylko suche fakty na temat pliku konfiguracyjnego :)

Aktualnie cały plik konfiguracyjny jest w wersji „3.1”. Oznacz to, że wersja dockera jaka powinna być to min. 1.13, a wersja docker-compose 1.11

Pełny plik konfiguracyjny (api z load balancingiem)

Pełne wyjaśnienie – hierarchia plików i katalogów https://github.com/mfratczak/myfood-generator

api.myfood.love – load balancing z api i api2

  • build – budowanie kontenera gdzie plik Dockerfile znajduje się w podkatalogu
    • context: Docker/python – katalog kontenera (Docker/python)
    • dockerfile: Dockerfile – nazwa pliku z konfiguracją kontenera, można np zmienic na Dockerfile-dev i będą ustawienia developerskie (jeśli taki plik istnieje)
  • environment: – zmienne systemowe przekazywane do środka kontenera
    • FORCE_SSL=yes – zmienna wykorzystywana w kontenerze haproxy – bardzo ważna zmienna dla haproxy i certyfikatu SSL
    • VIRTUAL_HOST=xxx – spis hostów które kierować mają na dany kontener, można podać kilka  – bardzo ważna zmienna dla haproxy i certyfikatu SSL
  • volumes: – mapowanie katalogów, aby projekt znajdował się poza kontenerem. Dzięki temu można usunąć całkowicie kontenery i utworzyć jeszcze raz a dane zostają
    • ./WebServer:/app – w katalogu WebServer znajduje się cały projekt systemu Api
  • links: – połączenie między kontenerami, kontener API ma dostęp do kontenera MYSQŁ, gdzie znajduje się baza danych
  • command: python server.py – możliwość zadeklarowania polecenia z jakim ma się uruchomić kontener, tutaj odpala serwer pythona, można dla wersji developerskiej zrobić np: python server-dev.py, czyli odpalić serwer pythona z ustawieniami pełnego logowania itp
  • restart: always – deklaracja co ma się stać jak kontener padnie, lub polecenie (python server.py) spowoduje błąd, czyli szybki restart maszyny
  • network_mode: „bridge” – wybór podsieci

Drobne wyjaśnienie odnośnie network_mode. Normalnie wszystkie kontenery z danego katalogu (z jednego pliku dockerfile) znajdują się w osobnej podsieci. Okazuje się, że serwer proxy działa tylko w głównej podsieci o nazwie „bridge”, dlatego wszystkie kontenery są dodane do niej.

Drugie drobne wyjaśnienie to FORCE_SSL. Dla testów lokalnych linijkę tą mam wyłączoną, ponieważ dla lokalnych domen (localhost, itp) nie można utworzyć certyfikatu

Ustawienie: VIRTUAL_HOST w api i w api2 na te same domeny powoduje, że proxy stosuje load balancing i dzieli ruch między te dwa kontenery.

myfood.love – serwer web

W pliku konfiguracyjnym powyżej, tworzę również serwer pythona do testów. Jednak różnicą jest zmiana w VIRTUAL_HOST, co powoduje, że ruch tutaj jest obsługiwany tylko przez jeden kontener.

W przyszłości tutaj będzie zmiana pliku konfiguracyjnego na ten z katalogu Docker/npm/Dockerfile (teraz jest tylko szybka kopia aby sprawdzić działanie haproxy)

– mysql oraz phpmyadmin

  • image: sameersbn/mysql:latest – popularny gotowy obraz mysql (posiadają również postgresql itp)
  • volumes: – ./Data/database:/var/lib/mysql – cała baza została wydzielona do podkatalogu database. Dzięki temu można wyłaczać i włączać kontener bazodanowy bez utraty danych
  • environment – zmienne z danymi do utworzenia pustej bazy

oraz

  • image: phpmyadmin/phpmyadmin – gotowy obraz z phpmyadminem
  • ports: – „9999:80” – kontener dostępny np pod localhost:9999 lokalnie, lub myfood.love:9999 w sieci, w wersji produkcyjnej dostęp do phpmyadmina powinien być WYŁĄCZONY!!!
  • environment: PMA_HOST: mysql – zmienna wskazuje na kontener w której jest baza

Małe wyjaśnienie: Przy tworzeniu bazy (pierwsze odpalenie kontenera mysql) dane są zapisane w katalogu Data/database. Tworzona jest czysta baza o podanej nazwie, loginie i haśle. Restart / Wyłączenie / Usunięcie i ponowne utworzenie kontenera nie powoduje utraty danych bazy. Aby usunąć dane, należy opróżnić katalog. Po opróżnieniu katalogu, ponowne uruchomienie kontenera bazodanowego powoduje utworzenie czystej bazy.

– letsencrypt

  • image: interaction/letsencrypt:master – gotowy obraz
  • environment:
    • DOMAINS=api.myfood.love myfood.love – domeny które powinny mieć ssl, dla nich jest generowany certyfikat, nie mogą to być domeny lokalne lub zmapowane w pliku host systemu
    • [email protected] – email który jest zawarty w certyfikacie, powinien to być istniejący adres email
  • expose: – „80” – port na którym nasłuchuje kontener
  • volumes:
    • ./Data/letsencrypt:/etc/letsencrypt – zmapowany katalog z wygenerowanymi certyfikatami
    • ./Logs/letsencrypt:/var/log/letsencrypt – zmapowany katalog gdzie można przejrzeć logi

– haproxy – serwer proxy przez który przechodzi cały ruch z portu 80 i 443 (każda domena i subdomena)

  • image: interaction/haproxy:master
  • links: – kontener musi być podłączony do letsencrypt oraz do wszystkich kontenerów na który ma być kierowany ruch
  • depends_on: – polecenie to sprawia, że haproxy odpalane jest na końcu, oraz że zależy jego działanie od innych kontenerów
  • ports: – „80:80” – „443:443” – cały ruch przechodzi przez ten kontener, potrzebne są do obsługi dwa porty 80 (zwykły ruch http) oraz 443 (ruch https)
  • volumes: – ./Data/letsencrypt:/etc/letsencrypt – haproxy oraz letsencrypt muszą dzielić ten sam katalog, z wygenerowanymi certyfikatami

Kilka spraw:

Ważną kwestią aby haproxy działał z SSL, to współdzielenie katalogu letsencrypt. Kontener letsencrypt przy odpaleniu oraz co 24h sprawdza certyfikat i generuje nową wersje. Gdy haproxy wykryje że pliki w katalogu się zmieniły, uaktualnia certyfikaty u siebie. Nigdy więc nie wygaśnie certyfikat SSL ponieważ jest on generowany co 24h

Dodatkowo można wydzielić haproxy razem z letsencrypt z pliku konfiguracyjnego dockerfile, i utworzyć 2 kontenery globalne.

Dzięki temu, w przyszłości można utworzyć całkiem nowe domeny, z nowymi kontenerami, i dodać ich obsługę w haproxy. Ale przykład podam następnym razem.

Koniec

Jeśli dotarłeś do końca, to podziwiam, i dziękuję. Jeśli uważasz, że można to rozpisać łatwiej, zostaw komentarz, na pewno zaktualizuje w przyszłości tą rozpiskę.

 

Ważne linki:

  • https://github.com/docker/dockercloud-haproxy – czysty haproxy bez SSL (przykład docker-compose >>)
  • https://github.com/ixc/letsencrypt-dockercloud-haproxy – użyty obraz haproxy z SSL ‚let’s encrypt
  • https://letsencrypt.org/ – darmowy certyfikat SSL
  • https://docs.docker.com/compose/compose-file/#dockerfile – opis dockerfile u źródeł

 

Systematyczność, metodyczność, efektywność

Dzisiaj poruszę kilka spraw na temat codziennej pracy, ale nie tylko. W internecie,  w pracy, w domu, słyszycie pewnie często „weź się za siebie”, „zorganizuj sobie czas” itp.

Niby to łatwe… pełno w internecie kursów, szkoleń, youtubów o tym. Normalnie cały świat powinien być zorganizowany i efektywny :)

Nikt jednak nie wziął pod uwagę lenistwa, oraz jak ja to nazywam „nie dorosłem do tego” lub „to nie był mój czas„.

Wiele osobom nie potrzeba tych wszystkich rzeczy. Jakoś udaje im się prześlizgnąć przez życie.

Mi także się udaje.

Udaje mi się, ale to jest męczące :) . Siedzenie przez cały dzień przy komputerze, kiedy masz wrażenie że życie ucieka ci przez palce. Mówisz sobie to już ostatni raz, zmienisz to. I tak setki razy.

Jeśli chcesz zmiany to się nie poddawaj

Moim problemem jest to, że znam teorie, dużo teorii. Ale na mnie nie działa (nie działała). Nawet mój brat, który zajmuje się szkoleniem ludzi z efektywności (polecam: http://projektantczasu.pl) powiedział, że nie zmusi ludzi do zmiany jeśli sami tego nie chcą. W tamtym momencie nie chciałem zmian (wtedy o tym nie wiedziałem), a brat nie mógł nic zrobić nie powodując wielkiej kłótni itp. Łatwiej pomóc obcej osobie niż rodzinie.

Dalej mam problem z efektywnością, ale pracuje nad tym. Nad chodzeniem spać o północy pracuje całe życie. Nawet w podstawówce chodziłem spać koło północy. Aktualnie rozbudzam się o 22.00 i jestem pełni sił i energii.

Od roku postanowiłem zmienić swoje życie. Tak na poważnie. Nadszedł mój czas zmian.

Prawie cały rok mi zajął, aż zaczęły być malutkie efekty widoczne. Jestem na początku drogi. Bez zmian nie dołączył bym do DSP, nie poznawał nowych technologii, nie założył bloga. Aktualnie mam kolejne podejście do stworzenia listy zadań tygodniowych, miesięcznych. Notowania i uporządkowania wszystkich materiałów, aby lepiej się żyło :) . Ograniczenia rozpraszaczy. Trzymanie porządku.

Więc jeśli ty, mój czytelniku, masz z tym problem, nie poddawaj się!!! Podziel się swoją opinią w komentarzu. Jak walczysz!

Tak jak mam problem z efektywnością czasu :) tak nie mam problem z:

Systematycznością, metodycznością

Ludzie dzielą umysł na humanistyczny, i matematyczny. Pewnie jest kilka innych podziałów mniej popularnych. Mój umysł to umysł analityka (?) pragmatyka . Jednym słowem podchodzę do działań metodycznie, oraz praktycznie.

np. popsuła się pralka? Mój umysł już ma plan działania w ciągu minuty.

  • wezwać serwisanta
  • potrzeba kupić nową pralkę?
    • przejrzenie top testów pralek,
    • wybór pośrodku między ekonomią / praktyką / a ilością miejsca w łazience (wielkość mikro),

np. projekt systemu – w ciągu kilku minut mam cały plan działania w głowie :), który

  • rozpisuje w notatkach, od pomysłów realnych do nie realnych,
  • przygotowuje plan działania,
  • jak projekt ruszy to co tydzień / dwa sprawdzanie czy jest realizowany w dobrym kierunku, i ewentualna korekta kierunku

np. testowanie systemu

  • rozpisanie wszystkich scenariuszy co trzeba przetestować,
  • co można popsuć,
  • jak inne osoby myślą,

 

Myślałem, że każdy tak ma :) , jak nie każdy to przynajmniej osoba powiązana z IT. Jak nie każdy z IT to programiści… okazuje się że jednak nie.

a więc:

Chcesz zostać dobrym programistą?

  • działaj metodycznie, rozkładaj wszystko na części pierwsze
  • działaj systematycznie
    • przeznacz dany dzień tygodnia na stałe działania
    • przeglądaj rzeczy do zrobienia, przygotowuj plan działania (min. raz na tydzień)
    • co x okres czasu rób przegląd narzędzi jakich używasz. Może uda się je poznać lepiej / udoskonalić / zamienić na coś lepszego.
      • (ja co 1-2 miesiące staram się wyeliminować elementy, które systematycznie mnie denerwują)
  • pracuj nad swoim zarządzaniem czasu.
  • pracuj nad zarządzaniem zadaniami

I to tyle koniec złotych myśli. Łatwe to nie jest :) , ale przyjemność z życia każdego dnia jest większa.

 

 

 

[05 MyFood] Hierarchia i podział projektu (docker, flask, react)

We wcześniejszym poście napisałem, że musiałem zrobić krok wstecz. Okazuje się, że musiałem zrobić kolejny krok wstecz.

Dlaczego?

Moim planem jest stworzenie projektu gdzie backend to flask. Będzie on serwował API, z którym komunikować się będzie front.

Na froncie stanie React, czyli technologia JS. Im więcej o nim czytam, i tworze tutoriale, tym bardziej mi się podoba :)

Moim błędnym podejściem było to, że python będzie odpowiadał za API, oraz serwował statyczną stronę. Na tej statycznej stronie miał być React.

Co tu jest błędnego?

Każda część projektu frontend i backend powinna być całkowicie oddzielnym bytem. Nie powinny być ze sobą powiązane. Front nie powinien być zależny od serwera API. Nie powinien być nawet na tym samym serwerze.

To oznacza że muszę przebudować hierarchie projektu.

Muszę wspomnieć, że mój błąd uświadomił mi kolega Dariusz (może kiedyś przekonam go do blogowania ;d )

Plusy:

  • możliwość łatwiejszego skalowania serwerem (baza, itp), wydzielenie backendu na inny serwer niż frontend
  • w razie potrzeby można zmienić technologię api, bez wpływu na front
  • możliwość łatwej modyfikacji wygładu aplikacji, bez ryzyka że coś popsujemy w danych
  • za rok może się okazać, że pojawi się coś lepszego niż React, dzięki oddzieleniu frontu od backendu nic nie stoi na przeszkodzie
  • łatwe stworzenie aplikacji mobilnej w dowolnej technologii dla dowolnego urządzenia (android, ios, windows) , cała komunikacja odbywać się będzie przez API,

Minusy:

  • konieczność poznania 2 technologii
  • … (jak wyjdzie w praniu to dopiszę :) )

Przebudowa repozytorium – zmiany

https://github.com/mfratczak/myfood-generator – wstępne zmiany

  • Docker
    • server backend
    • server frontend
    • server bazodanowy
  • WebClient
    • aplikacja React
  • WebServer
    • aplikacja Flask Api
  • docker-compose.yml (plik konfiguracyjny dockera)

Wstępna hierarchia jak wyżej. Prawdopodobnie się zmieni o elementy CI (Continuous Integration), Testy automatyczne, i kilka innych.

Do testów lokalnych, docker będzie odpalany na dwóch portach.

  • Port 80 -> localhost -> aplikacja web
  • Port 1025 -> localhost:1025 -> api backend

Docelowo jak już projekt zostanie wrzucony na domenę to podział będzie następujący:

  • http://myfood.love – front na porcie 80 (standardowo)
  • http://api.myfood.love – backend na porcie 80 (standardowo)

W kolejnym poście (mam już nadzieję) przygotuje aplikacje front i backend z „hello world”.

 

[04 MyFood] Jeden krok w tył, dwa do przodu …

Intensywny tydzień, brak czasu na pracę przy projekcie. W weekend zasiadłem i co się okazało?

Wcześniejszy post „Stworzenie szablonu HTML” jest ciut nie trafiony :) . W moim projekcie chce użyć React. Myślałem, że użyje normalnego szablonu html, i dodam elementy JS. Okazało się, że to nie takie proste.

Szablon semantic ma oddzielną wersje http://react.semantic-ui.com/, którą „zacząłem” wdrażać. Mogę powiedzieć zacząłem, bo jak faktycznie siadłem do tego to … straciłem czas i chęci, bo nic nie działało jak należy. Nie mogłem porządnie się wyspać bo ciągle myślałem co zrobiłem źle i czemu nie działa.

Z jedną ideą się jednak obudziłem: „Zacznij od podstaw!”

A więc dzisiaj pół dnia straciłem na tutoriale podstaw. Co najlepsze 3h zajeło mi ogarnianie czemu tutorial nie działa jak należy. Przejrzałem 3 różne, porównywałem czemu jeden działa jeden nie. Wspomogłem się stackoverflow.com. Wyciągnąłem wnioski, z którymi podzielę się w kolejnym już poście bardziej technicznym, oraz będę mógł pokazać pierwszy efekt wizualny.

2 dni działań, ponad 10h zabawy, i projekt nie ruszył o krok. 10h zabawy od podstaw, dzięki czemu zaoszczędzę przynajmniej kolejne kilka h w przyszłości.

Jeden wniosek z którym już dzisiaj się podzielę.

Męczysz się z gotowym projektem? Brakuje ci wiedzy? Cofnij się. Zacznij od podstaw jeśli musisz. Przejdź kilka kroków, które pozwolą ci zrozumieć gotowy projekt. Stracisz 2-3 dni na starcie, ale zyskasz wiedzę, która pozwoli ci ukończyć coś szybciej. Jeśli nie szybciej to ukończyć wspanialszy projekt !

W końcu wprowadzanie zmian…

Zmiany…

Co jakiś czas trzeba wprowadzać zmiany w życiu. Czasem idzie to automatycznie, nieświadomie, bezboleśnie. A czasem nie idzie wcale.

Czas kilku lat przestoju, braku weny, chęci zmian zaczyna topnieć. Startuje w konkursie Dsp2017, ulepszam małymi krokami swoją produktywność, uczę się robić zdjęcia :) . Wyrzucam zagłuszacze życia.

Nie idzie łatwo :) ale powoli i sukcesywnie. Na tapetę wróciło porządne zarządzanie zadaniami (porządny podział projektów firmowych, życiowych itp), porządkowanie poczty :) (inbox 0 maili przede mną) . Kolejna próba :) ale tym razem widzę światełko w tunelu…

 

[03 MyFood] Stworzenie szablonu HTML

Od czego zacząć jak niczego nie ma

Wpis powiązany z projektem MyFood. Szczegóły tutaj »
  • Stworzenie repozytorium [zrobione] – https://github.com/mfratczak/myfood-generator
  • Stworzenie szablonu szablonu html [w trakcie]
  • Wgranie aktualnej wersji projektu na domenę [wymyślam nazwę domeny, masz propozycje? pisz!]

Github

Przy tworzeniu nowego repozytorium, github automatyzuje tworzenie pliku z licencją (wybrałem licencje MIT). Drugą rzeczą ułatwiającą życie jest utworzenie automatycznie pliku .gitignore na podstawie wybranej technologii projektu. Co daje ten plik?

Git sprawdza plik .gitignore, i przy kolejnym pushu, ignoruje pliki nie powiązane z projektem, lub pliki które są generowane automatycznie (cache, kompilacje itp).

Dzięki temu nie wysyłamy do repo zbędnych plików, oraz trzymamy porządek.

Czytaj więcej

[02 MyFood] Dlaczego nazwa projektu jest ważna?

Nazwa projektu

Zawsze jak tworzę projekt, lubię nadawać im nazwy. Najlepiej aby nazwa mówiła coś o projekcie, np. Food Menu Generator. Brak nazwy męczy mnie psychicznie.

Ciągle o tym myślę :D

Dlaczego najlepsza nazwa jest po angielsku? Bo celuje w cały świat :D. Człowiek jednak chce umieścić swój projekt w sieci, i nagle sobie uświadamia że domena: food-menu-generator.com to nie jest najlepsza nazwa.

Jak to powiedzieć? Czy druga osoba to zapamięta? Czy nie ma czegoś prostszego?

Kilka godzin spędziłem na wymyślaniu nazwy domeny. Wniosek: wszystko co wymyśliłem zajęte. Domeny z reklamami, albo jakieś śmieci. Nazwy miałem fajne (?) np. foodly.com, mealio.com (i tysiące innych końcówek) .

Ale znalazłem. Od dzisiaj, projekt  nazywa się MyFood Generator. Domena: http://myfood.love

W tytule posta będzie zawsze znajdować się będzie nazwa MyFood dla treści powiązanych z projektem.

Nazwa jest, projekt się toczy, w końcu można psychicznie odetchnąć.

[01 MyFood] Geneza projektu, i jego cele

Start Projektu MyFood Generator

Jeśli śledzisz mojego bloga, to wiesz, że startuje w konkursie „Daj się poznać” edycja 2017. Dla tego konkursu wybrałem projekt „MyFood Generator” czyli w skrócie „Generator posiłków”.

Projekt będzie dostępny pod domeną: http://myfood.love

Geneza projektu

Walczę aktualnie z nietolerancją pokarmową, i co miesiąc dostaje pełny jadłospis dla dwóch osób, na 30 dni. Każdy posiłek może posiadać 2 warianty [dla każdej osoby inne ilości].

Przygotowanie listy dań, listy zakupów, oraz następnie gotowanie (5 posiłków) zabiera mnóstwo czasu :) . Samego gotowania nie można usprawnić programistycznie, można za to usprawnić przygotowanie posiłków :).

Cel

  • wrzucenie wszystkich posiłków do systemu (śniadanie, 2 śniadanie, obiad, kolacja, podwieczorek)
    • możliwość przypisania posiłku do diety, grupy, tag’a
  • stworzenie jadłospisu dla x dni, z istniejących dań w systemie
    • użytkownik sam wybiera listę dań
    • użytkownikowi losuje jadłospis (wg kryteriów, wszystkie w systemie)
  • dla każdego jadłospisu stworzenie możliwości generowania listy zakupów
    • pełna lista zakupów dla wybranych dań, lub wybranych dni
    • możliwość zmiany listy zakupów (np posiadamy marchewkę w lodówce, to nie chcemy aby ona była na liście zakupów)
    • generowanie plików w różnych formatach (pdf, txt), możliwość wysłania listy na email
  • wyszukiwarka
    • możliwość wyszukania dania po wybranych składnikach (np. mamy w lodówce 5 składników, i chcemy znaleźć dostępne dania)
    • szukanie po nazwie
    • szukanie po czasie przygotowania posiłku
    • szukanie po rodzaju posiłku
  • opcje socialmedia: dzielenie się posiłkami z innymi użytkownikami systemu, lub udostępnianie postów na fb (itp)
  • kalendarz / pamiętnik posiłków – oznaczanie posiłku (zjedzony, nie zjedzony, itp), możliwosć dodania opisu do dania, zdjęcia, czasu wykonania
  • statystyki i raporty [czas wykonywania posiłku, zjedzone posiłki w miesiącu, zjedzone kalorie, itp]
  • możliwośc wydruku przepisu, jadłospisu, listy zakupów
  • inne (np podpięcie toggl time tracker do mierzenia czasu wykonywania posiłków, …)

Technologie wykorzystywane w projekcie

Na codzień pracuje z PHP i w nim tworze strony i systemy IT. Postanowiłem więc rozpocząć projekt w którym wszystkiego musze nauczyć się prawie od początku :) a więc:

  • backend: python 3(framework flask) w którym napisane będzie api
  • frontend: react (framework js)
  • docker – do odpalenia projektu w izolowanym wirtualnym środowisku, używając jednego polecenia
  • szablon strony napisany przy wykorzystaniu semantic-ui.com (Semantic UI to zestaw komponentów wspomagający tworzenie interfejsu użytkownika)
  • baza danych mysql
  • testy automatyczne
  • zewnętrzna baza składników (? opcja) – użytkownik wpisuje marchewka do dania, i jak jej nie znajduje to pobiera dane z zewn systemu (kalorie, itp)
  • … (wyjdzie w praniu)

Dlaczego python api? Chciałbym w przyszłości stworzyć aplikacje na komórki. Istniejące API pozwoli zrobić to niższym kosztem :) . W czym to napisze, jeszcze nie wiem. Wstępnie będzie to w Electronie -> https://electron.atom.io/

Posty związane z projektem

W regulaminu konkursu, musza pojawiać się dwa posty tygodniowo z tagiem DSP2017

  • minimum raz na tydzień pojawiać się będzie post dotyczący projektu #MyFood
  • drugi post może być powiązany z projektem, ale nie musi

Moim planem jest rozpisanie krok po kroku tworzenia projektu.  Nie będą to jednak szczegółowe posty typu: to skopiuj, tu wklej, tu zrób to i to. Wpisy mają cię nakierować na rozwiązanie istniejącego problemu, rozpisanie działania, linków do bazy wiedzy / tutoriali z których skorzystałem. Przykładowe problemy:

  • postawienie dockera, posiadające skonfigurowane biblioteki python, mysql (itp)
  • stworzenie środowiska dla semantic-ui do stworzenia szablonu projektu (gulp, npm, less)
  • stworzenie testów automatycznych (jestem całkowicie zielony w tym :(  )

I to tyle na starcie :) , sporo pracy przedemną. Nie wiem czy uda mi się skończyć projekt do końca konkursu. Celem jest stworzenie kompleksowo napisanego kodu, którym będę mógł się pochwalić bez wstydu :) . Przy okazji osoby będą mogli skorzystać z postów i wykorzystać części rozwiązań w swoich projektach.


Repozytorium git: https://github.com/mfratczak/myfood-generator – tutaj możesz obejrzeć kody źródłowe, i odpalić projekt na swoim serwerze.

Start projektu w konkursie Daj się poznać 2017

Start projektu w DSP

Od pewnego czasu chodziło mi kilka projektów po głowie. Przy okazji konkursu „Daj się poznać” postanowiłem jeden z nich zrealizować w tym właśnie konkursie.

Konkurs „Daj się poznać” edycja 2017 jest drugą edycją gdzie w 2016 roku startowało prawie 300 osób, a 70 dotarło do końca :)

W tym roku już ponad 700 osób ukończyło rejestracje i przystąpiło do konkursu. Ponad 1000 osób stworzyło konta, więc 300 osób się zastanawia. (czy dojdziemy do 1000 uczestników?)

Cele konkursu?

  • stworzyć projekt open source
  • pisać dwa posty tygodniowo na blogu (1 post odnośnie projektu, 1 post w dowolnej tematyce)
  • dobrze się bawić, i nauczyć nowych rzeczy

Strona konkursu: http://devstyle.pl/daj-sie-poznac/

Rejestracja przedłużona do 12 marca 2017!!!

Nagrody?

http://devstyle.pl/daj-sie-poznac/nagrody/

Bardzo ciekawe, m.in:

  • krzesło (posiadam dobre, jestem nie zainteresowany)
  • xbox (mało gram, będzie się kurzył)
  • smartwatch (poczekam 2-3 lata na porządne rozwiązania ;) )
  • klawiatura (posiadam super klawiaturę lenovo)
  • dron (to mogę przygarnąć, ale chętnie przerobiłbym na wyścigowego drona na zawody :D )

Jak widać startuje nie dla nagród, a tego co mogę osiągnąć ucząc się i pisząc o tym. Myślę, że pomoże to także zwiększyć moją pewność siebie :) (to pewnie oklepany tekst, większość IT siebie nie docenia)

Nazwa projektu

„Generator posiłków” czyli zarządzanie swoimi daniami, i składanie tego w plan posiłków, generowanie listy zakupów, ustawianie kaloryczności itp.

Bardzo się ciesze, że mój projekt nie posiada żadnego klona w konkursie. Albo taki mało wymagający i nie ciekawy, albo nikt na to nie wpadł ;)

Więcej o projekcie, technologii, powodach utworzenia takiego projektu w następnych wpisach.

Google Analytics Alternative