Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7daa90dd89 | ||
|
|
23d72f5287 | ||
|
|
6283a4e5ad | ||
|
|
9765d28b6d | ||
|
|
88886a9916 | ||
|
|
0cc7d0805e | ||
|
|
ad5079dcec | ||
|
|
2bbc4235be | ||
|
|
7a1eb40bc8 |
+18
-12
@@ -286,6 +286,9 @@ jobs:
|
|||||||
# Notifications
|
# Notifications
|
||||||
GOTIFY_URL: ${{ secrets.GOTIFY_URL }}
|
GOTIFY_URL: ${{ secrets.GOTIFY_URL }}
|
||||||
GOTIFY_TOKEN: ${{ secrets.GOTIFY_TOKEN }}
|
GOTIFY_TOKEN: ${{ secrets.GOTIFY_TOKEN }}
|
||||||
|
|
||||||
|
# Anti-spam
|
||||||
|
FORM_TOKEN_SECRET: ${{ secrets.FORM_TOKEN_SECRET }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -360,6 +363,9 @@ jobs:
|
|||||||
echo "GOTIFY_URL=$GOTIFY_URL"
|
echo "GOTIFY_URL=$GOTIFY_URL"
|
||||||
echo "GOTIFY_TOKEN=$GOTIFY_TOKEN"
|
echo "GOTIFY_TOKEN=$GOTIFY_TOKEN"
|
||||||
echo ""
|
echo ""
|
||||||
|
echo "# Anti-spam"
|
||||||
|
echo "FORM_TOKEN_SECRET=$FORM_TOKEN_SECRET"
|
||||||
|
echo ""
|
||||||
echo "TARGET=$TARGET"
|
echo "TARGET=$TARGET"
|
||||||
echo "SENTRY_ENVIRONMENT=$TARGET"
|
echo "SENTRY_ENVIRONMENT=$TARGET"
|
||||||
echo "PROJECT_NAME=$PROJECT_NAME"
|
echo "PROJECT_NAME=$PROJECT_NAME"
|
||||||
@@ -385,7 +391,7 @@ jobs:
|
|||||||
mkdir -p ~/.ssh
|
mkdir -p ~/.ssh
|
||||||
echo "${{ secrets.ALPHA_SSH_KEY }}" > ~/.ssh/id_ed25519
|
echo "${{ secrets.ALPHA_SSH_KEY }}" > ~/.ssh/id_ed25519
|
||||||
chmod 600 ~/.ssh/id_ed25519
|
chmod 600 ~/.ssh/id_ed25519
|
||||||
ssh-keyscan -H alpha.mintel.me >> ~/.ssh/known_hosts 2>/dev/null
|
ssh-keyscan -H infra.mintel.me >> ~/.ssh/known_hosts 2>/dev/null
|
||||||
|
|
||||||
if [[ "$TARGET" == "production" ]]; then
|
if [[ "$TARGET" == "production" ]]; then
|
||||||
SITE_DIR="/home/deploy/sites/e-tib.com"
|
SITE_DIR="/home/deploy/sites/e-tib.com"
|
||||||
@@ -397,25 +403,25 @@ jobs:
|
|||||||
SITE_DIR="/home/deploy/sites/branch.e-tib.com/$SLUG"
|
SITE_DIR="/home/deploy/sites/branch.e-tib.com/$SLUG"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ssh root@alpha.mintel.me "mkdir -p $SITE_DIR"
|
ssh root@infra.mintel.me "mkdir -p $SITE_DIR"
|
||||||
scp .env.deploy root@alpha.mintel.me:$SITE_DIR/$ENV_FILE
|
scp .env.deploy root@infra.mintel.me:$SITE_DIR/$ENV_FILE
|
||||||
scp docker-compose.yml root@alpha.mintel.me:$SITE_DIR/docker-compose.yml
|
scp docker-compose.yml root@infra.mintel.me:$SITE_DIR/docker-compose.yml
|
||||||
|
|
||||||
ssh root@alpha.mintel.me "docker system prune -f"
|
ssh root@infra.mintel.me "docker system prune -f"
|
||||||
|
|
||||||
# ── Deterministic cleanup: stop the EXACT compose project we're about to redeploy ──
|
# ── Deterministic cleanup: stop the EXACT compose project we're about to redeploy ──
|
||||||
ssh root@alpha.mintel.me "cd $SITE_DIR && docker compose -p '${PROJECT_NAME}' --env-file '$ENV_FILE' down --remove-orphans 2>/dev/null || true"
|
ssh root@infra.mintel.me "cd $SITE_DIR && docker compose -p '${PROJECT_NAME}' --env-file '$ENV_FILE' down --remove-orphans 2>/dev/null || true"
|
||||||
|
|
||||||
# ── Safety net: kill ANY container whose Traefik host rule matches our target domain ──
|
# ── Safety net: kill ANY container whose Traefik host rule matches our target domain ──
|
||||||
# This catches ghost containers from prior deployments that used a different project name
|
# This catches ghost containers from prior deployments that used a different project name
|
||||||
# (e.g. 'e-tibcom' vs 'etib-production' due to Docker Compose defaulting to dir name)
|
# (e.g. 'e-tibcom' vs 'etib-production' due to Docker Compose defaulting to dir name)
|
||||||
ssh root@alpha.mintel.me "docker ps -q --filter label=traefik.http.routers.${PROJECT_NAME}.rule 2>/dev/null | xargs -r docker rm -f 2>/dev/null || true"
|
ssh root@infra.mintel.me "docker ps -q --filter label=traefik.http.routers.${PROJECT_NAME}.rule 2>/dev/null | xargs -r docker rm -f 2>/dev/null || true"
|
||||||
ssh root@alpha.mintel.me "docker ps --format '{{.Names}}' | grep -E '^e-tibcom-' | xargs -r docker rm -f 2>/dev/null || true"
|
ssh root@infra.mintel.me "docker ps --format '{{.Names}}' | grep -E '^e-tibcom-' | xargs -r docker rm -f 2>/dev/null || true"
|
||||||
|
|
||||||
ssh root@alpha.mintel.me "cd $SITE_DIR && echo '${{ secrets.REGISTRY_PASS }}' | docker login registry.infra.mintel.me -u '${{ secrets.REGISTRY_USER }}' --password-stdin"
|
ssh root@infra.mintel.me "cd $SITE_DIR && echo '${{ secrets.REGISTRY_PASS }}' | docker login registry.infra.mintel.me -u '${{ secrets.REGISTRY_USER }}' --password-stdin"
|
||||||
ssh root@alpha.mintel.me "cd $SITE_DIR && docker compose -p '${PROJECT_NAME}' --env-file '$ENV_FILE' pull"
|
ssh root@infra.mintel.me "cd $SITE_DIR && docker compose -p '${PROJECT_NAME}' --env-file '$ENV_FILE' pull"
|
||||||
ssh root@alpha.mintel.me "cd $SITE_DIR && docker compose -p '${PROJECT_NAME}' --env-file '$ENV_FILE' up -d --remove-orphans"
|
ssh root@infra.mintel.me "cd $SITE_DIR && docker compose -p '${PROJECT_NAME}' --env-file '$ENV_FILE' up -d --remove-orphans"
|
||||||
ssh root@alpha.mintel.me "docker system prune -f --filter 'until=24h'"
|
ssh root@infra.mintel.me "docker system prune -f --filter 'until=24h'"
|
||||||
|
|
||||||
# ──────────────────────────────────────────────────────────────────────────────
|
# ──────────────────────────────────────────────────────────────────────────────
|
||||||
# JOB 5: Post-Deploy Verification
|
# JOB 5: Post-Deploy Verification
|
||||||
|
|||||||
@@ -31,21 +31,21 @@ export const defaultCertificates: Certificate[] = [
|
|||||||
description: 'Umweltmanagementsystem',
|
description: 'Umweltmanagementsystem',
|
||||||
pdfUrl: '/assets/certificates/iso14001.pdf',
|
pdfUrl: '/assets/certificates/iso14001.pdf',
|
||||||
type: 'iso',
|
type: 'iso',
|
||||||
date: '14.12.2023',
|
date: '06.12.2023 – 05.12.2026',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'ISO 9001:2015',
|
title: 'ISO 9001:2015',
|
||||||
description: 'Qualitätsmanagementsystem',
|
description: 'Qualitätsmanagementsystem',
|
||||||
pdfUrl: '/assets/certificates/iso9001.pdf',
|
pdfUrl: '/assets/certificates/iso9001.pdf',
|
||||||
type: 'iso',
|
type: 'iso',
|
||||||
date: '14.12.2023',
|
date: '06.12.2023 – 05.12.2026',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'DIN EN ISO 45001:2018',
|
title: 'DIN EN ISO 45001:2018',
|
||||||
description: 'Arbeits- und Gesundheitsschutz',
|
description: 'Arbeits- und Gesundheitsschutz',
|
||||||
pdfUrl: '/assets/certificates/iso45001.pdf',
|
pdfUrl: '/assets/certificates/iso45001.pdf',
|
||||||
type: 'iso',
|
type: 'iso',
|
||||||
date: '05.12.2025',
|
date: '06.12.2025 – 05.12.2028',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Betriebshaftpflichtversicherung',
|
title: 'Betriebshaftpflichtversicherung',
|
||||||
|
|||||||
@@ -38,14 +38,9 @@ Danny Joseph
|
|||||||
Gewerbestraße 22
|
Gewerbestraße 22
|
||||||
03172 Guben
|
03172 Guben
|
||||||
|
|
||||||
## EU-Streitschlichtung
|
## Verbraucherstreitbeilegung
|
||||||
|
|
||||||
Die Europäische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) bereit: [https://ec.europa.eu/consumers/odr/](https://ec.europa.eu/consumers/odr/).
|
Wir sind nicht bereit und nicht verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.
|
||||||
Unsere E-Mail-Adresse finden Sie oben im Impressum.
|
|
||||||
|
|
||||||
## Verbraucherstreitbeilegung/Universalschlichtungsstelle
|
|
||||||
|
|
||||||
Wir sind nicht bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.
|
|
||||||
|
|
||||||
## Haftungsausschluss (Disclaimer)
|
## Haftungsausschluss (Disclaimer)
|
||||||
|
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ layout: "fullBleed"
|
|||||||
showFairs={true}
|
showFairs={true}
|
||||||
showJobs={false}
|
showJobs={false}
|
||||||
fairs={[
|
fairs={[
|
||||||
{ name: 'Windenergietage Linstow', date: '10. - 12. November 2026', type: 'Fachkongress', location: 'Linstow', url: 'https://www.windenergietage.de/' },
|
|
||||||
{ name: 'Werkstatt Kabel 2026', date: '24. - 25. November 2026', type: 'Fachtagung', location: 'Wiesbaden', url: 'https://werkstatt-kabel.essociation.de/' },
|
{ name: 'Werkstatt Kabel 2026', date: '24. - 25. November 2026', type: 'Fachtagung', location: 'Wiesbaden', url: 'https://werkstatt-kabel.essociation.de/' },
|
||||||
{ name: 'Intersolar München', date: '8. - 10. Juni 2027', type: 'Messe', location: 'München', url: 'https://www.intersolar.de/' }
|
{ name: 'Intersolar', date: '8. - 10. Juni 2027', type: 'Messe', location: 'München', url: 'https://www.intersolar.de/' },
|
||||||
|
{ name: 'Windenergietage', date: '09. - 11. November 2027', type: 'Fachkongress', location: 'Potsdam', url: 'https://www.windenergietage.de/' }
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -40,14 +40,9 @@ Gewerbestraße 22
|
|||||||
03172 Guben
|
03172 Guben
|
||||||
Germany
|
Germany
|
||||||
|
|
||||||
## EU Dispute Resolution
|
## Consumer Dispute Resolution
|
||||||
|
|
||||||
The European Commission provides a platform for online dispute resolution (ODR): [https://ec.europa.eu/consumers/odr/](https://ec.europa.eu/consumers/odr/).
|
We are not willing and not obliged to participate in dispute resolution proceedings before a consumer arbitration board.
|
||||||
Our email address can be found at the top of the imprint.
|
|
||||||
|
|
||||||
## Consumer Dispute Resolution/Universal Arbitration Board
|
|
||||||
|
|
||||||
We are not willing or obliged to participate in dispute resolution proceedings before a consumer arbitration board.
|
|
||||||
|
|
||||||
## Disclaimer
|
## Disclaimer
|
||||||
|
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ layout: "fullBleed"
|
|||||||
showFairs={true}
|
showFairs={true}
|
||||||
showJobs={false}
|
showJobs={false}
|
||||||
fairs={[
|
fairs={[
|
||||||
{ name: 'Wind Energy Days Linstow', date: 'November 10–12, 2026', type: 'Specialist Congress', location: 'Linstow', url: 'https://www.windenergietage.de/' },
|
|
||||||
{ name: 'Werkstatt Kabel 2026', date: 'November 24–25, 2026', type: 'Symposium', location: 'Wiesbaden', url: 'https://werkstatt-kabel.essociation.de/' },
|
{ name: 'Werkstatt Kabel 2026', date: 'November 24–25, 2026', type: 'Symposium', location: 'Wiesbaden', url: 'https://werkstatt-kabel.essociation.de/' },
|
||||||
{ name: 'Intersolar Munich', date: 'June 8–10, 2027', type: 'Fair', location: 'Munich', url: 'https://www.intersolar.de/' }
|
{ name: 'Intersolar', date: 'June 8–10, 2027', type: 'Fair', location: 'Munich', url: 'https://www.intersolar.de/' },
|
||||||
|
{ name: 'Wind Energy Days', date: 'November 9–11, 2027', type: 'Specialist Congress', location: 'Potsdam', url: 'https://www.windenergietage.de/' }
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -23,21 +23,21 @@ layout: "fullBleed"
|
|||||||
description: 'Environmental Management System',
|
description: 'Environmental Management System',
|
||||||
pdfUrl: '/assets/certificates/iso14001.pdf',
|
pdfUrl: '/assets/certificates/iso14001.pdf',
|
||||||
type: 'iso',
|
type: 'iso',
|
||||||
date: '14.12.2023',
|
date: '06.12.2023 – 05.12.2026',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'ISO 9001:2015',
|
title: 'ISO 9001:2015',
|
||||||
description: 'Quality Management System',
|
description: 'Quality Management System',
|
||||||
pdfUrl: '/assets/certificates/iso9001.pdf',
|
pdfUrl: '/assets/certificates/iso9001.pdf',
|
||||||
type: 'iso',
|
type: 'iso',
|
||||||
date: '14.12.2023',
|
date: '06.12.2023 – 05.12.2026',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'DIN EN ISO 45001:2018',
|
title: 'DIN EN ISO 45001:2018',
|
||||||
description: 'Occupational Health and Safety',
|
description: 'Occupational Health and Safety',
|
||||||
pdfUrl: '/assets/certificates/iso45001.pdf',
|
pdfUrl: '/assets/certificates/iso45001.pdf',
|
||||||
type: 'iso',
|
type: 'iso',
|
||||||
date: '05.12.2025',
|
date: '06.12.2025 – 05.12.2028',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Commercial Liability Insurance',
|
title: 'Commercial Liability Insurance',
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "e-tib-nextjs",
|
"name": "e-tib-nextjs",
|
||||||
"version": "2.4.58",
|
"version": "2.4.62",
|
||||||
|
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
|||||||
Binary file not shown.
@@ -13,7 +13,7 @@ fi
|
|||||||
# ── Configuration ──────────────────────────────────────────────────────────
|
# ── Configuration ──────────────────────────────────────────────────────────
|
||||||
SOURCE_ENV="${1:-}" # local | testing | staging | prod
|
SOURCE_ENV="${1:-}" # local | testing | staging | prod
|
||||||
TARGET_ENV="${2:-}" # testing | staging | prod
|
TARGET_ENV="${2:-}" # testing | staging | prod
|
||||||
SSH_HOST="root@alpha.mintel.me"
|
SSH_HOST="root@infra.mintel.me"
|
||||||
LOCAL_MEDIA_DIR="./public/media"
|
LOCAL_MEDIA_DIR="./public/media"
|
||||||
|
|
||||||
DRY_RUN=""
|
DRY_RUN=""
|
||||||
|
|||||||
@@ -10,46 +10,48 @@ describe('Messen Content and Translations', () => {
|
|||||||
const content = fs.readFileSync(deMessenPath, 'utf8');
|
const content = fs.readFileSync(deMessenPath, 'utf8');
|
||||||
|
|
||||||
// 1. Intersolar München
|
// 1. Intersolar München
|
||||||
expect(content).toContain("name: 'Intersolar München'");
|
expect(content).toContain("name: 'Intersolar'");
|
||||||
expect(content).toContain("date: '8. - 10. Juni 2027'");
|
expect(content).toContain("date: '8. - 10. Juni 2027'");
|
||||||
expect(content).toContain("type: 'Messe'");
|
expect(content).toContain("type: 'Messe'");
|
||||||
expect(content).toContain("location: 'München'");
|
expect(content).toContain("location: 'München'");
|
||||||
|
|
||||||
// 2. Windenergietage Linstow
|
// 2. Werkstatt Kabel 2026 (No "Kabel-Workshop")
|
||||||
expect(content).toContain("name: 'Windenergietage Linstow'");
|
|
||||||
expect(content).toContain("date: '10. - 12. November 2026'");
|
|
||||||
expect(content).toContain("type: 'Fachkongress'");
|
|
||||||
expect(content).toContain("location: 'Linstow'");
|
|
||||||
|
|
||||||
// 3. Werkstatt Kabel 2026 (No "Kabel-Workshop")
|
|
||||||
expect(content).not.toContain("Kabel-Workshop");
|
expect(content).not.toContain("Kabel-Workshop");
|
||||||
expect(content).toContain("name: 'Werkstatt Kabel 2026'");
|
expect(content).toContain("name: 'Werkstatt Kabel 2026'");
|
||||||
expect(content).toContain("date: '24. - 25. November 2026'");
|
expect(content).toContain("date: '24. - 25. November 2026'");
|
||||||
expect(content).toContain("type: 'Fachtagung'");
|
expect(content).toContain("type: 'Fachtagung'");
|
||||||
expect(content).toContain("location: 'Wiesbaden'");
|
expect(content).toContain("location: 'Wiesbaden'");
|
||||||
|
|
||||||
|
// 3. Windenergietage Potsdam (replaces Linstow 2026)
|
||||||
|
expect(content).not.toContain("Linstow");
|
||||||
|
expect(content).toContain("name: 'Windenergietage'");
|
||||||
|
expect(content).toContain("date: '09. - 11. November 2027'");
|
||||||
|
expect(content).toContain("type: 'Fachkongress'");
|
||||||
|
expect(content).toContain("location: 'Potsdam'");
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should have updated English trade fair dates and names for 2026', () => {
|
it('should have updated English trade fair dates and names for 2026', () => {
|
||||||
const content = fs.readFileSync(enMessenPath, 'utf8');
|
const content = fs.readFileSync(enMessenPath, 'utf8');
|
||||||
|
|
||||||
// 1. Intersolar Munich
|
// 1. Intersolar Munich
|
||||||
expect(content).toContain("name: 'Intersolar Munich'");
|
expect(content).toContain("name: 'Intersolar'");
|
||||||
expect(content).toContain("date: 'June 8–10, 2027'");
|
expect(content).toContain("date: 'June 8–10, 2027'");
|
||||||
expect(content).toContain("type: 'Fair'");
|
expect(content).toContain("type: 'Fair'");
|
||||||
expect(content).toContain("location: 'Munich'");
|
expect(content).toContain("location: 'Munich'");
|
||||||
|
|
||||||
// 2. Wind Energy Days Linstow
|
// 2. Werkstatt Kabel 2026 (No "Cable Workshop" or "Kabel Workshop")
|
||||||
expect(content).toContain("name: 'Wind Energy Days Linstow'");
|
|
||||||
expect(content).toContain("date: 'November 10–12, 2026'");
|
|
||||||
expect(content).toContain("type: 'Specialist Congress'");
|
|
||||||
expect(content).toContain("location: 'Linstow'");
|
|
||||||
|
|
||||||
// 3. Werkstatt Kabel 2026 (No "Cable Workshop" or "Kabel Workshop")
|
|
||||||
expect(content).not.toContain("Cable Workshop");
|
expect(content).not.toContain("Cable Workshop");
|
||||||
expect(content).not.toContain("Kabel Workshop");
|
expect(content).not.toContain("Kabel Workshop");
|
||||||
expect(content).toContain("name: 'Werkstatt Kabel 2026'");
|
expect(content).toContain("name: 'Werkstatt Kabel 2026'");
|
||||||
expect(content).toContain("date: 'November 24–25, 2026'");
|
expect(content).toContain("date: 'November 24–25, 2026'");
|
||||||
expect(content).toContain("type: 'Symposium'");
|
expect(content).toContain("type: 'Symposium'");
|
||||||
expect(content).toContain("location: 'Wiesbaden'");
|
expect(content).toContain("location: 'Wiesbaden'");
|
||||||
|
|
||||||
|
// 3. Wind Energy Days Potsdam (replaces Linstow 2026)
|
||||||
|
expect(content).not.toContain("Linstow");
|
||||||
|
expect(content).toContain("name: 'Wind Energy Days'");
|
||||||
|
expect(content).toContain("date: 'November 9–11, 2027'");
|
||||||
|
expect(content).toContain("type: 'Specialist Congress'");
|
||||||
|
expect(content).toContain("location: 'Potsdam'");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user