Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3e647cd44b | ||
|
|
54af256e91 |
185
DEBUG_VERSION.md
Normal file
185
DEBUG_VERSION.md
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
# Debug Version Display - Remote Server Checklist
|
||||||
|
|
||||||
|
## 1. Überprüfe Git-Tags auf dem Remote-Server
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Im Projekt-Verzeichnis auf dem Remote-Server
|
||||||
|
cd /path/to/hoerdle
|
||||||
|
|
||||||
|
# Zeige alle Tags
|
||||||
|
git tag -l
|
||||||
|
|
||||||
|
# Zeige aktuellen Tag/Version
|
||||||
|
git describe --tags --always
|
||||||
|
|
||||||
|
# Wenn keine Tags angezeigt werden:
|
||||||
|
git fetch --tags
|
||||||
|
git describe --tags --always
|
||||||
|
```
|
||||||
|
|
||||||
|
**Erwartetes Ergebnis:** Sollte `v0.1.0.2` oder ähnlich zeigen
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Überprüfe die version.txt im Container
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Zeige den Inhalt der Version-Datei im laufenden Container
|
||||||
|
docker exec hoerdle cat /app/version.txt
|
||||||
|
|
||||||
|
# Sollte die Version zeigen, z.B. "v0.1.0.2"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Erwartetes Ergebnis:** Die aktuelle Version, nicht "unknown" oder "dev"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Überprüfe die Umgebungsvariable im Container
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Zeige alle Umgebungsvariablen
|
||||||
|
docker exec hoerdle env | grep APP_VERSION
|
||||||
|
|
||||||
|
# Sollte APP_VERSION=v0.1.0.2 oder ähnlich zeigen
|
||||||
|
```
|
||||||
|
|
||||||
|
**Erwartetes Ergebnis:** `APP_VERSION=v0.1.0.2`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Überprüfe die Container-Logs beim Start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Zeige die letzten Logs beim Container-Start
|
||||||
|
docker logs hoerdle | head -20
|
||||||
|
|
||||||
|
# Suche speziell nach Version-Ausgaben
|
||||||
|
docker logs hoerdle | grep -i version
|
||||||
|
```
|
||||||
|
|
||||||
|
**Erwartetes Ergebnis:** Eine Zeile wie "App version: v0.1.0.2"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Teste die API direkt
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Rufe die Version-API auf
|
||||||
|
curl http://localhost:3010/api/version
|
||||||
|
|
||||||
|
# Sollte JSON zurückgeben: {"version":"v0.1.0.2"}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Erwartetes Ergebnis:** `{"version":"v0.1.0.2"}`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Überprüfe wann der Container gebaut wurde
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Zeige Image-Informationen
|
||||||
|
docker images | grep hoerdle
|
||||||
|
|
||||||
|
# Zeige detaillierte Container-Informationen
|
||||||
|
docker inspect hoerdle | grep -i created
|
||||||
|
```
|
||||||
|
|
||||||
|
**Wichtig:** Wenn das Image vor deinem letzten Deployment erstellt wurde, wurde es noch nicht neu gebaut!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Überprüfe Build-Logs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Baue das Image neu und beobachte die Ausgabe
|
||||||
|
docker compose build --no-cache 2>&1 | tee build.log
|
||||||
|
|
||||||
|
# Suche nach der Version-Ausgabe im Build
|
||||||
|
grep -i "Building version" build.log
|
||||||
|
```
|
||||||
|
|
||||||
|
**Erwartetes Ergebnis:** Eine Zeile wie "Building version: v0.1.0.2"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Häufige Probleme und Lösungen
|
||||||
|
|
||||||
|
### Problem 1: Tags nicht auf dem Server
|
||||||
|
```bash
|
||||||
|
git fetch --tags
|
||||||
|
git describe --tags --always
|
||||||
|
```
|
||||||
|
|
||||||
|
### Problem 2: Container wurde nicht neu gebaut
|
||||||
|
```bash
|
||||||
|
docker compose build --no-cache
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### Problem 3: Alte version.txt im Container
|
||||||
|
```bash
|
||||||
|
# Stoppe Container, lösche Image, baue neu
|
||||||
|
docker compose down
|
||||||
|
docker rmi $(docker images | grep hoerdle | awk '{print $3}')
|
||||||
|
docker compose build --no-cache
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### Problem 4: .git Verzeichnis nicht im Build-Context
|
||||||
|
```bash
|
||||||
|
# Überprüfe ob .git existiert
|
||||||
|
ls -la .git
|
||||||
|
|
||||||
|
# Überprüfe .dockerignore (sollte .git NICHT ausschließen)
|
||||||
|
cat .dockerignore 2>/dev/null || echo "Keine .dockerignore Datei"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Vollständiger Neustart (wenn nichts anderes hilft)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Stoppe alles
|
||||||
|
docker compose down
|
||||||
|
|
||||||
|
# 2. Lösche alte Images
|
||||||
|
docker rmi $(docker images | grep hoerdle | awk '{print $3}')
|
||||||
|
|
||||||
|
# 3. Hole neueste Änderungen und Tags
|
||||||
|
git pull
|
||||||
|
git fetch --tags
|
||||||
|
|
||||||
|
# 4. Überprüfe Version lokal
|
||||||
|
git describe --tags --always
|
||||||
|
|
||||||
|
# 5. Baue komplett neu
|
||||||
|
docker compose build --no-cache
|
||||||
|
|
||||||
|
# 6. Starte Container
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
# 7. Überprüfe Logs
|
||||||
|
docker logs hoerdle | grep -i version
|
||||||
|
|
||||||
|
# 8. Teste API
|
||||||
|
curl http://localhost:3010/api/version
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Debugging-Befehl für alle Checks auf einmal
|
||||||
|
|
||||||
|
```bash
|
||||||
|
echo "=== Git Tags ===" && \
|
||||||
|
git describe --tags --always && \
|
||||||
|
echo -e "\n=== version.txt im Container ===" && \
|
||||||
|
docker exec hoerdle cat /app/version.txt 2>/dev/null || echo "Container läuft nicht oder Datei fehlt" && \
|
||||||
|
echo -e "\n=== APP_VERSION Env ===" && \
|
||||||
|
docker exec hoerdle env | grep APP_VERSION || echo "Variable nicht gesetzt" && \
|
||||||
|
echo -e "\n=== API Response ===" && \
|
||||||
|
curl -s http://localhost:3010/api/version && \
|
||||||
|
echo -e "\n\n=== Container Created ===" && \
|
||||||
|
docker inspect hoerdle | grep -i created | head -1
|
||||||
|
```
|
||||||
|
|
||||||
|
Kopiere diesen Befehl und führe ihn auf dem Remote-Server aus. Schicke mir die Ausgabe!
|
||||||
84
DEPLOYMENT.md
Normal file
84
DEPLOYMENT.md
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
# Deployment Guide
|
||||||
|
|
||||||
|
## Automated Deployment
|
||||||
|
|
||||||
|
Use the deployment script for zero-downtime deployments:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./scripts/deploy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
This script will:
|
||||||
|
1. Create a database backup
|
||||||
|
2. Pull latest changes from git
|
||||||
|
3. Fetch all git tags (for version display)
|
||||||
|
4. Build the new Docker image
|
||||||
|
5. Restart the container with minimal downtime
|
||||||
|
6. Clean up old images
|
||||||
|
|
||||||
|
## Manual Deployment
|
||||||
|
|
||||||
|
If you need to deploy manually:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Pull latest changes
|
||||||
|
git pull
|
||||||
|
|
||||||
|
# Fetch tags (important for version display!)
|
||||||
|
git fetch --tags
|
||||||
|
|
||||||
|
# Build and restart
|
||||||
|
docker compose build
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## Version Display
|
||||||
|
|
||||||
|
The app displays the current version in the footer. The version is determined as follows:
|
||||||
|
|
||||||
|
1. **During Docker build**: The version is extracted from git tags using `git describe --tags --always`
|
||||||
|
2. **At runtime**: The version is read from `/app/version.txt` and exposed via the `/api/version` endpoint
|
||||||
|
3. **Local development**: The version is extracted directly from git on each request
|
||||||
|
|
||||||
|
### Building with a specific version
|
||||||
|
|
||||||
|
You can override the version during build:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose build --build-arg APP_VERSION=v1.2.3
|
||||||
|
```
|
||||||
|
|
||||||
|
### Troubleshooting
|
||||||
|
|
||||||
|
If the version shows as "dev" or "unknown":
|
||||||
|
|
||||||
|
1. Make sure git tags are pushed to the remote repository:
|
||||||
|
```bash
|
||||||
|
git push --tags
|
||||||
|
```
|
||||||
|
|
||||||
|
2. On the deployment server, fetch the tags:
|
||||||
|
```bash
|
||||||
|
git fetch --tags
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Verify tags are available:
|
||||||
|
```bash
|
||||||
|
git describe --tags --always
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Rebuild the Docker image:
|
||||||
|
```bash
|
||||||
|
docker compose build --no-cache
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## Health Check
|
||||||
|
|
||||||
|
The container includes a health check that monitors the `/api/daily` endpoint. Check the health status:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker ps
|
||||||
|
```
|
||||||
|
|
||||||
|
Look for the "healthy" status in the STATUS column.
|
||||||
12
Dockerfile
12
Dockerfile
@@ -14,14 +14,22 @@ RUN npm ci
|
|||||||
FROM base AS builder
|
FROM base AS builder
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Accept version as build argument (optional)
|
||||||
|
ARG APP_VERSION=""
|
||||||
|
|
||||||
# Install git to extract version information
|
# Install git to extract version information
|
||||||
RUN apk add --no-cache git
|
RUN apk add --no-cache git
|
||||||
|
|
||||||
COPY --from=deps /app/node_modules ./node_modules
|
COPY --from=deps /app/node_modules ./node_modules
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
# Extract version from git
|
# Extract version: use build arg if provided, otherwise get from git
|
||||||
RUN git describe --tags --always 2>/dev/null > /tmp/version.txt || echo "unknown" > /tmp/version.txt
|
RUN if [ -n "$APP_VERSION" ]; then \
|
||||||
|
echo "$APP_VERSION" > /tmp/version.txt; \
|
||||||
|
else \
|
||||||
|
git describe --tags --always 2>/dev/null > /tmp/version.txt || echo "unknown" > /tmp/version.txt; \
|
||||||
|
fi && \
|
||||||
|
echo "Building version: $(cat /tmp/version.txt)"
|
||||||
|
|
||||||
# Next.js collects completely anonymous telemetry data about general usage.
|
# Next.js collects completely anonymous telemetry data about general usage.
|
||||||
# Learn more here: https://nextjs.org/telemetry
|
# Learn more here: https://nextjs.org/telemetry
|
||||||
|
|||||||
@@ -1,14 +1,32 @@
|
|||||||
import { NextResponse } from 'next/server';
|
import { NextResponse } from 'next/server';
|
||||||
import { execSync } from 'child_process';
|
import { execSync } from 'child_process';
|
||||||
|
import { readFileSync, existsSync } from 'fs';
|
||||||
|
import { join } from 'path';
|
||||||
|
|
||||||
export async function GET() {
|
export async function GET() {
|
||||||
try {
|
try {
|
||||||
// First check if version is set via environment variable (Docker build)
|
// First check if version file exists (Docker deployment)
|
||||||
|
// Try both /app/version.txt (Docker) and ./version.txt (local)
|
||||||
|
const versionPaths = [
|
||||||
|
'/app/version.txt',
|
||||||
|
join(process.cwd(), 'version.txt')
|
||||||
|
];
|
||||||
|
|
||||||
|
for (const versionFilePath of versionPaths) {
|
||||||
|
if (existsSync(versionFilePath)) {
|
||||||
|
const version = readFileSync(versionFilePath, 'utf-8').trim();
|
||||||
|
if (version && version !== 'unknown') {
|
||||||
|
return NextResponse.json({ version });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback: check environment variable
|
||||||
if (process.env.APP_VERSION) {
|
if (process.env.APP_VERSION) {
|
||||||
return NextResponse.json({ version: process.env.APP_VERSION });
|
return NextResponse.json({ version: process.env.APP_VERSION });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to get the git tag/version
|
// Fallback: try to get from git (local development)
|
||||||
let version = 'dev';
|
let version = 'dev';
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -50,6 +50,10 @@ fi
|
|||||||
echo "📥 Pulling latest changes from git..."
|
echo "📥 Pulling latest changes from git..."
|
||||||
git pull
|
git pull
|
||||||
|
|
||||||
|
# Fetch all tags
|
||||||
|
echo "🏷️ Fetching git tags..."
|
||||||
|
git fetch --tags
|
||||||
|
|
||||||
# Build new image in background (doesn't stop running container)
|
# Build new image in background (doesn't stop running container)
|
||||||
echo "🔨 Building new Docker image (this runs while app is still online)..."
|
echo "🔨 Building new Docker image (this runs while app is still online)..."
|
||||||
docker compose build
|
docker compose build
|
||||||
|
|||||||
Reference in New Issue
Block a user