adding docker-compose

master
adb-sh 4 years ago
parent 5af8687ebb
commit 8779fee2af

7
.gitignore vendored

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

@ -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

@ -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

@ -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

@ -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="
}
}
}

@ -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",

Before

Width:  |  Height:  |  Size: 268 B

After

Width:  |  Height:  |  Size: 265 B

Loading…
Cancel
Save