mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-04-25 14:12:27 +00:00
simplex-chat-nodejs: add PostgreSQL backend build support (#6845)
* simplex-chat-nodejs: add PostgreSQL backend build support * simplex-chat-nodejs: fix postgres install command in README
This commit is contained in:
114
.github/workflows/build.yml
vendored
114
.github/workflows/build.yml
vendored
@@ -377,6 +377,100 @@ jobs:
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# =================================
|
||||
# Linux PostgreSQL Library Build
|
||||
# =================================
|
||||
|
||||
build-linux-postgres:
|
||||
name: "ubuntu-22.04-x86_64 (Postgres lib), GHC: ${{ needs.variables.outputs.GHC_VER }}"
|
||||
needs: [maybe-release, variables]
|
||||
runs-on: ubuntu-22.04
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Get UID and GID
|
||||
id: ids
|
||||
run: |
|
||||
echo "uid=$(id -u)" >> $GITHUB_OUTPUT
|
||||
echo "gid=$(id -g)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Free disk space
|
||||
shell: bash
|
||||
run: ./scripts/ci/linux_util_free_space.sh
|
||||
|
||||
- name: Restore cached build
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
~/.cabal/store
|
||||
dist-newstyle
|
||||
key: ubuntu-22.04-x86_64-postgres-ghc${{ needs.variables.outputs.GHC_VER }}-${{ hashFiles('cabal.project', 'simplex-chat.cabal') }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: simplex-chat/docker-setup-buildx-action@v3
|
||||
|
||||
- name: Build and cache Docker image
|
||||
uses: simplex-chat/docker-build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
load: true
|
||||
file: Dockerfile.build
|
||||
tags: build/22.04:latest
|
||||
build-args: |
|
||||
TAG=22.04
|
||||
HASH=sha256:5c8b2c0a6c745bc177669abfaa716b4bc57d58e2ea3882fb5da67f4d59e3dda5
|
||||
GHC=${{ needs.variables.outputs.GHC_VER }}
|
||||
USER_UID=${{ steps.ids.outputs.uid }}
|
||||
USER_GID=${{ steps.ids.outputs.gid }}
|
||||
|
||||
- name: Start container
|
||||
shell: bash
|
||||
run: |
|
||||
docker run -t -d \
|
||||
--name builder \
|
||||
-v ~/.cabal:/root/.cabal \
|
||||
-v /home/runner/work/_temp:/home/runner/work/_temp \
|
||||
-v ${{ github.workspace }}:/project \
|
||||
build/22.04:latest
|
||||
|
||||
- name: Prepare cabal.project.local
|
||||
shell: bash
|
||||
run: |
|
||||
echo "ignore-project: False" >> cabal.project.local
|
||||
echo "package direct-sqlcipher" >> cabal.project.local
|
||||
echo " flags: +openssl" >> cabal.project.local
|
||||
|
||||
- name: Build postgres library
|
||||
shell: docker exec -t builder sh -eu {0}
|
||||
run: |
|
||||
cabal clean
|
||||
cabal update
|
||||
scripts/desktop/build-lib-linux.sh postgres
|
||||
|
||||
- name: Copy libs from container
|
||||
shell: bash
|
||||
run: |
|
||||
ARCH=x86_64
|
||||
GHC_VER=${{ needs.variables.outputs.GHC_VER }}
|
||||
BUILD_DIR=$(echo dist-newstyle/build/${ARCH}-linux/ghc-${GHC_VER}/simplex-chat-*)
|
||||
mkdir -p postgres-libs
|
||||
cp ${BUILD_DIR}/build/libsimplex.so postgres-libs/
|
||||
cp ${BUILD_DIR}/build/deps/* postgres-libs/
|
||||
|
||||
- name: Upload postgres libs artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: simplex-libs-linux-postgres-x86_64
|
||||
path: postgres-libs/
|
||||
|
||||
- name: Fix permissions for cache
|
||||
shell: bash
|
||||
run: |
|
||||
sudo chmod -R 777 dist-newstyle ~/.cabal
|
||||
sudo chown -R $(id -u):$(id -g) dist-newstyle ~/.cabal
|
||||
|
||||
# =========================
|
||||
# MacOS Build
|
||||
# =========================
|
||||
@@ -613,7 +707,7 @@ jobs:
|
||||
|
||||
release-nodejs-libs:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [build-linux, build-macos]
|
||||
needs: [build-linux, build-linux-postgres, build-macos]
|
||||
if: startsWith(github.ref, 'refs/tags/v') && (!cancelled())
|
||||
steps:
|
||||
- name: Checkout current repository
|
||||
@@ -622,6 +716,13 @@ jobs:
|
||||
- name: Install packages for archiving
|
||||
run: sudo apt install -y msitools gcc-mingw-w64
|
||||
|
||||
- name: Download postgres libs artifact
|
||||
if: needs.build-linux-postgres.result == 'success'
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: simplex-libs-linux-postgres-x86_64
|
||||
path: ${{ runner.temp }}/postgres-libs
|
||||
|
||||
- name: Build archives
|
||||
run: |
|
||||
INIT_DIR='${{ runner.temp }}/artifacts'
|
||||
@@ -678,6 +779,17 @@ jobs:
|
||||
zip -r "${PREFIX}-windows-x86_64.zip" libs
|
||||
mv "${PREFIX}-windows-x86_64.zip" "$RELEASE_DIR" && cd "$INIT_DIR"
|
||||
|
||||
# Linux PostgreSQL (only if postgres build succeeded)
|
||||
# -------------------------------------------------
|
||||
POSTGRES_LIBS='${{ runner.temp }}/postgres-libs'
|
||||
if [ -d "$POSTGRES_LIBS" ]; then
|
||||
mkdir -p linux-postgres/libs
|
||||
cp "${POSTGRES_LIBS}"/*.so linux-postgres/libs/
|
||||
cd linux-postgres
|
||||
zip -r "${PREFIX}-linux-x86_64-postgres.zip" libs
|
||||
mv "${PREFIX}-linux-x86_64-postgres.zip" "$RELEASE_DIR" && cd "$INIT_DIR"
|
||||
fi
|
||||
|
||||
- name: Create release in libs repo and upload artifacts
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
|
||||
@@ -62,6 +62,32 @@ There is an example with more options in [./examples/squaring-bot.ts](./examples
|
||||
|
||||
You can run it with: `npx ts-node ./examples/squaring-bot.ts`
|
||||
|
||||
## PostgreSQL backend
|
||||
|
||||
By default, the package uses SQLite. To use PostgreSQL instead:
|
||||
|
||||
```bash
|
||||
npm install simplex-chat --simplex_backend=postgres
|
||||
```
|
||||
|
||||
Or persist the setting in `.npmrc`:
|
||||
|
||||
```ini
|
||||
simplex_backend=postgres
|
||||
```
|
||||
|
||||
### Prerequisites (PostgreSQL)
|
||||
|
||||
- `libpq5` must be installed on the host system (`apt install libpq5` on Debian/Ubuntu)
|
||||
- PostgreSQL backend is only available for Linux x86_64
|
||||
- A PostgreSQL server accessible via connection string
|
||||
|
||||
### API difference
|
||||
|
||||
With the PostgreSQL backend, `chatMigrateInit` arguments change meaning:
|
||||
- First argument: schema prefix (instead of DB file prefix)
|
||||
- Second argument: connection string (instead of encryption key)
|
||||
|
||||
## Documentation
|
||||
|
||||
The library docs are [here](./docs/README.md).
|
||||
|
||||
@@ -5,6 +5,18 @@ const extract = require('extract-zip');
|
||||
|
||||
const GITHUB_REPO = 'simplex-chat/simplex-chat-libs';
|
||||
const RELEASE_TAG = 'v6.5.0-beta.9';
|
||||
const BACKEND = (process.env.SIMPLEX_BACKEND || process.env.npm_config_simplex_backend || 'sqlite').toLowerCase();
|
||||
|
||||
if (BACKEND !== 'sqlite' && BACKEND !== 'postgres') {
|
||||
console.error(`✗ Invalid SIMPLEX_BACKEND: "${BACKEND}". Must be "sqlite" or "postgres".`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if (BACKEND === 'postgres' && (process.platform !== 'linux' || process.arch !== 'x64')) {
|
||||
console.error(`✗ SIMPLEX_BACKEND=postgres is only supported on Linux x86_64.`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const ROOT_DIR = process.cwd(); // Root of the package being installed
|
||||
const LIBS_DIR = path.join(ROOT_DIR, 'libs')
|
||||
const INSTALLED_FILE = path.join(LIBS_DIR, 'installed.txt');
|
||||
@@ -56,11 +68,12 @@ function isAlreadyInstalled() {
|
||||
|
||||
try {
|
||||
const installedVersion = fs.readFileSync(INSTALLED_FILE, 'utf-8').trim();
|
||||
if (installedVersion === RELEASE_TAG) {
|
||||
console.log(`✓ Libraries version ${RELEASE_TAG} already installed`);
|
||||
const expectedVersion = `${RELEASE_TAG}:${BACKEND}`;
|
||||
if (installedVersion === expectedVersion) {
|
||||
console.log(`✓ Libraries version ${RELEASE_TAG}:${BACKEND} already installed`);
|
||||
return true;
|
||||
} else {
|
||||
console.log(`Version mismatch: installed ${installedVersion}, need ${RELEASE_TAG}`);
|
||||
console.log(`Version mismatch: installed ${installedVersion}, need ${expectedVersion}`);
|
||||
cleanLibsDirectory();
|
||||
return false;
|
||||
}
|
||||
@@ -79,12 +92,14 @@ async function install() {
|
||||
|
||||
const { platformName, archName } = getPlatformInfo();
|
||||
const repoName = GITHUB_REPO.split('/')[1];
|
||||
const zipFilename = `${repoName}-${platformName}-${archName}.zip`;
|
||||
const backendSuffix = BACKEND === 'postgres' ? '-postgres' : '';
|
||||
const zipFilename = `${repoName}-${platformName}-${archName}${backendSuffix}.zip`;
|
||||
const ZIP_URL = `https://github.com/${GITHUB_REPO}/releases/download/${RELEASE_TAG}/${zipFilename}`;
|
||||
const ZIP_PATH = path.join(ROOT_DIR, zipFilename);
|
||||
const TEMP_EXTRACT_DIR = path.join(ROOT_DIR, '.temp-extract');
|
||||
|
||||
console.log(`Detected: ${platformName} ${archName}`);
|
||||
console.log(`Backend: ${BACKEND}`);
|
||||
console.log(`Downloading: ${zipFilename}`);
|
||||
|
||||
// Create libs directory
|
||||
@@ -124,8 +139,8 @@ async function install() {
|
||||
}
|
||||
|
||||
// Write installed.txt with version
|
||||
fs.writeFileSync(INSTALLED_FILE, RELEASE_TAG, 'utf-8');
|
||||
console.log(`✓ Wrote version ${RELEASE_TAG} to installed.txt`);
|
||||
fs.writeFileSync(INSTALLED_FILE, `${RELEASE_TAG}:${BACKEND}`, 'utf-8');
|
||||
console.log(`✓ Wrote version ${RELEASE_TAG}:${BACKEND} to installed.txt`);
|
||||
|
||||
// Cleanup
|
||||
fs.rmSync(TEMP_EXTRACT_DIR, { recursive: true, force: true });
|
||||
|
||||
@@ -8,6 +8,7 @@ function readlink() {
|
||||
|
||||
OS=linux
|
||||
ARCH="$(uname -m)"
|
||||
DATABASE_BACKEND="${1:-sqlite}"
|
||||
GHC_VERSION=9.6.3
|
||||
|
||||
if [ "$ARCH" == "aarch64" ]; then
|
||||
@@ -25,7 +26,13 @@ for elem in "${exports[@]}"; do count=$(grep -R "$elem$" libsimplex.dll.def | wc
|
||||
for elem in "${exports[@]}"; do count=$(grep -R "\"$elem\"" flake.nix | wc -l); if [ $count -ne 2 ]; then echo Wrong exports in flake.nix. Add \"$elem\" in two places of the file; exit 1; fi ; done
|
||||
|
||||
#rm -rf $BUILD_DIR
|
||||
cabal build lib:simplex-chat --ghc-options='-optl-Wl,-rpath,$ORIGIN -optl-Wl,-soname,libsimplex.so -flink-rts -threaded' --constraint 'simplexmq +client_library' --constraint 'simplex-chat +client_library'
|
||||
if [[ "$DATABASE_BACKEND" == "postgres" ]]; then
|
||||
echo "Building with postgres backend..."
|
||||
cabal build lib:simplex-chat --ghc-options='-optl-Wl,-rpath,$ORIGIN -optl-Wl,-soname,libsimplex.so -flink-rts -threaded' --constraint 'simplexmq +client_library +client_postgres' --constraint 'simplex-chat +client_library +client_postgres'
|
||||
else
|
||||
echo "Building with sqlite backend..."
|
||||
cabal build lib:simplex-chat --ghc-options='-optl-Wl,-rpath,$ORIGIN -optl-Wl,-soname,libsimplex.so -flink-rts -threaded' --constraint 'simplexmq +client_library' --constraint 'simplex-chat +client_library'
|
||||
fi
|
||||
cd $BUILD_DIR/build
|
||||
mv libHSsimplex-chat-*-inplace-ghc${GHC_VERSION}.so libsimplex.so 2> /dev/null || true
|
||||
#patchelf --add-needed libHSrts_thr-ghc${GHC_VERSION}.so libsimplex.so
|
||||
|
||||
Reference in New Issue
Block a user