build: run the container through dotenvx with the encrypted .env.production
- image installs @dotenvx/dotenvx (pinned) and starts via 'dotenvx run -f .env.production --strict -- node server.js' - only DOTENV_PRIVATE_KEY_PRODUCTION is supplied at runtime; without it the container exits(1) (MISSING_PRIVATE_KEY) instead of booting with undecryptable credentials - .env.production copied with --chown=node:node (the source mode is 600) - .dockerignore excludes .env/.env.local/.env.keys so local envs and the private keys never enter the build context
This commit is contained in:
@@ -4,6 +4,10 @@
|
|||||||
openspec
|
openspec
|
||||||
tools/node_modules
|
tools/node_modules
|
||||||
tools/test
|
tools/test
|
||||||
|
# never bake local env files or the private keys into the image
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
.env.keys
|
||||||
Dockerfile
|
Dockerfile
|
||||||
.dockerignore
|
.dockerignore
|
||||||
README.md
|
README.md
|
||||||
|
|||||||
+12
-2
@@ -3,19 +3,29 @@
|
|||||||
# on the field laptop (the wizard reaches it at http://127.0.0.1:9000 from the
|
# on the field laptop (the wizard reaches it at http://127.0.0.1:9000 from the
|
||||||
# browser, so the container location does not matter).
|
# browser, so the container location does not matter).
|
||||||
#
|
#
|
||||||
|
# The encrypted .env.production is baked in; the private key is supplied at
|
||||||
|
# runtime and never stored in the image:
|
||||||
|
#
|
||||||
# docker build -t yreka-tools .
|
# docker build -t yreka-tools .
|
||||||
# docker run -d -p 4173:4173 --name yreka-tools yreka-tools
|
# docker run -d -p 4173:4173 --name yreka-tools \
|
||||||
|
# --env DOTENV_PRIVATE_KEY_PRODUCTION="$(grep -oP '^DOTENV_PRIVATE_KEY_PRODUCTION=\K.*' .env.keys)" \
|
||||||
|
# yreka-tools
|
||||||
FROM node:22-alpine
|
FROM node:22-alpine
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
RUN npm install -g @dotenvx/dotenvx@1.51.4
|
||||||
|
|
||||||
COPY tools/package.json tools/package-lock.json ./
|
COPY tools/package.json tools/package-lock.json ./
|
||||||
RUN npm ci --omit=dev && npm cache clean --force
|
RUN npm ci --omit=dev && npm cache clean --force
|
||||||
|
|
||||||
COPY tools/server.js tools/yrka-auth.js tools/permit.js tools/cropper.js ./
|
COPY tools/server.js tools/yrka-auth.js tools/permit.js tools/cropper.js ./
|
||||||
COPY tools/public ./public
|
COPY tools/public ./public
|
||||||
|
COPY --chown=node:node .env.production ./
|
||||||
|
|
||||||
USER node
|
USER node
|
||||||
EXPOSE 4173
|
EXPOSE 4173
|
||||||
HEALTHCHECK --interval=30s --timeout=5s --start-period=5s \
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=5s \
|
||||||
CMD wget -qO- http://127.0.0.1:4173/ >/dev/null || exit 1
|
CMD wget -qO- http://127.0.0.1:4173/ >/dev/null || exit 1
|
||||||
CMD ["node", "server.js"]
|
# --strict: fail fast when the private key is missing or decryption fails,
|
||||||
|
# instead of starting with unusable credentials.
|
||||||
|
CMD ["dotenvx", "run", "-f", ".env.production", "--strict", "--", "node", "server.js"]
|
||||||
|
|||||||
@@ -91,11 +91,20 @@ dotenvx run -f .env -- node tools/server.js # local, from the repo root
|
|||||||
dotenvx set MINIO_SECRET_KEY "<value>" -f .env # add/rotate a value
|
dotenvx set MINIO_SECRET_KEY "<value>" -f .env # add/rotate a value
|
||||||
```
|
```
|
||||||
|
|
||||||
Deploying with Docker: `--env-file` cannot read encrypted values, so either
|
The Docker image contains the encrypted `.env.production` and runs through
|
||||||
decrypt at deploy time (`dotenvx decrypt -f .env.production --stdout` into a
|
`dotenvx`; only the private key is supplied at runtime (never baked in):
|
||||||
runtime env file) or pass `DOTENV_PRIVATE_KEY_PRODUCTION` into the container
|
|
||||||
and run through `dotenvx` inside the image (ask if you want the Dockerfile
|
```sh
|
||||||
wired for that).
|
docker build -t yreka-tools .
|
||||||
|
docker run -d -p 4173:4173 --name yreka-tools \
|
||||||
|
--env DOTENV_PRIVATE_KEY_PRODUCTION="$(grep -oP '^DOTENV_PRIVATE_KEY_PRODUCTION=\K.*' .env.keys)" \
|
||||||
|
yreka-tools
|
||||||
|
```
|
||||||
|
|
||||||
|
`dotenvx run --strict` makes the container exit rather than start with
|
||||||
|
undecryptable credentials. Note that `--env` values are visible to
|
||||||
|
`docker inspect`; on a shared host prefer an env file with restrictive
|
||||||
|
permissions (`--env-file deploy.keys`) or your platform's secret store.
|
||||||
|
|
||||||
## Tests
|
## Tests
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user