redundanet 2.0.0__tar.gz → 2.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- redundanet-2.0.1/PKG-INFO +298 -0
- redundanet-2.0.1/README.md +258 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/pyproject.toml +2 -2
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/auth/gpg.py +3 -3
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/cli/node.py +197 -14
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/utils/process.py +1 -1
- redundanet-2.0.0/PKG-INFO +0 -265
- redundanet-2.0.0/README.md +0 -225
- {redundanet-2.0.0 → redundanet-2.0.1}/LICENSE +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/__init__.py +2 -2
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/__main__.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/auth/__init__.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/auth/keyserver.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/cli/__init__.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/cli/main.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/cli/network.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/cli/storage.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/core/__init__.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/core/config.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/core/exceptions.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/core/manifest.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/core/node.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/network/__init__.py +2 -2
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/network/discovery.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/network/dns.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/network/validation.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/storage/__init__.py +2 -2
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/storage/client.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/storage/furl.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/storage/introducer.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/storage/storage.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/utils/__init__.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/utils/files.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/utils/logging.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/vpn/__init__.py +2 -2
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/vpn/keys.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/vpn/mesh.py +0 -0
- {redundanet-2.0.0 → redundanet-2.0.1}/src/redundanet/vpn/tinc.py +0 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: redundanet
|
|
3
|
+
Version: 2.0.1
|
|
4
|
+
Summary: Distributed encrypted storage on a mesh VPN network
|
|
5
|
+
Home-page: https://github.com/alessandrodefilippo/redundanet
|
|
6
|
+
License: MIT
|
|
7
|
+
Keywords: distributed-storage,vpn,encryption,mesh-network,tahoe-lafs
|
|
8
|
+
Author: Alessandro De Filippo
|
|
9
|
+
Author-email: alessandro@example.com
|
|
10
|
+
Requires-Python: >=3.11,<4.0
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Intended Audience :: System Administrators
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Topic :: Security :: Cryptography
|
|
21
|
+
Classifier: Topic :: System :: Distributed Computing
|
|
22
|
+
Classifier: Topic :: System :: Networking
|
|
23
|
+
Requires-Dist: gitpython (>=3.1,<4.0)
|
|
24
|
+
Requires-Dist: httpx (>=0.26,<0.27)
|
|
25
|
+
Requires-Dist: jinja2 (>=3.1,<4.0)
|
|
26
|
+
Requires-Dist: jsonschema (>=4.21,<5.0)
|
|
27
|
+
Requires-Dist: psutil (>=5.9,<6.0)
|
|
28
|
+
Requires-Dist: pydantic (>=2.5,<3.0)
|
|
29
|
+
Requires-Dist: pydantic-settings (>=2.1,<3.0)
|
|
30
|
+
Requires-Dist: python-gnupg (>=0.5,<0.6)
|
|
31
|
+
Requires-Dist: pyyaml (>=6.0,<7.0)
|
|
32
|
+
Requires-Dist: rich (>=13.7,<14.0)
|
|
33
|
+
Requires-Dist: structlog (>=24.1,<25.0)
|
|
34
|
+
Requires-Dist: typer[all] (>=0.12.0)
|
|
35
|
+
Requires-Dist: watchdog (>=4.0,<5.0)
|
|
36
|
+
Project-URL: Documentation, https://redundanet.readthedocs.io
|
|
37
|
+
Project-URL: Repository, https://github.com/alessandrodefilippo/redundanet
|
|
38
|
+
Description-Content-Type: text/markdown
|
|
39
|
+
|
|
40
|
+
# RedundaNet - Distributed Encrypted Storage Network
|
|
41
|
+
|
|
42
|
+
[](https://github.com/adefilippo83/redundanet/actions/workflows/ci.yml)
|
|
43
|
+
[](https://pypi.org/project/redundanet/)
|
|
44
|
+
[](LICENSE)
|
|
45
|
+
|
|
46
|
+
RedundaNet is a distributed, encrypted storage system built on a secure mesh VPN network. It enables users to contribute storage resources to a collective grid while maintaining privacy through end-to-end encryption.
|
|
47
|
+
|
|
48
|
+
**Website**: [https://redundanet.com](https://redundanet.com)
|
|
49
|
+
|
|
50
|
+
## Features
|
|
51
|
+
|
|
52
|
+
- **Decentralized Architecture**: No central authority or single point of failure
|
|
53
|
+
- **End-to-End Encryption**: Data is encrypted before leaving your device using Tahoe-LAFS
|
|
54
|
+
- **GPG-Based Authentication**: Secure node identity verification via public keyservers
|
|
55
|
+
- **Private Networking**: Secure Tinc mesh VPN isolates the storage network
|
|
56
|
+
- **Erasure Coding**: Data is split and distributed across multiple nodes (3-of-10 scheme)
|
|
57
|
+
- **Open Membership**: Anyone can apply to join the network
|
|
58
|
+
- **Containerized Deployment**: Easy setup with Docker Compose
|
|
59
|
+
- **Raspberry Pi Ready**: Pre-built images for ARM devices
|
|
60
|
+
|
|
61
|
+
## How It Works
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
┌─────────────────────────────────────────────────────────────────────────┐
|
|
65
|
+
│ RedundaNet Network │
|
|
66
|
+
│ │
|
|
67
|
+
│ Your File │
|
|
68
|
+
│ │ │
|
|
69
|
+
│ ▼ │
|
|
70
|
+
│ ┌─────────┐ Encrypted ┌─────────┐ │
|
|
71
|
+
│ │ Encrypt │ ──────────────────►│ Split │ │
|
|
72
|
+
│ │ (AES) │ │(Erasure)│ │
|
|
73
|
+
│ └─────────┘ └────┬────┘ │
|
|
74
|
+
│ │ │
|
|
75
|
+
│ ┌────────────────────────┼────────────────────────┐ │
|
|
76
|
+
│ ▼ ▼ ▼ ▼ ▼ │
|
|
77
|
+
│ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │
|
|
78
|
+
│ │Share 1│ │Share 2│ │Share 3│ │ ... │ │Share10│ │
|
|
79
|
+
│ └───┬───┘ └───┬───┘ └───┬───┘ └───┬───┘ └───┬───┘ │
|
|
80
|
+
│ │ │ │ │ │ │
|
|
81
|
+
│ ▼ ▼ ▼ ▼ ▼ │
|
|
82
|
+
│ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │
|
|
83
|
+
│ │Node A │ │Node B │ │Node C │ │Node D │ │Node E │ │
|
|
84
|
+
│ │ (VPN) │◄──►│ (VPN) │◄─►│ (VPN) │◄─►│ (VPN) │◄──►│ (VPN) │ │
|
|
85
|
+
│ └───────┘ └───────┘ └───────┘ └───────┘ └───────┘ │
|
|
86
|
+
│ │
|
|
87
|
+
│ Only 3 of 10 shares needed to reconstruct your file │
|
|
88
|
+
└─────────────────────────────────────────────────────────────────────────┘
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Key Concepts:**
|
|
92
|
+
- **Your data is encrypted** on your device before upload - nodes cannot read your files
|
|
93
|
+
- **Erasure coding** splits data across nodes - any 3 of 10 nodes can reconstruct your file
|
|
94
|
+
- **Mesh VPN** connects all nodes securely - no central server required
|
|
95
|
+
- **GPG keys** verify node identity - published to public keyservers
|
|
96
|
+
|
|
97
|
+
## Join the Network
|
|
98
|
+
|
|
99
|
+
Want to contribute storage and join RedundaNet? Here's how:
|
|
100
|
+
|
|
101
|
+
### 1. Generate and Publish Your GPG Key
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# Install the CLI
|
|
105
|
+
pip install redundanet
|
|
106
|
+
|
|
107
|
+
# Generate a GPG key for your node
|
|
108
|
+
redundanet node keys generate --name my-node --email you@example.com
|
|
109
|
+
|
|
110
|
+
# Publish your key to public keyservers
|
|
111
|
+
redundanet node keys publish --key-id YOUR_KEY_ID
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 2. Submit Your Application
|
|
115
|
+
|
|
116
|
+
Visit [redundanet.com/join.html](https://redundanet.com/join.html) and fill out the application form with:
|
|
117
|
+
- Your GPG Key ID
|
|
118
|
+
- Storage contribution (how much space you'll share)
|
|
119
|
+
- Your region
|
|
120
|
+
- Device type
|
|
121
|
+
|
|
122
|
+
This creates a GitHub issue that's automatically processed.
|
|
123
|
+
|
|
124
|
+
### 3. Wait for Approval
|
|
125
|
+
|
|
126
|
+
A maintainer will review your application and merge the PR that adds your node to the network manifest.
|
|
127
|
+
|
|
128
|
+
### 4. Set Up Your Node
|
|
129
|
+
|
|
130
|
+
Once approved:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
# Clone the repository
|
|
134
|
+
git clone https://github.com/adefilippo83/redundanet.git
|
|
135
|
+
cd redundanet
|
|
136
|
+
|
|
137
|
+
# Initialize your node (use the name assigned to you)
|
|
138
|
+
redundanet init --name node-XXXXXXXX
|
|
139
|
+
|
|
140
|
+
# Sync the manifest
|
|
141
|
+
redundanet sync
|
|
142
|
+
|
|
143
|
+
# Start services
|
|
144
|
+
docker compose up -d
|
|
145
|
+
|
|
146
|
+
# Check status
|
|
147
|
+
redundanet status
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Quick Start (Existing Network Members)
|
|
151
|
+
|
|
152
|
+
### Prerequisites
|
|
153
|
+
|
|
154
|
+
- Python 3.11+
|
|
155
|
+
- Docker and Docker Compose
|
|
156
|
+
- GPG (for key management)
|
|
157
|
+
|
|
158
|
+
### Installation
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
pip install redundanet
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Start Services
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# As a storage node (contributes storage)
|
|
168
|
+
docker compose --profile storage up -d
|
|
169
|
+
|
|
170
|
+
# As a client only (uses storage)
|
|
171
|
+
docker compose --profile client up -d
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Upload and Download Files
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
# Upload a file
|
|
178
|
+
redundanet storage upload /path/to/file.txt
|
|
179
|
+
# Returns: URI:CHK:abc123...
|
|
180
|
+
|
|
181
|
+
# Download a file
|
|
182
|
+
redundanet storage download URI:CHK:abc123... /path/to/output.txt
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## CLI Commands
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
redundanet --help
|
|
189
|
+
|
|
190
|
+
Commands:
|
|
191
|
+
init Initialize a new node
|
|
192
|
+
status Show node and network status
|
|
193
|
+
sync Sync manifest from repository
|
|
194
|
+
validate Validate manifest file
|
|
195
|
+
|
|
196
|
+
node Node management commands
|
|
197
|
+
list List all nodes in the network
|
|
198
|
+
info Show detailed node information
|
|
199
|
+
add Add a new node to manifest
|
|
200
|
+
remove Remove a node from manifest
|
|
201
|
+
keys Manage GPG keys (generate, export, import, publish, fetch, list)
|
|
202
|
+
|
|
203
|
+
network Network management
|
|
204
|
+
join Join an existing network
|
|
205
|
+
leave Leave the network
|
|
206
|
+
peers Show connected peers
|
|
207
|
+
vpn VPN management (start/stop/status)
|
|
208
|
+
|
|
209
|
+
storage Storage management
|
|
210
|
+
status Show storage status
|
|
211
|
+
mount Mount Tahoe filesystem
|
|
212
|
+
unmount Unmount filesystem
|
|
213
|
+
upload Upload a file
|
|
214
|
+
download Download a file
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## Raspberry Pi
|
|
218
|
+
|
|
219
|
+
Pre-built images are available for Raspberry Pi:
|
|
220
|
+
|
|
221
|
+
1. Download from [GitHub Releases](https://github.com/adefilippo83/redundanet/releases)
|
|
222
|
+
2. Flash to SD card using Raspberry Pi Imager
|
|
223
|
+
3. Boot and SSH in: `ssh redundanet@redundanet.local` (password: `redundanet`)
|
|
224
|
+
4. Run `redundanet init` to configure
|
|
225
|
+
|
|
226
|
+
## Architecture
|
|
227
|
+
|
|
228
|
+
```mermaid
|
|
229
|
+
graph TD
|
|
230
|
+
subgraph "Your Device"
|
|
231
|
+
A[redundanet CLI] --> B[Tahoe Client]
|
|
232
|
+
B --> C[Tinc VPN]
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
subgraph "Network Nodes"
|
|
236
|
+
D[Tinc VPN] --> E[Tahoe Storage]
|
|
237
|
+
F[Tinc VPN] --> G[Tahoe Storage]
|
|
238
|
+
H[Tinc VPN] --> I[Tahoe Introducer]
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
C -->|Encrypted Mesh| D
|
|
242
|
+
C -->|Encrypted Mesh| F
|
|
243
|
+
C -->|Encrypted Mesh| H
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**Components:**
|
|
247
|
+
- **Tinc VPN**: Creates encrypted mesh network between all nodes
|
|
248
|
+
- **Tahoe-LAFS**: Handles encryption, erasure coding, and distributed storage
|
|
249
|
+
- **GPG**: Authenticates node identity via public keyservers
|
|
250
|
+
- **Manifest**: YAML file in Git defining network configuration
|
|
251
|
+
|
|
252
|
+
## Documentation
|
|
253
|
+
|
|
254
|
+
- [Installation Guide](docs/installation.md)
|
|
255
|
+
- [Quick Start Guide](docs/quickstart.md)
|
|
256
|
+
- [Configuration Reference](docs/configuration.md)
|
|
257
|
+
- [Architecture Overview](docs/architecture.md)
|
|
258
|
+
|
|
259
|
+
## Development
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
# Clone repository
|
|
263
|
+
git clone https://github.com/adefilippo83/redundanet.git
|
|
264
|
+
cd redundanet
|
|
265
|
+
|
|
266
|
+
# Install dependencies
|
|
267
|
+
make install
|
|
268
|
+
|
|
269
|
+
# Run tests
|
|
270
|
+
make test
|
|
271
|
+
|
|
272
|
+
# Run linting
|
|
273
|
+
make lint
|
|
274
|
+
|
|
275
|
+
# Run type checking
|
|
276
|
+
make type-check
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## Contributing
|
|
280
|
+
|
|
281
|
+
1. Fork the repository
|
|
282
|
+
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
|
283
|
+
3. Make your changes
|
|
284
|
+
4. Run tests (`make test`) and linting (`make lint`)
|
|
285
|
+
5. Commit your changes
|
|
286
|
+
6. Push to the branch (`git push origin feature/amazing-feature`)
|
|
287
|
+
7. Open a Pull Request
|
|
288
|
+
|
|
289
|
+
## License
|
|
290
|
+
|
|
291
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
292
|
+
|
|
293
|
+
## Acknowledgments
|
|
294
|
+
|
|
295
|
+
- [Tahoe-LAFS](https://tahoe-lafs.org/) - Distributed storage system
|
|
296
|
+
- [Tinc VPN](https://www.tinc-vpn.org/) - Mesh VPN daemon
|
|
297
|
+
- [Typer](https://typer.tiangolo.com/) - CLI framework
|
|
298
|
+
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
# RedundaNet - Distributed Encrypted Storage Network
|
|
2
|
+
|
|
3
|
+
[](https://github.com/adefilippo83/redundanet/actions/workflows/ci.yml)
|
|
4
|
+
[](https://pypi.org/project/redundanet/)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
RedundaNet is a distributed, encrypted storage system built on a secure mesh VPN network. It enables users to contribute storage resources to a collective grid while maintaining privacy through end-to-end encryption.
|
|
8
|
+
|
|
9
|
+
**Website**: [https://redundanet.com](https://redundanet.com)
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- **Decentralized Architecture**: No central authority or single point of failure
|
|
14
|
+
- **End-to-End Encryption**: Data is encrypted before leaving your device using Tahoe-LAFS
|
|
15
|
+
- **GPG-Based Authentication**: Secure node identity verification via public keyservers
|
|
16
|
+
- **Private Networking**: Secure Tinc mesh VPN isolates the storage network
|
|
17
|
+
- **Erasure Coding**: Data is split and distributed across multiple nodes (3-of-10 scheme)
|
|
18
|
+
- **Open Membership**: Anyone can apply to join the network
|
|
19
|
+
- **Containerized Deployment**: Easy setup with Docker Compose
|
|
20
|
+
- **Raspberry Pi Ready**: Pre-built images for ARM devices
|
|
21
|
+
|
|
22
|
+
## How It Works
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
┌─────────────────────────────────────────────────────────────────────────┐
|
|
26
|
+
│ RedundaNet Network │
|
|
27
|
+
│ │
|
|
28
|
+
│ Your File │
|
|
29
|
+
│ │ │
|
|
30
|
+
│ ▼ │
|
|
31
|
+
│ ┌─────────┐ Encrypted ┌─────────┐ │
|
|
32
|
+
│ │ Encrypt │ ──────────────────►│ Split │ │
|
|
33
|
+
│ │ (AES) │ │(Erasure)│ │
|
|
34
|
+
│ └─────────┘ └────┬────┘ │
|
|
35
|
+
│ │ │
|
|
36
|
+
│ ┌────────────────────────┼────────────────────────┐ │
|
|
37
|
+
│ ▼ ▼ ▼ ▼ ▼ │
|
|
38
|
+
│ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │
|
|
39
|
+
│ │Share 1│ │Share 2│ │Share 3│ │ ... │ │Share10│ │
|
|
40
|
+
│ └───┬───┘ └───┬───┘ └───┬───┘ └───┬───┘ └───┬───┘ │
|
|
41
|
+
│ │ │ │ │ │ │
|
|
42
|
+
│ ▼ ▼ ▼ ▼ ▼ │
|
|
43
|
+
│ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │
|
|
44
|
+
│ │Node A │ │Node B │ │Node C │ │Node D │ │Node E │ │
|
|
45
|
+
│ │ (VPN) │◄──►│ (VPN) │◄─►│ (VPN) │◄─►│ (VPN) │◄──►│ (VPN) │ │
|
|
46
|
+
│ └───────┘ └───────┘ └───────┘ └───────┘ └───────┘ │
|
|
47
|
+
│ │
|
|
48
|
+
│ Only 3 of 10 shares needed to reconstruct your file │
|
|
49
|
+
└─────────────────────────────────────────────────────────────────────────┘
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Key Concepts:**
|
|
53
|
+
- **Your data is encrypted** on your device before upload - nodes cannot read your files
|
|
54
|
+
- **Erasure coding** splits data across nodes - any 3 of 10 nodes can reconstruct your file
|
|
55
|
+
- **Mesh VPN** connects all nodes securely - no central server required
|
|
56
|
+
- **GPG keys** verify node identity - published to public keyservers
|
|
57
|
+
|
|
58
|
+
## Join the Network
|
|
59
|
+
|
|
60
|
+
Want to contribute storage and join RedundaNet? Here's how:
|
|
61
|
+
|
|
62
|
+
### 1. Generate and Publish Your GPG Key
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Install the CLI
|
|
66
|
+
pip install redundanet
|
|
67
|
+
|
|
68
|
+
# Generate a GPG key for your node
|
|
69
|
+
redundanet node keys generate --name my-node --email you@example.com
|
|
70
|
+
|
|
71
|
+
# Publish your key to public keyservers
|
|
72
|
+
redundanet node keys publish --key-id YOUR_KEY_ID
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 2. Submit Your Application
|
|
76
|
+
|
|
77
|
+
Visit [redundanet.com/join.html](https://redundanet.com/join.html) and fill out the application form with:
|
|
78
|
+
- Your GPG Key ID
|
|
79
|
+
- Storage contribution (how much space you'll share)
|
|
80
|
+
- Your region
|
|
81
|
+
- Device type
|
|
82
|
+
|
|
83
|
+
This creates a GitHub issue that's automatically processed.
|
|
84
|
+
|
|
85
|
+
### 3. Wait for Approval
|
|
86
|
+
|
|
87
|
+
A maintainer will review your application and merge the PR that adds your node to the network manifest.
|
|
88
|
+
|
|
89
|
+
### 4. Set Up Your Node
|
|
90
|
+
|
|
91
|
+
Once approved:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Clone the repository
|
|
95
|
+
git clone https://github.com/adefilippo83/redundanet.git
|
|
96
|
+
cd redundanet
|
|
97
|
+
|
|
98
|
+
# Initialize your node (use the name assigned to you)
|
|
99
|
+
redundanet init --name node-XXXXXXXX
|
|
100
|
+
|
|
101
|
+
# Sync the manifest
|
|
102
|
+
redundanet sync
|
|
103
|
+
|
|
104
|
+
# Start services
|
|
105
|
+
docker compose up -d
|
|
106
|
+
|
|
107
|
+
# Check status
|
|
108
|
+
redundanet status
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Quick Start (Existing Network Members)
|
|
112
|
+
|
|
113
|
+
### Prerequisites
|
|
114
|
+
|
|
115
|
+
- Python 3.11+
|
|
116
|
+
- Docker and Docker Compose
|
|
117
|
+
- GPG (for key management)
|
|
118
|
+
|
|
119
|
+
### Installation
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
pip install redundanet
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Start Services
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
# As a storage node (contributes storage)
|
|
129
|
+
docker compose --profile storage up -d
|
|
130
|
+
|
|
131
|
+
# As a client only (uses storage)
|
|
132
|
+
docker compose --profile client up -d
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Upload and Download Files
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# Upload a file
|
|
139
|
+
redundanet storage upload /path/to/file.txt
|
|
140
|
+
# Returns: URI:CHK:abc123...
|
|
141
|
+
|
|
142
|
+
# Download a file
|
|
143
|
+
redundanet storage download URI:CHK:abc123... /path/to/output.txt
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## CLI Commands
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
redundanet --help
|
|
150
|
+
|
|
151
|
+
Commands:
|
|
152
|
+
init Initialize a new node
|
|
153
|
+
status Show node and network status
|
|
154
|
+
sync Sync manifest from repository
|
|
155
|
+
validate Validate manifest file
|
|
156
|
+
|
|
157
|
+
node Node management commands
|
|
158
|
+
list List all nodes in the network
|
|
159
|
+
info Show detailed node information
|
|
160
|
+
add Add a new node to manifest
|
|
161
|
+
remove Remove a node from manifest
|
|
162
|
+
keys Manage GPG keys (generate, export, import, publish, fetch, list)
|
|
163
|
+
|
|
164
|
+
network Network management
|
|
165
|
+
join Join an existing network
|
|
166
|
+
leave Leave the network
|
|
167
|
+
peers Show connected peers
|
|
168
|
+
vpn VPN management (start/stop/status)
|
|
169
|
+
|
|
170
|
+
storage Storage management
|
|
171
|
+
status Show storage status
|
|
172
|
+
mount Mount Tahoe filesystem
|
|
173
|
+
unmount Unmount filesystem
|
|
174
|
+
upload Upload a file
|
|
175
|
+
download Download a file
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Raspberry Pi
|
|
179
|
+
|
|
180
|
+
Pre-built images are available for Raspberry Pi:
|
|
181
|
+
|
|
182
|
+
1. Download from [GitHub Releases](https://github.com/adefilippo83/redundanet/releases)
|
|
183
|
+
2. Flash to SD card using Raspberry Pi Imager
|
|
184
|
+
3. Boot and SSH in: `ssh redundanet@redundanet.local` (password: `redundanet`)
|
|
185
|
+
4. Run `redundanet init` to configure
|
|
186
|
+
|
|
187
|
+
## Architecture
|
|
188
|
+
|
|
189
|
+
```mermaid
|
|
190
|
+
graph TD
|
|
191
|
+
subgraph "Your Device"
|
|
192
|
+
A[redundanet CLI] --> B[Tahoe Client]
|
|
193
|
+
B --> C[Tinc VPN]
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
subgraph "Network Nodes"
|
|
197
|
+
D[Tinc VPN] --> E[Tahoe Storage]
|
|
198
|
+
F[Tinc VPN] --> G[Tahoe Storage]
|
|
199
|
+
H[Tinc VPN] --> I[Tahoe Introducer]
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
C -->|Encrypted Mesh| D
|
|
203
|
+
C -->|Encrypted Mesh| F
|
|
204
|
+
C -->|Encrypted Mesh| H
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**Components:**
|
|
208
|
+
- **Tinc VPN**: Creates encrypted mesh network between all nodes
|
|
209
|
+
- **Tahoe-LAFS**: Handles encryption, erasure coding, and distributed storage
|
|
210
|
+
- **GPG**: Authenticates node identity via public keyservers
|
|
211
|
+
- **Manifest**: YAML file in Git defining network configuration
|
|
212
|
+
|
|
213
|
+
## Documentation
|
|
214
|
+
|
|
215
|
+
- [Installation Guide](docs/installation.md)
|
|
216
|
+
- [Quick Start Guide](docs/quickstart.md)
|
|
217
|
+
- [Configuration Reference](docs/configuration.md)
|
|
218
|
+
- [Architecture Overview](docs/architecture.md)
|
|
219
|
+
|
|
220
|
+
## Development
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
# Clone repository
|
|
224
|
+
git clone https://github.com/adefilippo83/redundanet.git
|
|
225
|
+
cd redundanet
|
|
226
|
+
|
|
227
|
+
# Install dependencies
|
|
228
|
+
make install
|
|
229
|
+
|
|
230
|
+
# Run tests
|
|
231
|
+
make test
|
|
232
|
+
|
|
233
|
+
# Run linting
|
|
234
|
+
make lint
|
|
235
|
+
|
|
236
|
+
# Run type checking
|
|
237
|
+
make type-check
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Contributing
|
|
241
|
+
|
|
242
|
+
1. Fork the repository
|
|
243
|
+
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
|
244
|
+
3. Make your changes
|
|
245
|
+
4. Run tests (`make test`) and linting (`make lint`)
|
|
246
|
+
5. Commit your changes
|
|
247
|
+
6. Push to the branch (`git push origin feature/amazing-feature`)
|
|
248
|
+
7. Open a Pull Request
|
|
249
|
+
|
|
250
|
+
## License
|
|
251
|
+
|
|
252
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
253
|
+
|
|
254
|
+
## Acknowledgments
|
|
255
|
+
|
|
256
|
+
- [Tahoe-LAFS](https://tahoe-lafs.org/) - Distributed storage system
|
|
257
|
+
- [Tinc VPN](https://www.tinc-vpn.org/) - Mesh VPN daemon
|
|
258
|
+
- [Typer](https://typer.tiangolo.com/) - CLI framework
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "redundanet"
|
|
3
|
-
version = "2.0.
|
|
3
|
+
version = "2.0.1"
|
|
4
4
|
description = "Distributed encrypted storage on a mesh VPN network"
|
|
5
5
|
authors = ["Alessandro De Filippo <alessandro@example.com>"]
|
|
6
6
|
license = "MIT"
|
|
@@ -29,7 +29,7 @@ redundanet = "redundanet.cli.main:app"
|
|
|
29
29
|
|
|
30
30
|
[tool.poetry.dependencies]
|
|
31
31
|
python = "^3.11"
|
|
32
|
-
typer = {extras = ["all"], version = "
|
|
32
|
+
typer = {extras = ["all"], version = ">=0.12.0"}
|
|
33
33
|
pydantic = "^2.5"
|
|
34
34
|
pydantic-settings = "^2.1"
|
|
35
35
|
pyyaml = "^6.0"
|
|
@@ -43,9 +43,9 @@ class GPGKeyInfo:
|
|
|
43
43
|
fingerprint=key.get("fingerprint", ""),
|
|
44
44
|
user_id=user_id,
|
|
45
45
|
email=email,
|
|
46
|
-
created=key.get("date"
|
|
47
|
-
expires=key.get("expires"
|
|
48
|
-
trust=key.get("trust"
|
|
46
|
+
created=key.get("date"),
|
|
47
|
+
expires=key.get("expires"),
|
|
48
|
+
trust=key.get("trust"),
|
|
49
49
|
)
|
|
50
50
|
|
|
51
51
|
|