Compare commits

..

5 commits

Author SHA1 Message Date
Renovate 7e5a65bc14 Update docker.io/nginx Docker tag to v1.27.2
All checks were successful
/ build (pull_request) Successful in 19s
2024-10-13 11:31:01 +00:00
Stefan Bethke fc235e6310 Add logo and brand with more CCCHH (#10)
All checks were successful
/ build (push) Successful in 11s
Reviewed-on: #10
Co-authored-by: Stefan Bethke <stb@lassitu.de>
Co-committed-by: Stefan Bethke <stb@lassitu.de>
2024-10-13 13:29:36 +02:00
Stefan Bethke 5bd94a6a09 Use correct staging directory
All checks were successful
/ build (push) Successful in 11s
2024-10-13 13:13:52 +02:00
Stefan Bethke 0da4340001 user correct user
All checks were successful
/ build (push) Successful in 10s
2024-10-12 21:52:03 +02:00
Stefan Bethke b90f8f7462 Deploy pages directly to static web root
Some checks failed
/ build (push) Failing after 10s
Instead of building a docker image, deploy the generated files directly to the static web server.
2024-10-12 21:48:21 +02:00
22 changed files with 288 additions and 50 deletions

View file

@ -0,0 +1,23 @@
on:
pull_request:
types:
- closed
jobs:
cleanup-staging:
runs-on: docker
container:
image: code.forgejo.org/oci/node:20-bookworm
steps:
- name: Pipeline info PR
run: |
echo "Run triggered by ${{ github.event_name }} (${{ github.event.action }}) on ref ${{ github.ref_name }}"
- name: Staging Deployment - Prepare keys
run: |
echo "${{ secrets.SSH_DEPLOY_KEY }}" > deploykey.priv
chmod 400 deploykey.priv
echo "${{ secrets.SSH_KNOWN_HOSTS_FILE }}" > ./known_hosts
- name: Staging Deployment - Remove PR from staging
run: |
ssh -i deploykey.priv -o 'UserKnownHostsFile ./known_hosts' ht-ccchh-website-deploy@public-web-static-intern.hamburg.ccc.de -t "rm -r /var/www/staging.hackertours.hamburg.ccc.de/pr${{ github.event.pull_request.number }}/"

View file

@ -0,0 +1,80 @@
on:
push:
branches:
- main
pull_request:
env:
TZ: Europe/Berlin
jobs:
build:
runs-on: docker
container:
image: docker.io/hugomods/hugo:latest
steps:
- name: Pipeline info
run: |
echo "Run triggered by ${{ github.event_name }} (${{ github.event.action }}) on ref ${{ github.ref_name }}"
- name: Install packages
run: |
apk update
# For CI actions.
apk add nodejs-current
# For website build.
apk add tzdata coreutils curl jq git
# For uploading.
apk add rsync openssh
- uses: actions/checkout@v4
with:
fetch-depth: 0 # pull full history for page lastmod by git commit date
submodules: recursive
- name: Patch baseURL (staging only)
if: github.ref_name != 'main'
run: |
sed -i "s#baseURL: 'https://hackertours.hamburg.ccc.de/'#baseURL: 'https://staging.hackertours.hamburg.ccc.de/pr${{ github.event.pull_request.number }}/'#" hugo.yaml
- name: Build website (prod)
if: (github.event_name == 'push' || github.event_name == 'schedule') && github.ref_name == 'main'
run: |
hugo
- name: Build website (staging)
if: github.ref_name != 'main'
run: |
hugo --buildFuture --buildDrafts
- name: Deploy - Prepare keys
if: github.event_name == 'push' || github.event_name == 'pull_request' || github.event_name == 'schedule'
run: |
echo "${{ secrets.SSH_DEPLOY_KEY }}" > deploykey.priv
chmod 400 deploykey.priv
echo "${{ secrets.SSH_KNOWN_HOSTS_FILE }}" > ./known_hosts
- name: Deploy - Upload PR to staging
if: github.event_name == 'pull_request'
run: |
echo "Deploying to staging.hamburg.ccc.de/pr${{ github.event.pull_request.number }}"
rsync -v -r --delete -e "ssh -i deploykey.priv -o 'UserKnownHostsFile ./known_hosts'" public/ ht-ccchh-website-deploy@public-web-static-intern.hamburg.ccc.de:/var/www/staging.hackertours.hamburg.ccc.de/pr${{ github.event.pull_request.number }}/
- name: Deploy - Add comment to PR with staging URL
if: github.event_name == 'pull_request' && github.event.action == 'opened'
run: |
curl \
-X POST \
${{ github.event.pull_request.base.repo.url }}/issues/${{ github.event.pull_request.number }}/comments \
-H "Content-Type: application/json" \
-H "Authorization: token $GITHUB_TOKEN" \
--data '{ "body": "You can view your changes at https://staging.hackertours.hamburg.ccc.de/pr${{ github.event.pull_request.number }}/" }'
- name: Deploy - Upload to prod
if: (github.event_name == 'push' || github.event_name == 'schedule') && github.ref_name == 'main'
run: |
rsync -v -r --delete -e "ssh -i deploykey.priv -o 'UserKnownHostsFile ./known_hosts'" public/ ht-ccchh-website-deploy@public-web-static-intern.hamburg.ccc.de:/var/www/hackertours.hamburg.ccc.de/
- uses: actions/upload-artifact@v3
if: github.event_name == 'pull_request'
with:
name: website-build
path: public/

View file

@ -1,36 +0,0 @@
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout project
uses: actions/checkout@v4
with:
submodules: recursive
- name: Run hugo
run: docker run --rm -it -v ${{ github.workspace }}:/src docker.io/hugomods/hugo:latest hugo
- name: Compute Image Metadata
uses: docker/metadata-action@v5
id: metadata
with:
images: git.hamburg.ccc.de/${{ github.repository }}/hackertours
tags: |
type=raw,value=latest,enable={{is_default_branch}}
- name: Log in to Image Registry
uses: docker/login-action@v3
with:
registry: git.hamburg.ccc.de
username: ${{ github.actor }}
password: ${{ secrets.REPO_TOKEN }}
- name: Build image with kaniko
uses: https://github.com/int128/kaniko-action@v1
with:
push: true
tags: ${{ steps.metadata.outputs.tags }}
labels: ${{ steps.metadata.outputs.labels }}
cache: true
cache-repository: git.hamburg.ccc.de/${{ github.repository }}/cache

View file

@ -1,3 +1,10 @@
.header__intro_headline {
font: bold var(--fs-xxl) "Arial";
padding-bottom: 10px;
}
.header__intro_text {
font-family: var(--ff-body)
}
table, th, td {
border: 1px solid;
}

View file

@ -4,13 +4,22 @@ menus:
main:
name: Home
weight: 1
params:
headline: Willkommen bei den Hamburger Hackertours euer Anbieter für Sightseeing für Technik-Enthusiasten!
intro: |
Zum Congress und zum Easterhegg organisiert der CCCHH Touren zu interessanten Orten in und um Hamburg. Hier findet ihr Informationen zu aktuellen und früheren Veranstaltungen!
logowidth: 500
logoheight: 500
cascade:
params:
intro: Der CCCHH zeigt euch Hamburg
---
## Willkommen zu den HHackertours euer Anbieter für Sightseeing für Technik-Enthusiasten!
## Willkommen zu den Hackertours euer Anbieter für Sightseeing für Technik-Enthusiasten!
Was sind die Hackertours? Das Hamburger Team hat spannende Orte in Hamburg gefunden, die euch für ein paar Stunden aus den Katakomben entführen, und neue, interessante Dinge erfahren lassen. [Hier erklären wir euch, wie genau das funktioniert]({{< relref "posts/faq" >}})!
**[Alle Touren zum 38c3]({{< relref "38c3" >}})** **[Direkt zum Shop](https://hackertours.hamburg.ccc.de/hackertours/38c3/)**
**[Alle Touren zum 38c3]({{< relref "38c3" >}})** **[Direkt zum Shop](https://tickets.hamburg.ccc.de/hackertours/38c3/)**
Hackertours-Desk: DECT 8687 "TOUR", +494057308308687, Foyer X an der großen Uhr

View file

@ -3,6 +3,6 @@ title: 'So long and thanks for all the fish!'
date: 2023-12-31T09:00:00+01:00
---
Danke, das ihr mit Hackertours gereist seid! Wir hoffen, euch habe die Touren gefallen, und wir freuen uns darauf, zum 38C3 neue Touren anbieten zu können!
Danke, das ihr mit Hackertours gereist seid! Wir hoffen, euch habe die Touren gefallen, und wir freuen uns darauf, zum 38c3 neue Touren anbieten zu können!
Wenn ihr in Kontakt bleiben möchtet, folgt uns auf Mastodon [@hackertours@chaos.social](https://chaos.social/@hackertours)!

View file

@ -26,13 +26,13 @@ Eine Gruppe von Menschen rund um den CCCHH hat in den vergangenen Wochen keine M
### Welche Touren gibt es?
**[Alle Touren zum 38c3]({{< relref "38c3" >}})** **[Direkt zum Shop](https://hackertours.hamburg.ccc.de/hackertours/38c3/)**
**[Alle Touren zum 38c3]({{< relref "38c3" >}})** **[Direkt zum Shop](https://tickets.hamburg.ccc.de/hackertours/38c3/)**
### Brauche ich ein Ticket?
Ja, unbedingt. Die Touren haben nur begrenzte Kapazität, und damit wir das gut planen und durchführen können, braucht ihr zur Teilnahme ein Ticket.
Bitte klickt euch das gewünschte **[Ticket im Ticketshop](https://hackertours.hamburg.ccc.de/hackertours/38c3/)** bzw. setzt euch dort auf die Warteliste!
Bitte klickt euch das gewünschte **[Ticket im Ticketshop](https://tickets.hamburg.ccc.de/hackertours/38c3/)** bzw. setzt euch dort auf die Warteliste!
### Wann treffen wir uns und wo?
@ -64,7 +64,7 @@ Einige der Touren verlangen ein Eintrittsgeld. Um die Durchführung der Touren s
Damit das sicher funktioniert, müsst ihr **spätestens am 23.12. überwiesen haben**. Wenn ihr Tickets bucht, zeigt euch das System an, wie viele Tage ihr Zeit habt, zu bezahlen. Wenn die Tickets bis zu dieser Frist nicht bezahlt sind, geben wir sie zurück in den Verkauf.
Wenn ihr euer Ticket im [Ticket Shop](https://hackertours.hamburg.ccc.de/hackertours/38c3/) kauft, erhaltet ihr eine Email mit den Details zur Überweisung: Kontonummer und ein Verwendungszweck, der eure Zahlung eurem Ticket zuordnet. Bitte folgt den Anweisungen in dieser Email. Wenn ihr aus irgendeinem Grund die Email nicht habt, aber euren Code kennt, dann könnt ihr diese Daten verwenden:
Wenn ihr euer Ticket im [Ticket Shop](https://tickets.hamburg.ccc.de/hackertours/38c3/) kauft, erhaltet ihr eine Email mit den Details zur Überweisung: Kontonummer und ein Verwendungszweck, der eure Zahlung eurem Ticket zuordnet. Bitte folgt den Anweisungen in dieser Email. Wenn ihr aus irgendeinem Grund die Email nicht habt, aber euren Code kennt, dann könnt ihr diese Daten verwenden:
* Verwendungszweck: Der Code für euer Ticket
* IBAN: DE69 8306 5408 0105 2955 05
* BIC: GENODEF1SLR

View file

@ -4,13 +4,22 @@ menus:
main:
name: Home
weight: 1
params:
headline: Welcome to Hackertours your provider of sightseeing tours for technical enthusiasts!
intro: |
For Congress and for Easterhegg CCC Hamburg is organizing tours to interesting places in and around Hamburg. Here you will find infos about current and past events!
logowidth: 500
logoheight: 500
cascade:
params:
intro: CCCHH shows you around Hamburg!
---
## Welcome to HHackertours your provider of sightseeing tours for technical enthusiasts!
## Welcome to Hackertours your provider of sightseeing tours for technical enthusiasts!
What are the Hackertours? The Hamburg team has sought out interesting locations in the city that will take you away from the catacombs of the Congress Center for a few hours, letting you experience exiting new things.
**[All Tours]({{< relref "38c3" >}})** **[Directly to the Ticket Shop](https://hackertours.hamburg.ccc.de/hackertours/37c3/)**
**[All Tours]({{< relref "38c3" >}})** **[Directly to the Ticket Shop](https://tickets.hamburg.ccc.de/hackertours/37c3/)**
Hackertours Desk: DECT 8687 "TOUR", +494057308308687, Foyer X next to the big clock

View file

@ -3,6 +3,6 @@ title: 'So long and thanks for all the fish!'
date: 2023-12-31T09:00:00+01:00
---
Thank you for traveling with Hackertours this Congress! We hope you enjoyed your tours, and we are looking forward to offering new tours at 38C3!
Thank you for traveling with Hackertours this Congress! We hope you enjoyed your tours, and we are looking forward to offering new tours at 38c3!
If you would like to stay in touch, please follow us on Mastodon [@hackertours@chaos.social](https://chaos.social/@hackertours)!

View file

@ -29,7 +29,7 @@ A group of people from CCCHH hat worked tirelessly the past few weeks to find in
Yes, definitely. The tours have limited capacity only, so we need you to get a ticket to participate so we can plan and run these properly.
Please get your desired **[ticket in the Ticket Shop](https://hackertours.hamburg.ccc.de/hackertours/38c3/)** or place yourself on the waiting list!
Please get your desired **[ticket in the Ticket Shop](https://tickets.hamburg.ccc.de/hackertours/38c3/)** or place yourself on the waiting list!
### Where and when do we meet up?
@ -63,7 +63,7 @@ Some of the tours charge an entrance fee. To make it as easy as possible for eve
For this to work, you will need to pay your ticket in advance. Make sure to post your **bank transfer on Dec 23st the latest**. When you book tickets, the system will show you how many days you have to pay. If you don't pay in time, we will return the tickets to the shop for sale to somebody else.
When you purchase your tickets in the [Ticket Shop](https://hackertours.hamburg.ccc.de/hackertours/38c3/), you will receive an email with the bank account details and a custom "note to payee" value to identify your purchase. Please follow the instructions in that email. If for some reason you don't have that email, but you do have your code, you can use this information:
When you purchase your tickets in the [Ticket Shop](https://tickets.hamburg.ccc.de/hackertours/38c3/), you will receive an email with the bank account details and a custom "note to payee" value to identify your purchase. Please follow the instructions in that email. If for some reason you don't have that email, but you do have your code, you can use this information:
* Note to Payee: the purchase code for your ticket
* IBAN: DE69 8306 5408 0105 2955 05
* BIC: GENODEF1SLR

View file

@ -7,11 +7,14 @@ theme: "zen"
#https://themes.gohugo.io/themes/hugo-theme-zen/#configuration
params:
contact: "hhackertours@lists.hamburg.ccc.de"
contact: "hackertours@hamburg.ccc.de"
copyright: "[CCC Hansestadt Hamburg e.V.](https://hamburg.ccc.de) ist nur der Vermittler, für die Touren sind die jeweiligen Veranstalter verantwortlich"
description: "37c3 Hackertours"
footer: "[Impressum & Datenschutz](https://hamburg.ccc.de/imprint/) [Ticket Shop](https://hackertours.hamburg.ccc.de/hackertours/37c3/)"
logo: false
footer: "[Impressum & Datenschutz](https://hamburg.ccc.de/imprint/) [Ticket Shop](https://tickets.hamburg.ccc.de/hackertours/37c3/)"
logo: true
logoPath: img/hackertours-2024-color.svg
logoHeight: 100
logoWidth: 100
mainSections:
- posts
mobileMenu: true

View file

@ -0,0 +1,58 @@
<!DOCTYPE html>
<html class="nojs" lang="{{ site.LanguageCode | default site.Language.Lang }}" dir="{{ site.Language.LanguageDirection | default "ltr" }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>{{ block "title" . }}{{ .Title }} {{ site.Title }}{{ end }}</title>
{{ partial "meta.html" . }}
{{ partialCached "styles.html" . }}
{{ partial "meta_json_ld.html" . }}
{{ partial "scripts.html" . }}
{{ partial "math.html" . }}
{{ partialCached "tracking.html" . }}
{{ if templates.Exists "partials/head.html" -}}
{{ partial "head.html" . }}
{{ end -}}
{{ block "head" . }}{{ end }}
</head>
<body class="{{ if .IsPage }}single-page{{ else }}list-page{{ end }}{{ if .IsHome }} front{{ end }}{{ with $.Param "bodyclass" }} {{ . }}{{ end }}">
<div class="page layout__page{{ if $.Param "sidebar" }} layout__sidebar-second{{ end }}">
<header class="header layout__header">
{{ if $.Param "logo" | default true -}}
<a href="{{ site.Home.RelPermalink }}" title="Home" rel="home" class="header__logo">
<img src="{{ with $.Param "logopath" }}{{ . | relURL }}{{ else }}{{ "images/logo.png" | relURL }}{{ end }}"{{ with $.Param "logowidth" }} width="{{ . }}"{{ end }}{{ with $.Param "logoheight" }} height="{{ . }}"{{ end }} alt="Home" class="header__logo-image">
</a>
{{ end -}}
<div class="header__intro">
<div class="header__intro_headline"><a href="{{ site.Home.RelPermalink }}" title="Home" class="header__site-link" rel="home"><span>{{ site.Title }}</span></a></div>
<div class="header__intro_text">{{ .Param "intro" }}</div>
</div>
<div class="region header__region">
{{ if hugo.IsMultilingual }}{{ partial "language-selector.html" . }}{{ end -}}
{{ if $.Param "menuinheader" }}{{ partial "menu.html" . }}{{ end -}}
</div>
</header>
{{ if not ($.Param "menuinheader") }}{{ partial "menu.html" . }}{{ end -}}
{{ if $.Param "mobilemenu" }}{{ partial "mobilemenu.html" . }}{{ end -}}
{{ block "main" . }}{{ end }}
{{ if $.Param "sidebar" }}{{ partial "sidebar.html" . }}{{ end -}}
<footer class="footer layout__footer mt--l">
{{ if templates.Exists "partials/footer.html" -}}
{{ partial "footer.html" . }}
{{ else -}}
{{ if $.Param "feedlinks" }}{{ partial "feedlinks.html" . }}{{ end -}}
<p>{{ with $.Param "copyright" }}{{ . | markdownify }}{{ else }}<span>© {{ site.Title }}</span>{{ end }}</p>
{{ with $.Param "footer" }}<p>{{ . | markdownify }}</p>{{ end }}
{{ if $.Param "poweredby" }}<p>Powered by <a href="https://gohugo.io/">Hugo</a> and the <a href="https://github.com/frjo/hugo-theme-zen">Zen theme</a>.</p>{{ end }}
{{ end -}}
</footer>
{{ if $.Param "cookieconsent" }}{{ partialCached "cookieconsent.html" . }}{{ end -}}
</div>
</body>
</html>

60
layouts/home/baseof.html Normal file
View file

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html class="nojs" lang="{{ site.LanguageCode | default site.Language.Lang }}" dir="{{ site.Language.LanguageDirection | default "ltr" }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>{{ block "title" . }}{{ .Title }} {{ site.Title }}{{ end }}</title>
{{ partial "meta.html" . }}
{{ partialCached "styles.html" . }}
{{ partial "meta_json_ld.html" . }}
{{ partial "scripts.html" . }}
{{ partial "math.html" . }}
{{ partialCached "tracking.html" . }}
{{ if templates.Exists "partials/head.html" -}}
{{ partial "head.html" . }}
{{ end -}}
{{ block "head" . }}{{ end }}
</head>
<body class="{{ if .IsPage }}single-page{{ else }}list-page{{ end }}{{ if .IsHome }} front{{ end }}{{ with $.Param "bodyclass" }} {{ . }}{{ end }}">
<div class="page layout__page{{ if $.Param "sidebar" }} layout__sidebar-second{{ end }}">
<header class="header layout__header">
{{ if $.Param "logo" | default true -}}
<a href="{{ site.Home.RelPermalink }}" title="Home" rel="home" class="header__logo">
<img src="{{ with $.Param "logopath" }}{{ . | relURL }}{{ else }}{{ "images/logo.png" | relURL }}{{ end }}"{{ with $.Param "logowidth" }} width="{{ . }}"{{ end }}{{ with $.Param "logoheight" }} height="{{ . }}"{{ end }} alt="Home" class="header__logo-image">
</a>
{{ end -}}
<div class="header__intro">
<div class="header__intro_headline">{{ .Param "headline" }}</div>
{{ if .Param "intro" }}
<div class="header__intro_text">{{ .Param "intro" }}</div>
{{ end }}
</div>
<div class="region header__region">
{{ if hugo.IsMultilingual }}{{ partial "language-selector.html" . }}{{ end -}}
{{ if $.Param "menuinheader" }}{{ partial "menu.html" . }}{{ end -}}
</div>
</header>
{{ if not ($.Param "menuinheader") }}{{ partial "menu.html" . }}{{ end -}}
{{ if $.Param "mobilemenu" }}{{ partial "mobilemenu.html" . }}{{ end -}}
{{ block "main" . }}{{ end }}
{{ if $.Param "sidebar" }}{{ partial "sidebar.html" . }}{{ end -}}
<footer class="footer layout__footer mt--l">
{{ if templates.Exists "partials/footer.html" -}}
{{ partial "footer.html" . }}
{{ else -}}
{{ if $.Param "feedlinks" }}{{ partial "feedlinks.html" . }}{{ end -}}
<p>{{ with $.Param "copyright" }}{{ . | markdownify }}{{ else }}<span>© {{ site.Title }}</span>{{ end }}</p>
{{ with $.Param "footer" }}<p>{{ . | markdownify }}</p>{{ end }}
{{ if $.Param "poweredby" }}<p>Powered by <a href="https://gohugo.io/">Hugo</a> and the <a href="https://github.com/frjo/hugo-theme-zen">Zen theme</a>.</p>{{ end }}
{{ end -}}
</footer>
{{ if $.Param "cookieconsent" }}{{ partialCached "cookieconsent.html" . }}{{ end -}}
</div>
</body>
</html>

BIN
static/apple-touch-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

BIN
static/favicon-48x48.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
static/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

3
static/favicon.svg Normal file
View file

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="32" height="32" viewBox="0 0 32 32"><image width="32" height="32" xlink:href="data:image/png;base64,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"></image><style>@media (prefers-color-scheme: light) { :root { filter: none; } }
@media (prefers-color-scheme: dark) { :root { filter: none; } }
</style></svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

21
static/site.webmanifest Normal file
View file

@ -0,0 +1,21 @@
{
"name": "hacker.tours",
"short_name": "hacker.tours",
"icons": [
{
"src": "/web-app-manifest-192x192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/web-app-manifest-512x512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB