feat: reorganise for cloud content

This commit is contained in:
Iain Learmonth 2026-02-22 19:21:02 +00:00
parent 7396dbc851
commit c7d058c599
24 changed files with 131 additions and 99 deletions

View file

@ -1,41 +1,3 @@
# Website
This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator.
## Installation
```bash
yarn
```
## Local Development
```bash
yarn start
```
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
## Build
```bash
yarn build
```
This command generates static content into the `build` directory and can be served using any static contents hosting service.
## Deployment
Using SSH:
```bash
USE_SSH=true yarn deploy
```
Not using SSH:
```bash
GIT_USER=<Your GitHub username> yarn deploy
```
If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.

View file

@ -0,0 +1,5 @@
---
label: Background Topics
position: 30
link:
type: "generated-index"

View file

@ -0,0 +1,33 @@
---
title: Collateral Freedom
sidebar_position: 10
---
Collateral freedom is an anti-censorship strategy that attempts to make it **economically prohibitive** for censors to
block a resource.
The diverse needs of businesses to exchange information across international borders makes it impossible to build a
catalogue of "good" and "bad" networks or websites.
A censor requires some confidence when they block a resource that it won't be affecting economic activity.
Its difficult to achieve accuracy with filtering as most internet traffic is encrypted and must be categorised
at speed to make blocking decisions.
As a result, censors will usually err on the side of under-blocking.
One way to exploit this is by deploying solutions in large platforms that are **“too big to block”**, like public cloud
providers.
Public cloud providers host large numbers of clients in shared infrastructure to benefit from economies of scale, but
this sharing also makes it difficult to know what content is being accessed.
Similarly, large social networks host content from large numbers of publishers but all traffic between the user and the
social network is typically encrypted and so the censor cannot know what is being read.
Blocking the cloud provider would have a negative impact on businesses and would hurt state revenue, and blocking the
social media platform would cause backlash from the people: neither is an attractive option for the censor.
Another approach is to use constantly rotating identifiers, as even where a resource may be easy to block once
identified, a new resource can be deployed quickly to replace it rendering the blocks ineffective.
Due to erring on the side of under-blocking, attempts to access previously unseen content usually succeed.
Even with a procedure for screening or approval, blocking by default would bog down innovation and development to the
extent that it could cease, certainly falling behind other economies.
This approach is particularly suited for news media where the majority of readers will be interested in an article for
only a short time after it is published, and if it is later blocked by the censor then the effect will be minimal.
With collateral freedom on your side **you can have the upper hand** when it comes to making your content accessible to
your audience.

View file

@ -1,10 +1,10 @@
---
sidebar_position: 1
sidebar_label: Overview
sidebar_label: Welcome
---
# Documentation Overview
:::warning[Under construction]
This documentation is a work in progress. Please [get in touch with us](mailto:help@cdr.link) if you have any questions.
:::
This documentation is a work in progress. Please [get in touch with us](mailto:contact@sr2.uk) if you have any questions.
:::

View file

@ -1,5 +1,5 @@
---
sidebar_position: 5
sidebar_position: 50
---
# Hosted CDR Link FAQ

15
docs/link/index.mdx Normal file
View file

@ -0,0 +1,15 @@
---
sidebar_position: 1
sidebar_label: Link Helpdesk
---
import DocCardList from '@theme/DocCardList';
import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
# Documentation Overview
:::warning[Under construction]
This documentation is a work in progress. Please [get in touch with us](mailto:contact@sr2.uk) if you have any questions.
:::
<DocCardList items={useCurrentSidebarCategory().items.slice(1)} />

26
docs/mirrors/index.mdx Normal file
View file

@ -0,0 +1,26 @@
---
title: Web Mirrors
sidebar_position: 20
---
A web mirror can help users by providing alternate URLs to access censored resources, allowing them to bypass censorship
and access information that may be otherwise blocked.
Web mirrors work by forwarding requests to the original website, and providing a different URL to access that content.
Dynamic web mirrors use frequently changing URLs to evade censorship, making it more difficult for censors to maintain
blocks for the content.
This assumption of a limited lifetime is built-in to the system, allowing for automated block detection to trigger the
deployment of new URLs, and for the new URLs to be made available via the portal, the API, and via dead drops.
Named web mirrors use alternative domain names with limited distribution to evade censorship.
By blending with the "long tail" of web traffic, it may take longer for these mirrors to be discovered.
Web mirrors can be accessed via a normal web browser, making them easily accessible to users without requiring any
special software or technical knowledge.
<figure style={{"text-align": "center"}}>
<img src="/img/mirrors/overview.png" style={{"max-width": "100%", "max-height": "500px"}} />
<figcaption style={{"font-weight": "bold"}}>
The jasima.app portal overview for web mirrors
</figcaption>
</figure>

View file

@ -0,0 +1,32 @@
---
title: Troubleshooting
sidebar_position: 100
---
We have collected solutions to common issued faced by web mirrors users.
If you are unable to resolve your issue, please [get in touch](/contact) with us to discuss the options.
## Upstream Rate Limiting
CDNs (Content Delivery Networks) can impose rate limiting or "bot detection" on websites to ensure that the network
resources are efficiently utilized, to protect the websites from Denial of Service (DoS) attacks, and to
maintain the quality of service for all the websites using the CDN.
If you find that mirrors are producing many “Rate Limited Exceeded” or “Access Denied” errors then you may be suffering
from this problem.
These rate limits will be sized according to the expected rate of requests from an average user, however the mirror
system is a bottleneck that aggregates requests from multiple users and passes these on to the original CDN.
When a single system is used to send a large number of requests to a CDN like this, the CDN may interpret this as a
DoS attack and prevent access to the website.
The optimal approach is to configure the origin to use an alternative host for connections, so that the CDN is bypassed
and the backend origin (web server) is used directly.
The mirror will still be the access point for users and this will not reveal the location of the backend origin to your
users.
If this is not possible, then deploying mirrors for websites hosted on CDNs will require either configuration at, or
co-operation from, the CDN provider.
Additional headers can be configured for the origin to authenticate requests that originate from jasima.app, and these
can be used to bypass the protection mechanisms at your CDN.
Consult your CDN's documentation or contact their support team to configure using an additional header to disable the
rate limiting for requests originating from jasima.app.

View file

@ -10,8 +10,8 @@ import {themes as prismThemes} from 'prism-react-renderer';
/** @type {import('@docusaurus/types').Config} */
const config = {
title: 'CDR Link',
tagline: 'A guide for agents, admins, and operators',
title: 'SR2® Cloud',
tagline: 'A cloud for civil society',
favicon: 'img/favicon.ico',
// Future flags, see https://docusaurus.io/docs/api/docusaurus-config#future
@ -20,7 +20,7 @@ const config = {
},
// Set the production url of your site here
url: 'https://docs.cdr.link',
url: 'https://docs.sr2.uk',
// Set the /<baseUrl>/ pathname under which your site is served
// For GitHub pages deployment, it is often '/<projectName>/'
baseUrl: '/',
@ -83,12 +83,12 @@ const config = {
respectPrefersColorScheme: true,
},
navbar: {
title: 'CDR Link',
title: 'SR2® Cloud',
logo: {
alt: '',
src: 'img/link-logo.png',
// href: 'https://www.digiresilience.org/solutions/link/',
// target: '_self',
src: 'img/sr2-logo.webp',
href: '/',
target: '_self',
},
items: [
{
@ -112,47 +112,31 @@ const config = {
title: 'Docs',
items: [
{
label: 'Agent Guide',
to: '/docs/category/agent-guide',
label: 'Link Helpdesk',
to: '/docs/link',
},
{
label: 'Admin Guide',
to: '/docs/category/admin-guide',
},
{
label: 'Operator Guide',
to: '/docs/category/operator-guide',
label: 'Web Mirrors',
to: '/docs/mirrors',
},
],
},
{
title: 'Policy',
title: '2nd Column',
items: [
{
label: 'Code of Practice',
href: 'https://digiresilience.org/about/code-practice/',
},
{
label: 'Code of Conduct',
href: 'https://digiresilience.org/about/code-conduct/',
},
],
},
{
title: 'More',
items: [
{
label: 'Center for Digital Resilience',
href: 'https://digiresilience.org/',
},
{
label: 'GitLab',
href: 'https://gitlab.com/digiresilience/link/',
label: 'Git',
href: 'https://guardianproject.dev/sr2/',
},
],
},
],
copyright: `Copyright © 2021-${new Date().getFullYear()}. This documentation is made available to you under the terms of the Creative Commons Attribution 4.0 International licence.`,
copyright: `Copyright © 2021-${new Date().getFullYear()} SR2 Communications Limited.<br>This documentation is made available to you under the terms of the Creative Commons Attribution 4.0 International licence.`,
},
prism: {
theme: prismThemes.github,

View file

@ -8,7 +8,7 @@
text-align: center;
position: relative;
overflow: hidden;
background-image: linear-gradient(270deg, rgb(255, 113, 21), rgb(250, 201, 66));
background-image: linear-gradient(270deg, #004B67, #009A64);
}
@media screen and (max-width: 996px) {

View file

@ -1,25 +0,0 @@
<svg width="840" height="857" viewBox="0 0 840 857" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_d)">
<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="41" y="41" width="758" height="775">
<path fill-rule="evenodd" clip-rule="evenodd" d="M79.6604 41.0193L798.203 78.6581L759.543 815.981L41.0001 778.342L79.6604 41.0193Z" fill="white"/>
</mask>
<g mask="url(#mask0)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M257.577 179.457L247.85 411.222C247.844 411.412 247.788 411.599 247.694 411.765L117.322 637.207C116.619 638.415 114.772 637.612 115.179 636.276L255.282 179.066C255.685 177.745 257.633 178.08 257.577 179.457ZM611.39 284.61L712.43 561.445C712.877 562.67 711.297 563.603 710.441 562.62L329.394 124.082C328.523 123.082 329.712 121.636 330.86 122.294L608.648 281.356C609.917 282.086 610.888 283.234 611.39 284.61ZM272.819 430.195L698.005 613.883C699.063 614.342 698.9 615.888 697.776 616.112L97.5989 737.09C96.6075 737.286 95.845 736.222 96.3522 735.349L272.819 430.195ZM279.391 398.465L290.666 129.839C290.71 128.779 292.029 128.317 292.728 129.121L673.189 566.981C674.009 567.924 672.985 569.324 671.84 568.83L280.1 399.588C279.657 399.398 279.374 398.949 279.391 398.465ZM633.872 260.097L269.832 51.6458C266.383 49.6734 261.996 51.4057 260.831 55.2071L41.603 770.65C40.2278 775.135 44.1502 779.467 48.7517 778.537L764.408 634.286C768.128 633.535 770.305 629.651 769.007 626.089L636.614 263.351C636.112 261.979 635.137 260.826 633.872 260.097Z" fill="url(#paint0_linear)"/>
</g>
</g>
<defs>
<filter id="filter0_d" x="0.00927734" y="0.00976562" width="839.184" height="856.98" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="20.5"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0471014 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
</filter>
<linearGradient id="paint0_linear" x1="368.206" y1="875.676" x2="614.412" y2="219" gradientUnits="userSpaceOnUse">
<stop stop-color="#ED633A"/>
<stop offset="1" stop-color="#FEE128"/>
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

BIN
static/img/sr2-logo.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB