fix(Docker): Can change URL in api docs

This commit is contained in:
Chris Troutner
2026-04-01 08:57:10 -07:00
parent 5d77880a0e
commit 67b141fc03
8 changed files with 90 additions and 7 deletions
+3
View File
@@ -16,6 +16,9 @@ LOCAL_RESTURL=http://localhost:5942/v6
# END INFRASTRUCTURE SETUP # END INFRASTRUCTURE SETUP
# Public base URL for apiDoc HTML (optional; used by Docker entrypoint before `npm run docs`).
#APIDOC_URL=https://api.example.com
# START ACCESS CONTROL # START ACCESS CONTROL
+2
View File
@@ -187,6 +187,8 @@ FULCRUM_API=http://172.17.0.1:3001/v1
SLP_INDEXER_API=http://172.17.0.1:5010 SLP_INDEXER_API=http://172.17.0.1:5010
``` ```
Set `APIDOC_URL` to the public base URL for your deployment (for example `https://api.example.com` or your subdomain). The container entrypoint applies this value to `apidoc.json` and the `apidoc` section of `package.json`, then runs `npm run docs` before starting the server so generated HTML matches each instance. The compose file mounts `./.env` to `/home/safeuser/psf-bch-api/.env` so it matches `dotenv.config()` in the app.
4. Build the Docker image: 4. Build the Docker image:
`docker-compose build --no-cache` `docker-compose build --no-cache`
+19
View File
@@ -0,0 +1,19 @@
# 2026-04-02 Update Log
## Summary
Docker deployments now run `npm run docs` at container start via an entrypoint script, and optionally apply `APIDOC_URL` from the environment so apiDoc HTML matches each deployment subdomain or public URL.
## Changes Made
- Added `scripts/patch-apidoc-from-env.js` to set `apidoc.json` and `package.json` `apidoc.url` from `APIDOC_URL` (dotenv loads the project `.env`, same path as `bin/server.js`).
- Added `production/docker/entrypoint.sh` to run the patch script, `npm run docs`, then `exec npm start`.
- Updated `production/docker/Dockerfile` to remove build-time `npm run docs`, copy the entrypoint and patch script from the build context, and use `ENTRYPOINT` for the shell script.
- Updated `production/docker/docker-compose.yml` to use build `context: ../..` and `dockerfile: production/docker/Dockerfile` so COPY paths resolve from the repository root.
- Compose mounts `./.env` at `/home/safeuser/psf-bch-api/.env` so the app and entrypoint share one file (not `/home/safeuser/.env`).
- Documented `APIDOC_URL` in `.env-example`, `production/docker/.env-example`, and `README.md` (Production Docker section).
## Outcome
- Operators can set `APIDOC_URL` in the mounted `.env` (for example `https://api.example.com`) per instance without rebuilding the image for each subdomain.
- The HTML apiDoc bundle is regenerated on every container start so it stays aligned with the configured URL.
+4
View File
@@ -16,6 +16,10 @@ LOCAL_RESTURL=http://172.17.0.1:5942/v6
# END INFRASTRUCTURE SETUP # END INFRASTRUCTURE SETUP
# Public base URL for apiDoc HTML (set per deployment / subdomain).
# Applied at container start before `npm run docs`. Example: https://api.example.com
#APIDOC_URL=https://api.example.com
# START ACCESS CONTROL # START ACCESS CONTROL
+7 -5
View File
@@ -57,13 +57,15 @@ RUN git checkout ct-unstable
RUN npm install RUN npm install
RUN npm install minimal-slp-wallet RUN npm install minimal-slp-wallet
# Generate the API docs # Runtime entrypoint + apidoc URL patch (see production/docker/entrypoint.sh).
RUN npm run docs # API docs are generated at container start so APIDOC_URL can be set per deployment.
COPY production/docker/entrypoint.sh /home/safeuser/psf-bch-api/entrypoint.sh
COPY scripts/patch-apidoc-from-env.js /home/safeuser/psf-bch-api/scripts/patch-apidoc-from-env.js
RUN chmod +x /home/safeuser/psf-bch-api/entrypoint.sh
COPY .env .env # Runtime `.env` is provided by docker-compose (mount at psf-bch-api/.env), not baked into the image.
ENTRYPOINT ["/home/safeuser/psf-bch-api/entrypoint.sh"]
CMD ["npm", "start"]
# Used to debug the container. # Used to debug the container.
#COPY temp.js temp.js #COPY temp.js temp.js
+4 -2
View File
@@ -2,7 +2,9 @@
services: services:
psf-bch-api: psf-bch-api:
build: . build:
context: ../..
dockerfile: production/docker/Dockerfile
container_name: psf-bch-api container_name: psf-bch-api
logging: logging:
driver: 'json-file' driver: 'json-file'
@@ -16,7 +18,7 @@ services:
- '5942:5942' # <host port>:<container port> - '5942:5942' # <host port>:<container port>
volumes: volumes:
#- ./start-rest2nostr.sh:/home/safeuser/REST2NOSTR/start-rest2nostr.sh #- ./start-rest2nostr.sh:/home/safeuser/REST2NOSTR/start-rest2nostr.sh
- ./.env:/home/safeuser/.env - ./.env:/home/safeuser/psf-bch-api/.env
- ../data:/home/safeuser/psf-bch-api/production/data - ../data:/home/safeuser/psf-bch-api/production/data
- ../data/logs:/home/safeuser/psf-bch-api/logs - ../data/logs:/home/safeuser/psf-bch-api/logs
restart: always restart: always
+10
View File
@@ -0,0 +1,10 @@
#!/bin/bash
set -euo pipefail
cd /home/safeuser/psf-bch-api
node scripts/patch-apidoc-from-env.js
npm run docs
exec npm start
+41
View File
@@ -0,0 +1,41 @@
/*
Applies APIDOC_URL from the environment to apidoc.json and package.json (apidoc.url).
Loads dotenv from the project root `.env` (same file as `dotenv.config()` in bin/server.js).
Exits without changes when APIDOC_URL is unset or empty.
*/
import dotenv from 'dotenv'
import { readFileSync, writeFileSync } from 'fs'
import { dirname, resolve } from 'path'
import { fileURLToPath } from 'url'
const __dirname = dirname(fileURLToPath(import.meta.url))
const root = resolve(__dirname, '..')
dotenv.config({ path: resolve(root, '.env') })
const url = process.env.APIDOC_URL
if (url === undefined || url === null || String(url).trim() === '') {
process.exit(0)
}
const normalized = String(url).trim()
function patchApidocJson () {
const path = resolve(root, 'apidoc.json')
const data = JSON.parse(readFileSync(path, 'utf8'))
data.url = normalized
data.sampleUrl = normalized
writeFileSync(path, `${JSON.stringify(data, null, 2)}\n`)
}
function patchPackageJson () {
const path = resolve(root, 'package.json')
const data = JSON.parse(readFileSync(path, 'utf8'))
if (!data.apidoc) data.apidoc = {}
data.apidoc.url = normalized
writeFileSync(path, `${JSON.stringify(data, null, 2)}\n`)
}
patchApidocJson()
patchPackageJson()