Optymalizacja pracy z instancjami local / staging / production Krystian Szymukowicz (k.szymukowicz@sourcebroket.net)
INSTANCJE APLIKACJI Jakich potrzebujemy? Czym mogą się różnić między sobą?
Z czym się zmierzymy? Production Backup Beta [timestamp] Previous Production (current) Production Replication 1 2 3 Integration 1 Integration 2 Integration n-1 Integration n 4 Developer 1 Developer 2 Developer n-1 Developer n n
Domeny Production Backup Beta [timestamp] Previous Production (current) Production Replication www1.yyy.com beta.yyy.com prev.yyy.com www.yyy.com www.yyy.com 1 2 3 Integration 1 Integration 2 Integration n-1 Integration n yyy.myagency.com yyy-2.myagency.com yyy-m.myagency.com yyy-n.myagency.com 4 Developer 1 Developer 2 Developer n-1 Developer n yyy.loc yyy.loc yyy.loc yyy.loc n
Domeny - multilang z multidomain Production Backup Beta [timestamp] Previous Production (current) Production Replication - www1.yyy.com - www1.yyy.pl - www1.yyy.de - beta.yyy.com - beta.yyy.pl - beta.yyy.de -... - prev.yyy.com - prev.yyy.pl - prev.yyy.de -... - www.yyy.com - www.yyy.pl - www.yyy.de -... - www.yyy.com - www.yyy.pl - www.yyy.de -... 1 2 3 Integration 1 Integration 2 Integration n-1 Integration n - yyy.myagency.com - pl.yyy.myagency.com - de.yyy.myagency.com -. - yyy.myagency.com - pl.yyy-1.myagancy.com - de.yyy-1.myagancy.com... 4 - yyy.myagency.com - pl.yyy-3.myagancy.com - de.yyy-3.myagancy.com... - yyy.myagency.com - pl.yyy-3.myagancy.com - de.yyy-3.myagancy.com... Developer 1 Developer 2 Developer n-1 Developer n - yyy.loc - pl.yyy.loc - de.yyy.loc - ch.yyy.loc -... - yyy.loc - de.yyy.loc - pl.yyy.loc - ch.yyy.loc -... - yyy.loc - ple.yyy.loc - de.yyy.loc - ch.yyy.loc -... - yyy.loc - pl.yyy.loc - de.yyy.loc - ch.yyy.loc -... n
Solr ustawienia hostów / core Production Backup Beta [timestamp] Previous Production (current) Production Replication Core: - /solr/live-yyy-1-0-en_en/ - /solr/live-yyy-1-1-pl_pl/ - /solr/live-yyy-1-2-de_de/ -.. Path: www.yyy.com site.solr.noindex = 1 Core: - /solr/beta-yyy-1-0-en_en/ - /solr/beta-yyy-1-1-pl_pl/ - /solr/beta-yyy-1-2-de_de/ -.. Path: www.yyy.com Core: - /solr/live-yyy-1-0-en_en/ - /solr/live-yyy-1-1-pl_pl/ - /solr/live-yyy-1-2-de_de/ -.. Path: www.yyy.com Core: - /solr/live-yyy-1-0-en_en/ - /solr/live-yyy-1-1-pl_pl/ - /solr/live-yyy-1-2-de_de/ -.. Path: www.yyy.com site.solr.noindex = 1 Integration 1 Integration 2 Integration n-1 Integration n Core: - /solr/dev-yyy-1-0-en_en/ - /solr/dev-yyy-1-1-pl_pl/ - /solr/dev-yyy-1-2-de_de/ -.. Path: yyy.myagency.com Core: - /solr/dev-yyy-1-0-en_en/ - /solr/dev-yyy-1-1-pl_pl/ - /solr/dev-yyy-1-2-de_de/ -.. Path: yyy.myagency.com Core: - /solr/dev-yyy-1-0-en_en/ - /solr/dev-yyy-1-1-pl_pl/ - /solr/dev-yyy-1-2-de_de/ -.. Path: yyy.myagency.com Core: - /solr/dev-yyy-1-0-en_en/ - /solr/dev-yyy-1-1-pl_pl/ - /solr/dev-yyy-1-2-de_de/ -.. Path: yyy.myagency.com Developer 1 Developer 2 Developer n-1 Developer n Core: - /solr/local-yyy-1-0-en_en/ - /solr/local-yyy-1-1-pl_pl/ - /solr/local-yyy-1-2-de_de/ -.. Path: yyy.myagency.com Core: - /solr/local-yyy-1-0-en_en/ - /solr/local-yyy-1-1-pl_pl/ - /solr/local-yyy-1-2-de_de/ -.. Path: yyy.myagency.com Core: - /solr/local-yyy-1-0-en_en/ - /solr/local-yyy-1-1-pl_pl/ - /solr/local-yyy-1-2-de_de/ -.. Path: yyy.myagency.com Core: - /solr/local-yyy-1-0-en_en/ - /solr/local-yyy-1-1-pl_pl/ - /solr/local-yyy-1-2-de_de/ -.. Path: yyy.myagency.com
Różne google/wtyczki DEFAULT FOR ALL INSTANCES: email = office@yyy.com Production Backup Beta [timestamp] Previous Production (current) Production Replication preventindexingbybots = 1 google.ga.disable = 1 search.indexing.disable = 1 preventindexingbybots = 1 google.ga.disable = 1 search.indexing.disable = 1 Integration 1 Integration 2 Integration n-1 Integration n preventindexingbybots = 1 google.ga.disable = 1 email = my11@gmail.com preventindexingbybots = 1 google.ga.disable = 1 email = my11@gmail.com preventindexingbybots = 1 google.ga.disable = 1 email = my11@gmail.com preventindexingbybots = 1 google.ga.disable = 1 email = my11@gmail.com Developer 1 Developer 2 Developer n-1 Developer n preventindexingbybots = 1 google.ga.disable = 1 email = my11@gmail.com search.disable = 1 search.indexing.disable = 1 preventindexingbybots = 1 google.ga.disable = 1 email = my11@gmail.com search.disable = 1 search.indexing.disable = 1 preventindexingbybots = 1 google.ga.disable = 1 email = my11@gmail.com search.disable = 1 search.indexing.disable = 1 preventindexingbybots = 1 google.ga.disable = 1 email = my11@gmail.com search.disable = 1 search.indexing.disable = 1
Dobrze jest ustawić takie domyślne wartości dla niebezpiecznych ustawień, które czynią najmniej szkody i nadpisać je w wyższych kontekstach.
Programista wdrażający się do projektu może zapomnieć lub nie być świadomy, że musi ustawić kontekst. Wówczas użyte zostaną bezpieczne wartości domyślne.
DEFAULT BEZPIECZNY DEFAULT BEZPIECZNY: google.ga.disable = 1 preventindexingbybots = 1 email = test.myagency@gmail.com overwriteallemails = test.myagency@gmail.com plugin.solr { [developers testing version] indexing.disable = 1 Production Backup Beta [timestamp] Previous Production (current) Production Replication overwriteallemails > google.ga.disable = 0 preventindexingbybots = 0 overwriteallemails > plugin.solr { [beta version settings] search.indexing.disable = 0 google.ga.disable = 0 preventindexingbybots = 0 overwriteallemails > plugin.solr { [live version settings] search.indexing.disable = 0 Integration 1 Integration 2 Integration n-1 Integration n Developer 1 Developer 2 Developer n-1 Developer n search.indexing.disable = 0
TIP general.overwriteallemails Jeżeli general.overwriteallemails jest ustawiony w evencie SwiftMailera modyfikujemy email tak, żeby wysyłal zawsze na naszego specjalnie spreparowanego emaila. Email docelowy: office@yyy.com Email testowy: test.myagency+office_yyy.com@gmail.com
TIP linkowanie mediów Im więcej instancji tym gigabajty mediów sprawiają większy problem. Rozwiązaniem może być tworzenie linków symbolicznych do pojedynczych plików. Skasować wówczas możemy tylko link a nie prawdziwy plik.
Podsumujmy ustawienia
Ustawienia dla każdej instancji w notacji TS Przykład dla strony bez języków google.ga.disable = 1 preventindexingbybots = 1 email = test.myagency@gmail.com overwriteallemails = test.myagency@gmail.com domains { main = www.yyy.loc plugin { solr { host = yyy.myagancy.com path { en = /solr/testing-yyy-1-0-en_en/
Ustawienia dla każdej instancji w notacji TS Przykład dla strony z językami w jednej domenie preventindexingbybots = 1 google { ga.disable = 1 search { indexing.disable = 1 frontend.disable = 1 backend.disable = 1 domains { main = www.yyy.loc plugin { solr { host = yyy.myagancy.com path { en = /solr/testing-yyy-1-0-en_en/ pl = /solr/testing-yyy-1-1-pl_pl/ de = /solr/testing-yyy-1-2-de_de/ www.yyy.com www.yyy.com/pl www.yyy.com/de
Ustawienia dla każdej instancji w notacji TS Przykład dla strony z językami w wielu domenach preventindexingbybots = 1 google { ga.disable = 1 search { indexing.disable = 1 frontend.disable = 1 backend.disable = 1 domains { england = www.yyy.loc poland = pl.yyy.loc germany = de.yyy.loc plugin { solr { host = yyy.myagancy.com path { en = /solr/testing-yyy-1-0-en_en/ pl = /solr/testing-yyy-1-1-pl_pl/ de = /solr/testing-yyy-1-2-de_de/ www.yyy.loc pl.yyy.loc de.yyy.loc
World of all applications World of TYPO3
Gdzie będziemy używali tych informacji?
Zwyczajowe miejsce tych danych to stałe w Typoscript
Gdzie będziemy używali tych informacji? WARUNKOWE RENDEROWANIE FRONTENDU TS SETUP: lib.header_search > lib.header_search = COA lib.header_search.if.isfalse = {$general.search.frontend.disable lib.header_search.wrap = <div class="search clearfix"> </div> lib.header_search.10 < plugin.tx_solr_pi_search
Gdzie będziemy używali tych informacji? WARUNKOWE WYSYŁANIE HEADERÓW TS SETUP: [globalvar = LIT:1 = {$general.preventindexingbybots] config.additionalheaders = X-Robots-Tag:noindex,nofollow [end]
Gdzie będziemy używali tych informacji? MULTILANG DLA DOMEN NARODOWYCH TS SETUP: // Poland version [globalstring = IENV:HTTP_HOST = {$domains.poland] [globalvar = GP:L = 1] config { sys_language_uid = 1 language = pl locale_all = pl_pl.utf-8 htmltag_langkey = pl plugin.tx_solr.index.queue.pages.indexer.frontenddatahelper.host = {$domains.poland [end]
Gdzie będziemy używali tych informacji? CORE i PATH DLA SOLR TS SETUP: plugin.tx_solr { solr { host = {$plugin.tx_solr.solr.host path = {$plugin.tx_solr.solr.path.en [globalstring = IENV:HTTP_HOST = {$domains.poland] [globalvar = GP:L = 1] plugin.tx_solr.solr.path = {$plugin.tx_solr.solr.path.pl [end] [globalstring = IENV:HTTP_HOST = {$domains.germany] [globalvar = GP:L = 2] plugin.tx_solr.solr.path = {$plugin.tx_solr.solr.path.de [end]
Gdzie będziemy używali tych informacji? KONFIGURACJA REALURL DLA DOMEN $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT']; $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']['pagePath']['rootpage_id'] = 1; $TYPO3_CONF_VARS['EXTCONF']['realurl']['beta.yyy.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; $TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy-1.myagency.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; $TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy-2.myagency.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com'];.... $TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy.loc'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; unset($typo3_conf_vars['extconf']['realurl']['_default']); REAL URL DOKUMENTACJA O $TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT'] _DEFAULT Key _DEFAULT Type ->sitecfg or pointer to other key with ->sitecfg in same array Description (Deprecated) Configuration of default Speaking URL coding if no matches was found for the specific HOST name. Warning! This is a legacy feature. The use of this option is highly discouraged because it leads to hard to detect errors with speaking URLs, wrong page id resolution, etc. Users are strongly recommended not to use _DEFAULT with multidomain web sites. This will not work correctly and be removed in future versions completely.
Jak zmieniać stałe TS w zależności od instancji? METODA 1 1. W każdej z instancji utworzyć plik ze stałymi w lokalizacji typo3conf/constants_local.ts i wylączyć ten plik z GIT 3. Dodać includowanie tego pliku w odpowiednim miejscu w TYPO3 <INCLUDE_TYPOSCRIPT: source="typo3conf/constants_local.ts"> WADY: 1. Przy dużej liczbie stałych i instancji TYPO3 wzrasta ryzyko błędów. 2. Brak śledzenia zmian z wykorzystaniem systemów wersjonowania. 3. Brak automatycznej propagacji zmian z wykorzystaniem systemów wersjonowania.
Jak zmieniać stałe TS w zależności od instancji? METODA 2 1. Utworzyć pliki ze stalymi zależnymi od instancji i dodać do GIT: fileadmin /typoscript/ constants/ constants_default.ts fileadmin /typoscript/ constants/ constants_default_local.ts fileadmin /typoscript/ constants/ constants_default_staging.ts fileadmin /typoscript/ constants/ constants_default_live.ts fileadmin /typoscript/ constants/ constants_local.ts fileadmin /typoscript/ constants/ constants_integration-1.ts fileadmin /typoscript/ constants/ constants_integration-n.ts fileadmin /typoscript/ constants/ constants_...ts fileadmin /typoscript/ constants/ constants_beta.ts fileadmin /typoscript/ constants/ constants_prev.ts fileadmin /typoscript/ constants/ constants_backup.ts fileadmin /typoscript/ constants/ constants_live.ts 2. Utworzyć plik typo3conf/constants_local.ts w każdej z instancji, wyłączyć go z GIT i dodać jego includowanie w TYPO3 <INCLUDE_TYPOSCRIPT: source="file:typo3conf/constants_local.ts"> 3. Dodać w nim includowanie pliku zależne od instancji <INCLUDE_TYPOSCRIPT: source="file:fileadmin/typoscript/constant/constants_default_local.ts"> <INCLUDE_TYPOSCRIPT: source="file:fileadmin/typoscript/constant/constants_local.ts">
Jak zmieniać stałe TS w zależności od instancji? METODA 2 WADY: 1. Przy dużej liczbie stałych i instancji TYPO3 wzrasta ryzyko błędów. 2. Brak śledzenia zmian z wykorzystaniem systemów wersjonowania. 3. Brak automatycznej propagacji zmian z wykorzystaniem systemów wersjonowania. 1. Nie mamy określonego kontekstu na poziomie PHP. 2. Nie uzyskamy stałych na niskim poziomie, kiedy nie ma jeszcze obiektu TSFE /realurl, eid, pliki ext_tables.php/ 3. Uzyskanie tych danych w BE wymaga sparsowania całego drzewa TS. 4. W warunkach w stałych nie można używać stałych. To nie zadziała w sekcji stałych: [globalstring = IENV:HTTP_HOST = {$domains.poland] [globalvar = GP:L = 1] plugin.tx_solr.solr.path = {$plugin.tx_solr.solr.path.pl [end]
PROPERTYMANAGER
Po co jest propertymanager? 1. Plik ze zmiennymi kontekstu wybierany automatycznie na podstawie kontekstu określonego w VHOST /.htaccess / PHP zmniejszamy liczbę miejsc konfiguracji. 2. Zmienne dostępne w PHP i w Typoscript. 3. Możliwość korzystania w PHP ze zmiennych na niskim pozimie. (index.php / ext_localconf.php etc) 4. Głośna informacja jeżeli zmianna kontekstowa nie jest ustawiona dla kontekstu a są do niej odwołania. 5. Parsing TS jest cachowany. Usuwanie cachu Clear all cache 6. Warunki ze stałymi w warunkach w sekcji CONSTANTS działają.
Przykładowa konfiguracja I W Extension Manager ustawiamy sciezkę do pliku głównego: files/resources/private/typosctipt/context/context_default.txt config.tx_propertymanager { required = 1 context { default { email = test.myagency@gmail.com overwriteallemails = test.myagency@gmail.com default_staging <.default default_live <.default default_live { email = test.myagency@yyy.com overwriteallemails = test.myagency@gmail.com kontekst1 <.default_live kontekst1 {... <INCLUDE_TYPOSCRIPT: source="file:files/resources/private/typosctipt/context/context_local.txt"> <INCLUDE_TYPOSCRIPT: source="file:files/resources/private/typosctipt/context/context_integration-1.ts"> <INCLUDE_TYPOSCRIPT: source="file:files/resources/private/typosctipt/context/context_integration-2.ts"> <INCLUDE_TYPOSCRIPT: source="file:files/resources/private/typosctipt/context/context_integration-3.ts"> <INCLUDE_TYPOSCRIPT: source="file:files/resources/private/typosctipt/context/context_beta.ts"> <INCLUDE_TYPOSCRIPT: source="file:files/resources/private/typosctipt/context/context_beta.ts"> <INCLUDE_TYPOSCRIPT: source="file:files/resources/private/typosctipt/context/context_34234234.ts"> <INCLUDE_TYPOSCRIPT: source="file:files/resources/private/typosctipt/context/context_prev.ts"> <INCLUDE_TYPOSCRIPT: source="file:files/resources/private/typosctipt/context/context_live.ts">
Przykładowa konfiguracja II Przykładowa zawartość: files/resources/private/typosctipt/context/context_local.ts config.tx_propertymanager { context { local <.default_local
Przykładowa konfiguracja III Przykładowa zawartość: files/resources/private/typosctipt/context/context_live.ts config.tx_propertymanager { context { live <.default_live live { google.ga.disable = 0...
Jak ustalić kontekst? 1) VHOST <VirtualHost 127.0.0.1:80> DocumentRoot "T:\workspace-typo3\projects\projekt - client1.loc" ServerName www.client1.loc SetEnv CONTEXT_IDENTIFIER local </VirtualHost> 2).htaccess SetEnv CONTEXT_IDENTIFIER local_developer1 3) Ustawiając $GLOBALS['CONTEXT_IDENTIFIER'] w pliku wyłączonym z GIT a) w TYPO3 < 6.0 w pliku typo3conf/localconf_local.php i includowanym w typo3conf/localconf.php b) w TYPO3 > 6.0 w pliku AdditionalConfiguration.php
Jak wykorzystać dane z kontekstów? W PHP: $propertymanager = t3lib_div::makeinstance('tx_propertymanager_manager'); $domains = $propertymanager->getproperty('domains.'); echo($domains['poland']); W CONSTANTS z poniższą notacją: email_1 = {@email email_2 = {@tx_myextension->getvalue('email') othervalue = {@tx_myextension->getsomevalue() domains { poland = {@domains.poland germany = {@domains.germany.. [globalstring = IENV:HTTP_HOST = {@domains.germany] [globalvar = GP:L = 2] plugin.tx_solr.solr.path = {@plugin.tx_solr.solr.path.de [end] W SETUP już standardowo używamy zwykłych CONSTANTS plugin.tx_ext { emailadmin = {$email
Realurl? KONFIGURACJA REALURL DLA DOMEN $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT']; $TYPO3_CONF_VARS['EXTCONF']['realurl']['beta.yyy.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; $TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy-1.myagency.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; $TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy-2.myagency.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com'];.... $TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy.loc'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; unset($typo3_conf_vars['extconf']['realurl']['_default']); include_once(path_site. '/typo3conf/ext/propertymanager/classes/class.tx_propertymanager_manager.php'); /** @var /* tx_propertymanager_manager $propertymanager */ $propertymanager = t3lib_div::makeinstance('tx_propertymanager_manager'); $domains = $propertymanager->getproperty('domains.'); foreach($domains as $domain) { $TYPO3_CONF_VARS['EXTCONF']['realurl'][$domain] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT']; unset($typo3_conf_vars['extconf']['realurl']['_default']);
RESTRICTFE
Wady autoryzacji.htaccess 1) długość autoryzacji to sesja Użytkownik zamknie przeglądarkę i musi autoryzować się raz jeszcze 2) żeby działała autoryzacja musimy zmienić plik vhosta lub htaccess. Do modyfikacji VHOSTa nie zawsze mamy dostęp a modyfikacja.htaccess wiąże się z jego wyłączeniem z GIT
Co może restrictfe?
Extension manager
Profil użytkownika
Aktywacja W pliku typo3conf/localconf_local.php /out off git/ $TYPO3_CONF_VARS['EXTCONF']['restrictfe']['enable'] = '0';
Zalety 1) Długość autoryzacji ustawiana dowolnie Użytkownik autoryzuje się raz ogląda wielokrotnie po zamknięciu / otwarciu przegladarki. Autozycacja trzymana w cookie, przy czym możemy wyczyścić po stronie TYPO3 autoryzację. 2) Strona powitalna nowej witryny Ponieważ template pojawiający się bez autoryzacji jest dowolny więc można przygotować stronę powitalną (Witamy! Już niedługo w tym miejscu będzie witryna naszej firmy ABC ). Użytkownicy, którzy zalogują się do TYPO3 w BE ekranu powitalnego nie zobaczą. 3) Brak autoryzacji dla określonych IP i headerów Są wtyczki do przegladarek/proxy, które ustawiają header do każdego requestu. 4) Nie trzeba modyfikować.htaccess Htaccess może pozostać w GIT. 5) Można wykorzysta na LIVE do blokady wersji językowych Witryna jest już LIVE, ale dodano nową wersję językową, którą trzeba przetłumaczyć. yyy.com/cz/ - bez blokady możliwość zindeksowania przez googla 6) Tylko jedno hasło do BE! User ma tyko hasło do BE nie potrzebuje hasła do.htaccess
Połączenie PROPERTYMANAGER I RESTRICTFE Wyłączenie widoku określonych domen językowych include_once(path_site. '/typo3conf/ext/propertymanager/classes/class.tx_propertymanager_manager.php' /** @var tx_propertymanager_manager $propertymanager */ $propertymanager = t3lib_div::makeinstance('tx_propertymanager_manager'); $domains = $propertymanager->getproperty('domains.'); foreach($domains as $domain) { if( $_SERVER['HOST'] == $domain['url'] && $domain['restrictfe']) $TYPO3_CONF_VARS['EXTCONF']['restrictfe']['enable'] = TRUE;
Dziękuję za uwagę RESTRICTFE http://typo3.org/extensions/repository/view/restrictfe PROPERTYMANAGER k.szymukowicz@sourcebroker.net Krystian Szymukowicz (k.szymukowicz@sourcebroker.net)