Ocean - это веб-пространство для заметок, документов и личных проектов. По ощущению приложение близко к Notion: можно быстро создавать страницы, выстраивать их в дерево, писать в блочном редакторе, добавлять иконки и обложки, публиковать документы для просмотра и возвращать удалённые страницы из корзины.
Проект сделан как полноценное Next.js-приложение с авторизацией, realtime данными, загрузкой пользовательских файлов и Docker-сборкой. Его можно поднять локально для разработки или собрать в production-образ.
- Личный рабочий стол после входа в аккаунт.
- Приватные документы, доступные только авторизованному пользователю.
- Вложенные страницы и боковая навигация по дереву документов.
- Rich-text редактор на BlockNote: заголовки, списки, таблицы, код, медиа и другие блочные элементы.
- Иконки и cover image для документов.
- Быстрый поиск по документам через командное окно.
- Публикация read-only preview по отдельному маршруту.
- Корзина, восстановление и окончательное удаление документов.
- Экспорт документа в PDF.
- Светлая и тёмная тема.
Приложение находится в деплое на Vercel. Для корректного использования приложения необходим VPN т.к. используется Clerk и Convex в качестве BaaS
https://ocean-six-murex.vercel.app/
- Next.js 16 App Router и React 19 - маршруты, layouts и клиентский UI.
- Convex - хранение документов, запросы и мутации с учётом пользователя.
- Clerk - регистрация, вход и сессии пользователя.
- EdgeStore - загрузка и хранение изображений документов.
- BlockNote - блочный rich-text редактор.
- Tailwind CSS, Radix UI и shadcn-style primitives - интерфейс, модальные окна, меню и базовые компоненты.
- TypeScript, ESLint и Prettier - проверка качества кода.
- Node.js 22.x. Next.js 16 требует Node.js 20.9 или новее.
- npm 10 или новее.
- Clerk application с publishable/secret keys.
- Convex deployment.
- EdgeStore credentials, если нужны загрузка обложек и изображений.
- Docker, если нужно проверить production image.
Для локальной разработки создай .env или .env.local. Не коммить реальные
ключи и токены.
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
CLERK_SECRET_KEY=sk_test_...
# Можно указать полный URL Convex:
NEXT_PUBLIC_CONVEX_URL=https://your-deployment.convex.cloud
# Или deployment name. next.config.mjs умеет собрать URL из этого значения.
CONVEX_DEPLOYMENT=dev:your-deployment
EDGE_STORE_ACCESS_KEY=...
EDGE_STORE_SECRET_KEY=...NEXT_PUBLIC_CONVEX_URL предпочтителен для production. Если он не задан,
приложение попробует вывести URL из CONVEX_DEPLOYMENT.
Установи зависимости:
npm installЗапусти Next.js dev server:
npm run devОткрой приложение:
http://localhost:3000
Если порт 3000 занят, Next.js выберет следующий свободный порт и покажет его в
консоли.
Если меняешь Convex functions/schema, параллельно запусти Convex:
npx convex dev/- публичный стартовый экран./documents- рабочая область пользователя./documents/[documentId]- редактор конкретного документа./preview/[documentId]- опубликованный read-only preview./api/edgestore/[...edgestore]- API route для EdgeStore.
npm run dev # Запустить приложение в development mode
npm run build # Собрать production build
npm run start # Запустить production build
npm run lint # ESLint
npm run typecheck # TypeScript без emit
npm run format # Отформатировать проект Prettier
npm run format:check # Проверить форматированиеDockerfile использует multi-stage build:
depsустанавливает зависимости для сборки.prod-depsустанавливает только production dependencies.builderзапускаетnpm run build.runnerстартует собранное приложение от non-root пользователя.
Для Docker удобно держать отдельный env-файл, например .env.docker. Он не
попадает в Git и Docker context, потому что .env* исключены в .gitignore и
.dockerignore.
cp .env .env.dockerПеред сборкой загрузи переменные из файла в текущий shell. Это нужно для
NEXT_PUBLIC_*: Next.js встраивает публичные значения в client bundle на этапе
npm run build.
set -a
. ./.env.docker
set +aСобрать образ:
docker build \
--build-arg NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY \
--build-arg CONVEX_DEPLOYMENT \
--build-arg NEXT_PUBLIC_CONVEX_URL \
-t ocean:local .Запустить контейнер, передав все runtime-переменные из env-файла:
docker run --rm -p 3000:3000 \
--env-file .env.docker \
ocean:localЕсли публичные NEXT_PUBLIC_* или CONVEX_DEPLOYMENT поменялись, пересобери
image. Runtime-only secrets (CLERK_SECRET_KEY, EDGE_STORE_ACCESS_KEY,
EDGE_STORE_SECRET_KEY) достаточно обновить в .env.docker и перезапустить
контейнер.
Минимальный набор локальных проверок:
npm run format:check
npm run lint
npm run typecheck
npm run build
docker build -t ocean:local .npm audit можно запускать отдельно, если нужен отчёт по зависимостям:
npm audit --audit-level=moderate- Root
app/содержит маршруты Next.js. Не создавай отдельныйsrc/app. /documents/*требует авторизованную Clerk-сессию.- Загруженные изображения хранятся в EdgeStore.
- Документы и дерево страниц обслуживаются Convex queries/mutations.
.env,.env.*,.next,node_modules, screenshots и служебные agent files исключены из Docker context.- Не добавляй реальные secrets, customer data или локальные session artifacts в Git.



