Skip to content

Latest commit

 

History

History
153 lines (112 loc) · 4.4 KB

File metadata and controls

153 lines (112 loc) · 4.4 KB

Hosting ReMemory

There are two ways to host ReMemory for your friends: static pages (simplest) and a self-hosted server (full-featured).

Static pages

The lightest option. Generate a folder with recover.html and MANIFEST.age, then upload it anywhere that serves files — GitHub Pages, Netlify, an S3 bucket, any web server.

rememory seal --pages
# or after sealing:
rememory bundle --pages

This creates output/pages/ in your project. The recover.html page fetches MANIFEST.age from the same directory automatically. Friends visit the URL, add their shares, and recover. No server-side code runs — it's just static files.

Works well when:

  • You want to give friends a URL instead of (or alongside) a ZIP file
  • You don't need the ability to create bundles from the browser
  • You don't want to run a server

Limitations:

  • Friends still need their shares (from their bundles or README.txt files)
  • No admin interface — you manage files directly
  • No bundle creation in the browser (use the CLI or maker.html)

Self-hosted server

Run ReMemory as a web app on your own server — create bundles, store encrypted archives, and recover, all from a browser.

Docker

A pre-built image is published to GitHub Container Registry on every release.

docker run -d \
  --name rememory \
  -p 8080:8080 \
  -v rememory-data:/data \
  ghcr.io/eljojo/rememory:latest

Visit http://localhost:8080 to set up. The first page asks you to choose an admin password for deleting bundles.

To pin a specific version:

docker run -d \
  --name rememory \
  -p 8080:8080 \
  -v rememory-data:/data \
  ghcr.io/eljojo/rememory:v0.0.16

Docker Compose:

services:
  rememory:
    image: ghcr.io/eljojo/rememory:latest
    ports:
      - "8080:8080"
    volumes:
      - rememory-data:/data
    restart: unless-stopped
    # environment:
    #   REMEMORY_MAX_MANIFEST_SIZE: 200MB

volumes:
  rememory-data:

The container is a single static binary with no dependencies. Data lives in /data — mount a volume there to persist across restarts.

Without Docker

If you have the CLI installed:

rememory serve

Options

Flag Env var Default Description
--port, -p REMEMORY_PORT 8080 Port to listen on
--host REMEMORY_HOST 127.0.0.1 Host to bind to
--data, -d REMEMORY_DATA ./rememory-data Data directory for bundles and config
--max-manifest-size REMEMORY_MAX_MANIFEST_SIZE 50MB Maximum MANIFEST.age size (e.g. 50MB, 1GB)

Flags take precedence over environment variables.

Deployment

Reverse proxy

Put the server behind a reverse proxy with TLS.

Caddy:

rememory.example.com {
    reverse_proxy localhost:8080
}

nginx:

server {
    listen 443 ssl;
    server_name rememory.example.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        client_max_body_size 100M;
    }
}

Authentication

The admin password only protects bundle deletion. For access control, use an auth proxy:

Security

  • The server stores only encrypted archives (MANIFEST.age). Without enough shares, the archive is useless.
  • Shares are never sent to the server. They stay in each friend's bundle.
  • The admin password uses age's scrypt-based passphrase encryption. Choose a strong one.
  • Put the server behind HTTPS and authentication appropriate for your threat model.

Friends still get self-contained offline bundles. The server is a convenience — if it goes away, they can recover without it.

Data directory

The data directory contains:

rememory-data/
  admin.age               # Admin password (age-encrypted)
  bundles/
    <uuid>/
      meta.json           # Non-secret metadata
      MANIFEST.age        # Encrypted archive

Back up this directory to preserve your encrypted archives. The admin.age file can be recreated by setting a new password (you'd lose the ability to delete existing bundles with the old password, but the bundles themselves are unaffected).