Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
04e7a5a
ipfs backend support
manalejandro Nov 29, 2025
bc02865
fix migration script
manalejandro Nov 29, 2025
bd37a49
fix migration script
manalejandro Nov 30, 2025
c103ffa
Merge branch 'Chocobozzz:develop' into ipfs
manalejandro Dec 3, 2025
8c28d70
Fix missing i18n tags
Chocobozzz Dec 4, 2025
86ac524
Do no uppercase video tags
Chocobozzz Dec 4, 2025
bd825e9
Better illustration to channel collab modal
Chocobozzz Dec 4, 2025
2476ad8
Translated using Weblate (Catalan)
fransecs Dec 3, 2025
aac87be
Update translations
Chocobozzz Dec 4, 2025
8e06e30
Fix caption edit modal on small screens
Chocobozzz Dec 8, 2025
0e770e6
Update jsonwebtoken
Chocobozzz Dec 8, 2025
141a464
Translated using Weblate (French (France) (fr_FR))
Dec 4, 2025
7ab83dd
Translated using Weblate (Swedish)
Dec 4, 2025
3b55b5b
Translated using Weblate (Vietnamese)
honhatduy Dec 4, 2025
ab25ee1
Translated using Weblate (Vietnamese)
honhatduy Dec 4, 2025
2f2ee6b
Translated using Weblate (Chinese (Traditional Han script))
s8321414 Dec 5, 2025
cc04397
Translated using Weblate (French (France) (fr_FR))
Dec 4, 2025
15c2b68
Translated using Weblate (Vietnamese)
honhatduy Dec 4, 2025
114fffd
Translated using Weblate (German)
Wuzzy2 Dec 5, 2025
14266c1
Translated using Weblate (Russian)
VictorFilimonov Dec 5, 2025
e30d8ff
Translated using Weblate (Russian)
VictorFilimonov Dec 5, 2025
4b5f02d
Translated using Weblate (Albanian)
ujdhesa Dec 5, 2025
23ccc68
Translated using Weblate (Russian)
VictorFilimonov Dec 5, 2025
e93e4ca
Translated using Weblate (Catalan)
fransecs Dec 6, 2025
609a531
Translated using Weblate (Japanese)
framabot Dec 6, 2025
9acb9cf
Translated using Weblate (Russian)
takezie Dec 7, 2025
eaa606d
Translated using Weblate (Russian)
takezie Dec 7, 2025
2e8bec7
Translated using Weblate (French (France) (fr_FR))
Dec 8, 2025
fcc4196
Translated using Weblate (Russian)
takezie Dec 8, 2025
20b7613
Update translations
Chocobozzz Dec 8, 2025
ad77d2f
Add missing translations
Chocobozzz Dec 9, 2025
a980b45
Update changelog
Chocobozzz Dec 9, 2025
94a0175
Improve production guide
Chocobozzz Dec 9, 2025
7709035
Bumped to version v8.0.0
Chocobozzz Dec 9, 2025
a1909e2
Fix docker build
Chocobozzz Dec 9, 2025
b1276b2
Fix docker build, again
Chocobozzz Dec 9, 2025
f86c86a
peertube user doesn't need a password
Chocobozzz Dec 9, 2025
dc2becb
Update dependencies guide
Chocobozzz Dec 9, 2025
e339a53
Fix reset password command
Chocobozzz Dec 9, 2025
2072e5f
Fix compat with HTTP3
Chocobozzz Dec 9, 2025
63cd12e
Prevent too big error log
Chocobozzz Dec 9, 2025
e3304d8
Prevent an error when the video is deleted
Chocobozzz Dec 10, 2025
cfada8c
Fix select style for redundancy
Chocobozzz Dec 10, 2025
ae9a936
Fix invalid form after configuration update
Chocobozzz Dec 10, 2025
c803030
Fix alert styling in watch page
Chocobozzz Dec 10, 2025
26aa7ef
Fix menu collapse
Chocobozzz Dec 10, 2025
5da9918
Fix config wizard not applying config
Chocobozzz Dec 10, 2025
585c477
Correctly do not open again welcome modal
Chocobozzz Dec 10, 2025
061991f
package.json
manalejandro Dec 11, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
481 changes: 481 additions & 0 deletions IPFS_IMPLEMENTATION.md

Large diffs are not rendered by default.

48 changes: 48 additions & 0 deletions config/default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,54 @@ object_storage:
prefix: ''
base_url: ''

# IPFS Storage Configuration
# Alternative to traditional object storage (S3-compatible)
# Uses Helia (IPFS implementation) for decentralized content storage
ipfs_storage:
enabled: false

# IPFS node repository path (where blocks and datastore are stored)
repo_path: '' # Default: storage.tmp/ipfs-repo

# IPFS gateway URL for accessing content
# If not set, URLs will use ipfs:// protocol
gateway_url: '' # Example: 'https://ipfs.io' or 'http://localhost:8080'

# Multiaddresses for the IPFS node to listen on
listen_addresses:
- '/ip4/0.0.0.0/tcp/4001'
- '/ip4/0.0.0.0/tcp/4002/ws'

# Bootstrap peers for IPFS network discovery
# Leave empty for local-only node
bootstrap_peers:
# Public IPFS bootstrap nodes
- '/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN'
- '/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa'
- '/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb'
- '/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt'

# IPFS storage for different resource types
streaming_playlists:
bucket_name: 'streaming-playlists-ipfs'
prefix: 'hls/'

web_videos:
bucket_name: 'web-videos-ipfs'
prefix: 'videos/'

user_exports:
bucket_name: 'user-exports-ipfs'
prefix: 'exports/'

original_video_files:
bucket_name: 'original-video-files-ipfs'
prefix: 'originals/'

captions:
bucket_name: 'captions-ipfs'
prefix: 'captions/'

log:
level: 'info' # 'debug' | 'info' | 'warn' | 'error'

Expand Down
12 changes: 12 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
"house-keeping": "LOGGER_LEVEL=warn node ./dist/scripts/house-keeping.js",
"i18n:create-custom-files": "tsx --tsconfig ./scripts/tsconfig.json --conditions=peertube:tsx ./scripts/i18n/create-custom-files.ts",
"i18n:update": "bash ./scripts/i18n/update.sh",
"migrate-to-ipfs": "node ./dist/scripts/migrate-to-ipfs.js",
"lint": "npm run ci -- lint",
"mocha": "mocha",
"ng": "ng",
Expand Down Expand Up @@ -93,8 +94,14 @@
"@aws-sdk/client-s3": "^3.930.0",
"@aws-sdk/lib-storage": "^3.930.0",
"@aws-sdk/s3-request-presigner": "^3.930.0",
"@chainsafe/libp2p-noise": "^17.0.0",
"@chainsafe/libp2p-yamux": "^8.0.1",
"@commander-js/extra-typings": "^14.0.0",
"@helia/strings": "^5.0.3",
"@helia/unixfs": "^6.0.3",
"@jimp/plugin-color": "^1.6.0",
"@libp2p/bootstrap": "^12.0.10",
"@libp2p/tcp": "^11.0.9",
"@node-oauth/oauth2-server": "^5.2.1",
"@opentelemetry/api": "^1.9.0",
"@opentelemetry/exporter-jaeger": "^2.2.0",
Expand Down Expand Up @@ -129,6 +136,7 @@
"async-mutex": "^0.5.0",
"bcrypt": "6.0.0",
"bencode": "^4.0.0",
"blockstore-fs": "^3.0.2",
"bluebird": "^3.7.2",
"bullmq": "^5.63.1",
"bytes": "^3.1.2",
Expand All @@ -138,6 +146,7 @@
"cookie-parser": "^1.4.7",
"cors": "^2.8.5",
"create-torrent": "^6.1.0",
"datastore-fs": "^11.0.2",
"deep-object-diff": "^1.1.9",
"email-templates": "^12.0.3",
"execa": "^9.6.0",
Expand All @@ -150,6 +159,7 @@
"got": "^14.6.3",
"got-ssrf": "^3.0.0",
"handlebars": "^4.7.8",
"helia": "^6.0.11",
"helmet": "^8.1.0",
"http-problem-details": "^0.1.7",
"i18next": "^25.6.2",
Expand All @@ -163,6 +173,7 @@
"js-yaml": "^4.1.1",
"jsonld": "~8.3.3",
"jsonwebtoken": "^9.0.3",
"libp2p": "^3.1.2",
"linkify-it": "^5.0.0",
"lodash-es": "^4.17.21",
"lru-cache": "^11.2.2",
Expand All @@ -173,6 +184,7 @@
"memoizee": "^0.4.17",
"morgan": "^1.10.1",
"multer": "^2.0.2",
"multiformats": "^13.4.1",
"node-html-parser": "^7.0.1",
"node-media-server": "^2.7.4",
"nodemailer": "^7.0.10",
Expand Down
26 changes: 13 additions & 13 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions server/core/initializers/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,33 @@ const CONFIG = {
BASE_URL: config.get<string>('object_storage.captions.base_url')
}
},
IPFS_STORAGE: {
ENABLED: config.get<boolean>('ipfs_storage.enabled'),
REPO_PATH: config.get<string>('ipfs_storage.repo_path'),
GATEWAY_URL: config.get<string>('ipfs_storage.gateway_url'),
LISTEN_ADDRESSES: config.get<string[]>('ipfs_storage.listen_addresses'),
BOOTSTRAP_PEERS: config.get<string[]>('ipfs_storage.bootstrap_peers'),
WEB_VIDEOS: {
BUCKET_NAME: config.get<string>('ipfs_storage.web_videos.bucket_name'),
PREFIX: config.get<string>('ipfs_storage.web_videos.prefix')
},
STREAMING_PLAYLISTS: {
BUCKET_NAME: config.get<string>('ipfs_storage.streaming_playlists.bucket_name'),
PREFIX: config.get<string>('ipfs_storage.streaming_playlists.prefix')
},
USER_EXPORTS: {
BUCKET_NAME: config.get<string>('ipfs_storage.user_exports.bucket_name'),
PREFIX: config.get<string>('ipfs_storage.user_exports.prefix')
},
ORIGINAL_VIDEO_FILES: {
BUCKET_NAME: config.get<string>('ipfs_storage.original_video_files.bucket_name'),
PREFIX: config.get<string>('ipfs_storage.original_video_files.prefix')
},
CAPTIONS: {
BUCKET_NAME: config.get<string>('ipfs_storage.captions.bucket_name'),
PREFIX: config.get<string>('ipfs_storage.captions.prefix')
}
},
WEBSERVER: {
SCHEME: config.get<boolean>('webserver.https') === true ? 'https' : 'http',
WS: config.get<boolean>('webserver.https') === true ? 'wss' : 'ws',
Expand Down
60 changes: 60 additions & 0 deletions server/core/initializers/migrations/0950-ipfs-storage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import * as Sequelize from 'sequelize'

async function up (utils: {
transaction: Sequelize.Transaction
queryInterface: Sequelize.QueryInterface
sequelize: Sequelize.Sequelize
}): Promise<void> {
// Add IPFS CID column to videoFile table
{
const data = {
type: Sequelize.STRING,
allowNull: true,
defaultValue: null
}

await utils.queryInterface.addColumn('videoFile', 'ipfsCid', data, { transaction: utils.transaction })
}

// Add IPFS CID column to videoStreamingPlaylist table
{
const data = {
type: Sequelize.STRING,
allowNull: true,
defaultValue: null
}

await utils.queryInterface.addColumn('videoStreamingPlaylist', 'ipfsCid', data, { transaction: utils.transaction })
}

// Add IPFS CID column to videoCaption table
{
const data = {
type: Sequelize.STRING,
allowNull: true,
defaultValue: null
}

await utils.queryInterface.addColumn('videoCaption', 'ipfsCid', data, { transaction: utils.transaction })
}

// Add IPFS CID column to videoSource table
{
const data = {
type: Sequelize.STRING,
allowNull: true,
defaultValue: null
}

await utils.queryInterface.addColumn('videoSource', 'ipfsCid', data, { transaction: utils.transaction })
}
}

function down (options) {
throw new Error('Not implemented.')
}

export {
up,
down
}
Loading
Loading