impressum

This commit is contained in:
2026-03-31 15:22:40 +02:00
parent d1eefa81f5
commit 5f606fec6e
2 changed files with 311 additions and 71 deletions

View File

@@ -415,6 +415,36 @@
footer a { color: #ccc; } footer a { color: #ccc; }
footer a:hover { color: #fff; } footer a:hover { color: #fff; }
/* ─── Impressum / Datenschutz ──────────────────────────── */
.legal-section h3 {
font-family: 'Cormorant Garamond', serif;
font-size: 1.4rem;
font-weight: 700;
color: var(--red);
margin: 32px 0 10px;
}
.legal-section h3:first-of-type { margin-top: 0; }
.legal-section p, .legal-section li {
font-size: 16px;
color: #444;
line-height: 1.7;
margin-bottom: 8px;
}
.legal-section ul {
padding-left: 20px;
margin-bottom: 12px;
}
.legal-section a { color: var(--red); text-decoration: underline; }
.legal-section .legal-box {
background: #fff;
border-radius: var(--radius);
border-left: 4px solid var(--red);
padding: 20px 24px;
margin-top: 8px;
}
body.large-font .legal-section p,
body.large-font .legal-section li { font-size: 18px; }
/* ─── Font Size Toggle ──────────────────────────────────── */ /* ─── Font Size Toggle ──────────────────────────────────── */
.font-toggle-wrap { .font-toggle-wrap {
display: flex; display: flex;
@@ -759,6 +789,165 @@ const SCHLIESSZEITEN = [
</div> </div>
</section> </section>
<!-- ─── Impressum ────────────────────────────────────────── -->
<section id="impressum">
<div class="section-inner legal-section">
<h2 class="section-title">Impressum</h2>
<p class="section-sub">Angaben gemäß §5 ECG und §25 MedienG</p>
<h3>Diensteanbieter</h3>
<div class="legal-box">
<p>
<strong>Dr. med. Carina Kautsch</strong><br>
Ärztin für Allgemeinmedizin<br>
Pfenninggeldgasse 1B/3<br>
A-1160 Wien<br>
Österreich
</p>
<p>
Telefon: <a href="tel:+4314931773">+43 / 1 / 493 17 73</a><br>
E-Mail: <a href="mailto:info@meineordi.at">info@meineordi.at</a>
</p>
</div>
<h3>Berufsbezeichnung und Berufsrecht</h3>
<p>
Berufsbezeichnung: <strong>Ärztin für Allgemeinmedizin</strong><br>
Verliehen in: Österreich<br>
Berufsrecht: Ärztegesetz 1998 (ÄrzteG 1998)
<a href="https://www.ris.bka.gv.at" target="_blank" rel="noopener">www.ris.bka.gv.at</a>
</p>
<h3>Aufsichtsbehörde / Kammer</h3>
<p>
Ärztekammer Wien<br>
Weihburggasse 1012, 1010 Wien<br>
<a href="https://www.aekwien.at" target="_blank" rel="noopener">www.aekwien.at</a>
</p>
<h3>Haftungsausschluss</h3>
<p>
Die Inhalte dieser Website wurden mit größtmöglicher Sorgfalt erstellt. Für die Richtigkeit,
Vollständigkeit und Aktualität der Inhalte wird jedoch keine Gewähr übernommen.
Diese Website enthält keine medizinischen Diagnosen oder Therapieempfehlungen.
Im Krankheitsfall wenden Sie sich bitte an eine Ärztin oder einen Arzt.
</p>
<h3>Urheberrecht</h3>
<p>
Die durch den Seitenbetreiber erstellten Inhalte und Werke auf dieser Website unterliegen
dem österreichischen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und
jede Art der Verwertung außerhalb der Grenzen des Urheberrechts bedürfen der schriftlichen
Zustimmung des jeweiligen Autors bzw. Erstellers.
</p>
</div>
</section>
<!-- ─── Datenschutz ───────────────────────────────────────── -->
<section id="datenschutz" class="alt">
<div class="section-inner legal-section">
<h2 class="section-title">Datenschutzerklärung</h2>
<p class="section-sub">Gemäß DSGVO (EU 2016/679) und DSG 2018</p>
<h3>Verantwortlicher</h3>
<div class="legal-box">
<p>
<strong>Dr. med. Carina Kautsch</strong><br>
Pfenninggeldgasse 1B/3, A-1160 Wien<br>
E-Mail: <a href="mailto:info@meineordi.at">info@meineordi.at</a><br>
Telefon: <a href="tel:+4314931773">+43 / 1 / 493 17 73</a>
</p>
</div>
<h3>Allgemeines zur Datenverarbeitung</h3>
<p>
Wir nehmen den Schutz Ihrer persönlichen Daten sehr ernst. Diese Website erhebt und
verarbeitet personenbezogene Daten nur im technisch notwendigen Umfang und ausschließlich
auf Basis der geltenden Rechtsvorschriften (DSGVO, DSG 2018).
</p>
<h3>Server-Logfiles</h3>
<p>
Beim Aufruf dieser Website werden durch den Webserver automatisch folgende Daten
in sogenannten Server-Logfiles gespeichert:
</p>
<ul>
<li>IP-Adresse des anfragenden Geräts</li>
<li>Datum und Uhrzeit des Zugriffs</li>
<li>Name und URL der abgerufenen Datei</li>
<li>Browsertyp und -version, Betriebssystem</li>
<li>Referrer-URL (zuvor besuchte Seite)</li>
</ul>
<p>
<strong>Rechtsgrundlage:</strong> Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse
an der Sicherheit und dem ordnungsgemäßen Betrieb der Website).<br>
<strong>Speicherdauer:</strong> Die Logfiles werden nach spätestens 30 Tagen gelöscht.
</p>
<h3>Kontaktaufnahme</h3>
<p>
Wenn Sie uns per Telefon oder E-Mail kontaktieren, werden Ihre übermittelten Daten
(Name, E-Mail-Adresse, Inhalt Ihrer Anfrage) zum Zweck der Bearbeitung Ihrer Anfrage
und für den Fall von Anschlussfragen gespeichert.<br>
<strong>Rechtsgrundlage:</strong> Art. 6 Abs. 1 lit. b DSGVO (Vertragsanbahnung bzw.
berechtigtes Interesse). Die Daten werden nach abschließender Bearbeitung gelöscht,
sofern keine gesetzliche Aufbewahrungspflicht besteht.
</p>
<h3>Google Maps</h3>
<p>
Diese Website verwendet Google Maps zur Darstellung einer interaktiven Karte.
Anbieter ist Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland.<br>
Bei Nutzung von Google Maps werden Daten (insbesondere Ihre IP-Adresse) an Google-Server
übertragen, die sich in den USA befinden können. Google ist unter dem EU-US Data Privacy
Framework zertifiziert.<br>
<strong>Rechtsgrundlage:</strong> Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse
an einer benutzerfreundlichen Standortdarstellung).<br>
Weitere Informationen finden Sie in der Datenschutzerklärung von Google:
<a href="https://policies.google.com/privacy" target="_blank" rel="noopener">policies.google.com/privacy</a>
</p>
<h3>Lokaler Speicher (localStorage)</h3>
<p>
Diese Website speichert Ihre Schriftgrößen-Einstellung (normal/groß) im lokalen Speicher
(localStorage) Ihres Browsers. Dabei werden keine personenbezogenen Daten erfasst oder
an Server übertragen. Der Eintrag kann jederzeit über die Browser-Einstellungen gelöscht
werden. Es werden keine Cookies gesetzt.
</p>
<h3>Ihre Rechte</h3>
<p>Sie haben gemäß DSGVO folgende Rechte:</p>
<ul>
<li><strong>Auskunft</strong> (Art. 15 DSGVO) — Recht auf Auskunft über Ihre gespeicherten Daten</li>
<li><strong>Berichtigung</strong> (Art. 16 DSGVO) — Recht auf Korrektur unrichtiger Daten</li>
<li><strong>Löschung</strong> (Art. 17 DSGVO) — Recht auf Löschung Ihrer Daten</li>
<li><strong>Einschränkung</strong> (Art. 18 DSGVO) — Recht auf Einschränkung der Verarbeitung</li>
<li><strong>Widerspruch</strong> (Art. 21 DSGVO) — Recht auf Widerspruch gegen die Verarbeitung</li>
<li><strong>Datenübertragbarkeit</strong> (Art. 20 DSGVO) — Recht auf Erhalt Ihrer Daten in maschinenlesbarem Format</li>
</ul>
<p>
Zur Ausübung Ihrer Rechte wenden Sie sich bitte an:
<a href="mailto:info@meineordi.at">info@meineordi.at</a>
</p>
<h3>Beschwerderecht bei der Aufsichtsbehörde</h3>
<p>
Sie haben das Recht, eine Beschwerde bei der österreichischen Datenschutzbehörde einzureichen:<br>
<strong>Datenschutzbehörde</strong><br>
Barichgasse 4042, 1030 Wien<br>
Telefon: +43 1 52 152-0<br>
E-Mail: <a href="mailto:dsb@dsb.gv.at">dsb@dsb.gv.at</a><br>
<a href="https://www.dsb.gv.at" target="_blank" rel="noopener">www.dsb.gv.at</a>
</p>
<h3>Aktualität dieser Datenschutzerklärung</h3>
<p>
Diese Datenschutzerklärung ist aktuell gültig und hat den Stand März 2025.
Durch die Weiterentwicklung unserer Website kann eine Anpassung notwendig werden.
</p>
</div>
</section>
<!-- ─── Footer ────────────────────────────────────────────── --> <!-- ─── Footer ────────────────────────────────────────────── -->
<footer> <footer>
<div class="footer-inner"> <div class="footer-inner">

View File

@@ -3,8 +3,9 @@
## Overview ## Overview
Complete static HTML redesign of the medical practice website for **Dr. med. Carina Kautsch**, Ärztin für Allgemeinmedizin, replacing a Joomla 3 CMS with a single self-contained `index.html` file served via nginx in Docker. Complete static HTML redesign of the medical practice website for **Dr. med. Carina Kautsch**, Ärztin für Allgemeinmedizin, replacing a Joomla 3 CMS with a single self-contained `index.html` file served via nginx in Docker.
**Live site (old):** https://meineordi.at/ **Live site (old):** https://meineordi.at/
**Logo URL:** https://meineordi.at/images/meineordi/logo.png **New site (staging):** https://new.meineordi.at/
**Git repository:** https://git.stranto.com/cgasser/web_meineordi
--- ---
@@ -30,34 +31,117 @@ Complete static HTML redesign of the medical practice website for **Dr. med. Car
--- ---
## Current Deliverable ## Infrastructure
### File: `index.html` ### Server Stack
A single fully self-contained HTML file. No framework, no build step, no CMS. | Component | Details |
|---|---|
| Docker host | existing server |
| Reverse proxy | Nginx Proxy Manager |
| Docker network | `nginx_internal_network` (external, shared with NPM) |
| Container manager | Portainer |
| Git server | Gitea at `https://git.stranto.com` (Docker, stack name: `gitea`) |
### Gitea Setup
- Stack deployed in Portainer, name: `gitea`
- Data volume: `gitea-data`
- Web UI port: `3000` (internal only, routed via NPM)
- SSH git port: `222`
- NPM proxy host: `git.stranto.com` → container `gitea`, port `3000`, SSL/HTTPS
- ROOT_URL: `https://git.stranto.com`
- Database: SQLite (built-in, no separate DB container)
- Gitea stack file: `gitea-stack.yml` in this repo
### meineordi Website Container
- Stack deployed in Portainer from **Git repository source**
- Repository: `https://git.stranto.com/cgasser/web_meineordi`
- Branch: `master`
- Compose path: `docker-compose.yml`
- Portainer authenticates with a Gitea access token (scope: repository)
- Container name: `meineordi-web`
- Port: `8094:80` (also accessible via NPM at `new.meineordi.at`)
- NPM proxy host: `new.meineordi.at` → container `meineordi-web`, port `80`, SSL/HTTPS
---
## Repository File Structure
```
web_meineordi/
├── index.html # Full website — single self-contained file
├── logo.png # Practice logo (copied into Docker image)
├── favicon.svg # SVG favicon (red circle + white cross, #C8102E)
├── Dockerfile # nginx:alpine, copies index.html + logo.png + favicon.svg
├── docker-compose.yml # Portainer stack definition, builds from Dockerfile
├── gitea-stack.yml # Gitea server stack (deploy separately in Portainer)
└── meineordi-project-summary.md # This file
```
### Dockerfile
```dockerfile
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
COPY logo.png /usr/share/nginx/html/logo.png
COPY favicon.svg /usr/share/nginx/html/favicon.svg
```
### docker-compose.yml
```yaml
services:
meineordi-web:
build: .
container_name: meineordi-web
restart: unless-stopped
ports:
- "8094:80"
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost/"]
interval: 30s
timeout: 5s
retries: 3
networks:
nginx_internal_network: {}
networks:
nginx_internal_network:
external: true
```
---
## index.html — Sections & Features
**Sections (top to bottom):** **Sections (top to bottom):**
1. Sticky header with logo + nav links + phone button 1. Sticky header logo + nav links + font size toggle (A / A+) + phone button
2. Hero — logo image large on right, headline + CTA buttons left, 4 quick-info cards below 2. Hero — logo (float animation) + headline + CTA buttons + 4 quick-info cards (address, phone, email, today's hours)
3. Öffnungszeiten — 2-column grid of hour boxes with shadows 3. Öffnungszeiten — 2-column card grid with red border, hover lift effect
4. Schließzeiten — dynamically rendered from JS array (see below) 4. Schließzeiten — dynamically rendered from JS array (see below)
5. Leistungen — 6-item service grid with emoji icons 5. Leistungen — 6-item service grid with emoji icons
6. Aktuelles — 3 notice items (prescriptions, diabetes supplies, sick notes) 6. Aktuelles — 3 notice cards (prescriptions, diabetes supplies, sick notes)
7. Kontakt & Standort — contact rows + embedded OpenStreetMap iframe 7. Kontakt & Standort — contact rows + embedded Google Maps iframe
8. Footer with logo 8. Footer — logo + copyright + Impressum/Datenschutz links (pages not yet built)
### Design Decisions ### Design
- **Fonts:** Cormorant Garamond (headings/serif) + DM Sans (body), loaded from Google Fonts | Property | Value |
- **Primary color:** `#C8102E` (red from meineOrdi logo) — fixed, not auto-extracted |---|---|
- **Background:** Pure white `#ffffff`, alt-sections `#f7f7f7` | Fonts | Cormorant Garamond (headings) + DM Sans (body), Google Fonts |
- **Base font size:** 18px (deliberately larger for older patients) | Primary color | `#C8102E` (red from logo) |
- **Opening hours boxes:** white cards with strong drop shadow (`box-shadow: 0 6px 28px rgba(0,0,0,.14)`) and subtle red border, hover lift effect | Background | `#ffffff`, alt sections `#f7f7f7` |
- **Logo:** displayed in navbar (42px height), large in hero section (280px, float animation), subtle watermark behind hero, inverted white in footer | Base font size | 18px normal / 22px large mode |
- **Map:** OpenStreetMap embed — no Google API key required | Border radius | 12px |
- **Mobile:** Fully responsive, hamburger menu below 768px, logo shifts above text on mobile | Map | Google Maps iframe embed (no API key required) |
- **Animations:** CSS `fadeUp` on hero elements, `floatLogo` on hero logo | Mobile | Fully responsive, hamburger menu below 768px |
| Animations | `fadeUp` on hero elements, `floatLogo` on hero logo |
| Favicon | `favicon.svg` — red circle with white medical cross |
### Closure/Holiday Management (no CMS needed) ### Accessibility — Font Size Toggle
At the very top of `<body>` is a clearly commented JavaScript array: - **A** / **A+** buttons in navbar and mobile menu
- Switches base font between 18px (normal) and 22px (large)
- Active button highlighted in red
- Preference saved in `localStorage` — persists across visits
### Closure/Holiday Management
At the very top of `<body>` is a clearly commented JavaScript array — **the only place that needs editing** to manage holidays:
```js ```js
const SCHLIESSZEITEN = [ const SCHLIESSZEITEN = [
@@ -69,65 +153,32 @@ const SCHLIESSZEITEN = [
deputyPhone: "01 / 406 31 04", deputyPhone: "01 / 406 31 04",
deputyHours: "Mo & Mi 812 Uhr · Di & Do 1418 Uhr · Fr 1216 Uhr" deputyHours: "Mo & Mi 812 Uhr · Di & Do 1418 Uhr · Fr 1216 Uhr"
}, },
// ... more entries // add more entries here...
]; ];
``` ```
The `renderClosures()` function at the bottom of the script reads this array and builds the closure cards dynamically. Empty array → "Keine Schließzeiten" message shown automatically. This is the ONLY place that needs editing to manage holidays. Empty array → "Keine Schließzeiten" message shown automatically.
--- ---
## Docker Setup ## Everyday Update Workflow
### Files
``` ```
meineordi-docker.tar.gz 1. Edit index.html locally (e.g. update SCHLIESSZEITEN array)
├── Dockerfile 2. Right-click folder → TortoiseGit → Git Commit → master
├── index.html 3. Enter commit message → Commit & Push
└── docker-compose.yml 4. Portainer → Stacks → meineordi → Pull and redeploy
``` ```
### Dockerfile Git client used locally: **TortoiseGit** (Windows Explorer integration)
```dockerfile
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
```
### docker-compose.yml
```yaml
services:
meineordi-web:
image: meineordi-web:latest
container_name: meineordi-web
restart: unless-stopped
ports:
- "8080:80"
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost/"]
interval: 30s
timeout: 5s
retries: 3
```
### Build & Deploy
```bash
# Build image (must be done on the Docker host)
docker build -t meineordi-web:latest .
# Deploy via Portainer → Stacks → Add stack → paste docker-compose.yml
# OR run directly:
docker compose up -d
```
**Note:** The image must be built locally on the Docker host (or pushed to a registry) before Portainer can use it. The compose file references `meineordi-web:latest` as a pre-built local image, not a registry image.
--- ---
## Possible Next Steps / Open Items ## Open Items / Next Steps
- **Reverse proxy integration** — The compose file currently exposes port 8080 directly. If the server uses Nginx Proxy Manager, Traefik, or Caddy, the `ports:` mapping should be replaced with a shared Docker network and proxy labels/config. - [ ] **Impressum**required by Austrian law (ECG). Needs: company name, address, responsible person, UID if applicable.
- **Registry/CI** — For easier updates, the image could be pushed to a private registry (e.g. Gitea with built-in registry, or Docker Hub) so Portainer can pull updates without SSH access. - [ ] **Datenschutzerklärung**required by DSGVO. Google Maps embed requires a note in the privacy policy.
- **HTTPS / domain** — Point `meineordi.at` DNS to the new server and configure SSL termination at the reverse proxy level. - [ ] **Switch main domain**point `meineordi.at` DNS to the new server and configure NPM proxy host once staging (`new.meineordi.at`) is approved.
- **Logo CORS** — The logo is loaded cross-origin from `meineordi.at`. Once the site is self-hosted, copy `logo.png` into the Docker image alongside `index.html` and reference it as `/logo.png` to avoid any cross-origin issues and eliminate the external dependency. - [ ] **Portainer auto-redeploy** — configure Gitea webhook → Portainer webhook URL so pushes trigger automatic redeployment without manual "Pull and redeploy".
- **Content updates** — All content (hours, notices, services) is hardcoded in `index.html`. If more frequent edits are needed, consider a simple JSON config file mounted as a Docker volume, or a minimal admin UI built on top. - [ ] **Content review**all text (Leistungen, Aktuelles) is placeholder-quality; Dr. Kautsch should review and approve final wording.
- **Imprint / Datenschutz** — Austrian law (ECG / DSGVO) requires an Impressum and Datenschutzerklärung. These pages don't exist yet. - [ ] **Google Maps**currently using a no-API-key embed URL. If Google blocks it, switch to official Maps Embed API with a key.