Модуль I · Хмарні сервіси й документи · тема 8, урок 2 з 2 · 120 хвилин
style.css
і дослівно однаковий блок меню;git push і за кілька секунд
побачити їх на адресі сайту;Слова «деплой» і «вебхук» поки нічого не означають. Розберемо їх на кроці 5.
Минулого уроку команда завела репозиторій, розібралася з гілками й зверстала каркас із чотирьох сторінок. Сьогодні цей каркас має стати продуктом — одним сайтом. Стороння людина відкриває його й розуміє: що це, хто це зробив і навіщо.
Урок складається з трьох частин, і кожна відповідає на своє питання.
| Частина | Питання | Результат |
|---|---|---|
| Інтеграція | як чотири шматки від чотирьох людей зробити одним сайтом | спільна навігація, один style.css, узгоджені імена |
| Деплой | чому «в мене працює» ще не означає «працює в інтернеті» | зелений прогін push → webhook → сайт |
| Захист | як за 5 хвилин показати зроблене так, щоб зрозуміли | виступ із ролями і CONTRIB.md |
| Етап | Хв | Що робимо |
|---|---|---|
| Вхід у тему | 10 | Чотири сторінки від чотирьох людей: що з ними не так |
| Інтеграція | 20 | Спільне меню, один style.css, домовленість про імена файлів |
| Деплой | 20 | Ланцюжок push → вебхук → сайт, симулятор на сторінці |
| Розбір поламок | 15 | Чотири місця, де рветься публікація; читання журналу |
| Практика: складання сайту | 35 | Чотири сторінки, чек-ліст, media.html, CONTRIB.md |
| Захист | 15 | П’ять хвилин на команду, ролі у виступі |
| Здача | 5 | check 15 --why, підсумок модуля |
| Разом | 120 |
class9a/team-3 — підстав свою організацію і номер.
Чотири сторінки з уроку 14 і налаштований вебхук-деплой на
https://team<N>.<домен>/. У прикладах на цій сторінці адреса
записана як team<N>.<домен> — підстав свій номер команди
й адресу, яку дав учитель.
Артефакти попередніх тем лежать
у кожного в особистому кабінеті. Це історія з теми 1, розмітка коміксу з теми 4,
дашборд із теми 6 і бот із теми 7.media.html з описом,
текстом субтитрів і посиланням на prompts.json. Сам трейлер і сам комікс
команда показує з власного екрана під час захисту. Якщо залити .mp4
у репозиторій, файл відхилять, а критерій no_media лишиться
незарахованим.https://team3.<домен>/ відкривається з телефона
сусіда, а не тільки з твого ноутбука;Коли кожен верстає свою сторінку окремо, він робить її красивою саму по собі. Проблема з’являється тільки в момент, коли ці сторінки ставлять поруч і людина переходить між ними.
Читач не бачить чотирьох авторів. Він бачить один сайт, який «стрибає». На кожній сторінці інший шрифт. Меню з’їжджає вбік. Кнопка тут синя, а на сусідній сторінці зелена. Це виглядає недоробленим — навіть якщо кожна сторінка окремо зроблена добре.
| Що розходиться | Як це помічає читач | Як лікується |
|---|---|---|
| Шрифт і розміри | «сторінка перезавантажилася на інший сайт» | один style.css на всі сторінки |
| Набір посилань у меню | заблукав і не може повернутися на головну | той самий блок <nav>, скопійований дослівно |
| Порядок пунктів меню | тицяє мимо: пункт «переїхав» | порядок фіксується один раз і не міняється |
| Імена файлів | 404 на переході | домовленість: усе малими, без пробілів і кирилиці |
| Структура тек | частина посилань працює, частина ні | одна схема тек на весь репозиторій |
Найчастіша поламка інтеграції — у кожного своя копія стилів. Формально сайт працює. А потім ви міняєте колір заголовка — і правити доводиться в чотирьох файлах. На четвертому хтось забуде.
У цьому виводі — дві різні проблеми. Перша: media.html тягне
власний файл стилів, його треба прибрати. Друга: dash/index.html
лежить на рівень глибше. Для нього шлях style.css означає
dash/style.css, а такого файлу немає. Правильно писати
../style.css. Сторінка відкриється, просто без оформлення.
Зібрали чотири сторінки в один репозиторій. На кожній свій шрифт, своє меню і свій набір кольорів. До захисту 40 хвилин. З чого починати?
На Windows файл Story.HTML відкриється за посиланням
story.html. Помилки не буде. На сервері під Linux це два
різні файли, і посилання дасть 404. Це найчастіша поламка, яку ми бачимо
на цьому уроці з року в рік. Помилку не видно в автора — вона вилазить
тільки після деплою.
team-photo.svg;index.html;%D1%81%D1%82… у посиланні.Тарас поклав у репозиторій файл Comic.html, а в навігації
написав <a href="comic.html">. У себе на Windows він відкрив
сайт — усе працює. Що станеться після деплою?
Репозиторій — не «тека, куди все кидають». Його структура і є домовленістю команди. Коли вона записана, усі знають, де що лежить, і посилання не ламаються.
team-3/story/index.html відкриється за адресою
https://team3.<домен>/story/. Дерево записується
в README.md, щоб домовленість не жила тільки в чиїйсь голові.Це список того, що git ігнорує назавжди. Туди пишуть тимчасові файли редактора, теку з локальними відео, файли з паролями.
Заводять його не заради охайності, а заради безпеки. Пароль, який одного разу потрапив у коміт, лишається в історії репозиторію. Видалити файл уже не досить.
git status: рядок Untracked files
має бути порожній.У репозиторії команди лежать style.css, styles.css
і main.css — усі три робочі, у різних сторінках підключені різні.
Що робити?
Продукт — це коли людина, яка вас не знає, відкриває адресу і за 15 секунд розуміє, що це таке. Набір сторінок — це коли їй доводиться здогадуватися.
Типова головна сторінка командного сайту — це заголовок «Команда 3» і чотири посилання. Без автора поруч такий сайт не зрозуміти.
| Замість цього | Напиши це |
|---|---|
| «Команда 3. Наш проєкт.» | «Ми опитали 62 учні 8–9 класів про те, скільки часу вони проводять у застосунках, і зробили сайт із результатами, історією й коміксом про цифрову звичку.» |
| «Тут наші роботи» | «Чотири розділи: дані опитування, інтерактивна історія, комікс і трейлер, сторінка команди.» |
порожній <title>Document</title> |
<title>Цифрова звичка — проєкт команди 3</title> |
Заголовок вкладки — не дрібниця. Його видно у списку вкладок, у закладках
і в результатах пошуку. Слово Document там означає одне:
сторінку зробили з шаблону й не дочитали.
Мертве посилання веде в нікуди. Це або
<a href="gallery.html"> на сторінку, якої немає,
або href="#", залишене «на потім». Читач читає це
однаково: сайт зламаний.
Тут два різні діагнози. 404 — файлу немає: або його не закомічено,
або ім’я інше. 403 у теці — файли в ній є, але серед них немає
index.html. Показувати список файлів сервер не стане.
curl — це псевдонім
Invoke-WebRequest, і ключі -o -s -w він не розуміє.
Або пиши curl.exe явно, або користуйся рідною командою:
(Invoke-WebRequest -Uri https://team<N>.<домен>/ -Method Head).StatusCode.На team.html — по абзацу на людину. Що робив, який файл
у репозиторії його, чого навчився.
«Допомагав з дизайном» не каже нічого. Пиши так: «зробив
style.css і звів чотири сторінки до одного вигляду».
І далі: «переверстав media.html, щоб на телефоні
не було бічного скролу».
Той самий текст, тільки коротше, дублюється в CONTRIB.md.
Звідти його читає чекер. Він звіряє імена з авторами комітів
у git log. Учасника без жодного коміту видно одразу.
Учитель відкриває головну сторінку команди й бачить заголовок «Наш проєкт» і чотири посилання без жодного речення тексту. Команда каже: «ну ми ж зараз усе розкажемо». Чому це все одно недороблено?
Сайт відкривається в браузері — і здається, що цього досить. Але наступного
року репозиторій візьме інша команда. Або ви самі через півроку.
README.md відповідає на питання, на які код не відповідає.
| Розділ README | Що там пишуть |
|---|---|
| Що це | 2–3 речення про продукт і для кого він |
| Як подивитися | адреса сайту + як відкрити локально
(просто відкрити index.html, чи потрібен сервер) |
| Де що лежить | дерево тек із поясненням, як на схемі вище |
| Чого тут немає | відео й зображення коміксу — локально в учасників, на сайті лише текстовий супровід |
| Хто робив | посилання на CONTRIB.md |
Команда каже: «README нікому не потрібен, сайт же й так відкривається і все видно». Який найсильніший аргумент проти?
Ти дописав сторінку й зробив git push. Через
кілька секунд її бачить будь-хто в інтернеті. Така публікація нової версії
зветься деплоєм. Автоматичний деплой означає, що файли ніхто не копіює руками.
Ти лишаєш у магазині свій номер: «привезуть — набери мені». Дві програми домовляються так само: «станеться подія — постукай ось за цією адресою». Такий домовлений стук зветься вебхуком.
Gitea приймає твій push. Далі бере з налаштувань репозиторію адресу хука
і шле на неї запит POST з описом події. За тією адресою чекає
маленький скрипт. Він робить git pull у теку сайту.
git push працює
без людини. Саме тому опублікована версія завжди дорівнює тому,
що лежить у гілці main.Скрипт на сервері простіший, ніж здається. Головне в ньому — ключ
--ff-only. Він забороняє серверу зливати гілки й розв’язувати
конфлікти. Сервер або бере нову версію цілком, або не робить нічого.
У другому випадку сайт лишається в робочому стані.
git log origin/main. Спрацювання хука — у Gitea:
Settings → Webhooks → Recent Deliveries, там видно код відповіді.
Роботу скрипта — у ~/deploy.log. Результат — у браузері.
Дивитися треба саме в такому порядку.Оксана зробила git push, у Gitea коміт видно, а сайт показує
стару версію навіть після Ctrl+F5. Куди дивитися
першим?
Тисни «Зробити push» і читай журнал очима того, у кого не оновився сайт. У кожному прогоні може трапитися типова помилка. Назви її раніше за вчителя.
Ланцюг проходить чотири ланки. Зелена — ланка відпрацювала, червона — обірвалася саме тут.
Демонстраційний режим: журнал згенеровано на цій сторінці.
Формат рядків і коди відповідей — такі самі, як у справжньому
~/deploy.log і виводі curl.
Локально сторінка відкривається з файлової системи твоєї машини. В інтернеті — з теки на сервері під Linux, з того, що потрапило в git. Це три різні набори правил, і вони розходяться завжди в тих самих місцях.
Сторінку з теки сервера браузеру віддає окрема програма. Вона приймає запит, знаходить потрібний файл і надсилає його назад. Цю програму звуть nginx — на схемі нижче вона остання ланка.
| Локально | На сервері | Симптом |
|---|---|---|
Images/hero.png = images/hero.png |
це два різні шляхи | порожні квадрати замість зображень, 404 у Network |
| відкривається будь-який файл у теці | тека без index.html закрита |
403 на переході в розділ |
| файл існує, бо він на диску | файла немає, бо його немає в git | 404 рівно на одному файлі, решта працює |
file:///C:/Users/…/style.css працює |
такого шляху не існує | сторінка без стилів, «як у 1998 році» |
Звідси одне робоче правило на весь сайт: усі шляхи відносні.
style.css, story/index.html, ../style.css —
так, C:\…, file:///…, /home/oksana/… — ні.
Відносний шлях однаково працює і на твоєму диску, і на сервері.
На головній сторінці команди три власні іконки у форматі SVG. Локально видно всі три, після деплою на їх місці порожні квадрати. Що перевіряєш першим?
Ніна підключила стилі так:
<link rel="stylesheet" href="/home/nina/team-3/style.css">.
Локально в редакторі все гарно, на сайті — гола сторінка без оформлення.
Чому?
П’ятнадцять пунктів у п’яти групах. Відмічай виконане — сторінка рахує відсоток готовності. Окремо вона показує пункти, без яких чекер поки не зарахує роботу, скільки б решти не було зроблено.
check 15,
або типова помилка, на якій команди спотикалися минулими роками.
Чек-ліст не замінює перевірку, він робить її передбачуваною.У коді сторінки лишився рядок
const TOKEN = "a7f3…" — токен доступу до Gitea, який
використовували для тесту. Репозиторій приватний, тому команда каже,
що це не страшно. Хто має рацію?
media.html: як показати те, чого немає на серверіТрейлер і комікс лишаються на машинах учасників. Але сайт має чесно розповідати, що вони існують і що саме в них зроблено — інакше половина роботи модуля просто зникає з продукту.
Сторінка media.html — це текстовий супровід медіа.
Її читають, коли команди немає поруч: наступного року, з телефона, з іншого
міста. Вона має бути зрозумілою сама по собі.
| Блок сторінки | Що в ньому | Звідки береться |
|---|---|---|
| Опис трейлера | 2–3 абзаци: про що, скільки триває, як зроблено | власний текст + av.meta.json з теми 5 |
| Субтитри | повний текст репліками, з таймкодами | trailer.vtt з теми 5 |
| Як зроблено звук | посилання на music.strudel
і sfx.json | тема 5 |
| Комікс | панелі з підписами, бульбашки текстом | comic.json з теми 4 |
| Промпти | посилання на prompts.json
і позначка «зображення згенеровано AI» | тема 4 |
| Де подивитися | чесний рядок: «відео показуємо з екрана, на сервері його немає» | правило модуля |
Файл .vtt уже містить усе потрібне: таймкод і репліку.
Перенести його на сторінку — хвилин десять роботи. Зате текст трейлера
стає видно в пошуку, і його можна прочитати без відео.
На сторінці це стає таблицею з двох колонок: час і репліка. Або списком
<dl>. Головне — щоб це був текст, а не картинка.
Текст знайде пошук. А ще його прочитає вголос програма для незрячих —
її звуть скрінрідером. І цитату з тексту можна скопіювати.
<video src="trailer.mp4"> і
<audio src="music.mp3"> — файлів немає в репозиторії,
тег дасть порожній плеєр і зламану сторінку. Так само не можна вставляти
посилання на файл у своїй домашній теці: воно працює тільки на твоїй машині.Трейлер команди важить 41 МБ. Тарас пропонує «просто закинути його в репозиторій, хай буде — сервер же наш». Що з цим не так і що робити натомість?
Захист — не звіт про витрачений час. Це відповідь на чотири питання: яка була задача, що ви зробили, як воно працює, і що не вийшло. Останнє питання приносить більше балів, ніж здається.
| Що | Звідки показуємо | Чому так |
|---|---|---|
| Сайт команди | браузер, публічна адреса | це і є продукт; локальна копія не рахується |
| Комікс | сторінка comic/ на своєму ноутбуці
з локальними зображеннями | картинки на сервер не заливаються |
| Трейлер | плеєр на своєму ноутбуці, зі звуком | відео на сервер не заливається |
| Внесок кожного | git log --oneline на екрані |
історія комітів — це доказ, а не слова |
Слабка відповідь: «нам не вистачило часу». Сильна звучить так:
«Фільтр галереї працює тільки мишею. З клавіатури він не вмикається.
Ми помітили це вчора, коли пройшли сторінку клавішею Tab.
Переписати не встигли: треба обробляти keydown».
Друга відповідь показує, що команда розуміє свою роботу й бачить її межі. Саме це й оцінюють.
Команда п’ять хвилин показувала код у редакторі, жодного разу не відкривши сайт у браузері. Технічно все правда. Що з таким захистом не так?
Кроки 1—4 робить уся команда разом за одним екраном, далі — кожен у своїй гілці. Галочки зберігаються, сторінку можна закрити.
class9a заміни на свою організацію
(class9a або class9b), team-3 — на номер
своєї команди, team<N>.<домен> — на адресу, яку дав учитель.Чекер відкриває ваш сайт так само, як стороння людина, і читає репозиторій через API Gitea. Він не знає, хто скільки старався, — він бачить коди відповідей і історію комітів. Спроби не обмежені.
Демонстраційний режим: результат згенеровано для показу. На сервері
ця кнопка викликає POST /api/check, який запускає
check 15 для репозиторію і сайту команди.
CONTRIB.md та git log;media.html і показує, де там субтитри
і посилання на prompts.json;Це те, що бачить учитель, коли виставляє оцінку.
| Складник | Вага | Результат |
|---|
style.css
і дослівно однаковий <nav>;main;Comic.html у репозиторії і comic.html у посиланні —
локально працює, на сервері 404;index.html — сервер віддає 403;Document на трьох сторінках із чотирьох;CONTRIB.md є людина, у якої в git log нуль комітів;Усунути зауваження після захисту й довести check 15 до зеленого.
Окремо: дописати в README.md розділ «Що ми зробили б інакше» —
3—5 речень від команди, з конкретикою.
«Краще розподілили б час» — це ні про що. Пиши конкретно: «Домовилися б про імена файлів на першому уроці теми. Три людини назвали головні сторінки розділів по-різному. Ми втратили близько години, поки лагодили посилання».
Тексти помилок git, коди відповідей HTTP і вимоги доступності на цій сторінці — зі стандартів і офіційної документації. Перевіряти дозволено й корисно.
push, де дивитися Recent Deliveries.
docs.gitea.com/usage/webhooksgit-pull — режим --ff-only
і повідомлення Your local changes would be overwritten by merge.
git-scm.com/docs/git-pullgit-status і gitignore —
розділ Untracked files, правила ігнорування.
git-scm.com/docs/gitignoreindex і autoindex:
чому тека без index.html віддає 403.
nginx.org/ngx_http_index_modulestyle.css
відрізняється від /style.css і від file:///….
developer.mozilla.org/What_is_a_URLalt) до зображень.
w3.org/WAI/WCAG22/non-text-contentDocument.
w3.org/WAI/WCAG22/page-titled-o, -s,
-w "%{http_code}", -I.
curl.se/docs/manpage.htmlInvoke-WebRequest: чому в Windows
PowerShell curl означає не те, що в Git Bash.
learn.microsoft.com/invoke-webrequestПовний список із поясненнями, що звідки взято, —
у файлі urok-15-джерела.md поруч із цією сторінкою.