# Drupal mustikas11 – D7 → D11 migratsioon (ohmu dev) Kataloog: `/opt/docker-compose/third/drupal/mustikas11/` ## Mis see on Drupal 7 (mustikas.maastikuarhitekt.ee) → **Drupal 11** migratsiooni testimiskeskkond arendusserveril `ohmu`. Production (hetzner) jääb täiesti puutumata — migratsioon loeb ainult ohmu-l olevat sünkroonitud `dr_mustikas` koopiat. ## Teenus | Konteiner | Pilt | Port | URL | |-----------|------|------|-----| | drupal_mustikas11 | drupal_mustikas11:latest (põhineb drupal:11) | 127.0.0.1:8010 → 80 | https://ohmu.tail20e23.ts.net:8010/ | - Andmebaas: `dr_mustikas11` (ohmu mariadb, `utf8mb4_general_ci`) - Source DB (D7 koopia): `dr_mustikas` (ohmu mariadb) - D7 failid: bind-mount `/var/lib/docker/volumes/drupal_mustikas-html/_data/sites/default/files` → `/d7-files` (read-only) - Admin: `admin` / `AdminPass2026!`, meil `ardokubjas@gmail.com` (VAJA VAHTADA tootmises) - SMTP: `mail.odamus.com:587` (TLS, `bounce@odamus.com`) — e-kirjad töötavad - `system.site.mail` = `bounce@odamus.com` (NB! peab ühtima SMTP auth kasutajaga, muidu SMTP server lükkab `info@maastikuarhitekt.ee` saatja tagasi) - Reverse proxy: `reverse_proxy = TRUE` settings.php-s (Tailscale serve HTTPS jaoks) - Keeled: `et` (vaikimisi, nagu D7) + `en`. `system.site.default_langcode = et`. NB! et-alias'd (`/liikmed/tanel-breede`) töötavad ilma prefiksita ainult siis, kui default keel on `et`. Kui default oleks `en`, vajaksid nad `/et/` prefiksit. ## Pilt (Dockerfile) Põhineb `drupal:11` + paigaldatud: - `drush/drush` - `drupal/migrate_plus` - `drupal/migrate_tools` - `drupal/migrate_upgrade` - `drupal/smtp` - `drupal/views_aggregator` - `drupal/views_data_export` Ehitamine: `docker compose build` ## Vaated (D7 analoggid) | Path | Vaade | Sisend | |------|-------|--------| | `/liikmed`, `/liikmed/nimekiri` | `liikmed` | emal_liige nimekiri (nimi, e-mail, isikukood) | | `/projektid` | `projektid` | projektide nimekiri | | `/kanded/liikmemaksud` | `kanded` (kande_tyyp=6) | kannete tabel | | `/kanded/projektid` | `kanded` (kande_tyyp=8) | kannete tabel | | `/kanded/tegevuskulud` | `kanded` (kande_tyyp=29) | kannete tabel | | `/kanded/*/saldod` | `kanded` + views_aggregator SUM | summeeritud saldod | | `/kanded/koik-kanded` | `kanded` | kõik kanded | | `/synnipaevad`, `/liikmed/synnipaevad` | `synnipaevad` | emal_liige nimekiri | | `/docs` | `dokumendid` | filedepot_folder nimekiri (täispika hierarhilise teega) | | `/filedepot` | `dokumendid` (page_filedepot) | sama nimekiri, täispika teega | | `/liikmed/eksport` | `liikmed` data_export | CSV (nimed, isikukoodid, e-mailid) | | `/contact` | contact moodul | kontaktivorm (feedback) | Custom moodul `mustikas_export` parandab views_data_export rea renderdamist D11-s (fields row plugin tagastab #theme render array, mis ei serialiseeru CSV-ks). Asub `custom_modules/mustikas_export/` ja tuleb image'i sisse kopeerida. ## Migratsiooni jooksutamine ```bash # Täismigratsioon (ka lõppsünk): sudo bash /opt/docker-compose/third/drupal/mustikas11/migrate_mustikas11.sh ``` Drush otse (NB! mälu limiit): ```bash docker exec drupal_mustikas11 sh -c "cd /opt/drupal && php -d memory_limit=1024M /opt/drupal/vendor/drush/drush/drush.php " ``` ## Migratsiooni tulemus (seis 2026-08-26) | Sisutüüp | D7 | D11 | Staatus | |----------|-----|------|---------| | kanne | 7792 | 7792 | 100% ✓ | | emal_liige | 153 | 153 | 100% ✓ | | projekt | 174 | 174 | 100% ✓ | | filedepot_folder | 141 | 141 | 100% ✓ | | book | 9 | 9 | 100% ✓ | | page | 5 | 5 | 100% ✓ | | php | 3 | 3 | 100% ✓ | | **Kokku node** | **8277** | **8277** | **100% ✓** | | kasutajad | 153 | 153 | ✓ | | taxonomy terminid | 108 | 108 | ✓ | | failid | 2675 | 854 (public) | osaline (private jäi) | | URL aliased | 11147 | ~11000 | ✓ | ## Juurdepääsuõigused (seis 2026-08) Juurdekontroll on viidud D7-ga vastavusse: - Anonüümsele kasutajale on EEMALDATUD `access content` (View published content). Selle tulemusena: - `/` (Avaleht, node/5) -> 403 "Ligipääs keelatud" + juhendtekst + sisselogimisplokk külgribal - `/liikmed`, `/projektid`, `/kanded/*`, `/docs`, `/filedepot`, `/synnipaevad`, kõik `/node/*` -> 403 - `/contact` -> 200 (kõigile) - `/user/login`, `/user/password` -> 200; `/user/register` -> 403 (admin_only) - Peamenüüs anonüümsele ainult "Avaleht" ja "Kontakt" - Eemaldatud standard profiili "Home" menüülink (`standard.front_page`) peamenüüst (hook_menu_links_discovered_alter mustikas_export moodulis). - Lisa juhendteksti blokk (`anonymous_front_instruction`), nähtav ainult anonüümsele JA ainult avalehel (request_path /node/5), content regionis (D7 node/3 PHP `drupal_is_front_page() && !$user->uid` analogg). NB! request_path peab sisaldama nii `` kui `/node/5` ja `/`, sest avalehele anonüümse juurdepääsu (403) korral on current path kas `/` või `/node/5`. - `metro_user_login` blokk piiratud ainult anonüümsele. - `tools_sidebar` menüü peidetud anonüümsele. - D7 footer taastatud: `metro_block_4-7` (telefon, e-mail, lahtiolekuajad, "Kirjuta meile" -> /contact) paigutatud `footer_top` regioni. - Tõlked (et): "Access denied" -> "Ligipääs keelatud", "You are not authorized to access this page." -> "Sul puudub õigus antud lehte vaadata.", kontaktvormi pealkiri "Website feedback" -> "Kontakt". Skriptid (kordustäitmiseks): - `revoke_anon_access.php` – eemaldab anonüümselt access content - `add_instruction_block.php` – loob juhendteksti bloki - `restrict_instruction_front.php` – piirab juhendteksti bloki ainult avalehele - `restrict_login_block.php` – metro_user_login anonüümsele - `restore_footer.php` – footer blokid footer_top - `restrict_tools_sidebar.php` – tools_sidebar peidetud anonüümsele ## Rollide ja õiguste vastavus (seis 2026-08) Rollide kaardistus D7 -> D11 on 1:1 (kasutajate jaotus säilis): | D7 roll | D11 roll | Õigused D11-s | |---------|----------|---------------| | anonymous | anonymous | contact form + filtered_html (access content EEMALDATUD) | | authenticated | authenticated | access content, view files, comments, contact form | | administrator | administrator | is_admin (kõik) | | EMAL liikmemaksud | emal_liikmemaksud | contact form | | EMAL juhatuse liige | emal_juhatuse_liige | **access filedepot**, contact form | | EMAL süsteemi administraator | emal_susteemi_administraator | 41+ õigust (admin pages, users, taxonomy, content create/edit/delete) + access filedepot + administer filedepot + contact form | | EMAL liige | emal_liige | contact form | | EMAL projektid | emal_projektid | contact form | | EMAL raamatupidamine | emal_raamatupidamine | contact form | | filedepot | filedepot | **access filedepot + administer filedepot** | | EMAL kutsekomisjon | emal_kutsekomisjon | **access filedepot** | ### Lehtede juurdepääs (D7-ga vastavuses) | Leht | Juurdepääs | |------|------------| | `/liikmed`, `/projektid`, `/docs` | access content (kõik autenditud) | | `/filedepot` | **access filedepot** õigus | | `/kanded/liikmemaksud`, `/kanded/projektid`, `/kanded/tegevuskulud` | rollid admin, juhatus, süsteemi admin VÕI projekti juurdepääsu väljal olev kasutaja | | `/kanded/liikmemaksud/saldod` | rollid admin, juhatus, raamatupidamine, süsteemi admin | | `/kanded/projektid/saldod` | rollid admin, juhatus, raamatupidamine, süsteemi admin | | `/kanded/koik-kanded` | access content (kõik autenditud) | | `/liikmed/eksport` | rollid admin, süsteemi admin | | `/liikmed/synnipaevad` | access content | ### Tehtud muudatused - Loodud custom permissionid: `access filedepot`, `administer filedepot` (mustikas_export.permissions.yml) - Loodud kanded Views access plugin `mustikas_kanded_access` + route access check `mustikas_export.kanded_access` (src/Access/KandedAccessCheck.php) - Migreeritud `field_projekt_juurdepaas` (projekti juurdepääsu õigused) D7-st D11-sse (11 rida, projektid 13550/13563/13565/13791/13885/13906) - Rakendatud kanded vaate display'dele D7-vastased access-id (defaults.access=false) - Liikmed CSV eksport piiratud admin+süsteemi admin rollidele - `/filedepot` vaade piiratud `access filedepot` õigusega - FileDownloadHooks nõuab nüüd `access filedepot` õigust (mitte ainult sisselogimist) Skriptid (kordustäitmiseks): - `migrate_projekt_juurdepaas.php` – projekti juurdepääsu andmete migratsioon - `grant_role_perms.php` – rollipõhiste õiguste andmine - `apply_kanded_access4.php` – kanded vaate access-ide seadistamine - `restrict_export.php` – CSV eksporti piiramine - `restrict_filedepot.php` – filedepot vaate piiramine ## Teadaolevad probleemid / edasiarendus 1. **body "plain text" väli** – D7 body on konfigureeritud plain_text-iga, migrate ei too seda üle (teadaolev Drupal issue). Mõjutab book/page/article/phpi sisu teksti. 2. **Custom väljad** (`field_nimi`, `field_isikukood`, `field_emal_kasutaja_oigused`, `field_sunnipaev`) – D7 custom moodulitest (`name`, `est_id_code_field`, `rolereference`, `birthdays_date`). Vajavad kohandatud migratsioonipluginaid. Praegu loon neile lihtsustatud storaged (string/datetime) — andmed ei tule automaatselt üle, aga emal_liige node'id ise migreeruvad. 3. **Panels / Rules / Features / Views** – EI migreeru automaatselt. Vajavad käsitsi uuesti ehitamist (sama nagu kõik D7→D8+ migratsioonid). 4. **Teemad** (metro, rainbow) – PHPTemplate → Twig täisümberkirjutus. Praegu kasutusel vaikimisi Olivero. 5. **Failid private** – private files (filedepot, backup_migrate) ei migreeru public files stream'i. 6. **Parool & turve** – admin parool on ajutine (`AdminPass2026!`), SMTP on seadistatud, SSL on Tailscale serve kaudu. ## Eeltingimused enne tootmist - [ ] Kõik custom moodulid (cpn, est_id_code jne) portida D11 jaoks - [ ] Teemad ümber kirjutada (Twig) - [ ] Panels/Views/Rules uuesti ehitada - [ ] i18n/entity_translation täiendav migratsioon - [ ] Turvaseaded (paroolid, SMTP, SSL) ## Lõppsünk (viimaste andmete ülekandmine) 1. Värskenda D7 koopia hetznerist: `sudo bash /opt/docker-compose/third/drupal/mustikas/sync_from_hetzner.sh` 2. Jooksuta täismigratsioon: `sudo bash /opt/docker-compose/third/drupal/mustikas11/migrate_mustikas11.sh` 3. Kui kõik ok → vaheta prod DNS / traefik uuele saidile. ## Abiskriptid (konteineris /tmp/) - `fix_fields.php` – loob puuduvad custom field storage'id (string/datetime) - `fix_fields2.php` – loob datetime_range → daterange storage'id - `fix_er_sort.php` – parandab entityreference `sort` puuduva võtme (source DB) - `fix_text_maxlength.php` – tõstab liiga lühikese `text` välja max_length=255 (source DB) - `del_kirjeldus.php` - kustutab field_kirjeldus config'i (vajadusel) - `migrate_filedepot.php` – migreerib filedepot failid (file_managed + node__filedepot_folder_file) - `migrate_filedepot_hierarchy.php` – loob field_folder_parent välja ja täidab D7 filedepot_categories.pid järgi kaustade hierarhia - `custom_modules/mustikas_export/src/Plugin/views/field/FolderPath.php` – Views väli "Kausta täispikk tee" (`filedepot_folder_path`) Need on ka `/tmp/opencode/` kohalikus Dropboxis (kust sai scp).