Files
fin-tracker/flake.nix
T
Dmitry 563308a08b chore: монорепо, dev-окружение и деплой
Nix flake на два шелла (backend и + Flutter), justfile как единая точка входа,
локальный Postgres в ./.pgdata на порту 54329, docker-compose из пяти сервисов
(db, api, worker, caddy, pg-backup) и CI на ruff/pyright/pytest + дрейф OpenAPI.

Российские корневые сертификаты лежат в репозитории: они публичные, но нужны и
Caddy, и gRPC-каналу T-Invest, а глобальный gitignore отбрасывает *.pem.
2026-09-18 13:43:17 +03:00

58 lines
2.0 KiB
Nix

{
description = "fin-tracker — personal finance + investment analytics";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs = { self, nixpkgs }:
let
system = "x86_64-linux";
pkgs = import nixpkgs { inherit system; };
python = pkgs.python312;
# manylinux wheels pulled by uv (grpcio for T-Invest, asyncpg, polars, …)
# dlopen these at runtime. nix-ld is enabled system-wide; we only extend
# its search path (never overwrite — keeps direnv diffs sane).
runtimeLibs = pkgs.lib.makeLibraryPath [
pkgs.stdenv.cc.cc.lib # libstdc++.so.6
pkgs.zlib
pkgs.openssl
];
backendTools = [
python
pkgs.uv
pkgs.just
pkgs.postgresql_17 # local dev cluster (`just db-start`) and psql
pkgs.openapi-generator-cli # `just gen-client`
];
commonHook = ''
export UV_PYTHON="${python}/bin/python3"
export UV_PYTHON_DOWNLOADS=never
export NIX_LD_LIBRARY_PATH="${runtimeLibs}''${NIX_LD_LIBRARY_PATH:+:$NIX_LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH="${runtimeLibs}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
# T-Invest gRPC must not go through a local SOCKS/HTTP proxy
export no_proxy="invest-public-api.tbank.ru,.tbank.ru,invest-public-api.tinkoff.ru,.tinkoff.ru,localhost,127.0.0.1''${no_proxy:+,$no_proxy}"
export NO_PROXY="$no_proxy"
export PGDATA="$PWD/.pgdata"
export PGHOST="$PWD/.pgdata"
export PGPORT=54329
'';
in {
devShells.${system} = {
# backend only — fast to enter
default = pkgs.mkShell {
packages = backendTools;
shellHook = commonHook + ''
echo "fin-tracker: 'just --list' for recipes; 'nix develop .#app' adds Flutter"
'';
};
# backend + Flutter toolchain (large download on first use)
app = pkgs.mkShell {
packages = backendTools ++ [ pkgs.flutter ];
shellHook = commonHook;
};
};
};
}