Compare commits
No commits in common. "master" and "v2.0.39" have entirely different histories.
@ -1,66 +0,0 @@
|
|||||||
name: Default (not tags)
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags-ignore:
|
|
||||||
- '**'
|
|
||||||
|
|
||||||
env:
|
|
||||||
IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
|
||||||
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@gitea.lossless.digital/${{gitea.repository}}.git
|
|
||||||
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
|
|
||||||
NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
|
|
||||||
NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
|
|
||||||
NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
security:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
continue-on-error: true
|
|
||||||
container:
|
|
||||||
image: ${{ env.IMAGE }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Install pnpm and npmci
|
|
||||||
run: |
|
|
||||||
pnpm install -g pnpm
|
|
||||||
pnpm install -g @shipzone/npmci
|
|
||||||
|
|
||||||
- name: Run npm prepare
|
|
||||||
run: npmci npm prepare
|
|
||||||
|
|
||||||
- name: Audit production dependencies
|
|
||||||
run: |
|
|
||||||
npmci command npm config set registry https://registry.npmjs.org
|
|
||||||
npmci command pnpm audit --audit-level=high --prod
|
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
- name: Audit development dependencies
|
|
||||||
run: |
|
|
||||||
npmci command npm config set registry https://registry.npmjs.org
|
|
||||||
npmci command pnpm audit --audit-level=high --dev
|
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
test:
|
|
||||||
if: ${{ always() }}
|
|
||||||
needs: security
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container:
|
|
||||||
image: ${{ env.IMAGE }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Test stable
|
|
||||||
run: |
|
|
||||||
npmci node install stable
|
|
||||||
npmci npm install
|
|
||||||
npmci npm test
|
|
||||||
|
|
||||||
- name: Test build
|
|
||||||
run: |
|
|
||||||
npmci node install stable
|
|
||||||
npmci npm install
|
|
||||||
npmci npm build
|
|
@ -1,124 +0,0 @@
|
|||||||
name: Default (tags)
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- '*'
|
|
||||||
|
|
||||||
env:
|
|
||||||
IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
|
||||||
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@gitea.lossless.digital/${{gitea.repository}}.git
|
|
||||||
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
|
|
||||||
NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
|
|
||||||
NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
|
|
||||||
NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
security:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
continue-on-error: true
|
|
||||||
container:
|
|
||||||
image: ${{ env.IMAGE }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Prepare
|
|
||||||
run: |
|
|
||||||
pnpm install -g pnpm
|
|
||||||
pnpm install -g @shipzone/npmci
|
|
||||||
npmci npm prepare
|
|
||||||
|
|
||||||
- name: Audit production dependencies
|
|
||||||
run: |
|
|
||||||
npmci command npm config set registry https://registry.npmjs.org
|
|
||||||
npmci command pnpm audit --audit-level=high --prod
|
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
- name: Audit development dependencies
|
|
||||||
run: |
|
|
||||||
npmci command npm config set registry https://registry.npmjs.org
|
|
||||||
npmci command pnpm audit --audit-level=high --dev
|
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
test:
|
|
||||||
if: ${{ always() }}
|
|
||||||
needs: security
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container:
|
|
||||||
image: ${{ env.IMAGE }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Prepare
|
|
||||||
run: |
|
|
||||||
pnpm install -g pnpm
|
|
||||||
pnpm install -g @shipzone/npmci
|
|
||||||
npmci npm prepare
|
|
||||||
|
|
||||||
- name: Test stable
|
|
||||||
run: |
|
|
||||||
npmci node install stable
|
|
||||||
npmci npm install
|
|
||||||
npmci npm test
|
|
||||||
|
|
||||||
- name: Test build
|
|
||||||
run: |
|
|
||||||
npmci node install stable
|
|
||||||
npmci npm install
|
|
||||||
npmci npm build
|
|
||||||
|
|
||||||
release:
|
|
||||||
needs: test
|
|
||||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container:
|
|
||||||
image: ${{ env.IMAGE }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Prepare
|
|
||||||
run: |
|
|
||||||
pnpm install -g pnpm
|
|
||||||
pnpm install -g @shipzone/npmci
|
|
||||||
npmci npm prepare
|
|
||||||
|
|
||||||
- name: Release
|
|
||||||
run: |
|
|
||||||
npmci node install stable
|
|
||||||
npmci npm publish
|
|
||||||
|
|
||||||
metadata:
|
|
||||||
needs: test
|
|
||||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container:
|
|
||||||
image: ${{ env.IMAGE }}
|
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Prepare
|
|
||||||
run: |
|
|
||||||
pnpm install -g pnpm
|
|
||||||
pnpm install -g @shipzone/npmci
|
|
||||||
npmci npm prepare
|
|
||||||
|
|
||||||
- name: Code quality
|
|
||||||
run: |
|
|
||||||
npmci command npm install -g typescript
|
|
||||||
npmci npm install
|
|
||||||
|
|
||||||
- name: Trigger
|
|
||||||
run: npmci trigger
|
|
||||||
|
|
||||||
- name: Build docs and upload artifacts
|
|
||||||
run: |
|
|
||||||
npmci node install stable
|
|
||||||
npmci npm install
|
|
||||||
pnpm install -g @gitzone/tsdoc
|
|
||||||
npmci command tsdoc
|
|
||||||
continue-on-error: true
|
|
23
.gitignore
vendored
23
.gitignore
vendored
@ -1,20 +1,5 @@
|
|||||||
.nogit/
|
|
||||||
|
|
||||||
# artifacts
|
|
||||||
coverage/
|
|
||||||
public/
|
|
||||||
pages/
|
|
||||||
|
|
||||||
# installs
|
|
||||||
node_modules/
|
node_modules/
|
||||||
|
nginxconfig/
|
||||||
# caches
|
coverage/
|
||||||
.yarn/
|
docs/
|
||||||
.cache/
|
.nogit/
|
||||||
.rpt2_cache
|
|
||||||
|
|
||||||
# builds
|
|
||||||
dist/
|
|
||||||
dist_*/
|
|
||||||
|
|
||||||
# custom
|
|
119
.gitlab-ci.yml
119
.gitlab-ci.yml
@ -1,119 +1,30 @@
|
|||||||
# gitzone ci_default
|
image: hosttoday/ht-docker-node:npmci
|
||||||
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
|
||||||
|
|
||||||
cache:
|
|
||||||
paths:
|
|
||||||
- .npmci_cache/
|
|
||||||
key: "$CI_BUILD_STAGE"
|
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- security
|
|
||||||
- test
|
- test
|
||||||
- release
|
- release
|
||||||
- metadata
|
|
||||||
|
|
||||||
# ====================
|
before_script:
|
||||||
# security stage
|
- "apt-get update && apt-get install nginx -y"
|
||||||
# ====================
|
|
||||||
mirror:
|
|
||||||
stage: security
|
|
||||||
script:
|
|
||||||
- npmci git mirror
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
- notpriv
|
|
||||||
|
|
||||||
snyk:
|
testSTABLE:
|
||||||
stage: security
|
|
||||||
script:
|
|
||||||
- npmci npm prepare
|
|
||||||
- npmci command npm install -g snyk
|
|
||||||
- npmci command npm install --ignore-scripts
|
|
||||||
- npmci command snyk test
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
- notpriv
|
|
||||||
|
|
||||||
# ====================
|
|
||||||
# test stage
|
|
||||||
# ====================
|
|
||||||
|
|
||||||
testLTS:
|
|
||||||
stage: test
|
stage: test
|
||||||
script:
|
script:
|
||||||
- npmci npm prepare
|
|
||||||
- npmci node install lts
|
|
||||||
- npmci npm install
|
|
||||||
- npmci npm test
|
|
||||||
coverage: /\d+.?\d+?\%\s*coverage/
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
- priv
|
|
||||||
|
|
||||||
testBuild:
|
|
||||||
stage: test
|
|
||||||
script:
|
|
||||||
- npmci npm prepare
|
|
||||||
- npmci node install lts
|
|
||||||
- npmci npm install
|
|
||||||
- npmci command npm run build
|
|
||||||
coverage: /\d+.?\d+?\%\s*coverage/
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
- notpriv
|
|
||||||
|
|
||||||
release:
|
|
||||||
stage: release
|
|
||||||
script:
|
|
||||||
- npmci node install lts
|
|
||||||
- npmci npm publish
|
|
||||||
only:
|
|
||||||
- tags
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
- notpriv
|
|
||||||
|
|
||||||
# ====================
|
|
||||||
# metadata stage
|
|
||||||
# ====================
|
|
||||||
codequality:
|
|
||||||
stage: metadata
|
|
||||||
allow_failure: true
|
|
||||||
script:
|
|
||||||
- npmci command npm install -g tslint typescript
|
|
||||||
- npmci npm install
|
- npmci npm install
|
||||||
- npmci command "tslint -c tslint.json ./ts/**/*.ts"
|
- npmci npm test stable
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
- priv
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
stage: metadata
|
|
||||||
script:
|
|
||||||
- npmci trigger
|
|
||||||
only:
|
only:
|
||||||
- tags
|
- tags
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
- notpriv
|
|
||||||
|
|
||||||
pages:
|
|
||||||
image: hosttoday/ht-docker-dbase:npmci
|
|
||||||
services:
|
|
||||||
- docker:18-dind
|
|
||||||
stage: metadata
|
|
||||||
script:
|
|
||||||
- npmci command npm install -g @gitzone/tsdoc
|
|
||||||
- npmci npm prepare
|
|
||||||
- npmci npm install
|
|
||||||
- npmci command tsdoc
|
|
||||||
tags:
|
tags:
|
||||||
- docker
|
- docker
|
||||||
- notpriv
|
- notpriv
|
||||||
|
|
||||||
|
release:
|
||||||
|
stage: release
|
||||||
|
environment: npmjs-com_registry
|
||||||
|
script:
|
||||||
|
- npmci npm prepare
|
||||||
|
- npmci npm publish
|
||||||
only:
|
only:
|
||||||
- tags
|
- tags
|
||||||
artifacts:
|
tags:
|
||||||
expire_in: 1 week
|
- docker
|
||||||
paths:
|
|
||||||
- public
|
|
||||||
allow_failure: true
|
|
11
.vscode/launch.json
vendored
11
.vscode/launch.json
vendored
@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "0.2.0",
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"command": "npm test",
|
|
||||||
"name": "Run npm test",
|
|
||||||
"request": "launch",
|
|
||||||
"type": "node-terminal"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
26
.vscode/settings.json
vendored
26
.vscode/settings.json
vendored
@ -1,26 +0,0 @@
|
|||||||
{
|
|
||||||
"json.schemas": [
|
|
||||||
{
|
|
||||||
"fileMatch": ["/npmextra.json"],
|
|
||||||
"schema": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"npmci": {
|
|
||||||
"type": "object",
|
|
||||||
"description": "settings for npmci"
|
|
||||||
},
|
|
||||||
"gitzone": {
|
|
||||||
"type": "object",
|
|
||||||
"description": "settings for gitzone",
|
|
||||||
"properties": {
|
|
||||||
"projectType": {
|
|
||||||
"type": "string",
|
|
||||||
"enum": ["website", "element", "service", "npm", "wcc"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
30
README.md
Normal file
30
README.md
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# smartnginx
|
||||||
|
|
||||||
|
control nginx from node, TypeScript ready
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
[](https://gitlab.com/pushrocks/smartnginx/commits/master)
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- easy reverse configuration
|
||||||
|
- automatic letsencrypt DNS01 challenge based ssl cert generation
|
||||||
|
- automatic nginx process handling zero-downtime config reloading
|
||||||
|
- works in Docker environements
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
We recommend the use of TypeScript! :)
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import * as smartnginx from 'smartnginx';
|
||||||
|
const smartnginxInstance = new smartnginx.SmartNginx();
|
||||||
|
myNginxHost = new smartnginx.NginxHost({
|
||||||
|
hostName: 'some.example.com',
|
||||||
|
type: 'reverseProxy',
|
||||||
|
destination: '192.192.192.192' // some destination IP
|
||||||
|
});
|
||||||
|
myNginxConfig.addZone(myNginxZone); // adds the zone to the config
|
||||||
|
myNginxConfig.deploy(); // deploys the referenced NginxConfig and gracefully reloads it
|
||||||
|
```
|
@ -1,15 +0,0 @@
|
|||||||
-----BEGIN RSA PRIVATE KEY-----
|
|
||||||
MIICWwIBAAKBgQCHoQbEbAo/0ZDFU9AkubBRi8FeKdhCFrzK+wXZD9JnEJRa3q6o
|
|
||||||
CI+6H3YLYleGGP8Vkwca8ykz5BX0MrKAlZWpoEpqgm2lVCBKh9mqCG1bN0aPdlwh
|
|
||||||
E24/HZFbeVgyJBvH/7XZJDGlm638dSMoXMmPtwLfq1uTAmHwtHBEqdiLFwIDAQAB
|
|
||||||
AoGAJWXibtD3toc7qx2kPCwzkRi/Ng7FwdtxLWswPp0dQCwTLEdQ06agswqvyw3P
|
|
||||||
4nsMA0/qWqUIDHXtE8vS6p/Uh21aKTYNgHJA4VZdJvh5Zhogq77dtGFyME7T3914
|
|
||||||
isamRo8hxemijJG9oml7y+jW/xnMFhe98dqKf9k0RNI9G1kCQQDHhInM8HEJWnRX
|
|
||||||
ckkhGoel7HlfpTaLYIO7Ls4ErsNmBQjralRZVX1+g4+h4/QLCcOYqihNDgSUZMEt
|
|
||||||
aEC82c4LAkEArgZXP/gaua0tylBwQETOyUip2apVOvArmH9xLL9qTkXueV39skZb
|
|
||||||
36cO9RK7C+HTY4hGNcXDdihxs+Fa4sD6pQJAQc6FZQMpRVyAYxde53xIoYGNxu5H
|
|
||||||
P1FmIacebIz4Bf5DIuK/T3fTHJdoGI2HQNzHluMIx+GHwSo6TS/FqoRsYQJAe/ia
|
|
||||||
aUC20TU0nJ6nCLG72hqAnUZBh0YW2IFZP3ZxJaed1ioGE90Zj/8zoZShWTqb25j1
|
|
||||||
41KqBt+S+ID+vPCa3QJABo8fEGIy/g7M5OB5euLHQLvCvYJDn9YWAryhRedR1B2e
|
|
||||||
zEZOO0qxUJSjMdnYFYG6Na/poM3atnJ4W8pJzOtA4w==
|
|
||||||
-----END RSA PRIVATE KEY-----
|
|
@ -1,6 +0,0 @@
|
|||||||
-----BEGIN PUBLIC KEY-----
|
|
||||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCHoQbEbAo/0ZDFU9AkubBRi8Fe
|
|
||||||
KdhCFrzK+wXZD9JnEJRa3q6oCI+6H3YLYleGGP8Vkwca8ykz5BX0MrKAlZWpoEpq
|
|
||||||
gm2lVCBKh9mqCG1bN0aPdlwhE24/HZFbeVgyJBvH/7XZJDGlm638dSMoXMmPtwLf
|
|
||||||
q1uTAmHwtHBEqdiLFwIDAQAB
|
|
||||||
-----END PUBLIC KEY-----
|
|
@ -1,15 +0,0 @@
|
|||||||
-----BEGIN RSA PRIVATE KEY-----
|
|
||||||
MIICXQIBAAKBgQD5b6wtr4xHY5gxH0SR+V9XIQPH6DGe2PXlKWN02dgvg7Ej/4uA
|
|
||||||
7MmOnem2SUpWE2GwuKCAUCeZkj+riEmky0EWFexaM3BmcvWLSHZ6MAYg5FxTsUG8
|
|
||||||
IXxNYUdTPpUBxaCX/yp/dvpiDqSMH67y9LwI85oWHx/zk1jMixaZXvOCXwIDAQAB
|
|
||||||
AoGBALFXn1/f9uluuu753yO12/4zf9+qi1T3xmQGuCqFE7o8dD422vVv5KHcTiUH
|
|
||||||
GK34G7Wsnph75JvAKjqHrGxZAk0NN59VK4Sl141S7qzXgjQf5Ks7r5y8v8AQgvEM
|
|
||||||
zOwutOqlGNHJZ1NlCDJuMNxUe/vyRXRl1WDCeJF6pt8huZgRAkEA/Ppqz8NyU+B7
|
|
||||||
kaz3e39uCELsyaDl3Xf82JMmJASBlndso3l3H2ihihAMYHaH21IxKQnfaiKMyfK4
|
|
||||||
tvONLB/eZwJBAPxqbKEzLqYM7ds8QG2fty7heIcwtcKjTMThl99/OinNsJdd0DUE
|
|
||||||
GPBVaDlvqijEk5R4oQ5CkzrQDe6mVkt90UkCQEogChoUl7RSC4MU3nM2VIRhL8ao
|
|
||||||
uZHaLaE8BKn7FAmFtrRzy97NJsAwkZ/WO1qdS8BNn0QXGY+26j7ZQF1UfTMCQG8W
|
|
||||||
u4Zaiz5DVG93XfehIjK8wpnlAymNSx0fGAMh8EwznXOQszCSBBPJ0tvsXBwjH7xp
|
|
||||||
NqCbBkcNCASvKi2BSxkCQQDphVUlroFh6n4KEfrVQkzHoGU2pWfwTekCwneJ1w8r
|
|
||||||
omwcagWn7E0a2DDj7tONmY7NU3kwRU2fLIzdG4Y9rewO
|
|
||||||
-----END RSA PRIVATE KEY-----
|
|
@ -1,13 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIB/zCCAWigAwIBAgIJH3Pl1mivagGCMA0GCSqGSIb3DQEBBQUAMB4xHDAaBgNV
|
|
||||||
BAMTE3NlbGZzaWduZWQuZ2l0LnpvbmUwHhcNMjMwNzI2MTQwNTIwWhcNMjQwNzI1
|
|
||||||
MTQwNTIwWjAeMRwwGgYDVQQDExNzZWxmc2lnbmVkLmdpdC56b25lMIGfMA0GCSqG
|
|
||||||
SIb3DQEBAQUAA4GNADCBiQKBgQD5b6wtr4xHY5gxH0SR+V9XIQPH6DGe2PXlKWN0
|
|
||||||
2dgvg7Ej/4uA7MmOnem2SUpWE2GwuKCAUCeZkj+riEmky0EWFexaM3BmcvWLSHZ6
|
|
||||||
MAYg5FxTsUG8IXxNYUdTPpUBxaCX/yp/dvpiDqSMH67y9LwI85oWHx/zk1jMixaZ
|
|
||||||
XvOCXwIDAQABo0UwQzAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIC9DAmBgNVHREE
|
|
||||||
HzAdhhtodHRwOi8vZXhhbXBsZS5vcmcvd2ViaWQjbWUwDQYJKoZIhvcNAQEFBQAD
|
|
||||||
gYEAQ0pJ279EDgvsY+YjslMdUaJbZcF9rFgUE3t8vDDZH99kth8gqNddahcLqEV2
|
|
||||||
8hyx7qcnplpKNVx8DYvDWoTGRdXBhCP/TBBW3jdsqaBHJey+yfAISBk4pbOow260
|
|
||||||
tNQngsMDf+PZQMLm2bT1Pxk2KXd0rFMkVWprcRs2qx3Yz0Q=
|
|
||||||
-----END CERTIFICATE-----
|
|
@ -1,31 +0,0 @@
|
|||||||
upstream test100.bleu.de {
|
|
||||||
keepalive 100;
|
|
||||||
server 192.192.192.191:3000;
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
|
||||||
# The keepalive parameter sets the maximum number of idle keepalive connections
|
|
||||||
# to upstream servers that are preserved in the cache of each worker process. When
|
|
||||||
# this number is exceeded, the least recently used connections are closed.
|
|
||||||
listen *:80 ;
|
|
||||||
server_name test100.bleu.de;
|
|
||||||
rewrite ^ https://test100.bleu.de$request_uri? permanent;
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
|
||||||
listen *:443 ssl;
|
|
||||||
server_name test100.bleu.de;
|
|
||||||
ssl_certificate /mnt/HC_Volume_11396573/lossless/push.rocks/smartnginx/nginxconfig/hosts/test100.bleu.de.public.pem;
|
|
||||||
ssl_certificate_key /mnt/HC_Volume_11396573/lossless/push.rocks/smartnginx/nginxconfig/hosts/test100.bleu.de.private.pem;
|
|
||||||
location / {
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_buffering off;
|
|
||||||
proxy_redirect off;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_next_upstream error timeout http_404 http_429 http_500 http_502;
|
|
||||||
proxy_next_upstream_tries 5;
|
|
||||||
proxy_pass http://test100.bleu.de;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
some private
|
|
@ -1 +0,0 @@
|
|||||||
some public
|
|
@ -1,31 +0,0 @@
|
|||||||
upstream test102.bleu.de {
|
|
||||||
keepalive 100;
|
|
||||||
server 192.192.192.192:3050;
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
|
||||||
# The keepalive parameter sets the maximum number of idle keepalive connections
|
|
||||||
# to upstream servers that are preserved in the cache of each worker process. When
|
|
||||||
# this number is exceeded, the least recently used connections are closed.
|
|
||||||
listen *:80 ;
|
|
||||||
server_name test102.bleu.de;
|
|
||||||
rewrite ^ https://test102.bleu.de$request_uri? permanent;
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
|
||||||
listen *:443 ssl;
|
|
||||||
server_name test102.bleu.de;
|
|
||||||
ssl_certificate /mnt/HC_Volume_11396573/lossless/push.rocks/smartnginx/nginxconfig/hosts/test102.bleu.de.public.pem;
|
|
||||||
ssl_certificate_key /mnt/HC_Volume_11396573/lossless/push.rocks/smartnginx/nginxconfig/hosts/test102.bleu.de.private.pem;
|
|
||||||
location / {
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_buffering off;
|
|
||||||
proxy_redirect off;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_next_upstream error timeout http_404 http_429 http_500 http_502;
|
|
||||||
proxy_next_upstream_tries 5;
|
|
||||||
proxy_pass http://test102.bleu.de;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
some private
|
|
@ -1 +0,0 @@
|
|||||||
some public
|
|
@ -1,79 +0,0 @@
|
|||||||
user www-data;
|
|
||||||
worker_processes auto;
|
|
||||||
pid /run/nginx/nginx.pid;
|
|
||||||
|
|
||||||
events {
|
|
||||||
worker_connections 768;
|
|
||||||
# multi_accept on;
|
|
||||||
}
|
|
||||||
|
|
||||||
http {
|
|
||||||
server_names_hash_bucket_size 128;
|
|
||||||
|
|
||||||
##
|
|
||||||
# Basic Settings
|
|
||||||
##
|
|
||||||
|
|
||||||
sendfile on;
|
|
||||||
tcp_nopush on;
|
|
||||||
tcp_nodelay on;
|
|
||||||
keepalive_timeout 65;
|
|
||||||
types_hash_max_size 2048;
|
|
||||||
# server_tokens off;
|
|
||||||
|
|
||||||
# server_names_hash_bucket_size 64;
|
|
||||||
# server_name_in_redirect off;
|
|
||||||
|
|
||||||
include /etc/nginx/mime.types;
|
|
||||||
default_type application/octet-stream;
|
|
||||||
|
|
||||||
##
|
|
||||||
# SSL Settings
|
|
||||||
##
|
|
||||||
|
|
||||||
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
|
|
||||||
ssl_prefer_server_ciphers on;
|
|
||||||
|
|
||||||
##
|
|
||||||
# Logging Settings
|
|
||||||
##
|
|
||||||
|
|
||||||
access_log /var/log/nginx/access.log;
|
|
||||||
error_log /var/log/nginx/error.log;
|
|
||||||
|
|
||||||
##
|
|
||||||
# Gzip Settings
|
|
||||||
##
|
|
||||||
|
|
||||||
gzip on;
|
|
||||||
gzip_disable "msie6";
|
|
||||||
|
|
||||||
# gzip_vary on;
|
|
||||||
# gzip_proxied any;
|
|
||||||
# gzip_comp_level 6;
|
|
||||||
# gzip_buffers 16 8k;
|
|
||||||
# gzip_http_version 1.1;
|
|
||||||
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
|
|
||||||
|
|
||||||
##
|
|
||||||
# Virtual Host Configs
|
|
||||||
##
|
|
||||||
|
|
||||||
server {
|
|
||||||
listen *:80 default_server;
|
|
||||||
server_name selfsigned.git.zone;
|
|
||||||
rewrite ^ https://git.zone redirect;
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
|
||||||
listen *:443 ssl default_server;
|
|
||||||
server_name selfsigned.git.zone;
|
|
||||||
ssl_certificate /mnt/HC_Volume_11396573/lossless/push.rocks/smartnginx/nginxconfig/hosts/default.public.pem;
|
|
||||||
ssl_certificate_key /mnt/HC_Volume_11396573/lossless/push.rocks/smartnginx/nginxconfig/hosts/default.private.pem;
|
|
||||||
rewrite ^ https://git.zone redirect;
|
|
||||||
}
|
|
||||||
|
|
||||||
include /mnt/HC_Volume_11396573/lossless/push.rocks/smartnginx/nginxconfig/hosts/*.conf;
|
|
||||||
include /etc/nginx/sites-enabled/*;
|
|
||||||
}
|
|
||||||
daemon off;
|
|
@ -2,28 +2,7 @@
|
|||||||
"npmci": {
|
"npmci": {
|
||||||
"npmAccessLevel": "public"
|
"npmAccessLevel": "public"
|
||||||
},
|
},
|
||||||
"npmdocker": {},
|
"npmdocker": {
|
||||||
"gitzone": {
|
|
||||||
"projectType": "npm",
|
|
||||||
"module": {
|
|
||||||
"githost": "code.foss.global",
|
|
||||||
"gitscope": "push.rocks",
|
|
||||||
"gitrepo": "smartnginx",
|
|
||||||
"description": "A TypeScript library for controlling Nginx from Node.js, with support for generating and managing Nginx configurations dynamically.",
|
|
||||||
"npmPackagename": "@push.rocks/smartnginx",
|
|
||||||
"license": "MIT",
|
|
||||||
"keywords": [
|
|
||||||
"nginx",
|
|
||||||
"node.js",
|
|
||||||
"TypeScript",
|
|
||||||
"configuration management",
|
|
||||||
"web server",
|
|
||||||
"reverse proxy",
|
|
||||||
"SSL certificates"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tsdoc": {
|
|
||||||
"legal": "\n## License and Legal Information\n\nThis repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository. \n\n**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.\n\n### Company Information\n\nTask Venture Capital GmbH \nRegistered at District court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or if you require further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
1645
package-lock.json
generated
Normal file
1645
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
70
package.json
70
package.json
@ -1,66 +1,44 @@
|
|||||||
{
|
{
|
||||||
"name": "@push.rocks/smartnginx",
|
"name": "@pushrocks/smartnginx",
|
||||||
"version": "2.0.52",
|
"version": "2.0.39",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "A TypeScript library for controlling Nginx from Node.js, with support for generating and managing Nginx configurations dynamically.",
|
"description": "control nginx from node, TypeScript ready",
|
||||||
"main": "dist_ts/index.js",
|
"main": "dist/index.js",
|
||||||
"typings": "dist_ts/index.d.ts",
|
"typings": "dist/index.d.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "tstest test/",
|
"test": "tstest test/",
|
||||||
"cleanTest": "(rm -r nginxconfig) && npm run test",
|
"cleanTest": "(rm -r nginxconfig) && npm run test",
|
||||||
"build": "(tsbuild --allowimplicitany)"
|
"build": "(tsbuild)"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://code.foss.global/push.rocks/smartnginx.git"
|
"url": "git+ssh://git@gitlab.com/pushrocks/smartnginx.git"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"nginx",
|
"nginx"
|
||||||
"node.js",
|
|
||||||
"TypeScript",
|
|
||||||
"configuration management",
|
|
||||||
"web server",
|
|
||||||
"reverse proxy",
|
|
||||||
"SSL certificates"
|
|
||||||
],
|
],
|
||||||
"author": "Lossless GmbH",
|
"author": "Lossless GmbH",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://gitlab.com/pushrocks/smartnginx/issues"
|
"url": "https://gitlab.com/pushrocks/smartnginx/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://code.foss.global/push.rocks/smartnginx",
|
"homepage": "https://gitlab.com/pushrocks/smartnginx#README",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@push.rocks/lik": "^6.0.2",
|
"@pushrocks/lik": "^3.0.4",
|
||||||
"@push.rocks/smartfile": "^10.0.26",
|
"@pushrocks/smartfile": "^6.0.11",
|
||||||
"@push.rocks/smartlog": "^3.0.2",
|
"@pushrocks/smartlog": "^2.0.11",
|
||||||
"@push.rocks/smartpath": "^5.0.11",
|
"@pushrocks/smartpromise": "^2.0.5",
|
||||||
"@push.rocks/smartpromise": "^4.0.2",
|
"@pushrocks/smartshell": "^2.0.13",
|
||||||
"@push.rocks/smartshell": "^3.0.3",
|
"@pushrocks/smartstring": "^3.0.8",
|
||||||
"@push.rocks/smartstring": "^4.0.7",
|
"@pushrocks/smartunique": "^3.0.1"
|
||||||
"@push.rocks/smartunique": "^3.0.3",
|
|
||||||
"selfsigned": "^2.1.1"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@gitzone/tsbuild": "^2.1.66",
|
"@gitzone/tsbuild": "^2.1.4",
|
||||||
"@gitzone/tsrun": "^1.2.44",
|
"@gitzone/tsrun": "^1.1.17",
|
||||||
"@gitzone/tstest": "^1.0.77",
|
"@gitzone/tstest": "^1.0.18",
|
||||||
"@push.rocks/qenv": "^5.0.2",
|
"@pushrocks/qenv": "^4.0.0",
|
||||||
"@push.rocks/tapbundle": "^5.0.8"
|
"@pushrocks/tapbundle": "^3.0.7",
|
||||||
},
|
"tslint": "^5.12.1",
|
||||||
"files": [
|
"tslint-config-prettier": "^1.17.0"
|
||||||
"ts/**/*",
|
}
|
||||||
"ts_web/**/*",
|
|
||||||
"dist/**/*",
|
|
||||||
"dist_*/**/*",
|
|
||||||
"dist_ts/**/*",
|
|
||||||
"dist_ts_web/**/*",
|
|
||||||
"assets/**/*",
|
|
||||||
"cli.js",
|
|
||||||
"npmextra.json",
|
|
||||||
"readme.md"
|
|
||||||
],
|
|
||||||
"type": "module",
|
|
||||||
"browserslist": [
|
|
||||||
"last 1 chrome versions"
|
|
||||||
]
|
|
||||||
}
|
}
|
4819
pnpm-lock.yaml
generated
4819
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@ -1 +0,0 @@
|
|||||||
|
|
93
readme.md
93
readme.md
@ -1,93 +0,0 @@
|
|||||||
# @push.rocks/smartnginx
|
|
||||||
control nginx from node, TypeScript ready
|
|
||||||
|
|
||||||
## Install
|
|
||||||
To install `@push.rocks/smartnginx`, you can use npm (Node Package Manager). Open your terminal and run:
|
|
||||||
```bash
|
|
||||||
npm install @push.rocks/smartnginx --save
|
|
||||||
```
|
|
||||||
This will download and install `@push.rocks/smartnginx` and its dependencies into your project's `node_modules` folder and save it as a dependency in your project's `package.json` file.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
`@push.rocks/smartnginx` is a powerful library for interacting with Nginx programmatically using Node.js and TypeScript. It simplifies tasks such as configuring hosts, deploying configurations, and managing SSL certificates. Below is a comprehensive guide to using the library effectively in your TypeScript projects.
|
|
||||||
|
|
||||||
### Getting Started
|
|
||||||
First, ensure you have imported the library into your TypeScript file. Use ESM syntax as shown:
|
|
||||||
```typescript
|
|
||||||
import { SmartNginx, NginxHost } from '@push.rocks/smartnginx';
|
|
||||||
```
|
|
||||||
|
|
||||||
### Initialize SmartNginx
|
|
||||||
Before you interact with Nginx, you need to create an instance of `SmartNginx`. This object acts as the main interface to your Nginx server. You can specify a default proxy URL that requests will be redirected to if no matching host is found.
|
|
||||||
```typescript
|
|
||||||
const smartNginx = new SmartNginx({
|
|
||||||
defaultProxyUrl: 'https://your-default-url.com'
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### Add Host Candidates
|
|
||||||
To serve content or applications via Nginx, you will define hosts. Each host corresponds to a domain or subdomain and can be configured with specific rules. Here's how to add host candidates:
|
|
||||||
```typescript
|
|
||||||
const myHost = smartNginx.addHostCandidate({
|
|
||||||
hostName: 'example.com',
|
|
||||||
destination: 'localhost',
|
|
||||||
destinationPort: 8080,
|
|
||||||
privateKey: '<Your SSL Private Key>',
|
|
||||||
publicKey: '<Your SSL Public Key>'
|
|
||||||
});
|
|
||||||
```
|
|
||||||
Replace `'example.com'`, `'localhost'`, `8080`, `'<Your SSL Private Key>'`, and `'<Your SSL Public Key>'` with your actual host name, destination IP or hostname, port number, and SSL keys respectively.
|
|
||||||
|
|
||||||
### Deploying Configuration
|
|
||||||
After adding all your host candidates, you will need to apply these configurations for Nginx to recognize and use them. Deploy the configuration as follows:
|
|
||||||
```typescript
|
|
||||||
await smartNginx.deploy();
|
|
||||||
```
|
|
||||||
This method checks for any changes in your host configurations compared to what's currently deployed and updates the Nginx configuration accordingly.
|
|
||||||
|
|
||||||
### Managing SSL Certificates
|
|
||||||
When setting up SSL for your hosts, you will provide the paths to the private key and public certificate. It's essential to ensure these files are securely stored and accessible by the library during deployment.
|
|
||||||
|
|
||||||
### Handling Multiple Hosts
|
|
||||||
You can add multiple host candidates using `addHostCandidate` method for different domains or subdomains, each with unique configurations. Here's an example of adding another host:
|
|
||||||
```typescript
|
|
||||||
const anotherHost = smartNginx.addHostCandidate({
|
|
||||||
hostName: 'sub.example.com',
|
|
||||||
destination: 'localhost',
|
|
||||||
destinationPort: 9090,
|
|
||||||
privateKey: '<Another SSL Private Key>',
|
|
||||||
publicKey: '<Another SSL Public Key>'
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### Reloading Configurations
|
|
||||||
If at any time you make changes to your host configurations and need to apply these changes, simply call the `deploy` method again. `@push.rocks/smartnginx` efficiently detects changes and reloads Nginx with the new configurations.
|
|
||||||
|
|
||||||
### Stopping SmartNginx
|
|
||||||
To stop the Nginx process managed by `@push.rocks/smartnginx`, use:
|
|
||||||
```typescript
|
|
||||||
await smartNginx.stop();
|
|
||||||
```
|
|
||||||
Bear in mind that this might affect your web services if they rely on the Nginx instance you are stopping.
|
|
||||||
|
|
||||||
### Conclusion
|
|
||||||
`@push.rocks/smartnginx` abstracts away much of the complexity involved in managing Nginx configurations, offering a TypeScript-ready solution for Node.js projects. With simple method calls, you can automate and manage your Nginx server programmatically, making it an excellent tool for developers seeking to integrate Nginx management into their applications or deployment workflows.
|
|
||||||
|
|
||||||
## License and Legal Information
|
|
||||||
|
|
||||||
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
|
|
||||||
|
|
||||||
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
### Trademarks
|
|
||||||
|
|
||||||
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
|
|
||||||
|
|
||||||
### Company Information
|
|
||||||
|
|
||||||
Task Venture Capital GmbH
|
|
||||||
Registered at District court Bremen HRB 35230 HB, Germany
|
|
||||||
|
|
||||||
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
|
|
||||||
|
|
||||||
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.
|
|
16
test/test.ts
16
test/test.ts
@ -1,18 +1,18 @@
|
|||||||
import { tap, expect } from '@push.rocks/tapbundle';
|
import { tap, expect } from '@pushrocks/tapbundle';
|
||||||
import path = require('path');
|
import path = require('path');
|
||||||
|
|
||||||
import { Qenv } from '@push.rocks/qenv';
|
import { Qenv } from '@pushrocks/qenv';
|
||||||
const testQenv = new Qenv('./', './.nogit/');
|
const testQenv = new Qenv('./', './.nogit/');
|
||||||
|
|
||||||
import * as smartnginx from '../ts/index.js';
|
import * as smartnginx from '../ts/index';
|
||||||
|
|
||||||
let testSmartNginx: smartnginx.SmartNginx;
|
let testSmartNginx: smartnginx.SmartNginx;
|
||||||
let testNginxZone01: smartnginx.NginxHost;
|
let testNginxZone01: smartnginx.NginxHost;
|
||||||
let testNginxZone02: smartnginx.NginxHost;
|
let testNginxZone02: smartnginx.NginxHost;
|
||||||
|
|
||||||
tap.test('should create a valid instance of SmartNginx', async () => {
|
tap.test('should create a valid instance of SmartNginx', async () => {
|
||||||
testSmartNginx = new smartnginx.SmartNginx({ defaultProxyUrl: 'https://git.zone' });
|
testSmartNginx = new smartnginx.SmartNginx({});
|
||||||
expect(testSmartNginx).toBeInstanceOf(smartnginx.SmartNginx);
|
expect(testSmartNginx).to.be.instanceof(smartnginx.SmartNginx);
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.test(`should produce an instance of NginxConfig`, async () => {
|
tap.test(`should produce an instance of NginxConfig`, async () => {
|
||||||
@ -21,16 +21,16 @@ tap.test(`should produce an instance of NginxConfig`, async () => {
|
|||||||
destination: '192.192.192.191',
|
destination: '192.192.192.191',
|
||||||
destinationPort: 3000,
|
destinationPort: 3000,
|
||||||
privateKey: 'some private',
|
privateKey: 'some private',
|
||||||
publicKey: 'some public',
|
publicKey: 'some public'
|
||||||
});
|
});
|
||||||
testNginxZone02 = new smartnginx.NginxHost(testSmartNginx, {
|
testNginxZone02 = new smartnginx.NginxHost(testSmartNginx, {
|
||||||
hostName: 'test102.bleu.de',
|
hostName: 'test102.bleu.de',
|
||||||
destination: '192.192.192.192',
|
destination: '192.192.192.192',
|
||||||
destinationPort: 3050,
|
destinationPort: 3050,
|
||||||
privateKey: 'some private',
|
privateKey: 'some private',
|
||||||
publicKey: 'some public',
|
publicKey: 'some public'
|
||||||
});
|
});
|
||||||
expect(testNginxZone01).toBeInstanceOf(smartnginx.NginxHost);
|
expect(testNginxZone01).to.be.instanceof(smartnginx.NginxHost);
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.test('.addHostCandidate() should add a zone to NginxConfig Object', async () => {
|
tap.test('.addHostCandidate() should add a zone to NginxConfig Object', async () => {
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
/**
|
|
||||||
* autocreated commitinfo by @pushrocks/commitinfo
|
|
||||||
*/
|
|
||||||
export const commitinfo = {
|
|
||||||
name: '@push.rocks/smartnginx',
|
|
||||||
version: '2.0.52',
|
|
||||||
description: 'control nginx from node, TypeScript ready'
|
|
||||||
}
|
|
@ -1,4 +1,6 @@
|
|||||||
|
import * as plugins from './smartnginx.plugins';
|
||||||
|
|
||||||
// classes
|
// classes
|
||||||
export * from './smartnginx.classes.smartnginx.js';
|
export * from './smartnginx.classes.smartnginx';
|
||||||
export * from './smartnginx.classes.nginxprocess.js';
|
export * from './smartnginx.classes.nginxprocess';
|
||||||
export * from './smartnginx.classes.nginxhost.js';
|
export * from './smartnginx.classes.nginxhost';
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
import * as plugins from './smartnginx.plugins.js';
|
import * as plugins from './smartnginx.plugins';
|
||||||
import * as paths from './smartnginx.paths.js';
|
import * as paths from './smartnginx.paths';
|
||||||
import * as snippets from './smartnginx.snippets.js';
|
import * as snippets from './smartnginx.snippets';
|
||||||
|
|
||||||
import { SmartNginx } from './smartnginx.classes.smartnginx.js';
|
import { SmartNginx } from './smartnginx.classes.smartnginx';
|
||||||
|
|
||||||
import { type IHostConfig } from './interfaces/hostconfig.js';
|
import { IHostConfig } from './interfaces/hostconfig';
|
||||||
|
|
||||||
export enum hostTypes {
|
export enum hostTypes {
|
||||||
reverseProxy,
|
reverseProxy
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -40,23 +40,18 @@ export class NginxHost implements IHostConfig {
|
|||||||
* @param certInstanceArg
|
* @param certInstanceArg
|
||||||
*/
|
*/
|
||||||
public async deploy() {
|
public async deploy() {
|
||||||
const filePathConfig = plugins.path.join(paths.nginxHostDirPath, `${this.hostName}.conf`);
|
const filePathConfig = plugins.path.join(paths.nginxHostDirPath, `${this.hostName}.conf`);
|
||||||
const filePathPrivate = plugins.path.join(
|
const filePathPrivate = plugins.path.join(paths.nginxHostDirPath, `${this.hostName}.private.pem`);
|
||||||
paths.nginxHostDirPath,
|
const filePathPublic = plugins.path.join(paths.nginxHostDirPath, `${this.hostName}.public.pem`);
|
||||||
`${this.hostName}.private.pem`
|
|
||||||
);
|
|
||||||
const filePathPublic = plugins.path.join(paths.nginxHostDirPath, `${this.hostName}.public.pem`);
|
|
||||||
|
|
||||||
// writeConfig
|
// writeConfig
|
||||||
this.configString = snippets.getHostConfigString(
|
this.configString = snippets.getHostConfigString(this.hostName, this.destination, this.destinationPort);
|
||||||
this.hostName,
|
|
||||||
this.destination,
|
|
||||||
this.destinationPort
|
|
||||||
);
|
|
||||||
plugins.smartfile.memory.toFsSync(this.configString, filePathConfig);
|
plugins.smartfile.memory.toFsSync(this.configString, filePathConfig);
|
||||||
|
|
||||||
// write ssl
|
// write ssl
|
||||||
plugins.smartfile.memory.toFsSync(this.privateKey, filePathPrivate);
|
plugins.smartfile.memory.toFsSync(this.privateKey, filePathPrivate);
|
||||||
plugins.smartfile.memory.toFsSync(this.publicKey, filePathPublic);
|
plugins.smartfile.memory.toFsSync(this.publicKey, filePathPublic);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
import * as plugins from './smartnginx.plugins.js';
|
import * as plugins from './smartnginx.plugins';
|
||||||
import * as paths from './smartnginx.paths.js';
|
import * as paths from './smartnginx.paths';
|
||||||
import { SmartNginx } from './smartnginx.classes.smartnginx.js';
|
import { SmartNginx } from './smartnginx.classes.smartnginx';
|
||||||
import { NginxHost } from './smartnginx.classes.nginxhost.js';
|
import { NginxHost } from './smartnginx.classes.nginxhost';
|
||||||
|
|
||||||
|
import { Smartshell } from '@pushrocks/smartshell';
|
||||||
|
|
||||||
import { ChildProcess } from 'child_process';
|
import { ChildProcess } from 'child_process';
|
||||||
|
|
||||||
@ -12,8 +14,8 @@ export class NginxProcess {
|
|||||||
public started: boolean = false;
|
public started: boolean = false;
|
||||||
public smartNginxRef: SmartNginx;
|
public smartNginxRef: SmartNginx;
|
||||||
private nginxChildProcess: ChildProcess;
|
private nginxChildProcess: ChildProcess;
|
||||||
private smartshellInstance = new plugins.smartshell.Smartshell({
|
private smartshellInstance = new Smartshell({
|
||||||
executor: 'bash',
|
executor: 'bash'
|
||||||
});
|
});
|
||||||
|
|
||||||
constructor(nginxRefArg: SmartNginx) {
|
constructor(nginxRefArg: SmartNginx) {
|
||||||
@ -25,12 +27,12 @@ export class NginxProcess {
|
|||||||
*/
|
*/
|
||||||
public async start() {
|
public async start() {
|
||||||
if (!this.nginxChildProcess) {
|
if (!this.nginxChildProcess) {
|
||||||
this.nginxChildProcess = (
|
this.nginxChildProcess = (await this.smartshellInstance.execStreaming(
|
||||||
await this.smartshellInstance.execStreaming(`nginx -c ${paths.nginxConfFile}`)
|
`nginx -c ${paths.nginxConfFile}`
|
||||||
).childProcess;
|
)).childProcess;
|
||||||
}
|
}
|
||||||
this.started = true;
|
this.started = true;
|
||||||
console.log('info', 'started Nginx!');
|
plugins.smartlog.defaultLogger.log('info', 'started Nginx!');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,34 +1,25 @@
|
|||||||
import * as plugins from './smartnginx.plugins.js';
|
import * as plugins from './smartnginx.plugins';
|
||||||
import * as paths from './smartnginx.paths.js';
|
import * as paths from './smartnginx.paths';
|
||||||
import * as snippets from './smartnginx.snippets.js';
|
import * as snippets from './smartnginx.snippets';
|
||||||
import { NginxHost } from './smartnginx.classes.nginxhost.js';
|
import { NginxHost } from './smartnginx.classes.nginxhost';
|
||||||
import { NginxProcess } from './smartnginx.classes.nginxprocess.js';
|
import { NginxProcess } from './smartnginx.classes.nginxprocess';
|
||||||
import { type IHostConfig } from './interfaces/hostconfig.js';
|
import { IHostConfig } from './interfaces/hostconfig';
|
||||||
|
|
||||||
export interface ISmartNginxContructorOptions {
|
|
||||||
logger?: plugins.smartlog.Smartlog;
|
|
||||||
defaultProxyUrl: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* main class that manages a NginxInstance
|
* main class that manages a NginxInstance
|
||||||
*/
|
*/
|
||||||
export class SmartNginx {
|
export class SmartNginx {
|
||||||
public options: ISmartNginxContructorOptions;
|
|
||||||
public logger: plugins.smartlog.Smartlog;
|
public logger: plugins.smartlog.Smartlog;
|
||||||
|
|
||||||
// the objectmaps
|
// the objectmaps
|
||||||
private deployedHosts = new plugins.lik.ObjectMap<NginxHost>();
|
private deployedHosts = new plugins.lik.Objectmap<NginxHost>();
|
||||||
private hostCandidates = new plugins.lik.ObjectMap<NginxHost>();
|
private hostCandidates = new plugins.lik.Objectmap<NginxHost>();
|
||||||
|
|
||||||
public nginxProcess: NginxProcess = new NginxProcess(this);
|
public nginxProcess: NginxProcess = new NginxProcess(this);
|
||||||
constructor(optionsArg: ISmartNginxContructorOptions) {
|
constructor(optionsArg: { logger?: plugins.smartlog.Smartlog }) {
|
||||||
this.options = optionsArg;
|
optionsArg.logger
|
||||||
this.options.logger
|
? (this.logger = optionsArg.logger)
|
||||||
? (this.logger = this.options.logger)
|
: (this.logger = plugins.smartlog.defaultLogger);
|
||||||
: (this.logger = new plugins.smartlog.Smartlog({
|
|
||||||
logContext: null
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===================
|
// ===================
|
||||||
@ -50,7 +41,7 @@ export class SmartNginx {
|
|||||||
* @param hostNameArg
|
* @param hostNameArg
|
||||||
*/
|
*/
|
||||||
public getDeployedNginxHostByHostName(hostNameArg: string): NginxHost {
|
public getDeployedNginxHostByHostName(hostNameArg: string): NginxHost {
|
||||||
return this.deployedHosts.findSync((nginxHost) => {
|
return this.deployedHosts.find(nginxHost => {
|
||||||
return nginxHost.hostName === hostNameArg;
|
return nginxHost.hostName === hostNameArg;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -67,7 +58,7 @@ export class SmartNginx {
|
|||||||
*/
|
*/
|
||||||
public async removeDeployedHost(nginxHostArg: NginxHost) {
|
public async removeDeployedHost(nginxHostArg: NginxHost) {
|
||||||
if (this.hostCandidates.isEmpty()) {
|
if (this.hostCandidates.isEmpty()) {
|
||||||
this.deployedHosts.forEach((hostArg) => {
|
this.deployedHosts.forEach(hostArg => {
|
||||||
this.hostCandidates.add(hostArg);
|
this.hostCandidates.add(hostArg);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -82,9 +73,9 @@ export class SmartNginx {
|
|||||||
private async areHostsDiverged(): Promise<boolean> {
|
private async areHostsDiverged(): Promise<boolean> {
|
||||||
let hostCounter = 0;
|
let hostCounter = 0;
|
||||||
let unfoundHosts = 0;
|
let unfoundHosts = 0;
|
||||||
await this.hostCandidates.forEach(async (hostCandidateArg) => {
|
await this.hostCandidates.forEach(async hostCandidateArg => {
|
||||||
let foundHost = false;
|
let foundHost = false;
|
||||||
await this.deployedHosts.forEach(async (deployedHostArg) => {
|
await this.deployedHosts.forEach(async deployedHostArg => {
|
||||||
if (
|
if (
|
||||||
hostCandidateArg.hostName === deployedHostArg.hostName &&
|
hostCandidateArg.hostName === deployedHostArg.hostName &&
|
||||||
hostCandidateArg.destination === deployedHostArg.destination &&
|
hostCandidateArg.destination === deployedHostArg.destination &&
|
||||||
@ -117,27 +108,10 @@ export class SmartNginx {
|
|||||||
|
|
||||||
// write base config
|
// write base config
|
||||||
plugins.smartfile.fs.ensureDirSync(paths.nginxConfigDirPath);
|
plugins.smartfile.fs.ensureDirSync(paths.nginxConfigDirPath);
|
||||||
plugins.smartfile.memory.toFsSync(
|
plugins.smartfile.memory.toFsSync(snippets.getBaseConfigString(), paths.nginxConfFile);
|
||||||
snippets.getBaseConfigString(this.options.defaultProxyUrl),
|
|
||||||
paths.nginxConfFile
|
|
||||||
);
|
|
||||||
|
|
||||||
// write standard self signed certificate
|
|
||||||
const selfsignedCert = plugins.selfsigned.generate(
|
|
||||||
[{ name: 'commonName', value: 'selfsigned.git.zone' }],
|
|
||||||
{ days: 365 }
|
|
||||||
);
|
|
||||||
|
|
||||||
// deploy hosts
|
// deploy hosts
|
||||||
plugins.smartfile.fs.ensureDirSync(paths.nginxHostDirPath);
|
plugins.smartfile.fs.ensureEmptyDirSync(paths.nginxHostDirPath);
|
||||||
plugins.smartfile.memory.toFsSync(
|
|
||||||
selfsignedCert.private,
|
|
||||||
plugins.path.join(paths.nginxHostDirPath, './default.private.pem')
|
|
||||||
);
|
|
||||||
plugins.smartfile.memory.toFsSync(
|
|
||||||
selfsignedCert.cert,
|
|
||||||
plugins.path.join(paths.nginxHostDirPath, './default.public.pem')
|
|
||||||
);
|
|
||||||
for (const host of this.deployedHosts.getArray()) {
|
for (const host of this.deployedHosts.getArray()) {
|
||||||
await host.deploy();
|
await host.deploy();
|
||||||
this.logger.log('info', `Host ${host.hostName} deployed!`);
|
this.logger.log('info', `Host ${host.hostName} deployed!`);
|
||||||
@ -148,13 +122,4 @@ export class SmartNginx {
|
|||||||
this.hostCandidates.wipe();
|
this.hostCandidates.wipe();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* stops the smartnginx instance
|
|
||||||
*/
|
|
||||||
public async stop() {
|
|
||||||
if (this.nginxProcess) {
|
|
||||||
await this.nginxProcess.stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import * as plugins from './smartnginx.plugins.js';
|
import * as plugins from './smartnginx.plugins';
|
||||||
|
|
||||||
// directories
|
// directories
|
||||||
export const packageBase = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../');
|
export const packageBase = plugins.path.join(__dirname, '../');
|
||||||
export const nginxConfigDirPath = plugins.path.join(packageBase, 'nginxconfig');
|
export const nginxConfigDirPath = plugins.path.join(packageBase, 'nginxconfig');
|
||||||
export const nginxHostDirPath = plugins.path.join(nginxConfigDirPath, 'hosts');
|
export const nginxHostDirPath = plugins.path.join(nginxConfigDirPath, 'hosts');
|
||||||
|
|
||||||
|
@ -4,18 +4,12 @@ import * as path from 'path';
|
|||||||
export { path };
|
export { path };
|
||||||
|
|
||||||
// @pushrocks scope
|
// @pushrocks scope
|
||||||
import * as lik from '@push.rocks/lik';
|
import * as lik from '@pushrocks/lik';
|
||||||
import * as smartfile from '@push.rocks/smartfile';
|
import * as smartlog from '@pushrocks/smartlog';
|
||||||
import * as smartlog from '@push.rocks/smartlog';
|
import * as smartpromise from '@pushrocks/smartpromise';
|
||||||
import * as smartpath from '@push.rocks/smartpath';
|
import * as smartshell from '@pushrocks/smartshell';
|
||||||
import * as smartpromise from '@push.rocks/smartpromise';
|
import * as smartfile from '@pushrocks/smartfile';
|
||||||
import * as smartshell from '@push.rocks/smartshell';
|
import * as smartstring from '@pushrocks/smartstring';
|
||||||
import * as smartstring from '@push.rocks/smartstring';
|
import * as smartunique from '@pushrocks/smartunique';
|
||||||
import * as smartunique from '@push.rocks/smartunique';
|
|
||||||
|
|
||||||
export { lik, smartfile, smartlog, smartpath, smartpromise, smartshell, smartstring, smartunique };
|
export { lik, smartlog, smartpromise, smartshell, smartfile, smartstring, smartunique };
|
||||||
|
|
||||||
// thirdparty scope
|
|
||||||
import * as selfsigned from 'selfsigned';
|
|
||||||
|
|
||||||
export { selfsigned };
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import * as plugins from './smartnginx.plugins.js';
|
import * as plugins from './smartnginx.plugins';
|
||||||
import * as paths from './smartnginx.paths.js';
|
import * as paths from './smartnginx.paths';
|
||||||
export let getBaseConfigString = (defaultProxy: string) => {
|
export let getBaseConfigString = () => {
|
||||||
const baseConfig = plugins.smartstring.indent.normalize(`
|
const baseConfig = plugins.smartstring.indent.normalize(`
|
||||||
user www-data;
|
user www-data;
|
||||||
worker_processes auto;
|
worker_processes auto;
|
||||||
@ -63,20 +63,6 @@ export let getBaseConfigString = (defaultProxy: string) => {
|
|||||||
# Virtual Host Configs
|
# Virtual Host Configs
|
||||||
##
|
##
|
||||||
|
|
||||||
server {
|
|
||||||
listen *:80 default_server;
|
|
||||||
server_name selfsigned.git.zone;
|
|
||||||
rewrite ^ ${defaultProxy} redirect;
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
|
||||||
listen *:443 ssl default_server;
|
|
||||||
server_name selfsigned.git.zone;
|
|
||||||
ssl_certificate ${paths.nginxHostDirPath}/default.public.pem;
|
|
||||||
ssl_certificate_key ${paths.nginxHostDirPath}/default.private.pem;
|
|
||||||
rewrite ^ ${defaultProxy} redirect;
|
|
||||||
}
|
|
||||||
|
|
||||||
include ${paths.nginxHostDirPath}/*.conf;
|
include ${paths.nginxHostDirPath}/*.conf;
|
||||||
include /etc/nginx/sites-enabled/*;
|
include /etc/nginx/sites-enabled/*;
|
||||||
}
|
}
|
||||||
@ -85,12 +71,8 @@ export let getBaseConfigString = (defaultProxy: string) => {
|
|||||||
return baseConfig;
|
return baseConfig;
|
||||||
};
|
};
|
||||||
|
|
||||||
export let getHostConfigString = (
|
export let getHostConfigString = (hostNameArg: string, destinationIpArg: string, destinationPortArg = 80) => {
|
||||||
hostNameArg: string,
|
const hostConfig = plugins.smartstring.indent.normalize(`
|
||||||
destinationIpArg: string,
|
|
||||||
destinationPortArg = 80
|
|
||||||
) => {
|
|
||||||
const hostConfig = plugins.smartstring.indent.normalize(`
|
|
||||||
upstream ${hostNameArg} {
|
upstream ${hostNameArg} {
|
||||||
keepalive 100;
|
keepalive 100;
|
||||||
server ${destinationIpArg}:${destinationPortArg};
|
server ${destinationIpArg}:${destinationPortArg};
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"experimentalDecorators": true,
|
|
||||||
"useDefineForClassFields": false,
|
|
||||||
"target": "ES2022",
|
|
||||||
"module": "NodeNext",
|
|
||||||
"moduleResolution": "NodeNext",
|
|
||||||
"esModuleInterop": true,
|
|
||||||
"verbatimModuleSyntax": true
|
|
||||||
},
|
|
||||||
"exclude": [
|
|
||||||
"dist_*/**/*.d.ts"
|
|
||||||
]
|
|
||||||
}
|
|
17
tslint.json
Normal file
17
tslint.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"extends": ["tslint:latest", "tslint-config-prettier"],
|
||||||
|
"rules": {
|
||||||
|
"semicolon": [true, "always"],
|
||||||
|
"no-console": false,
|
||||||
|
"ordered-imports": false,
|
||||||
|
"object-literal-sort-keys": false,
|
||||||
|
"member-ordering": {
|
||||||
|
"options":{
|
||||||
|
"order": [
|
||||||
|
"static-method"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"defaultSeverity": "warning"
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user