[{"data":1,"prerenderedAt":754},["ShallowReactive",2],{"navigation_docs_ru":3,"-ru-development-installation":167,"-ru-development-installation-surround":749},[4,61,101,146],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":60},"Руководство","i-lucide-book-open","\u002Fru\u002Fguide","ru\u002F1.guide",[10,15,20,25,30,35,40,45,50,55],{"title":11,"path":12,"stem":13,"icon":14},"Введение","\u002Fru\u002Fguide\u002Fintroduction","ru\u002F1.guide\u002F01.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Установка","\u002Fru\u002Fguide\u002Finstallation","ru\u002F1.guide\u002F02.installation","i-lucide-smartphone",{"title":21,"path":22,"stem":23,"icon":24},"Авторизация","\u002Fru\u002Fguide\u002Fauth","ru\u002F1.guide\u002F03.auth","i-lucide-lock",{"title":26,"path":27,"stem":28,"icon":29},"Кошельки","\u002Fru\u002Fguide\u002Fwallets","ru\u002F1.guide\u002F04.wallets","i-lucide-wallet",{"title":31,"path":32,"stem":33,"icon":34},"Категории","\u002Fru\u002Fguide\u002Fcategories","ru\u002F1.guide\u002F05.categories","i-lucide-tags",{"title":36,"path":37,"stem":38,"icon":39},"Транзакции","\u002Fru\u002Fguide\u002Ftransactions","ru\u002F1.guide\u002F06.transactions","i-lucide-receipt",{"title":41,"path":42,"stem":43,"icon":44},"Переводы","\u002Fru\u002Fguide\u002Ftransfers","ru\u002F1.guide\u002F07.transfers","i-lucide-arrow-left-right",{"title":46,"path":47,"stem":48,"icon":49},"Статистика","\u002Fru\u002Fguide\u002Fstatistics","ru\u002F1.guide\u002F08.statistics","i-lucide-bar-chart-3",{"title":51,"path":52,"stem":53,"icon":54},"Тема","\u002Fru\u002Fguide\u002Ftheme","ru\u002F1.guide\u002F09.theme","i-lucide-palette",{"title":56,"path":57,"stem":58,"icon":59},"Настройки","\u002Fru\u002Fguide\u002Fsettings","ru\u002F1.guide\u002F10.settings","i-lucide-settings",false,{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":60},"Разработка","i-lucide-code","\u002Fru\u002Fdevelopment","ru\u002F2.development",[67,71,76,81,86,91,96],{"title":16,"path":68,"stem":69,"icon":70},"\u002Fru\u002Fdevelopment\u002Finstallation","ru\u002F2.development\u002F01.installation","i-lucide-download",{"title":72,"path":73,"stem":74,"icon":75},"Граф кодовой базы","\u002Fru\u002Fdevelopment\u002Funderstand-anything","ru\u002F2.development\u002F02.understand-anything","i-lucide-network",{"title":77,"path":78,"stem":79,"icon":80},"Офлайн и PWA","\u002Fru\u002Fdevelopment\u002Foffline","ru\u002F2.development\u002F03.offline","i-lucide-wifi-off",{"title":82,"path":83,"stem":84,"icon":85},"История миграций данных","\u002Fru\u002Fdevelopment\u002Fmigration","ru\u002F2.development\u002F04.migration","i-lucide-database",{"title":87,"path":88,"stem":89,"icon":90},"Деплой","\u002Fru\u002Fdevelopment\u002Fdeployment","ru\u002F2.development\u002F05.deployment","i-lucide-rocket",{"title":92,"path":93,"stem":94,"icon":95},"Тестирование","\u002Fru\u002Fdevelopment\u002Ftesting","ru\u002F2.development\u002F06.testing","i-lucide-flask-conical",{"title":97,"path":98,"stem":99,"icon":100},"Дата-утилиты","\u002Fru\u002Fdevelopment\u002Fdate-utilities","ru\u002F2.development\u002F07.date-utilities","i-lucide-calendar",{"title":102,"icon":103,"path":104,"stem":105,"children":106,"page":60},"Справочник","i-lucide-file-code","\u002Fru\u002Freference","ru\u002F3.reference",[107,112,116,121,126,131,136,141],{"title":108,"path":109,"stem":110,"icon":111},"Архитектура","\u002Fru\u002Freference\u002Farchitecture","ru\u002F3.reference\u002F01.architecture","i-lucide-boxes",{"title":113,"path":114,"stem":115,"icon":44},"Типы транзакций","\u002Fru\u002Freference\u002Ftransaction-types","ru\u002F3.reference\u002F02.transaction-types",{"title":117,"path":118,"stem":119,"icon":120},"Синхронизация","\u002Fru\u002Freference\u002Fsync","ru\u002F3.reference\u002F03.sync","i-lucide-refresh-cw",{"title":122,"path":123,"stem":124,"icon":125},"Офлайн-first","\u002Fru\u002Freference\u002Foffline-first","ru\u002F3.reference\u002F04.offline-first","i-lucide-list-ordered",{"title":127,"path":128,"stem":129,"icon":130},"Тех. решения","\u002Fru\u002Freference\u002Ftech-decisions","ru\u002F3.reference\u002F05.tech-decisions","i-lucide-lightbulb",{"title":132,"path":133,"stem":134,"icon":135},"Валидация","\u002Fru\u002Freference\u002Fvalidation-strategy","ru\u002F3.reference\u002F06.validation-strategy","i-lucide-shield-check",{"title":137,"path":138,"stem":139,"icon":140},"Что изменилось со времён Firebase","\u002Fru\u002Freference\u002Ffirebase-migration","ru\u002F3.reference\u002F07.firebase-migration","i-lucide-hamburger",{"title":142,"path":143,"stem":144,"icon":145},"Производительность","\u002Fru\u002Freference\u002Fperformance","ru\u002F3.reference\u002F08.performance","i-lucide-gauge",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":60},"Премиум","i-lucide-star","\u002Fru\u002Fpremium","ru\u002F4.premium",[152,157,162],{"title":153,"path":154,"stem":155,"icon":156},"Обзор","\u002Fru\u002Fpremium\u002Foverview","ru\u002F4.premium\u002F01.overview","i-lucide-layers",{"title":158,"path":159,"stem":160,"icon":161},"Telegram-бот","\u002Fru\u002Fpremium\u002Ftelegram-bot","ru\u002F4.premium\u002F02.telegram-bot","i-lucide-send",{"title":163,"path":164,"stem":165,"icon":166},"AI Chat","\u002Fru\u002Fpremium\u002Fai-chat","ru\u002F4.premium\u002F03.ai-chat","i-lucide-sparkles",{"id":168,"title":16,"body":169,"description":741,"extension":742,"links":743,"meta":744,"navigation":745,"path":68,"seo":746,"stem":69,"__hash__":748},"docs_ru\u002Fru\u002F2.development\u002F01.installation.md",{"type":170,"value":171,"toc":724},"minimark",[172,177,215,218,535,539,546,680,684,720],[173,174,176],"h2",{"id":175},"требования","Требования",[178,179,180,191,199,207],"ul",{},[181,182,183,190],"li",{},[184,185,189],"a",{"href":186,"rel":187},"https:\u002F\u002Fnodejs.org",[188],"nofollow","Node.js"," v24.12.0 или выше",[181,192,193,198],{},[184,194,197],{"href":195,"rel":196},"https:\u002F\u002Fpnpm.io",[188],"pnpm"," >= 11.1.2",[181,200,201,206],{},[184,202,205],{"href":203,"rel":204},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fcli",[188],"Supabase CLI"," (для локального Supabase)",[181,208,209,214],{},[184,210,213],{"href":211,"rel":212},"https:\u002F\u002Fdocs.docker.com\u002Fget-docker\u002F",[188],"Docker"," (для Supabase и PowerSync)",[173,216,16],{"id":217},"установка",[219,220,221,226,263,267,279,283,287,303,365,388,392,399,405,419,424,463,474,479,503,507,519,527],"steps",{},[222,223,225],"h3",{"id":224},"клонируйте-репозиторий","Клонируйте репозиторий",[227,228,234],"pre",{"className":229,"code":230,"filename":231,"language":232,"meta":233,"style":233},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https:\u002F\u002Fgithub.com\u002Filkome\u002Ffinapp.git\ncd finapp\n","Terminal","bash","",[235,236,237,253],"code",{"__ignoreMap":233},[238,239,242,246,250],"span",{"class":240,"line":241},"line",1,[238,243,245],{"class":244},"sBMFI","git",[238,247,249],{"class":248},"sfazB"," clone",[238,251,252],{"class":248}," https:\u002F\u002Fgithub.com\u002Filkome\u002Ffinapp.git\n",[238,254,256,260],{"class":240,"line":255},2,[238,257,259],{"class":258},"s2Zo4","cd",[238,261,262],{"class":248}," finapp\n",[222,264,266],{"id":265},"установите-зависимости","Установите зависимости",[227,268,270],{"className":229,"code":269,"filename":231,"language":232,"meta":233,"style":233},"pnpm install\n",[235,271,272],{"__ignoreMap":233},[238,273,274,276],{"class":240,"line":241},[238,275,197],{"class":244},[238,277,278],{"class":248}," install\n",[222,280,282],{"id":281},"настройте-переменные-окружения","Настройте переменные окружения",[284,285,286],"p",{},"Скопируйте пример env-файла и заполните значения:",[227,288,290],{"className":229,"code":289,"filename":231,"language":232,"meta":233,"style":233},"cp app\u002F.env.example app\u002F.env\n",[235,291,292],{"__ignoreMap":233},[238,293,294,297,300],{"class":240,"line":241},[238,295,296],{"class":244},"cp",[238,298,299],{"class":248}," app\u002F.env.example",[238,301,302],{"class":248}," app\u002F.env\n",[227,304,307],{"className":229,"code":305,"filename":306,"language":232,"meta":233,"style":233},"VITE_SUPABASE_URL=http:\u002F\u002Flocalhost:54321\nVITE_SUPABASE_ANON_KEY=\u003Canon key из вывода supabase start>\nVITE_POWERSYNC_URL=http:\u002F\u002Flocalhost:8080\n","app\u002F.env",[235,308,309,322,354],{"__ignoreMap":233},[238,310,311,315,319],{"class":240,"line":241},[238,312,314],{"class":313},"sTEyZ","VITE_SUPABASE_URL",[238,316,318],{"class":317},"sMK4o","=",[238,320,321],{"class":248},"http:\u002F\u002Flocalhost:54321\n",[238,323,324,327,330,333,336,339,342,345,348,351],{"class":240,"line":255},[238,325,326],{"class":313},"VITE_SUPABASE_ANON_KEY",[238,328,329],{"class":317},"=\u003C",[238,331,332],{"class":248},"anon",[238,334,335],{"class":244}," key",[238,337,338],{"class":248}," из",[238,340,341],{"class":248}," вывода",[238,343,344],{"class":248}," supabase",[238,346,347],{"class":248}," star",[238,349,350],{"class":313},"t",[238,352,353],{"class":317},">\n",[238,355,357,360,362],{"class":240,"line":356},3,[238,358,359],{"class":313},"VITE_POWERSYNC_URL",[238,361,318],{"class":317},[238,363,364],{"class":248},"http:\u002F\u002Flocalhost:8080\n",[284,366,367,368,371,372,375,376,378,379,375,382,384,385,387],{},"При локальной разработке ",[235,369,370],{},"supabase start"," выводит ",[235,373,374],{},"API URL"," (использовать как ",[235,377,314],{},") и ",[235,380,381],{},"anon key",[235,383,326],{},"). ",[235,386,359],{}," - это сервис PowerSync, запускаемый на следующем шаге.",[222,389,391],{"id":390},"запустите-локальный-бэкенд","Запустите локальный бэкенд",[284,393,394,395,398],{},"Выполните три команды из директории ",[235,396,397],{},"app\u002F",". После первоначальной настройки достаточно просто запускать контейнеры при необходимости.",[284,400,401],{},[402,403,404],"strong",{},"1. Запустите Supabase (Postgres + Auth на порту 54321):",[227,406,409],{"className":229,"code":407,"filename":408,"language":232,"meta":233,"style":233},"supabase start\n","Terminal - из app\u002F",[235,410,411],{"__ignoreMap":233},[238,412,413,416],{"class":240,"line":241},[238,414,415],{"class":244},"supabase",[238,417,418],{"class":248}," start\n",[284,420,421],{},[402,422,423],{},"2. Примените настройки репликации PowerSync:",[227,425,427],{"className":229,"code":426,"filename":408,"language":232,"meta":233,"style":233},"docker exec -i supabase_db_app psql -U postgres -d postgres \u003C supabase\u002Fpowersync_setup.sql\n",[235,428,429],{"__ignoreMap":233},[238,430,431,434,437,440,443,446,449,452,455,457,460],{"class":240,"line":241},[238,432,433],{"class":244},"docker",[238,435,436],{"class":248}," exec",[238,438,439],{"class":248}," -i",[238,441,442],{"class":248}," supabase_db_app",[238,444,445],{"class":248}," psql",[238,447,448],{"class":248}," -U",[238,450,451],{"class":248}," postgres",[238,453,454],{"class":248}," -d",[238,456,451],{"class":248},[238,458,459],{"class":317}," \u003C",[238,461,462],{"class":248}," supabase\u002Fpowersync_setup.sql\n",[284,464,465,466,469,470,473],{},"Эта команда создаёт роль ",[235,467,468],{},"powersync_role"," с правами репликации и публикацию ",[235,471,472],{},"powersync"," для пяти таблиц Финапки.",[284,475,476],{},[402,477,478],{},"3. Запустите сервис PowerSync (порт 8080):",[227,480,482],{"className":229,"code":481,"filename":408,"language":232,"meta":233,"style":233},"docker compose -f powersync\u002Fdocker-compose.yaml up -d\n",[235,483,484],{"__ignoreMap":233},[238,485,486,488,491,494,497,500],{"class":240,"line":241},[238,487,433],{"class":244},[238,489,490],{"class":248}," compose",[238,492,493],{"class":248}," -f",[238,495,496],{"class":248}," powersync\u002Fdocker-compose.yaml",[238,498,499],{"class":248}," up",[238,501,502],{"class":248}," -d\n",[222,504,506],{"id":505},"запустите-dev-сервер","Запустите dev-сервер",[227,508,510],{"className":229,"code":509,"filename":231,"language":232,"meta":233,"style":233},"pnpm dev\n",[235,511,512],{"__ignoreMap":233},[238,513,514,516],{"class":240,"line":241},[238,515,197],{"class":244},[238,517,518],{"class":248}," dev\n",[284,520,521,522,526],{},"Приложение доступно на ",[184,523,524],{"href":524,"rel":525},"http:\u002F\u002Flocalhost:3050",[188],".",[284,528,529,530,534],{},"Playground дизайн-системы доступен на ",[184,531,532],{"href":532,"rel":533},"http:\u002F\u002Flocalhost:3050\u002Fdev",[188]," в режиме разработки (скрыт в продакшене).",[173,536,538],{"id":537},"вход-через-google-опционально","Вход через Google (опционально)",[284,540,541,542,545],{},"На экране входа есть кнопка ",[402,543,544],{},"Войти через Google",". Вход по почте и паролю работает без этой настройки - настраивайте Google, только если хотите протестировать этот флоу локально.",[219,547,548,552,565,573,579,613,636,640,659],{},[222,549,551],{"id":550},"создайте-oauth-клиент-google","Создайте OAuth-клиент Google",[284,553,554,555,560,561,564],{},"В ",[184,556,559],{"href":557,"rel":558},"https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Fcredentials",[188],"Google Cloud Console"," создайте ",[402,562,563],{},"OAuth 2.0 Client ID"," (Web application) и добавьте локальный callback Supabase как разрешённый redirect URI:",[227,566,571],{"className":567,"code":569,"language":570,"meta":233},[568],"language-text","http:\u002F\u002F127.0.0.1:54321\u002Fauth\u002Fv1\u002Fcallback\n","text",[235,572,569],{"__ignoreMap":233},[222,574,576,577],{"id":575},"добавьте-ключи-в-appenv","Добавьте ключи в ",[235,578,306],{},[227,580,582],{"className":229,"code":581,"filename":306,"language":232,"meta":233,"style":233},"SUPABASE_AUTH_EXTERNAL_GOOGLE_CLIENT_ID=\u003Cclient id>\nSUPABASE_AUTH_EXTERNAL_GOOGLE_SECRET=\u003Cclient secret>\n",[235,583,584,599],{"__ignoreMap":233},[238,585,586,589,591,594,597],{"class":240,"line":241},[238,587,588],{"class":313},"SUPABASE_AUTH_EXTERNAL_GOOGLE_CLIENT_ID",[238,590,329],{"class":317},[238,592,593],{"class":248},"client",[238,595,596],{"class":244}," id",[238,598,353],{"class":313},[238,600,601,604,606,608,611],{"class":240,"line":255},[238,602,603],{"class":313},"SUPABASE_AUTH_EXTERNAL_GOOGLE_SECRET",[238,605,329],{"class":317},[238,607,593],{"class":248},[238,609,610],{"class":244}," secret",[238,612,353],{"class":313},[284,614,615,616,619,620,623,624,627,628,631,632,635],{},"CLI Supabase загружает ",[235,617,618],{},".env"," из директории запуска. Эти переменные подставляются в ",[235,621,622],{},"env()"," в ",[235,625,626],{},"app\u002Fsupabase\u002Fconfig.toml"," и ",[402,629,630],{},"не"," попадают в клиент (без префикса ",[235,633,634],{},"VITE_",").",[222,637,639],{"id":638},"перезапустите-supabase","Перезапустите Supabase",[227,641,643],{"className":229,"code":642,"filename":408,"language":232,"meta":233,"style":233},"supabase stop && supabase start\n",[235,644,645],{"__ignoreMap":233},[238,646,647,649,652,655,657],{"class":240,"line":241},[238,648,415],{"class":244},[238,650,651],{"class":248}," stop",[238,653,654],{"class":317}," &&",[238,656,344],{"class":244},[238,658,418],{"class":248},[284,660,661,662,665,666,669,670,673,674,676,677,526],{},"Провайдер Google уже включён в ",[235,663,664],{},"config.toml"," (",[235,667,668],{},"[auth.external.google]",", ",[235,671,672],{},"skip_nonce_check = true"," для локали), а dev-origin ",[235,675,524],{}," добавлен в ",[235,678,679],{},"additional_redirect_urls",[173,681,683],{"id":682},"сборка","Сборка",[685,686,687,700],"code-group",{},[227,688,691],{"className":229,"code":689,"filename":690,"language":232,"meta":233,"style":233},"pnpm build\n","SPA",[235,692,693],{"__ignoreMap":233},[238,694,695,697],{"class":240,"line":241},[238,696,197],{"class":244},[238,698,699],{"class":248}," build\n",[227,701,704],{"className":229,"code":702,"filename":703,"language":232,"meta":233,"style":233},"pnpm generate\npnpm preview\n","Static",[235,705,706,713],{"__ignoreMap":233},[238,707,708,710],{"class":240,"line":241},[238,709,197],{"class":244},[238,711,712],{"class":248}," generate\n",[238,714,715,717],{"class":240,"line":255},[238,716,197],{"class":244},[238,718,719],{"class":248}," preview\n",[721,722,723],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":233,"searchDepth":255,"depth":255,"links":725},[726,727,734,740],{"id":175,"depth":255,"text":176},{"id":217,"depth":255,"text":16,"children":728},[729,730,731,732,733],{"id":224,"depth":356,"text":225},{"id":265,"depth":356,"text":266},{"id":281,"depth":356,"text":282},{"id":390,"depth":356,"text":391},{"id":505,"depth":356,"text":506},{"id":537,"depth":255,"text":538,"children":735},[736,737,739],{"id":550,"depth":356,"text":551},{"id":575,"depth":356,"text":738},"Добавьте ключи в app\u002F.env",{"id":638,"depth":356,"text":639},{"id":682,"depth":255,"text":683},"Начало работы с Финапкой - клонирование, настройка переменных окружения, запуск локального бэкенда и dev-сервера.","md",null,{},{"icon":70},{"title":16,"description":747},"Как установить и запустить Финапку локально с Supabase и PowerSync.","iyRUDMSYpNjdX3PrR0bHBfJ9cWKeMrEWDia4FM2ISKA",[750,752],{"title":56,"path":57,"stem":58,"description":751,"icon":59,"children":-1},"Настройки и параметры приложения.",{"title":72,"path":73,"stem":74,"description":753,"icon":75,"children":-1},"Интерактивный граф знаний кодовой базы Finapp, сгенерированный плагином understand-anything.",1782114339377]