Skip to content

Commit c9b5da1

Browse files
authored
Add ADR: GitHub Pages hosting decision (#50)
## Sammanfattning Dokumenterar arkitektoniska beslutet att använda GitHub Pages som primär hosting-lösning för den genererade HTML-webbplatsen. ## Vad har ändrats - ✨ Ny ADR-005: GitHub Pages som hosting för webbplatsen - 📝 Uppdaterad ADR README med länk till nya ADR:en ## Motivering GitHub Pages valdes som hosting-lösning för att det är: - **Helt gratis** för publika repositories - **Enkelt** med seamless integration i befintlig GitHub-baserad workflow - **Automatiskt** deployment via GitHub Actions (redan konfigurerat) - **Funktionellt** med inbyggd CDN, HTTPS och URL-rewrites ## Alternativ som övervägdes ADR:en dokumenterar fem olika alternativ: 1. **Cloudflare R2** - Billigt men URL-rewrites fungerar inte utan Workers 2. **Cloudflare R2 + Workers** - Fungerar men kostar $5/månad 3. **Docker Container** - Flexibelt men kräver hosting och mer komplexitet 4. **Traditionell hosting** - Kostnad och underhåll 5. **Netlify/Vercel** - Ingen fördel för vårt användningsfall ## Migration Eftersom det bara är statiska HTML-filer är migration till annan plattform trivial (< 1 timme). Cloudflare R2 finns redan som backup-lösning. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
1 parent 2ebc746 commit c9b5da1

2 files changed

Lines changed: 257 additions & 1 deletion

File tree

Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,255 @@
1+
# ADR-005: GitHub Pages som hosting för webbplatsen
2+
3+
## Status
4+
5+
Accepterad
6+
7+
## Kontext och problembeskrivning
8+
9+
För att publicera de genererade HTML-filerna av SFS-författningar behövde vi välja en hosting-lösning. Projektet genererar statiska HTML-filer som behöver vara publikt tillgängliga på webben.
10+
11+
Huvudalternativen var:
12+
13+
1. **GitHub Pages**: Hosting direkt via GitHub
14+
2. **Cloudflare R2**: Object storage med HTTP-access
15+
3. **Cloudflare R2 + Workers**: Object storage med serverless rewrites
16+
4. **Docker Container**: Containeriserad webserver (nginx/Apache)
17+
5. **Amazon CloudFront + S3**: CDN med S3 object storage
18+
6. **Traditionell hosting**: VPS eller shared hosting
19+
20+
Utmaningarna var:
21+
22+
- **Kostnad**: Projektet har ingen budget för hosting
23+
- **Enkelhet**: Lösningen ska vara enkel att sätta upp och underhålla
24+
- **Integration**: Bör fungera smidigt med befintlig GitHub-baserad workflow
25+
- **Suveränitet**: Beroende av externa tjänster
26+
- **URL-hantering**: Behov av att `selex.se/folder/` automatiskt servar `index.html`
27+
- **Migrering**: Möjlighet att flytta till annan lösning om behov uppstår
28+
29+
## Beslut
30+
31+
Vi använder **GitHub Pages** som primär hosting-lösning för den genererade HTML-webbplatsen.
32+
33+
### Arkitektur
34+
35+
```text
36+
GitHub Actions Workflow
37+
38+
Genererar HTML-filer (alt. ladda ner från R2)
39+
40+
Skapar Pages artifact
41+
42+
Deploy till GitHub Pages
43+
44+
Publik webbplats (https://selex.se)
45+
```
46+
47+
### Backup-lösning
48+
49+
Cloudflare R2 används som backup och alternativ hosting:
50+
51+
- HTML-filer synkas även till R2 bucket
52+
- Kan aktiveras som fallback vid problem med GitHub Pages
53+
- Begränsning: Kräver Cloudflare Workers för fullständig funktionalitet (rewrites)
54+
55+
## Konsekvenser
56+
57+
### Positiva
58+
59+
- **Helt gratis**: GitHub Pages är kostnadsfritt för publika repositories
60+
- **Enkel integration**: Seamless integration med GitHub-baserad workflow
61+
- Same platform som source code, issues, och pull requests
62+
- Automatisk deployment via GitHub Actions (redan konfigurerat)
63+
- Inget behov av externa credentials eller API-nycklar
64+
- **Ingen infrastruktur**: Ingen server att underhålla eller uppdatera
65+
- **Inbyggd CDN**: GitHub Pages använder CDN för snabb leverans globalt
66+
- **HTTPS automatiskt**: SSL/TLS-certifikat hanteras automatiskt
67+
- **URL-rewrites fungerar**: `selex.se/1999/1/` servar automatiskt `index.html`
68+
- **Custom domain-stöd**: Möjlighet att använda egen domän
69+
- **Artifact-baserad deployment**: Använder GitHub Actions artifacts för deployment
70+
- **Enkel att förstå**: Lågtröskel för bidragsgivare att förstå deployment
71+
72+
### Negativa
73+
74+
- **Suveränitetsberoende**: Projektet är beroende av GitHubs tillgänglighet och villkor
75+
- Mitigering: GitHub är en stabil plattform med hög uptime
76+
- Mitigering: Enkel migrering (se nedan)
77+
78+
- **Begränsad kontroll**: Mindre flexibilitet än egen hosting
79+
- Kan inte köra server-side logic
80+
- Begränsade HTTP-headers och caching-policies
81+
- Mitigering: Statiska HTML-filer kräver inte server-side logic
82+
83+
- **GitHub-specifikt**: Lösningen är kopplad till GitHub som plattform
84+
- Mitigering: Projektet använder redan GitHub för allt annat
85+
- Mitigering: Automatiserad deployment gör migrering enkel
86+
87+
### Migrering är enkel
88+
89+
Eftersom vi bara publicerar statiska HTML-filer är migrering trivial:
90+
91+
- Generera HTML-filer via workflow eller lokalt
92+
- Ladda upp till ny hosting-lösning
93+
- Uppdatera DNS (om custom domain används)
94+
- Cloudflare R2 backup finns redan som färdig alternativ lösning
95+
96+
Migreringstid: < 1 timme
97+
98+
## Alternativ som övervägdes
99+
100+
### 1. Cloudflare R2 (utan Workers)
101+
102+
**Fördelar**:
103+
104+
- Extremt billig storage (~$0.015/GB/månad)
105+
- Ingen vendor lock-in till GitHub
106+
- Egen kontroll över filer
107+
- Redan implementerad som backup-lösning
108+
109+
**Varför inte valt som primär lösning**:
110+
111+
- **URL-rewrites fungerar inte**: `/folder/` servar inte automatiskt `index.html`
112+
- Problem: Användare måste besöka `/folder/index.html` explicit
113+
- Problemet gäller även för root: `selex.se/` fungerar inte
114+
- Kräver manuell upload-process eller separat CI/CD
115+
- Mer komplext att sätta upp än GitHub Pages
116+
- Kräver hantering av Cloudflare-credentials
117+
118+
### 2. Cloudflare R2 + Workers
119+
120+
**Fördelar**:
121+
122+
- Löser URL-rewrite problemet via Workers
123+
- Full kontroll över HTTP-routing och headers
124+
- Kraftfull om avancerad logik behövs
125+
126+
**Varför inte valt**:
127+
128+
- **Kostnad**: Workers kostar $5/månad (minimum)
129+
- Projektet har ingen budget
130+
- **Komplexitet**: Kräver Worker-kod för URL-rewrites
131+
- **Overkill**: Statiska HTML-filer behöver inte serverless compute
132+
- **Underhåll**: Ytterligare kod att underhålla
133+
134+
### 3. Docker Container med nginx/Apache
135+
136+
**Fördelar**:
137+
138+
- Full kontroll över konfiguration och deployment
139+
- Portabelt - kan köras var som helst (lokalt, VPS, cloud)
140+
- Standard webserver (nginx/Apache) hanterar URL-rewrites automatiskt
141+
- Ingen vendor lock-in
142+
- Kan köras gratis på många plattformar (Fly.io free tier, Railway, etc.)
143+
144+
**Varför inte valt**:
145+
146+
- **Hosting krävs fortfarande**: Container måste köras någonstans
147+
- Gratis alternativ finns men ofta med begränsningar
148+
- Kräver egen server eller cloud-plattform för produktion
149+
- **Mer komplext deployment**: Container registry, orchestration, deployment
150+
- **Underhåll**: Container images måste uppdateras och hanteras
151+
- **CI/CD komplexitet**: Kräver byggsteg för container + push till registry + deployment
152+
- **Overkill**: Container-infrastruktur är onödigt komplext för enbart statiska filer
153+
- **Kostnad över tid**: Även "gratis" tiers har begränsningar, kan kräva betalning senare
154+
155+
### 4. Traditionell hosting (VPS/Shared hosting)
156+
157+
**Varför inte valt**:
158+
159+
- **Kostnad**: VPS kostar $5-20/månad, shared hosting $3-10/månad
160+
- **Underhåll**: Kräver serveradministration, säkerhetsuppdateringar
161+
- **Komplexitet**: Overkill för statiska filer
162+
- **CI/CD**: Kräver SSH-credentials och deployment-scripts
163+
164+
### 5. Netlify/Vercel
165+
166+
**Fördelar**:
167+
168+
- Liknande fördelar som GitHub Pages
169+
- Fler features (serverless functions, forms)
170+
171+
**Varför inte valt**:
172+
173+
- Ingen fördel för vårt användningsfall (bara statiska filer)
174+
- Ytterligare extern tjänst att hantera
175+
- GitHub Pages är enklare när allt redan finns på GitHub
176+
177+
### 6. Amazon CloudFront + S3
178+
179+
**Fördelar**:
180+
181+
- Kraftfull CDN med global presence (AWS edge locations)
182+
- Billig storage i S3 (~$0.023/GB/månad)
183+
- Bra om projektet redan använder AWS-ekosystemet
184+
- Professionell lösning med SLA:er
185+
- CloudFront free tier: 1 TB utgående data/månad första 12 månaderna
186+
187+
**Varför inte valt**:
188+
189+
- **URL-rewrites fungerar inte automatiskt**: Samma problem som Cloudflare R2
190+
- `/folder/` servar inte automatiskt `index.html`
191+
- CloudFront stödjer bara default root object för root, inte subdirectorier
192+
- Kräver CloudFront Functions eller Lambda@Edge för rewrites
193+
- **Kostnad**:
194+
- CloudFront Functions: ~$0.10 per miljon requests
195+
- Lambda@Edge: Dyrare än CloudFront Functions
196+
- Efter free tier: Data transfer kostar (~$0.085/GB för första 10 TB)
197+
- **Komplexitet**:
198+
- Kräver AWS-konto och hantering av credentials
199+
- CloudFront Functions eller Lambda@Edge kod måste skrivas och deployas
200+
- Mer komplext än GitHub Pages
201+
- **AWS-specifikt**: Vendor lock-in till AWS-ekosystemet
202+
- **Overkill**: Projektet har ingen budget och använder inte AWS för övrigt
203+
204+
**Alternativa S3 lösningar**:
205+
206+
- S3 Static Website Endpoint fungerar med automatiska rewrites, men kräver publik bucket (fungerar inte med CloudFront OAI/OAC för säker access)
207+
208+
## Relaterade beslut
209+
210+
- [ADR-001](001-markdown-som-mellanformat.md) - Markdown som mellanformat (genererar HTML-output)
211+
- Workflow-konfiguration: `.github/workflows/github-pages-workflow.yml`
212+
213+
## Noteringar
214+
215+
- **Deployment-process**:
216+
217+
```yaml
218+
# GitHub Actions workflow (.github/workflows/github-pages-workflow.yml)
219+
1. Checkout code
220+
2. Generera HTML-filer till _site/ katalog (eller ladda från R2)
221+
3. Skapa Pages artifact via actions/upload-pages-artifact
222+
4. Deploy artifact via actions/deploy-pages
223+
5. GitHub Pages servar automatiskt från artifact
224+
```
225+
226+
- **Cloudflare R2 backup**:
227+
- Filer synkas till R2 parallellt
228+
- Script: `tools/upload_to_cloudflare.py`
229+
- Kan aktiveras manuellt vid behov
230+
- Begränsning: URL-rewrites fungerar inte utan Workers
231+
232+
- **Framtida möjligheter**:
233+
- Custom domain kan adderas utan kod-ändringar
234+
- Kan byta till R2+Workers om budget tillkommer
235+
- Migrering till annan plattform är trivial (kopiera filer)
236+
237+
- **Performance**:
238+
- GitHub Pages använder Fastly CDN
239+
- Bra global latency
240+
- Automatisk gzip-kompression
241+
242+
- **Begränsningar** (GitHub Pages limits):
243+
- Max 1 GB repository size (långt ifrån vår användning)
244+
- Max 100 GB bandwidth/månad (mer än tillräckligt)
245+
- Max 10 builds/timme (vi bygger vid code changes)
246+
247+
- **Exempel på GitHub Pages URL-rewrites**:
248+
249+
```text
250+
/1999/1/ → /1999/1/index.html
251+
/1999/1/kapitel-1 → /1999/1/kapitel-1/index.html
252+
/ → /index.html
253+
```
254+
255+
Detta fungerar automatiskt utan konfiguration.

docs/adr/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@ Vi använder [MADR](https://adr.github.io/madr/) (Markdown Any Decision Records)
1919
## Index över ADR:er
2020

2121
| ADR | Titel | Status |
22-
|-----|-------|--------|
22+
| --- | ----- | ------ |
2323
| [ADR-001](001-markdown-som-mellanformat.md) | Markdown som mellanformat | Accepterad |
2424
| [ADR-002](002-import-fran-regeringskansliet.md) | Import från Regeringskansliet istället för PDF-crawling | Accepterad |
2525
| [ADR-003](003-git-commits-historiska-datum.md) | Git-commits med historiska datum för versionshistorik | Accepterad |
2626
| [ADR-004](004-semantiska-temporal-taggar.md) | Semantiskt val av taggar för temporal data | Accepterad |
27+
| [ADR-005](005-github-pages-hosting.md) | GitHub Pages som hosting för webbplatsen | Accepterad |
2728

2829
## Skapa en ny ADR
2930

0 commit comments

Comments
 (0)