mirror of
https://github.com/tarampampam/error-pages.git
synced 2024-08-30 18:22:40 +00:00
Compare commits
10 Commits
Author | SHA1 | Date | |
---|---|---|---|
a55ec08eef | |||
7957d16c0f | |||
80b2544f36 | |||
090767ba6b | |||
a040c913e7 | |||
5ab113ba1a | |||
ea46e9f738 | |||
aeb6018a57 | |||
158856bebd | |||
f140dd3ad8 |
16
.github/workflows/release.yml
vendored
16
.github/workflows/release.yml
vendored
@ -7,7 +7,7 @@ on:
|
||||
jobs:
|
||||
demo:
|
||||
name: Update demonstration, hosted on github pages
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v2
|
||||
@ -17,9 +17,6 @@ jobs:
|
||||
with:
|
||||
node-version: 12
|
||||
|
||||
- name: Generate version value
|
||||
run: echo "::set-env name=PACKAGE_VERSION::${GITHUB_REF##*/v}"
|
||||
|
||||
- uses: actions/cache@v2
|
||||
with:
|
||||
path: '**/node_modules'
|
||||
@ -67,24 +64,25 @@ jobs:
|
||||
|
||||
docker-image:
|
||||
name: Build docker image
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Generate image tag value
|
||||
run: echo "::set-env name=IMAGE_TAG::${GITHUB_REF##*/[vV]}" # `/refs/tags/v1.2.3` -> `1.2.3`
|
||||
- name: Generate builder values
|
||||
id: values
|
||||
run: echo "::set-output name=version::${GITHUB_REF##*/[vV]}" # `/refs/tags/v1.2.3` -> `1.2.3`
|
||||
|
||||
- name: Make docker login
|
||||
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_LOGIN }}" --password-stdin &> /dev/null
|
||||
|
||||
- name: Build image
|
||||
run: docker build --tag "tarampampam/error-pages:${IMAGE_TAG}" --tag "tarampampam/error-pages:latest" -f ./Dockerfile .
|
||||
run: docker build --tag "tarampampam/error-pages:${{ steps.values.outputs.version }}" --tag "tarampampam/error-pages:latest" -f ./Dockerfile .
|
||||
|
||||
- name: Push version image
|
||||
run: docker push "tarampampam/error-pages:${IMAGE_TAG}"
|
||||
run: docker push "tarampampam/error-pages:${{ steps.values.outputs.version }}"
|
||||
|
||||
- name: Push latest image
|
||||
run: docker push "tarampampam/error-pages:latest"
|
||||
|
9
.github/workflows/tests.yml
vendored
9
.github/workflows/tests.yml
vendored
@ -11,7 +11,7 @@ on:
|
||||
jobs: # Docs: <https://git.io/JvxXE>
|
||||
generate:
|
||||
name: Try to run generator
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v2
|
||||
@ -37,7 +37,7 @@ jobs: # Docs: <https://git.io/JvxXE>
|
||||
|
||||
docker-build:
|
||||
name: Build docker image
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v2
|
||||
@ -51,5 +51,8 @@ jobs: # Docs: <https://git.io/JvxXE>
|
||||
- name: Pause
|
||||
run: sleep 2
|
||||
|
||||
- name: Send HTTP request
|
||||
- name: Verify 500.html error file exists in root
|
||||
run: curl -sS --fail "http://127.0.0.1:8080/500.html"
|
||||
|
||||
- name: Verify root request HTTP code
|
||||
run: test $(curl --write-out %{http_code} --silent --output /dev/null http://127.0.0.1:8080/) -eq 404
|
||||
|
41
CHANGELOG.md
41
CHANGELOG.md
@ -4,6 +4,47 @@ 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].
|
||||
|
||||
## v1.4.0
|
||||
|
||||
### Added
|
||||
|
||||
- Template `shuffle` [#4]
|
||||
|
||||
[#3]:https://github.com/tarampampam/error-pages/issues/4
|
||||
|
||||
## v1.3.1
|
||||
|
||||
### Fixed
|
||||
|
||||
- `can't create directory '/opt/html/nginx-error-pages'` error [#3]
|
||||
|
||||
[#3]:https://github.com/tarampampam/error-pages/issues/3
|
||||
|
||||
## v1.3.0
|
||||
|
||||
### Added
|
||||
|
||||
- `418` status code error page
|
||||
- Set `server_tokens off;` in `nginx` server configuration
|
||||
|
||||
## v1.2.0
|
||||
|
||||
### Fixed
|
||||
|
||||
- By default `nginx` in docker container returns 404 http code instead 200 when `/` requested
|
||||
|
||||
### Changed
|
||||
|
||||
- Default value for `TEMPLATE_NAME` is `ghost` now
|
||||
|
||||
### Removed
|
||||
|
||||
- Environment variable `DEFAULT_ERROR_CODE` support in docker image
|
||||
|
||||
### Added
|
||||
|
||||
- Templates `l7-light` and `l7-dark`
|
||||
|
||||
## v1.1.0
|
||||
|
||||
### Added
|
||||
|
2
Makefile
2
Makefile
@ -26,7 +26,7 @@ gen: ## Generate error pages
|
||||
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 open in your favorite browser <http://127.0.0.1:8081> and press CTRL+C for stopping'
|
||||
$(DOCKER_BIN) run --rm -i -p 8081:8080 -e "TEMPLATE_NAME=ghost" $(APP_NAME):local
|
||||
$(DOCKER_BIN) run --rm -i -p 8081:8080 -e "TEMPLATE_NAME=l7-light" $(APP_NAME):local
|
||||
|
||||
shell: ## Start shell into container with node
|
||||
$(DC_BIN) run $(DC_RUN_ARGS) app sh
|
||||
|
75
README.md
75
README.md
@ -44,9 +44,12 @@ $ make preview
|
||||
|
||||
## Templates
|
||||
|
||||
Name | Preview
|
||||
:------: | :-----:
|
||||
`ghost` | 
|
||||
Name | Preview
|
||||
:--------: | :-----:
|
||||
`ghost` | 
|
||||
`l7-light` | 
|
||||
`l7-dark` | 
|
||||
`shuffle` | 
|
||||
|
||||
## Usage
|
||||
|
||||
@ -54,17 +57,16 @@ Generated error pages in our [docker image][link_docker_hub] permanently located
|
||||
|
||||
#### 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`)_
|
||||
`DEFAULT_ERROR_CODE` | (`404` by default) Code with passed error code will be used as default (index) page (can be used only with `TEMPLATE_NAME` variable)
|
||||
Name | Description
|
||||
--------------- | -----------
|
||||
`TEMPLATE_NAME` | (`ghost` by default) "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
|
||||
$ docker run --rm -p "8082:8080" tarampampam/error-pages:1.1.0
|
||||
$ docker run --rm -p "8082:8080" tarampampam/error-pages:1.4.0
|
||||
```
|
||||
|
||||
And open in your browser `http://127.0.0.1:8082/ghost/400.html`.
|
||||
@ -105,7 +107,7 @@ FROM nginx:1.18-alpine
|
||||
COPY --chown=nginx \
|
||||
./nginx.conf /etc/nginx/conf.d/default.conf
|
||||
COPY --chown=nginx \
|
||||
--from=tarampampam/error-pages:1.1.0 \
|
||||
--from=tarampampam/error-pages:1.4.0 \
|
||||
/opt/html/ghost /usr/share/nginx/errorpages/_error-pages
|
||||
```
|
||||
|
||||
@ -116,37 +118,52 @@ COPY --chown=nginx \
|
||||
Simple traefik (tested on `v2.2.1`) service configuration for usage in [docker swarm][link_swarm] (**change with your needs**):
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
version: '3.4'
|
||||
|
||||
services:
|
||||
error-pages:
|
||||
image: tarampampam/error-pages:1.1.0
|
||||
image: tarampampam/error-pages:1.4.0
|
||||
environment:
|
||||
TEMPLATE_NAME: ghost
|
||||
TEMPLATE_NAME: l7-dark
|
||||
networks:
|
||||
- traefik-public
|
||||
deploy:
|
||||
placement:
|
||||
constraints:
|
||||
- node.role == worker
|
||||
max_replicas_per_node: 1
|
||||
resources:
|
||||
limits:
|
||||
memory: 32M
|
||||
reservations:
|
||||
memory: 16M
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.docker.network=traefik-public
|
||||
- traefik.http.routers.error-pages-router.rule=HostRegexp(`{host:.+}`)
|
||||
- traefik.http.routers.error-pages-router.tls=true
|
||||
- traefik.http.routers.error-pages-router.priority=10
|
||||
- traefik.http.routers.error-pages-router.entrypoints=https
|
||||
- traefik.http.routers.error-pages-router.middlewares=error-pages-middleware@docker
|
||||
- traefik.http.services.error-pages-service.loadbalancer.server.port=8080
|
||||
- traefik.http.middlewares.error-pages-middleware.errors.status=400-599
|
||||
- traefik.http.middlewares.error-pages-middleware.errors.service=error-pages-service@docker
|
||||
- traefik.http.middlewares.error-pages-middleware.errors.query=/{status}.html
|
||||
traefik.enable: 'true'
|
||||
traefik.docker.network: traefik-public
|
||||
# use as "fallback" for any non-registered services (with priority below normal)
|
||||
traefik.http.routers.error-pages-router.rule: HostRegexp(`{host:.+}`)
|
||||
traefik.http.routers.error-pages-router.priority: 10
|
||||
# should say that all of your services work on https
|
||||
traefik.http.routers.error-pages-router.tls: 'true'
|
||||
traefik.http.routers.error-pages-router.entrypoints: https
|
||||
traefik.http.routers.error-pages-router.middlewares: error-pages-middleware@docker
|
||||
traefik.http.services.error-pages-service.loadbalancer.server.port: 8080
|
||||
# "errors" middleware settings
|
||||
traefik.http.middlewares.error-pages-middleware.errors.status: 400-599
|
||||
traefik.http.middlewares.error-pages-middleware.errors.service: error-pages-service@docker
|
||||
traefik.http.middlewares.error-pages-middleware.errors.query: /{status}.html
|
||||
|
||||
any-another-http-service:
|
||||
image: nginx:alpine
|
||||
networks:
|
||||
- traefik-public
|
||||
deploy:
|
||||
placement:
|
||||
constraints:
|
||||
- node.role == worker
|
||||
labels:
|
||||
traefik.enable: 'true'
|
||||
traefik.docker.network: traefik-public
|
||||
traefik.http.routers.another-service.rule: Host(`subdomain.example.com`)
|
||||
traefik.http.routers.another-service.tls: 'true'
|
||||
traefik.http.routers.another-service.entrypoints: https
|
||||
# next line is important
|
||||
traefik.http.routers.another-service.middlewares: error-pages-middleware@docker
|
||||
traefik.http.services.another-service.loadbalancer.server.port: 80
|
||||
|
||||
networks:
|
||||
traefik-public:
|
||||
|
17
config.json
17
config.json
@ -3,6 +3,18 @@
|
||||
{
|
||||
"name": "ghost",
|
||||
"path": "./templates/ghost.html"
|
||||
},
|
||||
{
|
||||
"name": "l7-light",
|
||||
"path": "./templates/l7-light.html"
|
||||
},
|
||||
{
|
||||
"name": "l7-dark",
|
||||
"path": "./templates/l7-dark.html"
|
||||
},
|
||||
{
|
||||
"name": "shuffle",
|
||||
"path": "./templates/shuffle.html"
|
||||
}
|
||||
],
|
||||
"output": {
|
||||
@ -74,6 +86,11 @@
|
||||
"message": "Requested Range Not Satisfiable",
|
||||
"description": "The requested byte range is not available and is out of bounds"
|
||||
},
|
||||
{
|
||||
"code": 418,
|
||||
"message": "I'm a teapot",
|
||||
"description": "Attempt to brew coffee with a teapot is not supported"
|
||||
},
|
||||
{
|
||||
"code": 429,
|
||||
"message": "Too Many Requests",
|
||||
|
@ -1,8 +1,7 @@
|
||||
#!/usr/bin/env sh
|
||||
set -e
|
||||
|
||||
TEMPLATE_NAME=${TEMPLATE_NAME:-} # string|empty
|
||||
DEFAULT_ERROR_CODE=${DEFAULT_ERROR_CODE:-404} # numeric
|
||||
TEMPLATE_NAME=${TEMPLATE_NAME:-ghost} # string|empty
|
||||
|
||||
if [ -n "$TEMPLATE_NAME" ]; then
|
||||
echo "$0: set pages for template '$TEMPLATE_NAME' as default (make accessible in root directory)";
|
||||
@ -13,13 +12,14 @@ if [ -n "$TEMPLATE_NAME" ]; then
|
||||
|
||||
ln -f -s "/opt/html/$TEMPLATE_NAME/"* /opt/html;
|
||||
|
||||
if [ -L "/opt/html/$DEFAULT_ERROR_CODE.html" ]; then
|
||||
echo "$0: set page with error code '$DEFAULT_ERROR_CODE' as default (index) page";
|
||||
|
||||
cp -f "/opt/html/$DEFAULT_ERROR_CODE.html" /opt/html/index.html;
|
||||
else
|
||||
(>&2 echo "$0: cannot set page with error code '$DEFAULT_ERROR_CODE' as default (index) page!");
|
||||
# on `docker restart` next directory keep existing: <https://github.com/tarampampam/error-pages/issues/3>
|
||||
if [ -d /opt/html/nginx-error-pages ]; then
|
||||
rm -Rf /opt/html/nginx-error-pages;
|
||||
fi;
|
||||
|
||||
# next directory is required for easy nginx `error_page` usage
|
||||
mkdir /opt/html/nginx-error-pages;
|
||||
ln -f -s "/opt/html/$TEMPLATE_NAME/"* /opt/html/nginx-error-pages;
|
||||
fi;
|
||||
|
||||
exec "$@"
|
||||
|
@ -2,8 +2,24 @@ server {
|
||||
listen 8080;
|
||||
server_name _;
|
||||
|
||||
server_tokens off;
|
||||
|
||||
index index.html index.htm;
|
||||
root /opt/html;
|
||||
|
||||
error_page 400 /nginx-error-pages/400.html;
|
||||
error_page 401 /nginx-error-pages/401.html;
|
||||
error_page 403 /nginx-error-pages/403.html;
|
||||
error_page 404 /nginx-error-pages/404.html;
|
||||
error_page 500 /nginx-error-pages/500.html;
|
||||
error_page 502 /nginx-error-pages/502.html;
|
||||
|
||||
location ^~ /nginx-error-pages/ {
|
||||
internal;
|
||||
root /opt/html;
|
||||
}
|
||||
|
||||
location / {
|
||||
root /opt/html;
|
||||
index index.html index.htm;
|
||||
try_files $uri =404;
|
||||
}
|
||||
}
|
||||
|
@ -1,22 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<title>Error pages</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
|
||||
<link href="https://fonts.googleapis.com/css?family=Montserrat" rel="stylesheet" type="text/css" />
|
||||
<style type="text/css">
|
||||
html,body {background-color:#fff;font-family:'Montserrat',sans-serif;color:#1a1a1a;overflow:hidden}
|
||||
.wrap {top:50%;left:50%;width:350px;height:260px;margin-left:-175px;margin-top:-130px;position:absolute;text-align:center}
|
||||
.wrap h1 {font-size: 3em; margin-top: 0}
|
||||
.wrap p {font-size: 0.85em}
|
||||
.wrap p.small {font-size: 0.6em}
|
||||
</style>
|
||||
</head><body>
|
||||
<div class="wrap">
|
||||
<h1>Error pages</h1>
|
||||
<p class="small">
|
||||
For online documentation and support please refer to <a href="https://github.com/tarampampam/error-pages">project repository</a>.
|
||||
</p>
|
||||
</div>
|
||||
</body></html>
|
29
templates/l7-dark.html
Normal file
29
templates/l7-dark.html
Normal file
@ -0,0 +1,29 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<title>{{ message }}</title>
|
||||
<link rel="dns-prefetch" href="//fonts.gstatic.com">
|
||||
<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
|
||||
<style>
|
||||
html,body {background-color: #222526;color:#fff;font-family:'Nunito',sans-serif;font-weight:100;height:100vh;margin:0}
|
||||
.full-height {height:100vh}
|
||||
.flex-center {align-items:center;display:flex;justify-content:center}
|
||||
.position-ref {position:relative}
|
||||
.code {border-right:2px solid;font-size:26px;padding:0 10px 0 15px;text-align:center}
|
||||
.message {font-size:18px;text-align:center;padding:10px}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="flex-center position-ref full-height">
|
||||
<div class="code">
|
||||
{{ code }}
|
||||
</div>
|
||||
<div class="message">
|
||||
{{ message }}
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
29
templates/l7-light.html
Normal file
29
templates/l7-light.html
Normal file
@ -0,0 +1,29 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<title>{{ message }}</title>
|
||||
<link rel="dns-prefetch" href="//fonts.gstatic.com">
|
||||
<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
|
||||
<style>
|
||||
html,body {background-color:#fff;color:#636b6f;font-family:'Nunito',sans-serif;font-weight:100;height:100vh;margin:0}
|
||||
.full-height {height:100vh}
|
||||
.flex-center {align-items:center;display:flex;justify-content:center}
|
||||
.position-ref {position:relative}
|
||||
.code {border-right:2px solid;font-size:26px;padding:0 10px 0 15px;text-align:center}
|
||||
.message {font-size:18px;text-align:center;padding:10px}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="flex-center position-ref full-height">
|
||||
<div class="code">
|
||||
{{ code }}
|
||||
</div>
|
||||
<div class="message">
|
||||
{{ message }}
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
71
templates/shuffle.html
Normal file
71
templates/shuffle.html
Normal file
@ -0,0 +1,71 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="robots" content="noindex, nofollow"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<title>{{ code }} - {{ message }}</title>
|
||||
<style>
|
||||
html, body {
|
||||
margin: 0;
|
||||
background-color: #222;
|
||||
color: #aaa;
|
||||
font-family: 'Hack', monospace
|
||||
}
|
||||
|
||||
.full-height {
|
||||
height: 100vh
|
||||
}
|
||||
|
||||
.flex-center {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
justify-content: center
|
||||
}
|
||||
|
||||
#error_text {
|
||||
font-size: 2em
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="flex-center full-height">
|
||||
<span id="error_text">{{ code }}: {{ message }}</span>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
const $errorText = document.getElementById('error_text'),
|
||||
text = $errorText.innerText,
|
||||
characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-=+<>,./?[{()}]!@#$%^&*~`\|'.split('');
|
||||
let progress = 0;
|
||||
|
||||
const scrambleInterval = window.setInterval(function () {
|
||||
let newText = text;
|
||||
|
||||
for (let i = 0; i < text.length; i++) {
|
||||
if (i >= progress) {
|
||||
newText = newText.substr(0, i) +
|
||||
characters[Math.round(Math.random() * (characters.length - 1))] +
|
||||
newText.substr(i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
$errorText.innerText = newText;
|
||||
}, 800 / 60);
|
||||
|
||||
window.setTimeout(function () {
|
||||
let revealInterval = window.setInterval(function () {
|
||||
if (progress < text.length) {
|
||||
progress++;
|
||||
} else {
|
||||
window.clearInterval(revealInterval);
|
||||
window.clearInterval(scrambleInterval);
|
||||
}
|
||||
}, 70);
|
||||
}, 350);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
Reference in New Issue
Block a user