feat(app/web): add endpoint to stop instance
This commit is contained in:
21
.github/workflows/ci.yml
vendored
21
.github/workflows/ci.yml
vendored
@@ -217,11 +217,20 @@ jobs:
|
|||||||
use_mocked_data: yes
|
use_mocked_data: yes
|
||||||
verify: yes
|
verify: yes
|
||||||
|
|
||||||
|
# Deploy to metrics.lecoq.io
|
||||||
|
deploy-latest:
|
||||||
|
name: Deploy lowlighter/metrics@latest
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [ update-latest ]
|
||||||
|
steps:
|
||||||
|
- name: Deploy web instance
|
||||||
|
run: "curl -X POST -H 'Authorization: ${{ secrets.WEB_DEPLOY_TOKEN }}' https://metrics.lecoq.io/.control/stop"
|
||||||
|
|
||||||
# Publish GitHub release
|
# Publish GitHub release
|
||||||
publish-release:
|
publish-release:
|
||||||
name: Publish release
|
name: Publish release
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [ action-latest-test ]
|
needs: [ action-latest-test, deploy-latest ]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
@@ -237,13 +246,3 @@ jobs:
|
|||||||
GITHUB_TOKEN: ${{ github.token }}
|
GITHUB_TOKEN: ${{ github.token }}
|
||||||
GITHUB_REPOSITORY: ${{ github.repository }}
|
GITHUB_REPOSITORY: ${{ github.repository }}
|
||||||
GITHUB_COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
|
GITHUB_COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
|
||||||
|
|
||||||
# Deploy to metrics.lecoq.io
|
|
||||||
deploy-latest:
|
|
||||||
name: Deploy lowlighter/metrics@latest
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: [ action-latest-test ]
|
|
||||||
if: contains(github.event.head_commit.message, '[deploy]')
|
|
||||||
steps:
|
|
||||||
- name: Deploy web instance
|
|
||||||
run: "curl -H 'Content-Type: application/json' --data '${{ secrets.WEB_DEPLOY_TOKEN }}' -X POST https://deploy.metrics.lecoq.io"
|
|
||||||
|
|||||||
@@ -399,6 +399,24 @@ export default async function({sandbox = false} = {}) {
|
|||||||
app.get("/embed/*", (req, res) => res.status(405).send("Method not allowed: this endpoint is not available"))
|
app.get("/embed/*", (req, res) => res.status(405).send("Method not allowed: this endpoint is not available"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Control endpoints
|
||||||
|
if ((conf.settings.control?.token)&&(conf.settings.control.token)) {
|
||||||
|
const middleware = (req, res, next) => {
|
||||||
|
console.log(`metrics/app/control > ${req.method} > ${req.url}`)
|
||||||
|
if (req.headers.authorization === conf.settings.control.token) {
|
||||||
|
next()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return res.status(401).send("Unauthorized: invalid token")
|
||||||
|
}
|
||||||
|
app.post("/.control/stop", limiter, middleware, async (req, res) => {
|
||||||
|
console.debug("metrics/app/control > instance will be stopped in a few seconds")
|
||||||
|
res.status(202).send("Accepted: instance will be stopped in a few seconds")
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 5000))
|
||||||
|
process.exit(1)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
//Listen
|
//Listen
|
||||||
app.listen(port, () =>
|
app.listen(port, () =>
|
||||||
console.log([
|
console.log([
|
||||||
|
|||||||
3
source/app/web/settings.example.json
generated
3
source/app/web/settings.example.json
generated
@@ -20,6 +20,9 @@
|
|||||||
"by": "", "//": "Web instance host (displayed in footer)",
|
"by": "", "//": "Web instance host (displayed in footer)",
|
||||||
"link": "", "//": "Web instance host link (displayed in footer)"
|
"link": "", "//": "Web instance host link (displayed in footer)"
|
||||||
},
|
},
|
||||||
|
"control":{
|
||||||
|
"token": null, "//": "Control token (can be used by external services to perform actions on instance, such as stopping it for redeploys)"
|
||||||
|
},
|
||||||
"community": {
|
"community": {
|
||||||
"templates": [], "//": "Additional community templates to setup"
|
"templates": [], "//": "Additional community templates to setup"
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user