adding docker-compose

This commit is contained in:
adb-sh 2020-09-14 22:56:34 +02:00
parent 5af8687ebb
commit 8779fee2af
11 changed files with 209 additions and 111 deletions

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
.idea/
./redis_conf/
./redis_data/
./node_logs/
./node_app./
node_modules/
./node_app/package-lock.json

View File

@ -1,13 +1,13 @@
# short_url # short_url
This is a simple application to short you urls with your own web server. This is a simple application to short you urls with your own web server.
It is based on Nodejs and Redis. It is based on Nodejs and Redis.
You will have to change the IPs in the `index.js` and `./public/index.html` files to your public IP or domain. You can change the public ports `8080` (web UI) and `8081` (websocket) in the `docker-compose.yml` file
To start the server simply execute `index.js`: To start the server simply use `docker-compose`:
``` ```
screen -A -m -d -S short_url nodejs index.js docker-compose -p surl up -d
``` ```
It's recommended to use a reverse proxy like nginx to manage SSL certificates etc. It's recommended to use a reverse proxy like nginx to manage SSL certificates.
A test instance is running under [s.adb.sh](https://s.adb.sh). A test instance is running at [s.adb.sh](https://s.adb.sh).
//good luck //good luck

31
docker-compose.yml Normal file
View File

@ -0,0 +1,31 @@
version: '3'
services:
node:
image: node
container_name: surl_node
restart: always
ports:
- "8080:8080"
- "8081:8081"
volumes:
- ./node_app/:/home/node/app/
# - ./node_modules/:/home/node/app/node_modules/
- ./node_logs/:/var/log/
working_dir: /home/node/app/
environment:
- NODE_ENV=production
command: sh -c 'npm i && nodejs index.js'
links:
- redis
redis:
image: redis
container_name: surl_redis
expose:
- 6379
restart: always
volumes:
- ./redis_data/:/var/lib/redis/
- ./redis_conf/:/usr/local/etc/redis/
environment:
- REDIS_REPLICATION_MODE=master

View File

@ -5,30 +5,34 @@ const ws = require('ws')
const redis = require('redis') const redis = require('redis')
const mime = require('mime') const mime = require('mime')
const XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest const XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest
const host = 'http://127.0.0.1:8080/' const host = 'http://127.0.0.1:8080/'
const outpath = ['sym', '', 'manifest.json', 'admin', 'stats']
//redis client //redis client
const redis_cli = redis.createClient() const redis_cli = redis.createClient({
host: 'redis',
port: 6379
})
redis_cli.on("error", function (error) { redis_cli.on("error", function (error) {
console.error(error) console.error(error)
}) })
const outpath = ['sym', '', 'manifest.json']
//HTTP server //HTTP server
http.createServer(function (req, res) { http.createServer(function (req, res) {
const q = url.parse(req.url, true); const q = url.parse(req.url, true);
let filename = "./public" + q.pathname; let filename = "./public" + q.pathname;
if (filename === "./public/") filename = "./public/index.html"; let path_split = q.pathname.split("/", 3);
if (path_split[path_split.length - 1] === "") filename += "/index.html";
let file_type = mime.getType(filename) let file_type = mime.getType(filename)
//q.pathname.split("/", 2)[1] === "sym" || ) if (function valid_path(){
if (function valid_path(){// //outpath.forEach( path => {if (request_path === path) return true})
for (let i = 0; i < outpath.length; i++) if (q.pathname.split("/", 2)[1] === outpath[i]) return true for (let i = 0; i < outpath.length; i++) if (path_split[1] === outpath[i]) return true
return false return false
}() === true){ }() === true){
fs.readFile(filename, function(err, data) { fs.readFile(filename, function(err, data) {
if (err) { if (err) {
res.writeHead(404, {'Content-Type': file_type}); res.writeHead(404, {'Content-Type': "text/html"});
return res.end("404 Not Found"); return res.end("404 Not Found");
} }
res.writeHead(200, {'Content-Type': file_type}); res.writeHead(200, {'Content-Type': file_type});
@ -42,7 +46,7 @@ http.createServer(function (req, res) {
res.writeHead(302, {'Location': obj}); res.writeHead(302, {'Location': obj});
return res.end(); return res.end();
}else{ }else{
res.writeHead(404, {'Content-Type': file_type}); res.writeHead(404, {'Content-Type': "text/html"});
return res.end("404 this short-url does not exist :/"); return res.end("404 this short-url does not exist :/");
} }
}); });
@ -113,14 +117,13 @@ wss.on('connection', ws => {
}) })
//random key //random key
const forbidden_array = ['sym', 'admin', 'stats']
function get_key(length) { function get_key(length) {
let forbidden = false; let output = '' let forbidden = false; let output = ''
let characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' let characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
do{ do{
for (let i = 0; i < length; i++ ) for (let i = 0; i < length; i++ )
output += characters.charAt(Math.floor(Math.random() * characters.length)) output += characters.charAt(Math.floor(Math.random() * characters.length))
for (let i = 0; i < forbidden_array.length; i++) if (output === forbidden_array[i]) forbidden = true for (let i = 0; i < output.length; i++) if (output === outpath[i]) forbidden = true
redis_cli.hget("surl;"+output, "url", function(err, obj) { redis_cli.hget("surl;"+output, "url", function(err, obj) {
if(err) console.log(err) if(err) console.log(err)
if(obj) forbidden = true if(obj) forbidden = true

57
node_app/package-lock.json generated Normal file
View File

@ -0,0 +1,57 @@
{
"name": "surl",
"version": "1.1.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"denque": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz",
"integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ=="
},
"mime": {
"version": "2.4.6",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
"integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA=="
},
"redis": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/redis/-/redis-3.0.2.tgz",
"integrity": "sha512-PNhLCrjU6vKVuMOyFu7oSP296mwBkcE6lrAjruBYG5LgdSqtRBoVQIylrMyVZD/lkF24RSNNatzvYag6HRBHjQ==",
"requires": {
"denque": "^1.4.1",
"redis-commands": "^1.5.0",
"redis-errors": "^1.2.0",
"redis-parser": "^3.0.0"
}
},
"redis-commands": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.6.0.tgz",
"integrity": "sha512-2jnZ0IkjZxvguITjFTrGiLyzQZcTvaw8DAaCXxZq/dsHXz7KfMQ3OUJy7Tz9vnRtZRVz6VRCPDvruvU8Ts44wQ=="
},
"redis-errors": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
"integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60="
},
"redis-parser": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
"integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=",
"requires": {
"redis-errors": "^1.0.0"
}
},
"ws": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
"integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA=="
},
"xmlhttprequest": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
"integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw="
}
}
}

View File

@ -1,6 +1,6 @@
{ {
"name": "short_url", "name": "surl",
"version": "1.0.0", "version": "1.1.0",
"dependencies": { "dependencies": {
"mime": "^2.4.6", "mime": "^2.4.6",
"redis": "^3.0.2", "redis": "^3.0.2",

View File

Before

Width:  |  Height:  |  Size: 268 B

After

Width:  |  Height:  |  Size: 265 B