个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Video and image processing using ffmpeg.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗[!IMPORTANT] Status: Currently in active development for
v2.0.0. The platform is undergoing a complete rebuild. You can join the waitlist at StreamSouk to get notified once we're live.
StreamSouk is a video streaming platform built with a primary focus on learning and implementing those learnings.
The current iteration of StreamSouk is a self-managed monorepo. The primary goals for this rebuild are:
Two ways, pick one:
CLAUDE.md "Commands" describe the same things.Docker is the only prerequisite (about 4 GB of RAM allocated to it).
git clone https://github.com/azeemuddinaziz/streaming.git
cd streaming
docker compose up
Open http://localhost:3001. The API is on :3000 and the upload server (tusd) on :8080.
docker compose down. Accounts, Videos and uploads survive the next up.docker compose down -v (deletes the database, the uploaded bytes and the generated sign-in secret).docker compose restart worker.docker compose up --build.Limits: the first build takes several minutes, and transcoding speed depends on your machine. Media and share links use localhost, so they only work on the same machine. This is not for production: no TLS, no backups, and bytes stay on disk instead of S3.
The seed fills a fresh run with demo content, so the home page is not empty. It creates demo Users (demo-user-N), Videos (generated 8-second clips, processed by the worker like a real upload; one in six is Unlisted, the rest Public), Comments with Replies, Likes and Dislikes, and a ring of Subscriptions. It waits until every Video is ready (5 minute limit) and is safe to run again: it only adds what is missing.
| Flag | Range | Default |
|---|---|---|
--users N | 1 to 10 | 3 |
--videos N | 1 to 50 | 6 |
--comments-per-video N | 0 to 10 | 2 |
--help prints the same. The demo Users sign in with their email [email protected] (for example [email protected]) and the password demo-password, which is known to everyone, so use it on a local run only. The seed refuses to run under NODE_ENV=production or with S3_BUCKET set.
docker compose run --rm api ./node_modules/.bin/tsx src/seed.ts --users 5 --videos 12
Leave the flags out for the defaults. Then open http://localhost:3001; Videos appear on the home page as they finish processing.pnpm --filter server seed --users 5 --videos 12.docker compose down -v deletes everything, the demo data included.This is the source of truth for running StreamSouk from a clone. You run a Postgres database and four processes: the API, the background worker, the upload server (tusd) and the web app.
| Tool | Version | macOS (Homebrew) | Linux (Debian/Ubuntu) |
|---|---|---|---|
| Node | 24 (what the Docker images use) | brew install node@24 | nvm install 24, or nodejs.org |
| pnpm | the repo pins 12.4.2 and pnpm downloads it when needed | brew install pnpm | npm i -g pnpm |
| Postgres | 17 (what Docker uses) | brew install postgresql@17 && brew services start postgresql@17 | sudo apt install postgresql && sudo systemctl start postgresql |
tusd | 2.x | brew install tusd | binary from the tusd releases, put on your PATH |
ffmpeg and ffprobe | any recent (one package provides both) | brew install ffmpeg | sudo apt install ffmpeg |
Check: node -v, pnpm -v, psql --version, tusd -version, ffmpeg -version, ffprobe -version.
git clone https://github.com/azeemuddinaziz/streaming.git
cd streaming
pnpm install
One for the app and a separate one the tests are allowed to wipe (only needed to run pnpm --filter server test).
createdb streamsouk
createdb streamsouk_test
On Linux the postgres user usually owns the server, so use sudo -u postgres createdb ... (and create a role for yourself with sudo -u postgres createuser --superuser $USER).
cp server/.env.example server/.env
cp web/.env.example web/.env.local
Edit server/.env:
DATABASE_URL=postgresql://<you>@localhost:5432/streamsouk (add :<password> after the user if your Postgres has one; on a default Homebrew or Postgres.app install there is none).TEST_DATABASE_URL=postgresql://<you>@localhost:5432/streamsouk_test (must differ from DATABASE_URL).JWT_SECRET: paste the output of openssl rand -base64 48.WEB_ORIGIN as http://localhost:3001 and S3_BUCKET unset: uploaded bytes then stay on disk under server/data/.web/.env.local works as copied.
pnpm --filter server generate
pnpm --filter server exec prisma migrate deploy
(pnpm --filter server migrate is prisma migrate dev, for changing the schema.) To prepare the test database too: DATABASE_URL=<your TEST_DATABASE_URL> pnpm --filter server exec prisma migrate deploy.
One terminal each, from the repo root:
| Process | Command | Port |
|---|---|---|
| API | pnpm --filter server dev | 3000 |
| Worker (transcoding, cleanup) | pnpm --filter server worker | none |
| Upload server | pnpm --filter server tusd | 8080 |
| Web | pnpm --filter web dev | 3001 |
Want demo content instead? See Demo data.
If the Video stays on Processing, look at the worker terminal. curl http://localhost:3000/api/v1/videos returning {"videos":[],...} confirms the API and the database.
EADDRINUSE on 3000, 3001 or 8080): stop the other process, or run the API on another port with PORT=<n> in server/.env (the tusd script reads it too, and also set API_URL and NEXT_PUBLIC_API_URL in web/.env.local). For the web app: pnpm --filter web exec next dev -p <n>, and set WEB_ORIGIN in server/.env and NEXT_PUBLIC_WEB_ORIGIN to match. If Docker is running, docker compose down frees all three.tusd: command not found: install it (step 1) and make sure it is on your PATH; open a new terminal after installing.pnpm --filter server tusd must be running, and WEB_ORIGIN in server/.env must be exactly the address in your browser (http://localhost:3001, not 127.0.0.1).ffmpeg and ffprobe must be on the worker's PATH; run ffmpeg -version. The worker must also be running. A failed Video has a Retry button in Studio.localhost for both the web app and the API (not an IP address or a mix), and keep NEXT_PUBLIC_API_URL pointing at the API's address.JWT_SECRET or DATABASE_URL errors on start, or Environment variable not found: the file must be server/.env, and the commands must be run through pnpm --filter server.Cannot find module .../generated/prisma): run pnpm --filter server generate.The legacy version of StreamSouk (v1) has been officially deprecated and taken offline to make way for the new infrastructure. It featured basic video upload via Cloudinary, user authentication, and profile management, utilizing separate frontend and backend repositories.
If you are interested in the legacy code or the architectural starting point of this project, you can view the historical snapshot here:
StreamSouk is released under the MIT License.