feat: Docker-Compose-Setup zum Selbsthosten
Dreistufiges Image: Abhängigkeiten, Build, Laufzeit. Im Endbild landen nur der standalone-Server, die statischen Dateien und die Prisma-CLI — letztere, damit der Container ausstehende Migrationen beim Start selbst einspielt. Der Entrypoint wartet per TCP-Verbindung auf die Datenbank, statt dafür ein zusätzliches Paket ins Laufzeitimage zu ziehen.
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
#!/bin/sh
|
||||
# Startskript des Flimmer-Containers.
|
||||
#
|
||||
# Vor dem Start der App werden ausstehende Datenbankmigrationen ausgespielt.
|
||||
# Das ist bewusst hier und nicht im Image-Build: die Datenbank existiert erst
|
||||
# zur Laufzeit, und beim Update soll das Schema automatisch nachziehen.
|
||||
set -e
|
||||
|
||||
if [ -z "$DATABASE_URL" ]; then
|
||||
echo "Flimmer: DATABASE_URL ist nicht gesetzt — Abbruch." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Warten, bis der Datenbank-Port annimmt. Bewusst nur eine TCP-Verbindung über
|
||||
# Node-Bordmittel — so hängt der Start nicht an einem zusätzlichen Paket.
|
||||
echo "Flimmer: warte auf die Datenbank ..."
|
||||
node -e '
|
||||
const net = require("node:net");
|
||||
const url = new URL(process.env.DATABASE_URL);
|
||||
const host = url.hostname;
|
||||
const port = Number(url.port || 5432);
|
||||
const deadline = Date.now() + 120000;
|
||||
|
||||
function attempt() {
|
||||
const socket = net.connect({ host, port });
|
||||
socket.setTimeout(3000);
|
||||
socket.on("connect", () => { socket.end(); process.exit(0); });
|
||||
const retry = () => {
|
||||
socket.destroy();
|
||||
if (Date.now() > deadline) {
|
||||
console.error("Flimmer: Datenbank " + host + ":" + port + " nach 120 s nicht erreichbar.");
|
||||
process.exit(1);
|
||||
}
|
||||
setTimeout(attempt, 2000);
|
||||
};
|
||||
socket.on("error", retry);
|
||||
socket.on("timeout", retry);
|
||||
}
|
||||
attempt();
|
||||
'
|
||||
|
||||
echo "Flimmer: spiele Migrationen ein ..."
|
||||
node node_modules/prisma/build/index.js migrate deploy
|
||||
|
||||
echo "Flimmer: starte Anwendung."
|
||||
exec "$@"
|
||||
Reference in New Issue
Block a user