diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 31df4ba..721c132 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,7 +26,7 @@ jobs: key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - name: Install dependencies - run: ./bin/generator.js -c ./configuration.json -o ./out + run: ./bin/generator.js -c ./config.json -o ./out - name: Upload artifact uses: actions/upload-artifact@v2 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 45b5b00..107afcb 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -30,7 +30,7 @@ jobs: # Docs: run: yarn install - name: Run generator - run: ./bin/generator.js -c ./configuration.json -o ./out + run: ./bin/generator.js -c ./config.json -o ./out - name: Test file creation run: test -f ./out/ghost/404.html diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b3377c..05fa871 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,24 @@ All notable changes to this package will be documented in this file. The format is based on [Keep a Changelog][keepachangelog] and this project adheres to [Semantic Versioning][semver]. +## UNRELEASED + +### Changed + +- `configuration.json` renamed to `config.json` +- Makefile contains new targets (`install`, `gen`, `preview`) +- Generator logging messages + +### Added + +- `docker-compose` for development + +### Fixed + +- Readme file content [#1] + +[#1]:https://github.com/tarampampam/error-pages/issues/1 + ## v1.0.0 ### Changed diff --git a/Dockerfile b/Dockerfile index 387eba4..c159ebb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,7 @@ COPY . . RUN set -x \ && yarn install --frozen-lockfile \ - && ./bin/generator.js -c ./configuration.json -o ./out + && ./bin/generator.js -c ./config.json -o ./out # Image page: FROM nginx:1.18-alpine diff --git a/Makefile b/Makefile index 35a3430..15538b5 100644 --- a/Makefile +++ b/Makefile @@ -5,17 +5,28 @@ SHELL = /bin/sh DOCKER_BIN = $(shell command -v docker 2> /dev/null) +DC_BIN = $(shell command -v docker-compose 2> /dev/null) + +DC_RUN_ARGS = --rm --user "$(shell id -u):$(shell id -g)" APP_NAME = $(notdir $(CURDIR)) +.PHONY : help install gen preview .DEFAULT_GOAL : help help: ## Show this help @printf "\033[33m%s:\033[0m\n" 'Available commands' @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " \033[32m%-15s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) -image: ## Build docker image +install: ## Install all dependencies + $(DC_BIN) run $(DC_RUN_ARGS) app yarn install + +gen: ## Generate error pages + $(DC_BIN) run $(DC_RUN_ARGS) app nodejs ./bin/generator.js -c ./config.json -o ./out + +preview: ## Build docker image and start preview $(DOCKER_BIN) build -f ./Dockerfile -t $(APP_NAME):local . - @printf "\n \e[30;42m %s \033[0m\n\n" 'Now you can use image like `docker run --rm -p 8080:8080 $(APP_NAME):local ...`' + @printf "\n \e[30;42m %s \033[0m\n\n" 'Now open in your favorite browser and press CTRL+C for stopping' + $(DOCKER_BIN) run --rm -i -p 8081:8080 $(APP_NAME):local shell: ## Start shell into container with node - $(DOCKER_BIN) run --rm -ti -v "$(shell pwd):/src:rw" -w "/src" --user "$(shell id -u):$(shell id -g)" node:12.16.2-alpine sh + $(DC_BIN) run $(DC_RUN_ARGS) app sh diff --git a/README.md b/README.md index 767baba..6fc0615 100644 --- a/README.md +++ b/README.md @@ -2,64 +2,110 @@

-# Static error pages in a Docker container +# HTTP's error pages in :whale: image [![Build Status][badge_build_status]][link_build_status] +[![Image size][badge_size_latest]][link_docker_hub] [![License][badge_license]][link_license] -This repository contains a very simple generator for server error pages _(like `404: Not found`)_ and ready docker image with web server for error pages serving. +This repository contains: -Generator ([`bin/generator.js`](./bin/generator.js)) allows you: +- A very simple [generator](./bin/generator.js) _(`nodejs`)_ for HTTP error pages _(like `404: Not found`)_ with different templates supports +- Dockerfile for [docker image][link_docker_hub] with generated pages and `nginx` as web server -- Use different templates (section `templates` in configuration file) -- Generate pages with arbitrary content according to a specific template +## Development + +> For project development we use `docker-ce` + `docker-compose`. Make sure you have them installed. + +Install `nodejs` dependencies: + +```bash +$ make install +``` + +If you want to generate error pages on your machine _(after that look into output directory)_: + +```bash +$ make gen +``` + +If you want to preview the pages using the Docker image: + +```bash +$ make preview +``` Can be used for [Traefik error pages customization](https://docs.traefik.io/middlewares/errorpages/). -### Usage +## Usage -Just execute (installed `nodejs` is required): +Generated error pages in our [docker image][link_docker_hub] permanently located in directory `/opt/html/%THEME_NAME%`. + +#### Supported environment variables + +Name | Description +--------------- | ----------- +`TEMPLATE_NAME` | "default" pages template _(allows to use error pages without passing theme name in URL - `http://127.0.0.1/500.html` instead `http://127.0.0.1/ghost/500.html`)_ + +### HTTP server for error pages serving only + +Execute in your shell: ```bash -$ bin/generator.js -c ./configuration.json -o ./out +$ docker run --rm -p "8082:8080" tarampampam/error-pages ``` -And watch into `./out` directory: +And open in your browser `http://127.0.0.1:8082/ghost/400.html`. -```text -./out -└── ghost - ├── 400.html - ├── 401.html - ├── 403.html - ├── 404.html - ├── ... - └── 505.html -``` +### Custom error pages for [nginx][link_nginx] -Default configuration can be found in [`configuration.json`](./configuration.json) file. - -### Docker - -[![Image size][badge_size_latest]][link_docker_build] - -Start image (`nginx` inside): +You can build your own docker image with `nginx` and our error pages: ```bash -$ docker run --rm -p "8080:8080" tarampampam/error-pages:1.0.0 +# File `./nginx.conf` + +server { + listen 80; + server_name localhost; + + error_page 401 /_error-pages/401.html; + error_page 403 /_error-pages/403.html; + error_page 404 /_error-pages/404.html; + error_page 500 /_error-pages/500.html; + error_page 502 /_error-pages/502.html; + error_page 503 /_error-pages/503.html; + + location ^~ /_error-pages/ { + internal; + root /usr/share/nginx/errorpages; + } + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } +} ``` -And open in your browser `http://127.0.0.1:8080/ghost/400.html`. Additionally, you can set "default" pages theme by passing `TEMPLATE_NAME` environment variable (eg.: `-e "TEMPLATE_NAME=ghost"`) - in this case all error pages will be accessible in root directory (eg.: `http://127.0.0.1:8080/400.html`). - -Also you can use generated error pages in your own docker images: - ```dockerfile FROM nginx:1.18-alpine -COPY --from=tarampampam/error-pages:1.0.0 /opt/html/ghost /usr/share/nginx/html/error-pages +COPY --chown=nginx \ + ./nginx.conf /etc/nginx/conf.d/default.conf +COPY --chown=nginx \ + --from=tarampampam/error-pages:1.0.0 \ + /opt/html/ghost /usr/share/nginx/errorpages/_error-pages ``` -> [`error_page` for `nginx` configuration](http://nginx.org/en/docs/http/ngx_http_core_module.html#error_page) +> More info about `error_page` directive can be [found here](http://nginx.org/en/docs/http/ngx_http_core_module.html#error_page). + +### Custom error pages for [Traefik][link_traefik] + +Simple traefik service configuration for usage in [docker swarm][link_swarm] (**change with your needs**): + +```yaml +# Work in progress +``` ## Changes log @@ -94,4 +140,7 @@ This is open-sourced software licensed under the [MIT License][link_license]. [link_build_status]:https://travis-ci.org/tarampampam/error-pages [link_create_issue]:https://github.com/tarampampam/error-pages/issues/new [link_license]:https://github.com/tarampampam/error-pages/blob/master/LICENSE -[link_docker_build]:https://hub.docker.com/r/tarampampam/error-pages/ +[link_docker_hub]:https://hub.docker.com/r/tarampampam/error-pages/ +[link_nginx]:http://nginx.org/ +[link_traefik]:https://docs.traefik.io/ +[link_swarm]:https://docs.docker.com/engine/swarm/ diff --git a/bin/generator.js b/bin/generator.js index a5877fa..0eb77db 100755 --- a/bin/generator.js +++ b/bin/generator.js @@ -46,7 +46,9 @@ try { // Loop over all pages configContent.pages.forEach((pageConfig) => { - console.info(`Page with code ${pageConfig.code} generation...`); + let outPath = path.join(templateOutDir, `${pageConfig.code}.${configContent.output.file_extension}`); + + console.info(` [${templateConfig.name}:${pageConfig.code}] Output: ${outPath}`); // Make replaces let result = layoutContent @@ -55,7 +57,7 @@ try { .replace(/{{\s?description\s?}}/g, pageConfig.description); // And write into result file - fs.writeFileSync(path.join(templateOutDir, `${pageConfig.code}.${configContent.output.file_extension}`), result, { + fs.writeFileSync(outPath, result, { encoding: "utf8", flag: "w+", mode: 0o644 diff --git a/configuration.json b/config.json similarity index 100% rename from configuration.json rename to config.json diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..6038d0e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,17 @@ +version: '3.2' + +volumes: + tmp-data: + +services: + app: + image: node:12.16.2-alpine # Image page: + working_dir: /src + environment: + HOME: /tmp + PS1: '\[\033[1;32m\]\[\033[1;36m\][\u@docker] \[\033[1;34m\]\w\[\033[0;35m\] \[\033[1;36m\]# \[\033[0m\]' + volumes: + - /etc/passwd:/etc/passwd:ro + - /etc/group:/etc/group:ro + - .:/src:cached + - tmp-data:/tmp:cached