Drupal 6.x telepítése (Squeeze)

Innen: AdminWiki

A Drupal egy elterjedt, PHP-MySQL alapú web tartalomkezelő (CMS) és prezentációs szoftver (portal engine). A Drupal fejlesztői környezetként is használatos, mert funkcionalitása modulokkal könnyen bővíthető (web development framework).

Ebben a leírásban a Drupal 6.x nagyverzióját farmként (megbízható fejlesztőknek nyújtott hosting szintű szolgáltatásként), az alábbi házirend szerint telepítjük:

  • a szerverre (nagyverziónként) egy közös Drupal kódkészlet települ;
  • minden Drupal instance (web) önálló upload tárterületet és adatbázist használ;
  • minden Drupal instance használhatja a rendszerszintű modulokat és témákat (sminkeket), valamint használhat önálló modulokat és témákat is, amelyeket azonban (futtatható kódok lévén) megbízható fejlesztői hozzáféréssel (DAV) kell telepíteni;
  • a Drupal instance-nak van egy egyedi (technikai) neve (a továbbiakban WEBNAME)
    • a használt adatbázis neve dr_WEBNAME;
    • az adatbázis-felhasználó neve dr_WEBNAME;
  • minden fenti account jelszava generált;
  • a Drupal instance egyedi (technikai) nevének nem kell közvetlen összefüggésben lennie a virtualhost névvel;
  • TODO: átgondolni, kiegészíteni!

Előfeltételek

  • Apache 2.x + WSM2 (Debian csomagból, illetve policy szerint telepítve)
  • MySQL 5.x (Debian csomagból policy szerint telepítve)
  • PHP 5.x (Debian csomagból policy szerint telepítve)
    • XMLContent modul esetén + PHP XSL
    • TODO!

Telepítés

A Debian Squeeze tartalmazza ugyan a Drupalt, de annak fejlődése gyorsabb, mint azt a disztribúció követni tudja, így a közös kódkészletet tarball-ból telepítjük és nem vesszük igénybe a Drupal csomaghoz biztosított Debian security supportot.

A telepítéshez a /usr partíciót írhatóan kell mount-olnunk, ezután szerezzük be a telepítőkészletet, és tömörítsük ki a /usr/local/share/ útvonalra, majd a verziószámot is tartalmazó célkönyvtárra készítsünk symlinkeket (security update előkészítése):

mount -o remount,rw /usr
cd /root/tmp; export DSUBVERSION="6.x"; export DVERSION="6" # "x"-et az aktuális verziószámmal töltsük ki!
wget "http://ftp.osuosl.org/pub/drupal/files/projects/drupal-$DSUBVERSION.tar.gz" # vagy más mirror
tar xzvf drupal-$DSUBVERSION.tar.gz -C /usr/local/share/
ln -s /usr/local/share/drupal-$DSUBVERSION /usr/local/share/drupal-$DVERSION 

# Ha csak egyféle Drupalt hostolunk (nincs pl. 5.x és 6.x is)
ln -s /usr/local/share/drupal-$DSUBVERSION /usr/local/share/drupal

A 6.x verziókban a lokalizációt (nyelvi file-okat) a telepítés során is használni lehet. A magyar változatot a drupal.hu-ról érdemes venni (tájékozódjunk, melyik az utolsó verzió - a jelen leírás készítésekor 1.2):

wget "http://ftp.drupal.org/files/projects/hu-6.x-1.2.tar.gz"

más nyelvi források a drupal.org webhelyről szerezhetőek be. A letöltött állományt a Drupal kódkészlet gyökerébe kell kicsomagolni, magyar verzió esetén pl. az alábbi paranccsal:

tar xzvf hu-6.x-1.2.tar.gz -C /usr/local/share/drupal-$DSUBVERSION

A kicsomagolt kódkészletben hozzunk létre három, egyelőre üres könyvtárat a közösen telepítendő külső könyvtáraknak, moduloknak és sminkeknek:

mkdir /usr/local/share/drupal-$DSUBVERSION/sites/all/libraries
mkdir /usr/local/share/drupal-$DSUBVERSION/sites/all/modules
mkdir /usr/local/share/drupal-$DSUBVERSION/sites/all/themes

Ezután a tarballokra már nincs szükség, azok törölhetőek, vagy pl. a /root/install könyvtárba archiválhatóak.

A kitömörítés után a Drupal kódállományok a root tulajdonában lesznek 755/644 jogokkal. A safe mode gid alatti futtatás miatt ezek nem futtathatnák az egyes virtualhostok alatti, a webadmin:www-data tulajdonában lévő kiegészítéseket. Ennek feloldására a teljes kódállományt a www-data csoport tulajdonába adjuk, oly módon, hogy az állományokat a csoport olvashassa, de a root felhasználón kívül senki ne írhassa:

find /usr/local/share/drupal-$DSUBVERSION -type d -exec chown root:www-data {} \; -exec chmod 750 {} \;
find /usr/local/share/drupal-$DSUBVERSION -type f -exec chown root:www-data {} \; -exec chmod 640 {} \;

Ezzel a közös kódkészletet előkészítettük.

Modulok és könyvtárak

Modulokat lehet rendszerszintű szolgáltatásként telepíteni, akkor azokat (a Drupal core moduljaival azonos módon) az egyes virtualhostok web adminisztrátorai webjük számára egymástól függetlenül, külön-külön aktiválhatják. Ezen felül minden virtualhost megbízható (DAV) adminisztrátora telepíthet modult önállóan, csak az adott virtualhost számára. Az így telepített modulok az adott virtualhostra nézve "felülbírálják" a közöseket.

Megjegyzés: a két eljárás között az a lényeges különbség, hogy a rendszerszintű modulokat minden instance-ra csak egyszerre lehet frissíteni, azaz ha a modulnak van adatbázis-vonzata, akkor a kód átírásával párhuzamosan minden instance-ban le kell futtatni az update.php scriptet, amit normálisan csak a webmaster (/user/1) tehet meg. Ha ez az account általában nálunk van, akkor érdemes lehet a gyakran használt modulokat közösen telepíteni; ha nem, akkor viszont egy frissítés sok egyeztetést igényelhet, így érdemesebb lehet minél kevesebb közös modult használni.

Modulokat elsősorban a Drupal modulgyűjteményéből lehet letölteni (futtatható kód, mindenképpen megbízható helyről szerezzük be!). A zip tömörítvényeket illetve tarballokat a /usr/local/share/drupal-*/sites/all/modules könyvtárba kell kitömöríteni, kicsomagolás után a tarballok törölhetőek.

Közös modulként érdemes telepíteni:

  • Update status advanced settings (a core kiterjesztése pl. modulonkénti beállítás lehetőségével)
  • WYSIWYG modulok
    • WYSIWYG API (wrapper modul WYSIWYG szövegszerkesztőkhöz)
      • CKeditor 3.x engine (nem CKEditor for Drupal 6 - az ugyanis egy komplett modul, nemcsak az engine!) - /usr/local/share/drupal-6/libraries/ckeditor-ba tenni!
      • FCKeditor 2.x engine (FCKEditor retired) - /usr/local/share/drupal-6/libraries/fckeditor-ba tenni!
      • TinyMCE 3.x engine - /usr/local/share/drupal-6/libraries/tinymce-be tenni!
    • IMCE (képkezelő a WYSIWYG editorokhoz)
    • HTML purifier (tartalomszerkesztésnél használatos HTML szűrő)
      • HTML purifier engine (legalább 4.0.0) - csak a library kell belőle, ide: /usr/local/share/drupal-6/libraries/htmlpurifier/library
  • API provider modulok
    • Chaos tools suite - API gyűjtemény
    • getID3 - médiaállományok (pl. MP3) beágyazott adatainak kezelése
      • getID3 engine - /usr/local/share/drupal-6/libraries/getid3-ba tenni és a demos alkönyvtárát eltávolítani!
        (TODO: működésre bírni a php-getid3 Debian package-dzsel.)
    • image cache - előre beállított képtranszformációk kezelése, tárolása
    • libraries API - általános könyvtár kezelő API
    • token - token kezelő API
    • transliteration - filenevek mentesítése az egzotikus karakterektől
    • voting API - szavazások, értékelések API-ja
  • TODO!

Hasznos, gyakran használatos modulok, amelyeket célszerű lehet közösként telepíteni:

  • Hozzászólások adminisztrációja
    • akismet (spamfilter)
    • captcha (spambotok által generált tatalmak kivédése pl. bevitelkori képfelismeréssel; kell hozzá legalább egy true type font is, pl. a /usr/share/fonts/truetype alól bemásolva vagy belinkelve)
    • commentmail (levél az adminisztrátornak új hozzászólás esetén)
    • quicktags (egyszerű szövegformázás támogatása)
  • TODO!

A modulok és könyvtárak kitömörítése után azok állományainak fájlrendszerbeli jogait is be kell állítani a safe mode gid alatti használathoz:

find /usr/local/share/drupal-$DSUBVERSION/sites/all/ -type d -exec chown root:www-data {} \; -exec chmod 750 {} \;
find /usr/local/share/drupal-$DSUBVERSION/sites/all/ -type f -exec chown root:www-data {} \; -exec chmod 640 {} \;

Sminkek

A modulokhoz hasonlóan a sminkeket (theme, skin) is lehet rendszerszinten (/usr/local/share/drupal-6/sites/all/themes könyvtár) illetve per-virtualhost (var/www/FULLY.QUALIFIED.HOSTNAME/sites/all/themes) telepíteni. Előbbiek a megbízhatónak tekintett (DAV) adminisztrátorok által sem módosíthatóak, míg az utóbbiak igen.

Megjegyzés: általában nem tűnik érdemesnek a core Drupallal szállítottakon túlmenően rendszerszintű sminkeket telepíteni, hiszen a kinézetet minden instance adminisztrátora jogosan szeretné egyénileg testre szabni.

Sminkeket elsősorban a Drupal sminkgyűjteményéből lehet letölteni (futtatható kódot tartalmaz, mindenképpen megbízható helyről szerezzük be!). Ügyeljünk arra, hogy a megfelelő verziószámú (6.x) Drupalhoz készített sminket töltsük le!

A rendszerszintű sminkek kitömörítése után azok állományainak fájlrendszerbeli jogait is be kell állítani a safe mode gid alatti használathoz:

find /usr/local/share/drupal-$DSUBVERSION/sites/all/themes/ -type d -exec chown root:www-data {} \; -exec chmod 750 {} \;
find /usr/local/share/drupal-$DSUBVERSION/sites/all/themes/ -type f -exec chown root:www-data {} \; -exec chmod 640 {} \;

A létrehozott profil mentése

A közös modulok, könyvtárak és sminkek telepítése után a /usr partíciót csak olvashatóan újracsatolhatjuk:

mount -o remount /usr

Érdemes lehet a kibővített közös Drupal kódkészletet (ami tulajdonképpen egy Drupal telepítési profil) a /root/install könyvtárba elmenteni:

cd /root/tmp
tar czvf drupal-$DSUBVERSION-profiled.tar.gz -C /usr/local/share drupal-$DSUBVERSION
chmod 600 drupal-$DSUBVERSION-profiled.tar.gz
mv drupal-$DSUBVERSION-profiled.tar.gz ../install/

Közös beállítások

Apache

Ha csak önálló virtualhostként telepített Drupal instance-okat használunk, a /usr/local/share/drupal* könyvtárakra külön Apache beállítások nem szükségesek. Aliasokon keresztüli elérés esetén TODO!

PHP

Vizsgáljuk felül a PHP globális beállításait:

  • ini_set-re (TODO!), levélküldésre és include-ra szükség van - wsm2 esetén:
-rw-r--r-- root root /etc/php5/conf.d/wsm2-php5.ini

[...]
disable_functions = [ini_set, mail, include ne szerepeljenek itt - kommentezés nem jó!]
[...]

Megjegyzés: a beállítások érvényesítéséhez a webszerverek konfigurációit újra kellene olvastatni, de ezt elhagyhatjuk, mert később a wsm2 úgyis megteszi.

Értesítés biztonsági bejelentésekről

Tekintettel arra, hogy a tarballból telepített Drupalhoz a Debian Security Team nem biztosít támogatást, külön gondoskodni kell arról, hogy értesítést kapjunk a biztonsági bejelentésekről és frissítésekről. Ehhez iratkozzunk fel a Drupal Security oldalon a levelezőlistára, vagy kövessük ezt az RSS csatornát.

Virtualhost (website) felvétele

MySQL adatbázis készítése

A MySQL adatbázisnak egyetlen, az adatbázisra nézve teljes jogú felhasználója van, akinek neve célszerűen megegyezik az adatbázis nevével. Az adatbázist és a felhasználót a MySQL root hozzáféréssel hozzuk létre.

mysql --defaults-file=/etc/mysql/root.cnf

mysql> CREATE DATABASE dr_WEBNAME character set utf8 DEFAULT COLLATE utf8_hungarian_ci;
mysql> GRANT ALL PRIVILEGES ON dr_WEBNAME.* TO 'dr_WEBNAME'@'localhost' IDENTIFIED BY 'PASSWORD';
mysql> FLUSH PRIVILEGES;

ahol a PASSWORD egy megfelelő jelszó. Relatív megjegyezhető, mégis erős jelszó a pwgen segédprogrammal is generálható, pl. a következőképpen:

/usr/bin/pwgen -s -n -c 12 1

Ellenőrizzük, hogy a felhasználó megfelelően létrejött-e:

mysql> SELECT host, user, password FROM mysql.user ORDER BY user;
+-----------+------------------+---------------------------------------------+
| host      | user             | password                                    |
+-----------+------------------+---------------------------------------------+
| localhost | DBNAME           | *73CDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
[...]
+-----------+------------------+---------------------------------------------+

mysql> quit

Ezután próbáljunk a létrehozott felhasználó nevében és jelszavával belépni. Az alábbi parancsokkal ellenőrizhetjük, hogy a felhasználó jogosultságai valóban csak erre a Drupal adatbázisra terjednek ki:

mysql -u DBNAME -p
Enter password:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| DBNAME             |
+--------------------+

A felhasználó felvételét és kipróbálását követően töröljük le a .mysql_history állományt, mert ebben a jelszó szabad szöveges formában benne van:

rm ~/.mysql_history

A 6.x sorozatú Drupal esetén az adatbázis iniciális feltöltését a telepítő PHP script végzi.

Website felvétele önálló Apache virtualhostként

Ez esetben a http://fully.qualified.hostname weboldal közvetlenül a Drupal web nyitólapjára mutat. A virtualhostot a szokott módon, a wsm2 segítségével készítjük el:

wsm2 -cw FULLY.QUALIFIED.HOSTNAME sysadmin@MYDOMAIN

Filerendszer beállítások

A wsm által létrehozott állományokat a bin, log könyvtár és az awstats link kivételével töröljük. A virtualhost tárterületén az egyedi tartalom részére a tárterületet (a sites könyvtárat és ezalatt az all és default/files hierarchiát) fizikailag is el kell készíteni (a default/files tárterületet safe mode gid-ben is írható módon), míg a /usr/local/share/drupal-* alatti összes többi tartalmat (benne a közösen elérhető könyvtárakkal, modulokkal és sminkekkel), illetve a maintainer által biztosított .htaccess állományt (benne a rewrite és biztonsági beállításokkal) egyszerűen belinkeljük:

cd /var/www/FULLY.QUALIFIED.HOSTNAME
rm -R  `ls -1 | grep -iv awstats | grep -iv bin | grep -iv log`
# Ha farmunkon minden Drupal mindig ugyanolyan verziójú (nincs pl. 5.x és 6.x is)
export DRUPAL="/usr/local/share/drupal"
# Ha van Drupal 5.x, 6.x stb. is (általában ezt használjuk!)
export DRUPAL="/usr/local/share/drupal-6"
# Ha adott Drupal verzióhoz (pl. 6.1) készítsünk instance-t (nem javasolt, biztonsági frissítés miatt):
export DRUPAL="/usr/local/share/drupal-6.x" # "x"-et töltsük ki!
echo $DRUPAL; ls $DRUPAL # Biztos, ami biztos... :-)

# sites/all hierarchia, közös elemek
mkdir -p sites/all/libraries; if [ -n "$(ls $DRUPAL/sites/all/libraries)" ]; then ln -s $DRUPAL/sites/all/libraries/* sites/all/libraries; fi
mkdir -p sites/all/modules; if [ -n "$(ls $DRUPAL/sites/all/modules)" ]; then ln -s $DRUPAL/sites/all/modules/* sites/all/modules; fi
mkdir -p sites/all/themes; if [ -n "$(ls $DRUPAL/sites/all/themes)" ]; then ln -s $DRUPAL/sites/all/themes/* sites/all/themes; fi
ln -s $DRUPAL/sites/all/README.txt sites/all
# Jogosultságok
find sites -type d -exec chmod 2750 {} \; -exec chown webadmin:www-data {} \;
find sites -type f -exec chmod 640 {} \; -exec chown webadmin:www-data {} \;
find sites -type l -exec chown -h webadmin:www-data {} \;

# sites/default hierarchia
mkdir -m 2750 sites/default; chown webadmin:www-data sites/default
ln -s $DRUPAL/sites/default/* sites/default
find sites/default -type l -exec chown -h webadmin:www-data {} \;

# sites/default/files hierarchia, írható elemek
mkdir -m 2770 sites/default/files; chown webadmin:www-data sites/default/files; setfacl -d -m g::rwX sites/default/files
mkdir -m 2770 sites/default/files/imce; chown webadmin:www-data sites/default/files/imce
mkdir -m 2770 sites/default/files/pictures; chown webadmin:www-data sites/default/files/pictures
mkdir -m 2770 sites/default/files/tmp; chown webadmin:www-data sites/default/files/tmp
# Drupal-5 kompatibilitás, ha nem szükséges, elhagyható:
ln -s sites/default/files files

# közös kódkészlet belinkelése
ln -s $DRUPAL/* . 2>/dev/null       # amit már megcsináltunk, hibát adna
ln -s $DRUPAL/.htaccess .htaccess   # külön kell, mert rejtett file
rm *.txt                            # a szövegállományok nem kellenek
ln -s $DRUPAL/robots.txt robots.txt # kivéve a robots.txt-t
# csak szépség
find . -type l -exec chown -h webadmin:www-data {} \;
.info TLD esetén

Speciális probléma: a Drupal 6.x belinkelt .htaccess állományában szerepel ez a szabály:

-r--r----- webadmin www-data /usr/local/share/drupal-6/.htaccess

[...]
# Protect files and directories from prying eyes.
<FilesMatch "\.(engine|inc|info|install|module|profile|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(code-style\.pl|Entries.*|Repository|Root|Tag|Template)$">
  Order allow,deny
</FilesMatch>
[...]

ami miatt az .info TLD alatt hibák keletkeznek (DirectoryIndex-ként nem jelenik meg az index.php). Ilyen domain esetében a .htaccess állományt linkelés helyett ki kell másolni a virtualhost gyökerébe, és az "info|" részt törölni a fenti szabályból.

TODO: jobb megoldást találni!

Webszerver beállítások

Módosítsuk a virtualhost (a wsm2 által létrehozott) Apache konfigurációját:

  • a teljes virtualhostra vonatkozóan:
    • vegyük ki az alábbi ModSecurity szabályokat:
      • 950004 - XSS detection in REQUEST_FILENAME|ARGS|ARGS_NAMES
      • 960009 - Missing user agent header
      • 960010 - Content encoding isn't allowed
      • 960015 - Require common headers
    • engedélyezzük a PHP futtatását, engedélyezünk 32 MB RAM használatot;
    • módosítjuk az open_basedir bejegyzést: egyrészt hozzátesszük a Drupal kódkönyvtárát, másrészt levesszük a wsm2 által a virtualhost alapkönyvtárának végére tett / jelet (mert a color modul csinál chdir /-t, ami meghagyott /-rel nem sikerül);
    • módosítjuk az include_path bejegyzést és engedjük ennek futás közbeni felülbírálását (a HTMLPurifier modul miatt - jobb megoldás: TODO!);
    • engedélyezzük a PHP file feltöltést, ha az APC telepítve van, a progress bar-t, megadunk méretkorlátot és egy ideiglenes könyvtárat;
    • megadunk egy User-Agent headert a PHP-ból indított esetleges web kapcsolatokra;
    • engedélyezzük a .htaccess állományok értelmezését;
  • speciálisan az adminisztrációs útvonalakra véglegesen tiltjuk a ModSecurity-t (jó szabályok? - TODO!);
  • speciálisan a sites/default/files (írható) könyvtárra (a wsm2 /upload-hoz hasonlóan):
    • tiltjuk a PHP futtatását;
    • tiltjuk a .htaccess állományok értelmezését;
    • a HTML, SHTML tartalmakat plain text-ként szolgáltatjuk ki;
    • a wsm2 /upload-tól eltérően engedjük a közvetlen fájlkiszolgálást;
  • speciálisan a /sites/default/files/backup névvel kezdődő alkönyvtárakra minden hozzáférést tiltunk;
  • a nem használt (törölt) könyvtárakra vonatkozó bejegyzéseket (a bin kivételével, melyet kommentezünk) törölhetjük;
  • a virtualhost ssl konfigurációját az esetleges ServerAlias-ok felvételét kivéve nem kell módosítani.
-rw-r--r-- root root /etc/apache2/sites-available/FULLY.QUALIFIED.HOSTNAME

<VirtualHost *:80>
[...]
    <IfModule mod_php5.c>
        php_admin_flag engine on
#       php_admin_value open_basedir /var/www/FULLY.QUALIFIED.HOSTNAME:/usr/local/share/drupal/
        php_admin_value open_basedir /var/www/FULLY.QUALIFIED.HOSTNAME:/usr/local/share/drupal-6/
#       php_admin_value open_basedir /var/www/FULLY.QUALIFIED.HOSTNAME:/usr/local/share/drupal-6.X/
        # a HTMLPurifier miatt nem lehet php_admin_value! - sechole, TODO!
#       php_value include_path .:/usr/local/share/drupal/
        php_value include_path .:/usr/local/share/drupal-6/
#       php_value include_path .:/usr/local/share/drupal-6.X/
        #
#       php_admin_value safe_mode_exec_dir bin/
        php_admin_value memory_limit 32M
        php_admin_value file_uploads on
#       php_admin_flag apc.rfc1867 on
        php_admin_value upload_max_filesize 1M
        php_admin_value post_max_size 1M
        php_admin_value upload_tmp_dir /var/www/FULLY.QUALIFIED.HOSTNAME/sites/default/files/tmp/
        php_admin_value user_agent 'Drupal (6.x)'
        [...]
    </IfModule>

    <IfModule security2_module>
        # Engine On/Off/DetectionOnly.
        SecRuleEngine On
        [...]
#
        # Write your own per-virtualhost rules here.
        ## XSS detection in REQUEST_FILENAME|ARGS|ARGS_NAMES
        SecRuleRemoveByID 950004
        ## Missing user agent header 
        SecRuleRemoveByID 960009
        ## Content encoding isn't allowed 
        SecRuleRemoveByID 960010
        ## Require common headers 
        SecRuleRemoveByID 960015
#
    </IfModule>

    # Virtualhost itself.
    <Directory /var/www/FULLY.QUALIFIED.HOSTNAME>
        Allow from all
        AllowOverride all
        Options +FollowSymLinks
        Options +SymLinksIfOwnerMatch
        [...]
    </Directory>

    # ModSecurity disabled on admin activities.
    <LocationMatch "^/(admin)|(install\.php)|(update\.php)|(node/add)|(node/[0-9]*/edit)|(node/[0-9]*/webform)">
        <IfModule security2_module>
            # Engine On/Off/DetectionOnly.
            SecRuleEngine Off
        </IfModule>
    </LocationMatch>
    [...]
    
    # Official upload directory (writable by www-data).
    <Directory /var/www/FULLY.QUALIFIED.HOSTNAME/sites/default/files>
        Allow from all
        AllowOverride none
        Options -FollowSymLinks
        Options +SymLinksIfOwnerMatch
        AddType text/plain .html .htm .shtml
        <IfModule mod_phpX.c>
            php_admin_flag engine off
        </IfModule>
    </Directory>

    # Hide backups (if any).
    <LocationMatch "^/sites/default/files/(backup)">
        Order allow,deny
        Deny from all
    </LocationMatch>
[...]
</VirtualHost>

Egyéb beállítások

A virtualhostok egyéni Drupal beállításait a telepítő a sites/default/settings.php állományban helyezi el; tekintettel a szigorúságunkra :-), ezt az állományt a telepítés előtt létre kell hozni a www-data felhasználó számára (csoport jogán) írható módon:

cp -p sites/default/default.settings.php sites/default/settings.php; chmod g+w sites/default/settings.php

Ezzel a Drupal virtualhost alapbeállítása megtörtént, a webszerver konfigurációk újraolvasása után használatba vehető:

invoke-rc.d apache2 reload

Használatba vétel

Tekintettel arra, hogy a frissen telepített Drupal az első, arra tévedő felhasználónak lehetőséget ad adminisztrátori hozzáférésre, a használatba vételt a webszerver konfiguráció újraolvasása után azonnal el kel végezni.

Telepítő futtatása

Egy, a telepítés alatti szervergépet grafikus böngészővel elérő munkaállomáson hívjuk be a http://FULLY.QUALIFIED.HOSTNAME/install.php weboldalt! A Drupal alapértelmezett telepítője jelenik meg, ahol

  • válasszunk magyar nyelvet;
  • adjuk meg a létrehozott MySQL adatbázis nevét és felhasználóját, valamint annak jelszavát (a felkínált haladó beállításokat általában nem kell változtatni).

A Drupal elvégzi a telepítést, és felszólít a sites/default/settings.php konfigurációs állomány írásvédetté tételére. Vegyük el a korábban megadott írásjogot:

chmod g-w sites/default/settings.php

és folytassuk a webhely alapbeállítását:

  • adjuk meg a webhely nevét és e-mail címét;
  • hozzuk létre (pl. webmaster néven) az "überadmin" (/user/1) Drupal felhasználót azonos e-mail címmel és generált jelszóval - a Drupal által közepes erősségűnek minősített jelszó pl. a
pwgen -c -n -s 12 1

paranccsal generálható;

  • ellenőrizzük az időzóna, rövid webcímek és frissítéskeresés beállításait (általában nem kell bántani).

Ha a telepítő sikeresen lefutott, állítsuk vissza a mod-security működését:

-rw-r--r-- root root /etc/apache2/sites-available/FULLY.QUALIFIED.HOSTNAME

<VirtualHost *:80>
[...]
    <IfModule security2_module>
        # Engine On/Off/DetectionOnly.
        SecRuleEngine on
        [...]
    </IfModule>

és olvastassuk újra a webszerver konfigurációját:

invoke-rc.d apache2 reload

Ezzel a telepítés elkészült, a továbbiakhoz shell hozzáférés már nem szükséges, a megbízható adminisztrátori (DAV, a Drupalon belül /user/1 és modulfejlesztés esetén SSH-tunnelezett MySQL) hozzáférés elegendő.

Azonnali teendők

az alábbiakat mindenképpen tegyük meg:

  • az adminisztráció - felhasználó kezelés - felhasználó beállítások lapon az "Csak a webhely karbantartói hozhatnak létre új felhasználót." megjelölésével akadályozzuk meg, hogy bárki más felvehessen Drupal felhasználót.

Ezzel a Drupal virtualhost szerkesztői felületét biztosítottuk, a további beállítások szükség szerint elhalaszthatóak.

Cron karbantartás beállítása

A Drupal karbantartó funkciói számára szükséges egy cron job beállítása, amit wsm 2.3 (vagy újabb változatok) alatt legegyszerűbben egy, a .htcrontab állományba felvett sorral oldhatunk meg:

-rw-r----- webadmin www-data /var/www/FULLY.QUALIFIED.HOSTNAME/.htcrontab

[...]
10,40 *  * * *   http://FULLY.QUALIFIED.HOSTNAME/cron.php 300

Ez a hívás fél óránként végrehajtódik, biztosítva ezzel a Drupal periodikus karbantartását.

Célszerű beállítások

Ezeket a beállításokat a szerkesztői felületen webmaster felhasználóként bejelentkezve az Adminisztráció oldalon tehetjük meg.

Webhely általános beállításai

  • dátum és idő - az időzóna +0001 legyen, a hét első napja hétfő, a magyar dátumformák lehetnek pl.
Y. m. d. - H:i     (rövid)
D, Y. m. d. - H:i  (közepes)
l, Y. F j. - H:i   (hosszú)
  • webhely információk - a névtelen felhasználó neve legyen Látogató, a többit értelemszerűen töltsük ki.
  • Adminisztráció - elérhető frissítések, Beállítások fülön vegyük fel a sysadmin@MYDOMAIN címet az értesítendők listájára.

Legújabb felület fordítások importálása

Töltsük le (saját gépünkre) a legfrissebb magyar nyelvi fordításokat tartalmazó .po állományt, és a webhelyépítés - felület fordítása - import lapon importáljuk azt. Az alapértelmezett beállításokkal ez a művelet nem változtat a meglévő magyar szövegeken (nem destruktív), de kiegészíti a fordítást a telepítéskor használt profilnál frissebb szövegekkel.

Felhasználókezelés előkészítése

Az alapértelmezett anonymous és authenticated user mellett a Felhasználókezelés, Csoportok menüpontban célszerű létrehozni egy 'tartalomszerkesztő' és egy 'webszerkesztő' csoportot, ezt követően a Felhasználókezelés, Felhasználók menüpontban (a frissítési lehetőségek használatával) a webmaster felhasználót fel kell venni a webszerkesztő csoportba.

Modulok telepítése és bekapcsolása

Amennyiben a kívánt illetve szükséges modulok rendszerszinten nem állnak rendelkezésre, azokat megbízható (DAV jogosult) adminisztrátorként a Drupal modulgyűjteményéből letöltött és kicsomagolt tarball-ok állományainak a webhely sites/all/modules/ könyvtárába DAV-on keresztül történő, könyvtárhelyes feltöltésével telepíthetjük. A DAV feltöltés automatikusan a safe mode gid-nek megfelelő file jogosultságokat állít be; ha rendszergazdaként shell hozzáféréssel telepítjük a modulokat, akkor pl. a következő parancsokkal adhatunk megfelelő jogokat:

pwd # /var/www/FULLY.QUALIFIED.HOSTNAME/ legyen!
find sites/all/modules/ -type d -exec chown webadmin:www-data {} \; -exec chmod 2750 {} \;
find sites/all/modules/ -type f -exec chown webadmin:www-data {} \; -exec chmod 640 {} \;

Telepítés után az alaprendszer opcionális modulok közül célszerű bekapcsolni az alábbiakat:

  • book (több node összefogása navigálható könyvvé)
  • contact (kérdőív modul)
  • path (a Drupalon belüli URL aliasok)
  • search (a Drupal saját keresője)
  • upload (file feltöltés)

valamint a WYSIWYG támogatást:

  • imce
  • wysiwyg
  • imce wysiwyg API bridge
  • HTML purifier (csak a libraries bekapcsolása után!)

illetve a telepített API-ket:

  • Chaos tools
  • getID3()
  • image API, image API GD2, image API imagemagick(?)
  • libraries
  • token
  • voting API

és helper modulokat:

  • transliteration
  • update status advanced settings

A modulok bekapcsolását követően célszerű az update status ellenőrzése.

Tartalomfeltöltés előkészítése

Elsősorban szerkesztett ("web-1") webhely esetén a Drupal tartalomtípusai közül a Tartalom kezelés, Tartalom típusok menüpontban a címlapra kerülés alapértelmezését mindhárom (oldal, írás, könyvlap) tartalomtípusra célszerű tiltottra állítani, és az írás kivételével a hozzászólás alapértelmezése is tiltott lehet.

A WYSIWYG tartalomfeltöltéshez egyfelől ki kell jelölni a Drupal HTML szűrőjén átengedendő formázásokat, másfelől be kell állítani ezek beillesztésére a TinyMCE kliens oldali HTML szerkesztőt és az IMCE képkezelőt.

HTML szűrés

A szövegbevitelnél manuálisan begépelt HTML formázások (esetleg rosszindulatú tartalmak) kiszűrésére szolgál, megjelenítéskor érvényesül: amit nem enged át, az nem megy át a böngészőnek küldött HTML-be. Több lehetőség is van, az egyik a Drupal beépített HTML szűrő eszköze (hátránya, hogy nem lehet szabályozni a tagek attribútumait, így pl. a style = inline formázásokat nem engedi érvényesülni), a másik a HTML Purifier modul.

Beépített HTML szűrő

A Webhely beállítása, Beviteli formák menüpontban adjunk hozzá egy Rich text nevű beviteli formát, melyet engedélyezzünk a tartalomszerkesztő és webszerkesztő csoport számára, és jelöljük meg a HTML korrektor, HTML szűrő, Sortörés-átalakító és URL szűrő használatát, valamint állítsuk be az engedélyezett HTML elemeket az alábbiakra:

<br> <b> <i> <u> <a> <em> <strong> <cite> <code> <sup> <sub> <img> <div> <p> <h1> <h2> <h3> <h4> <h5> <h6> <ul> <ol> <li> <dl> <dt> <dd> <table> <thead> <tbody> <tfoot> <th> <tr> <td> <embed>

Az <embed> megengedi, hogy forrás nézetben YouTube (vagy hasonló) anyagokat beszúrjon a szerkesztő. Ezekben a kódrészletekben szerepelnek <object> és <param> tagek is (igazából az <embed> elavult), de a Drupal IE-ben nem jeleníti meg az <object>-eket (ugyanezt a hibát WordPress-re ld. pl. itt - TODO!), ezért ezeket átmenetileg a szűrővel tiltsuk ki. Csúnya hack, tudom...

HTML Purifier modul

TODO!

A Webhely beállítása, Beviteli formák menüpontban adjunk hozzá egy Rich text nevű beviteli formát, melyet engedélyezzünk a tartalomszerkesztő és webszerkesztő csoport számára, és jelöljük meg a HTML Purifier, Sortörés-átalakító és URL szűrő használatát, valamint állítsuk be az engedélyezett HTML elemeket (Configure HTML Purifier, HTML, allowed) az alábiakra:

b[class],strong[class],i[class],em[class],u[class],cite[class],code[class],sub[class],sup[class],a[href|name|title|target|style|class],img[src|alt|height|width|align|hspace|vspace|style|class],br[clear|style|class],p[align|style|class],div[align|style|class],h1[style|class],h2[style|class],h3[style|class],h4[style|class],h5[style|class],h6[style|class],ul[type|style|class],ol[type|start|style|class],li[type|value|style|class],dl[style|class],dd[style|class],dt[style|class],table[align|width|border|frame|rules|bgcolor|cellpadding|cellspacing|width|style|class],th[align|valign|style|class],tbody[align|valign|style|class],tfoot[align|valign|style|class],th[colspan|rowspan|width|height|align|valign|nowrap|style|class],tr[align|valign|style|class],td[colspan|rowspan|width|height|align|valign|nowrap|style|class]

Ezen kívül jelenleg az EnableID értékét is yes-re kell állítani, különben az anchorok nem működnek, ld. itt, valamint egyszer át kell menni HTML Purifier advanced-be és az Allowed Frame Targets ablakban fel kell sorolni a _blank _parent _self _top standard frame neveket (soronként egy), különben nem működik az <a target="" [...]> attribútum.

IMCE

Az IMCE használatához a Webhely beállítása, IMCE alatt érdemes megszerkeszteni az alapértelmezett profile-t, és abban a Directory path-t sites/default/files/imce/u%uid-ra állítani (minden más maradhat alapértelmezett). Ezután hozzunk létre egy IMCE profile-t a szerkesztők számára, ebbe importáljuk a User-1 profil beállításait (korlátlan feltöltés) és állítsuk a Directory path-t sites/default/files/imce-re, majd rendeljük ezt a profilt a tartalomszerkesztő és webszerkesztő csoportokhoz.

TinyMCE

Rendeljük a Rich text tartalomtípushoz a TinyMCE szövegszerkesztőt a Webhely beállítása - WYSIWYG modul beállításainál, és szerkesszük meg a hozzá tartozó profile-t az alábbiak szerint:

  • alapértelmezett használat, magyar nyelv (Basic setup - Enabled by default, Nyelv: hu)
  • használható kontrollok (Buttons and Plugins - bold, italic, underline, strike-through, align left, align center, align right, justify, bullet list, numbered list, outdent, indent, undo, redo, link, unlink, anchor, image, cleanup, sup, sub, cut, copy, paste, remove format, character map, font style, paste text, paste from word, search, replace, table, IMCE, teaser break.)
  • tiltsuk le a HTML font tag-ek inline stílussá konvertálását (Cleanup and output - Convert tags to styles: false).

Felhasználók beállításai

A Felhasználó kezelés, Jogosultságok menüpontban állítsuk be az alapértelmezett felhasználók és a létrehozott tartalomszerkesztő és webszerkesztő csoport jogosultságait! A webszerkesztő minden jogot megkaphat, míg a többiek számára a szükséges legkevesebb jogosultságot igyekezzünk megadni az alábbi házirend szerint (TODO!):

  • anonymous - olvas, kérdőívet kitölthet
  • authenticated - olvas, kérdőívet kitölthet, commentet írhat, esetleg avatart vagy egyéb file-t feltölthet, profilját módosíthatja
  • tartalomszerkesztő - tartalmat és navigációt teljes körűen szerkeszt, de kódot nem írhat, profilját módosíthatja
  • webszerkesztő - majdnem mindenhez joga van, de kódot nem írhat
Modul be nem jelentkezett azonosított tartalomszerkesztő webszerkesztő
block - - adminisztráció minden
book nyomtatóbarát nyomtatóbarát minden minden
comment hozzáférés hozzáférés, beküldés minden minden
contact elérés elérés minden minden
filter - - - minden
locale - - - minden
menu - - adminisztráció minden
node hozzáférés hozzáférés tartalom típusok adminisztrációja kivételével minden minden
path - - minden minden
search keresés, haladó keresés keresés, haladó keresés minden minden
system - - adminisztrációs oldalak hozzáférése minden
taxonomy - - adminisztráció minden
upload megtekintés megtekintés (esetleg feltöltés) minden minden
user - profilok hozzáférése profilok hozzáférése minden

Ne feledjük, hogy modulok bekapcsolása esetén a hozzáféréseket felül kell vizsgálni!

A csoport hozzáférések beállítása után hozzuk létre a tényleges szerkesztő felhasználókat, és a tartalomfeltöltést már ezen account-okkal végezzük.

Tartalom tesztoldal feltöltése

Tartalomszerkesztő jogosultságú felhasználóval belépve küldjünk be egy tesztoldalt oldal típusú tartalomként, Rich text beviteli formában, "Lorem ipsum" címmel, a WYSIWYG editor letiltása után ("disable rich text") a törzsbe az alábbi teszt HTML-t bemásolva:

<h1>Heading 1</h1>
<p><img src="/sites/default/files/imce/design-teszt-image.jpg" alt="Design test image" title="Design test image" hspace="5"  width="100" height="100" align="left" />Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p><p>Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p>
<h2>Heading 2</h2>
<p><a href="#" title="Clickable image"><img src="/sites/default/files/imce/design-teszt-image.jpg" alt="Design test image" title="Design test image" hspace="5" width="100" height="100" align="right" /></a>Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p><p>Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p>
<h3>Heading 3</h3>
<p><img src="/sites/default/files/imce/design-teszt-image.jpg" alt="Design test image" title="Design test image" hspace="5" width="100" height="100" align="left" />Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p><p>Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p>
<h4>Heading 4</h4>
<p><img src="/sites/default/files/imce/design-teszt-image.jpg" alt="Design test image" title="Design test image" hspace="5" width="100" height="100" align="right" />Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p><p>Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p>
<h5>Heading 5</h5>
<p><img src="/sites/default/files/imce/design-teszt-image.jpg" alt="Design test image" title="Design test image" hspace="5" width="100" height="100" align="left" />Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p><p>Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p>
<h6>Heading 6</h6>
<p><img src="/sites/default/files/imce/design-teszt-image.jpg" alt="Design test image" title="Design test image" hspace="5" width="100" height="100" align="right" />Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p><p>Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p>
<h1>Lists</h1>
<ul><li>Bullet list 1</li><ul><li>Bullet list 1.1</li><ul><li>Bullet list 1.1.1<br /></li></ul> </ul><li>Bullet list 2</li><li>Bullet list 3 </li></ul>
<ol><li>Numbered list 1</li><ol><li>Numbered list 1.1</li><ol><li>Numbered list 1.1.1<br /></li></ol></ol><li>Numbered list 2</li><li>Numbered list 3</li></ol>
<h1>Table</h1>
<table border="0"> <tbody> <tr> <th><h1>Heading 1</h1></th> <th><h2>Heading 2</h2></th> <th><h3>Heading 3</h3></th> <th><h4>Heading 4</h4></th> </tr> <tr><th>row 1<br /></th> <td><p>data 11<br /> data 11</p></td> <td>data 12</td> <td>data 13</td> </tr> <tr> <th>row 2<br /></th> <td>data 21<br /></td> <td>data 22</td> <td>data 23<br /></td> </tr> <tr> <th>summary<br /></th> <th>summary 1<br /></th> <th> summary 2</th><th>summary 3</th></tr></tbody></table>

Design-teszt-image.jpg

Beküldés előtt az IMCE használatával töltsünk fel egy 100x100px méretű, design-test-image.jpg filenevű képet, és előnézettel ellenőrizzük, hogy az a teszt tartalomban több helyen is megjelenik-e.

Ha a teszt tartalom beküldése sikeres, webmaster felhasználóként belépve érdemes lehet a nyitólapot átmenetileg az ezt a tartalmat megmutató node/1 útvonalra irányítani.

Egyéni smink telepítése

Sminkeket elsősorban a Drupal sminkgyűjteményéből lehet letölteni (futtatható kódot tartalmaz, mindenképpen megbízható helyről szerezzük be!). Ügyeljünk arra, hogy a megfelelő verziószámú (6.x) Drupalhoz készített sminket töltsük le! A sminket célszerűen DAV útján, a /sites/all/themes/sminkneve könyvtárba kell feltölteni. A DAV feltöltés automatikusan a safe mode-nak megfelelő file jogosultságokat állít be; ha rendszergazdaként, shell hozzáféréssel telepítjük a sminket, akkor a bemásolás után a következő parancsokkal adhatunk megfelelő jogokat:

pwd # /var/www/FULLY.QUALIFIED.HOSTNAME/ legyen!
find sites/all/themes/ -type d -exec chown webadmin:www-data {} \; -exec chmod 2750 {} \;
find sites/all/themes/ -type f -exec chown webadmin:www-data {} \; -exec chmod 640 {} \;

Hasznos sminkek:

  • Gutenberg - ez valójában egy szűrő, a Drupal HTML kimenetét alakítja a Movable Type CSS által elvárt formájúra. Használathoz a MT design-t egy, a Gutenberg smink könyvtárában elhelyezett alkönyvtárba kell feltölteni, és - az általában a stílus nevét viselő - css fájlt át kell nevezni style.css-re.

TODO!

Drupal frissítés

A közös kódkészlet (Drupal Core illetve közös modulok) frissülése esetén (erről a Drupal Security Announcements RSS-e vagy levelező listája, illetve az Update Status modul értesít) az alábbiak szerint érdemes a frissítéseket elvégezni:

Core frissítése

A frissítéshez a /usr partíciót írhatóan kell mount-olnunk, ezután szerezzük be a frissített core telepítőkészletet, és tömörítsük ki a /usr/local/share/ útvonalra:

mount -o remount,rw /usr
cd /root/tmp; export DSUBVERSION="6.x"; export DVERSION="6" # "x"-et töltsük ki!
wget "http://ftp.osuosl.org/pub/drupal/files/projects/drupal-$DSUBVERSION.tar.gz" # vagy más mirror
tar xzvf drupal-$DSUBVERSION.tar.gz -C /usr/local/share/

A 6.x verziókban a lokalizációt (nyelvi file-okat) a telepítés során is használni lehet. A magyar változatot a drupal.hu-ról érdemes venni:

export HUNVERSION="1.2" # ellenőrizzük, van-e újabb!
wget "http://ftp.drupal.org/files/projects/hu-6.x-$HUNVERSION.tar.gz"

más nyelvi források a drupal.org webhelyről szerezhetőek be. A letöltött állományt a Drupal kódkészlet gyökerébe kell kicsomagolni, magyar verzió esetén a:

tar xzvf hu-6.x-$HUNVERSION.tar.gz -C /usr/local/share/drupal-$DSUBVERSION

paranccsal. Ezután a tarballokra már nincs szükség, azok törölhetőek.

A kitömörítés után a Drupal kódállományokat a root:www-data tulajdonába adjuk, hogy azokat a webszerver a safe mode GID beállítás mellett is futtathassa, de ne írhassa:

find /usr/local/share/drupal-$DSUBVERSION -type d -exec chown root:www-data {} \; -exec chmod 750 {} \;
find /usr/local/share/drupal-$DSUBVERSION -type f -exec chown root:www-data {} \; -exec chmod 640 {} \;

Ezután másoljuk át a jelenlegi Drupal kódkönyvtárból a /sites/all alatti összes olyan könyvtárat (közös library-t, modult és sminket), amelyik a frissen telepített Drupal kódkönyvtárban nem szerepel (ezt célszerű kétpaneles filekezelővel, pl. Midnight Commanderrel végezni - script: TODO!). Ezzel az új közös kódkészletet előkészítettük az aktiválásra.

Az aktiválás úgy történik, hogy a Drupal symlinkeket átírjuk úgy, hogy a frissítést tartalmazó könyvtárra mutassanak. Az aktiválást érdemes az érintett Drupal site-ok webmestereivel (/user/1) egyeztetni, mert szükséges lehet az /update.php lefuttatása.

Aktiválás után a /usr csak olvashatóan visszacsatolható:

mount -o remount /usr

Közös modulok frissítése

TODO!