Upload media to IPFS

This is the write endpoint of the project-zero IPFS node. Anything you push here is pinned on ipfs01 and served to the world from ipfs.p0.contact and over bitswap. Uploading needs a geninf account in the core-member group.

1. Get an app password

  1. Sign in at auth.geninf.io, open the settings (gear icon) → Credentials → Tokens and App passwords.
  2. Click New App Password, name it ipfs, create.
  3. Copy the password shown once. Your normal account password does not work here.

Your username is the one Authentik shows under User details. Revoke the app password on the same page whenever you like.

2. Upload

One file, pinned, with a modern CID:

curl -u <username>:<app-password> -F file=@clip.mp4 \
  "https://ipfs-api.p0.contact/api/v0/add?pin=true&cid-version=1"
# {"Name":"clip.mp4","Hash":"bafy…","Size":"…"}

Share https://ipfs.p0.contact/ipfs/<Hash>. Any IPFS gateway or client resolves the same CID; this one is simply the fastest for our own content.

A directory (the last line of the response is the directory's CID; files sit at /ipfs/<dir-cid>/a.jpg):

curl -u <username>:<app-password> \
  -F "file=@a.jpg;filename=album/a.jpg" -F "file=@b.jpg;filename=album/b.jpg" \
  "https://ipfs-api.p0.contact/api/v0/add?pin=true&cid-version=1&wrap-with-directory=true"

With the kubo CLI:

ipfs --api /dns/ipfs-api.p0.contact/tcp/443/https \
     --api-auth basic:<username>:<app-password> add -r ./album

3. Pins

# everything pinned, by everyone
curl -u <username>:<app-password> -X POST \
  "https://ipfs-api.p0.contact/api/v0/pin/ls?type=recursive"
# drop one; the blocks go at the next garbage collection
curl -u <username>:<app-password> -X POST \
  "https://ipfs-api.p0.contact/api/v0/pin/rm?arg=<cid>"

Any member can unpin any artifact. There is no per-member quota and no backup: an upload lives on this node's volume and on your own disk, nowhere else. Only add, pin/add, pin/ls, pin/rm, id and version are reachable here; everything else answers 404.

Source and operator notes: machines/ipfs01/README.md.