diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..72d4be0 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,32 @@ +name: CI + +# Build-Check für Pull Requests. Deployt niemals – das übernimmt +# ausschließlich deploy-pages.yml bei Push auf main oder manuellem Start. +on: + pull_request: + branches: [main] + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Type/Astro check + run: npm run check + + - name: Build + run: npm run build diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml new file mode 100644 index 0000000..a4da792 --- /dev/null +++ b/.github/workflows/deploy-pages.yml @@ -0,0 +1,62 @@ +name: Deploy to GitHub Pages + +on: + push: + branches: [main] + workflow_dispatch: + +# Workflow-weit nur Leserechte. Die für das OIDC-basierte Pages-Deployment +# nötigen Schreibrechte (pages/id-token) sind ausschließlich dem deploy-Job +# zugeordnet, damit der build-Job sie nicht erbt. +permissions: + contents: read + +# Nur ein Pages-Deployment gleichzeitig; laufende Deployments nicht abbrechen. +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Type/Astro check + run: npm run check + + - name: Build + run: npm run build + + - name: Configure Pages + uses: actions/configure-pages@v5 + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v4 + with: + path: ./dist + + deploy: + needs: build + runs-on: ubuntu-latest + # Nur der Deploy-Job erhält die für actions/deploy-pages nötigen Rechte. + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/README.md b/README.md index 423f300..90ba235 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # blitztextweb -Statische Produktwebsite für [Blitztext Linux](https://github.com/TimInTech/blitztext-linux) – -vorgesehen für die Domain `https://blitztext.timintech.de`. +Statische Produktwebsite für [Blitztext Linux](https://github.com/TimInTech/blitztext-linux), +veröffentlicht über GitHub Pages unter `https://timintech.github.io/blitztextweb/`. Dieses Repository enthält **ausschließlich die Website**. Die Desktop-App lebt im getrennten Repository [TimInTech/blitztext-linux](https://github.com/TimInTech/blitztext-linux). @@ -29,19 +29,22 @@ npm run build # Produktionsbuild → dist/ npm run preview # gebauten Stand lokal ansehen ``` -Der Produktionsbuild landet im Ordner **`dist/`** und ist für das Hosting am -Domain-Root (`/`) gebaut. +Der Produktionsbuild landet im Ordner **`dist/`** und ist für die Auslieferung +unter dem GitHub-Pages-Unterpfad **`/blitztextweb/`** gebaut +(`base: '/blitztextweb'` in `astro.config.mjs`). ## Seiten +Alle Routen werden unter dem Unterpfad `/blitztextweb/` ausgeliefert. + | Route | Inhalt | | :--- | :--- | -| `/` | Deutsche Startseite | -| `/en/` | Englische Startseite | -| `/impressum/` | Impressum (Vorlage mit markierten Platzhaltern) | -| `/datenschutz/` | Datenschutzerklärung (Deutsch) | -| `/en/privacy/` | Datenschutzerklärung (Englisch) | -| `/404.html` | Fehlerseite | +| `/blitztextweb/` | Deutsche Startseite | +| `/blitztextweb/en/` | Englische Startseite | +| `/blitztextweb/impressum/` | Impressum (Vorlage mit markierten Platzhaltern) | +| `/blitztextweb/datenschutz/` | Datenschutzerklärung (Deutsch) | +| `/blitztextweb/en/privacy/` | Datenschutzerklärung (Englisch) | +| `/blitztextweb/404.html` | Fehlerseite | ## Herkunft der Blitztext-Assets @@ -54,9 +57,28 @@ App-Repository [TimInTech/blitztext-linux](https://github.com/TimInTech/blitztex - `public/screenshots/` ← `docs/screenshots/linux/` (Dateinamen für das Web vereinheitlicht) - `public/images/og-*.png` ← `docs/screenshots/linux/Banner-{de,en}.png` +## Deployment + +Gehostet wird **ausschließlich über GitHub Pages** (Project Page) unter: + +`https://timintech.github.io/blitztextweb/` + +Es wird **keine Custom Domain** verwendet – es gibt keine `CNAME`-Datei und +keine DNS-Konfiguration. + +- Deployment über GitHub Actions, Workflow `.github/workflows/deploy-pages.yml` + (Trigger: Push auf `main` oder manueller `workflow_dispatch`). Der + Produktionsbuild in **`dist/`** wird als Pages-Artefakt veröffentlicht. +- Pull Requests werden nur von `.github/workflows/ci.yml` geprüft (Build ohne + Deploy) und deployen niemals. +- Die Schreibrechte `pages: write` / `id-token: write` gelten ausschließlich für + den Deploy-Job; Build und Workflow-Ebene laufen mit `contents: read`. +- Die eigentliche **Aktivierung von GitHub Pages** (Settings → Pages → Source: + *GitHub Actions*) erfolgt manuell und ist nicht Teil dieses Repos. + ## Noch offen vor dem öffentlichen Deployment -- **Rechtliche Angaben:** Impressum und Datenschutzerklärung enthalten deutlich - markierte `[PLATZHALTER]` (Betreiber, Anschrift, Kontakt, Hosting-Anbieter/Logdaten). - Diese müssen vor der Veröffentlichung ausgefüllt werden. -- **Deployment und DNS** waren nicht Bestandteil des Erstellungsauftrags dieser Website. +- **Rechtliche Angaben:** Das Impressum enthält deutlich markierte + `[PLATZHALTER]` (Betreiber, Anschrift, Kontakt). Diese sind rechtlich + erforderlich (u. a. § 5 DDG) und müssen vom Betreiber ausgefüllt werden, bevor + GitHub Pages öffentlich aktiviert wird. diff --git a/astro.config.mjs b/astro.config.mjs index 97822b8..a8183e0 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -2,8 +2,11 @@ import { defineConfig } from 'astro/config'; import sitemap from '@astrojs/sitemap'; // https://astro.build/config +// Auslieferung als GitHub-Pages-Project-Page unter +// https://timintech.github.io/blitztextweb/ (Unterpfad, kein Domain-Root). export default defineConfig({ - site: 'https://blitztext.timintech.de', + site: 'https://timintech.github.io', + base: '/blitztextweb', output: 'static', trailingSlash: 'ignore', integrations: [ @@ -13,7 +16,7 @@ export default defineConfig({ }), ], build: { - // saubere /pfad/index.html-Ausgabe für statisches Hosting am Domain-Root + // saubere /pfad/index.html-Ausgabe für statisches Hosting format: 'directory', }, }); diff --git a/package.json b/package.json index f23dfc0..621528f 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "blitztextweb", "version": "1.0.0", "private": true, - "description": "Static product website for Blitztext Linux (blitztext.timintech.de)", + "description": "Static product website for Blitztext Linux (https://timintech.github.io/blitztextweb/)", "type": "module", "scripts": { "dev": "astro dev", diff --git a/public/robots.txt b/public/robots.txt index 9e1b555..2239798 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,4 +1,4 @@ User-agent: * Allow: / -Sitemap: https://blitztext.timintech.de/sitemap-index.xml +Sitemap: https://timintech.github.io/blitztextweb/sitemap-index.xml diff --git a/src/components/Footer.astro b/src/components/Footer.astro index 7467068..afec75b 100644 --- a/src/components/Footer.astro +++ b/src/components/Footer.astro @@ -2,14 +2,17 @@ import type { Dict } from '../i18n'; import { langPrefix, type Lang } from '../i18n'; import { product } from '../data/product'; +import { withBase } from '../utils/base'; interface Props { dict: Dict; } const { dict } = Astro.props; -const home = `${langPrefix(dict.lang as Lang)}/`; -const privacyUrl = dict.lang === 'de' ? '/datenschutz/' : '/en/privacy/'; +const home = withBase(`${langPrefix(dict.lang as Lang)}/`); +const privacyUrl = withBase(dict.lang === 'de' ? '/datenschutz/' : '/en/privacy/'); +const imprintUrl = withBase('/impressum/'); +const otherLangUrl = withBase(dict.otherLangUrl); const year = new Date().getFullYear(); --- @@ -18,7 +21,7 @@ const year = new Date().getFullYear();
{dict.notFound.text}
Page not found – the requested page does not exist or has been moved.
diff --git a/src/pages/datenschutz.astro b/src/pages/datenschutz.astro index 8ce04a1..b3fb8ff 100644 --- a/src/pages/datenschutz.astro +++ b/src/pages/datenschutz.astro @@ -1,6 +1,7 @@ --- import Base from '../layouts/Base.astro'; import { dicts } from '../i18n'; +import { withBase } from '../utils/base'; const dict = dicts.de; const title = 'Datenschutzerklärung – Blitztext Linux'; @@ -21,8 +22,8 @@ const description =Diese Erklärung gilt ausschließlich für die Website - blitztext.timintech.de. Sie beschreibt den tatsächlichen - technischen Stand dieser statischen Seite. + timintech.github.io/blitztextweb. Sie beschreibt den + tatsächlichen technischen Stand dieser statischen Seite.
- Beim Aufruf der Website verarbeitet der Hosting-Anbieter technisch bedingt - Verbindungsdaten (z. B. IP-Adresse, Zeitpunkt des Abrufs, angeforderte Datei, - User-Agent), soweit dies für die Auslieferung der Seite und die Gewährleistung der - Systemsicherheit erforderlich ist (Art. 6 Abs. 1 lit. f DSGVO). + Diese Website wird über GitHub Pages ausgeliefert, einen Dienst der + GitHub, Inc. (88 Colin P. Kelly Jr. Street, + San Francisco, CA 94107, USA). Beim Aufruf der Website verarbeitet GitHub als + Hosting-Anbieter technisch bedingt Verbindungsdaten (z. B. IP-Adresse, Zeitpunkt + des Abrufs, angeforderte Datei, User-Agent), soweit dies für die Auslieferung der Seite + und die Gewährleistung der Systemsicherheit erforderlich ist + (Art. 6 Abs. 1 lit. f DSGVO). +
++ Einzelheiten zur Datenverarbeitung durch GitHub regelt die + GitHub-Datenschutzerklärung; + Hinweise speziell zu GitHub Pages enthält die + GitHub-Pages-Dokumentation. + Zu Speicherdauer und etwaigen vertraglichen Grundlagen gelten ausschließlich die dort + von GitHub veröffentlichten Angaben.
-
- ⚠ Platzhalter: [PLATZHALTER: Hosting-Anbieter, Speicherdauer
- der Server-Logs und ggf. Auftragsverarbeitungsvertrag] – diese Angaben hängen
- vom später gewählten Hoster ab und müssen vor dem öffentlichen Deployment ergänzt
- werden.
-
@@ -80,7 +84,7 @@ const description = Nach der DSGVO stehen dir gegenüber dem Verantwortlichen u. a. Rechte auf Auskunft, Berichtigung, Löschung und Einschränkung der Verarbeitung zu, sowie ein Beschwerderecht bei einer Aufsichtsbehörde. Der Verantwortliche ist im - Impressum benannt. + Impressum benannt.
diff --git a/src/pages/en/privacy.astro b/src/pages/en/privacy.astro index c2aee1b..44929b2 100644 --- a/src/pages/en/privacy.astro +++ b/src/pages/en/privacy.astro @@ -1,6 +1,7 @@ --- import Base from '../../layouts/Base.astro'; import { dicts } from '../../i18n'; +import { withBase } from '../../utils/base'; const dict = dicts.en; const title = 'Privacy Policy – Blitztext Linux'; @@ -21,8 +22,8 @@ const description =This policy applies exclusively to the website - blitztext.timintech.de. It describes the actual technical state - of this static site. + timintech.github.io/blitztextweb. It describes the actual technical + state of this static site.
- When you visit the website, the hosting provider technically processes connection - data (e.g. IP address, time of access, requested file, user agent) to the extent - required to deliver the page and ensure system security - (Art. 6(1)(f) GDPR). + This website is served via GitHub Pages, a service provided by + GitHub, Inc. (88 Colin P. Kelly Jr. Street, + San Francisco, CA 94107, USA). When you visit the website, GitHub as the + hosting provider technically processes connection data (e.g. IP address, time of + access, requested file, user agent) to the extent required to deliver the page and + ensure system security (Art. 6(1)(f) GDPR). +
++ Details on GitHub's data processing are set out in the + GitHub Privacy Statement; + information specific to GitHub Pages is provided in the + GitHub Pages documentation. + Only the information published there by GitHub applies to retention periods and any + contractual basis.
-
- ⚠ Placeholder: [PLACEHOLDER: hosting provider, server log
- retention period, and data processing agreement if applicable] – these
- details depend on the hosting provider chosen later and must be completed before
- the public deployment.
-
@@ -78,7 +81,7 @@ const description = Under the GDPR you have, among others, the rights to access, rectification, erasure, and restriction of processing, as well as the right to lodge a complaint with a supervisory authority. The controller is named in the - imprint (German). + imprint (German).
diff --git a/src/utils/base.ts b/src/utils/base.ts new file mode 100644 index 0000000..151ba68 --- /dev/null +++ b/src/utils/base.ts @@ -0,0 +1,16 @@ +/** + * Zentrale Base-URL-Behandlung für die Auslieferung als GitHub-Pages- + * Project-Page unter einem Unterpfad (z. B. `/blitztextweb/`). + * + * `import.meta.env.BASE_URL` wird von Astro aus `base` in `astro.config.mjs` + * abgeleitet (hier `/blitztextweb/`). Ohne konfiguriertes `base` ist der Wert + * `/`, sodass sich `withBase` neutral verhält (Auslieferung am Domain-Root). + */ + +/** Präfixiert einen absoluten internen Pfad mit der konfigurierten Base-URL. */ +export function withBase(path: string): string { + // Externe URLs, Anker und relative Pfade bleiben unverändert. + if (!path.startsWith('/')) return path; + const base = import.meta.env.BASE_URL.replace(/\/$/, ''); + return `${base}${path}`; +}