feat(app/web): add endpoint to stop instance

This commit is contained in:
lowlighter
2022-07-07 00:30:41 -04:00
parent 6d01f36f31
commit 1d978c18d1
3 changed files with 31 additions and 11 deletions

View File

@@ -217,11 +217,20 @@ jobs:
use_mocked_data: 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-release:
name: Publish release
runs-on: ubuntu-latest
needs: [ action-latest-test ]
needs: [ action-latest-test, deploy-latest ]
steps:
- name: Checkout repository
uses: actions/checkout@v2
@@ -237,13 +246,3 @@ jobs:
GITHUB_TOKEN: ${{ github.token }}
GITHUB_REPOSITORY: ${{ github.repository }}
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"

View File

@@ -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"))
}
//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
app.listen(port, () =>
console.log([

View File

@@ -20,6 +20,9 @@
"by": "", "//": "Web instance host (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": {
"templates": [], "//": "Additional community templates to setup"
},