Как использовать Litestream с SQLite и Prisma


Originally posted on: https://arnavgosain.com/sqlite-prisma-litestream

Один из моих побочных проектов — Rune, альтернативный почтовый клиент, созданный для чтения и аннотирования содержимого информационных бюллетеней.

Rune построен с использованием Remix1 и использует Prisma2 в качестве ORM. Prisma поддерживает довольно много баз данных, из которых я предпочитаю Postgres. Но я хотел сохранить простоту и не хотел устанавливать полноценный экземпляр Postgres, поэтому я решил использовать SQLite.

Поскольку я предпочитаю разворачивать систему через Docker на Railway.app, мне нужен был способ сохранить SQLite, так как контейнеры Docker обновляются при каждом развертывании. Litestream3 был идеальным инструментом для этой работы.

Но поскольку Litestream работает только с режимом журналирования WAL в SQLite4то перед запуском приложения Remix его необходимо включить на базе данных SQLite.

enable-wal.js.

const { PrismaClient } = require("@prisma/client");

let client = new PrismaClient();

client.$queryRaw`PRAGMA journal_mode = WAL;`
  .then(() => {
    console.log("ENABLED WAL MODE FOR DATABASE");
  })
  .catch((err) => {
    console.log("DB SETUP FAILED", err);
    process.exit(1);
  });
Вход в полноэкранный режим Выход из полноэкранного режима

run.sh

#!/bin/bash

set -ex

## Restores the database from S3
litestream restore -v -config /etc/litestream.yml -if-replica-exists -o /data/db /data/db

## Runs migrations on the restored database
npx prisma migrate deploy

## Enables WAL Mode
node ./scripts/enable-wal.js

npx concurrently "litestream replicate -config /etc/litestream.yml" "npm run start"
Вход в полноэкранный режим Выход из полноэкранного режима

Dockerfile

CMD ["bash", "./scripts/run.sh"]
Войти в полноэкранный режим Выход из полноэкранного режима

Пояснение

  1. Dockerfile запускает сценарий run.sh.
  2. Сценарий сначала восстанавливает последний снимок базы данных из S3 с помощью Litestream.
  3. Он запускает npx prisma migrate deploy для развертывания всех ожидающих миграций.
  4. Затем запускается enable-wal.js для включения режима журналирования WAL с помощью $queryRaw PrismaClient.
  5. Наконец, приложение Remix & Litestream запускаются одновременно с помощью команды concurrently.5 CLI.


  1. https://remix.run

  2. https://prisma.io

  3. https://litestream.io

  4. https://sqlite.org/wal.html

  5. https://www.npmjs.com/package/concurrently

Оцените статью
Procodings.ru
Добавить комментарий