diff --git a/.gitignore b/.gitignore index 43f25aa7..6a4f2eb0 100644 --- a/.gitignore +++ b/.gitignore @@ -78,3 +78,4 @@ docker/data # Cache files __pycache__ /.idea/ +/venv/ diff --git a/docker-compose.yml b/docker-compose.yml index 727040d2..7fc0c35d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -79,7 +79,6 @@ services: - 80 depends_on: - sia - - health-check - handshake-api webapp: @@ -119,6 +118,7 @@ services: container_name: handshake-api restart: unless-stopped environment: + - HOSTNAME=0.0.0.0 - HSD_HOST=handshake - HSD_NETWORK=main - HSD_PORT=12037 @@ -142,6 +142,11 @@ services: networks: - shared environment: + - HOSTNAME=0.0.0.0 - PORTAL_URL=nginx expose: - 3100 + depends_on: + - caddy + - handshake + - handshake-api diff --git a/docker/nginx/conf.d/client.conf b/docker/nginx/conf.d/client.conf index cbab2d32..b6dfd2cd 100644 --- a/docker/nginx/conf.d/client.conf +++ b/docker/nginx/conf.d/client.conf @@ -115,6 +115,7 @@ server { location /hns { include /etc/nginx/conf.d/include/cors; + include /etc/nginx/conf.d/include/proxy-buffer; # if you are expecting large headers (ie. Skynet-Skyfile-Metadata), tune these values to your needs proxy_buffer_size 128k; @@ -179,6 +180,7 @@ server { location ~ "^/([a-zA-Z0-9-_]{46}(/.*)?)$" { include /etc/nginx/conf.d/include/cors; + include /etc/nginx/conf.d/include/proxy-buffer; limit_conn downloads_by_ip 100; # ddos protection: max 100 downloads at a time add_header Cache-Control "public, max-age=86400"; # allow consumer to cache response @@ -208,6 +210,7 @@ server { location ~ "^/file/([a-zA-Z0-9-_]{46}(/.*)?)$" { include /etc/nginx/conf.d/include/cors; + include /etc/nginx/conf.d/include/proxy-buffer; limit_conn downloads_by_ip 100; # ddos protection: max 100 downloads at a time add_header Cache-Control "public, max-age=86400"; # allow consumer to cache response diff --git a/docker/nginx/conf.d/include/proxy-buffer b/docker/nginx/conf.d/include/proxy-buffer new file mode 100644 index 00000000..f7a2b12e --- /dev/null +++ b/docker/nginx/conf.d/include/proxy-buffer @@ -0,0 +1,4 @@ +# if you are expecting large headers (ie. Skynet-Skyfile-Metadata), tune these values to your needs +proxy_buffer_size 128k; +proxy_buffers 4 256k; +proxy_busy_buffers_size 256k; diff --git a/packages/handshake-api/src/index.js b/packages/handshake-api/src/index.js index 6c00d2f4..6c057ca1 100644 --- a/packages/handshake-api/src/index.js +++ b/packages/handshake-api/src/index.js @@ -19,7 +19,8 @@ const clientOptions = { }; const client = new NodeClient(clientOptions); -const startsWithSkylinkRegExp = /^[a-zA-Z0-9_-]{46}/; +// Match both `sia://HASH` and `HASH` links. +const startsWithSkylinkRegExp = /^(sia:\/\/)?[a-zA-Z0-9_-]{46}/; const getDomainRecords = async (name) => { const response = await client.execute("getnameresource", [name]); @@ -31,7 +32,13 @@ const getDomainRecords = async (name) => { }; const findSkylinkRecord = (records) => { - return records?.find(({ txt }) => txt?.some((entry) => isValidSkylink(entry))); + // Find the last one, so people can update their domains in a non-destructive + // way by simply adding a new link. This will also allow keeping links to + // older versions for backwards compatibility. + return records + ?.slice() + .reverse() + .find(({ txt }) => txt?.some((entry) => isValidSkylink(entry))); }; const getSkylinkFromRecord = (record) => { @@ -69,7 +76,10 @@ server.use( // eslint-disable-next-line no-unused-vars userResHeaderDecorator(headers, userReq, userRes, proxyReq, proxyRes) { if (headers.location && headers.location.match(startsWithSkylinkRegExp)) { - headers.location = headers.location.replace(startsWithSkylinkRegExp, `/hns/${userReq.params.name}`); + headers.location = headers.location.replace( + startsWithSkylinkRegExp, + `/hns/${userReq.params.name.replace("sia://", "")}` + ); } return headers; @@ -81,7 +91,7 @@ server.use( const record = findSkylinkRecord(records); if (!record) throw new Error(`No skylink found in dns records of ${req.params.name}`); - const skylink = getSkylinkFromRecord(record); + const skylink = getSkylinkFromRecord(record).replace("sia://", ""); // get skylink and strip sia:// prefix const basepath = url.resolve("/", skylink); // make the url absolute const subpath = req.url.slice(1); // drop the leading slash diff --git a/packages/webapp/src/components/HomeSamples/HomeSamples.js b/packages/webapp/src/components/HomeSamples/HomeSamples.js index e24d2dee..1a9efd48 100644 --- a/packages/webapp/src/components/HomeSamples/HomeSamples.js +++ b/packages/webapp/src/components/HomeSamples/HomeSamples.js @@ -23,7 +23,7 @@ export default function HomeSamples() {

Skynet includes{" "} APIs {" "} - that integrate seamlessly with your existing apps. You can follow this{" "} + that integrate seamlessly with your existing apps. You can follow these guides to start using Skynet with{" "} - guide + the Skynet CLI {" "} - to setup a Sia Node. + and{" "} + + integrate Skynet + {" "} + into your application.