Nix flake for https://github.com/fsinfuhh/BitPoll
				
			
		| example-configuration.nix | ||
| flake.nix | ||
| module.nix | ||
| package.nix | ||
| README.md | ||
Bitpoll Nix Package
This repository contains a Nix flake for packaging Bitpoll, a web application for scheduling meetings and general polling.
Features
- Complete Nix Package: Bitpoll packaged as a Nix derivation with all Python dependencies
 - NixOS Service Module: Ready-to-use systemd service with PostgreSQL integration
 - Security Hardened: Runs with minimal privileges and security restrictions
 - Configurable: All major settings exposed as NixOS options
 - Production Ready: Uses uWSGI with proper process management
 
Quick Start
1. Add to your NixOS configuration
{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05";
    bitpoll.url = "github:your-username/bitpoll-nix";
  };
  outputs = { self, nixpkgs, bitpoll }: {
    nixosConfigurations.your-host = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";
      modules = [
        bitpoll.nixosModules.default
        {
          services.bitpoll = {
            enable = true;
            secretKey = "your-secret-key-here";
            encryptionKey = "your-encryption-key-here";
            allowedHosts = [ "your-domain.com" ];
          };
        }
      ];
    };
  };
}
2. Generate required keys
# Generate Django secret key
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
# Generate field encryption key (32 bytes, base64 encoded)
python -c "import base64, os; print(base64.b64encode(os.urandom(32)).decode())"
3. Deploy
sudo nixos-rebuild switch --flake .#your-host
Configuration Options
Basic Configuration
services.bitpoll = {
  enable = true;
  
  # Required security keys
  secretKey = "your-django-secret-key";
  encryptionKey = "your-field-encryption-key";
  
  # Network settings
  listenAddress = "127.0.0.1";
  port = 3008;           # uWSGI socket
  httpPort = 3009;       # HTTP port (null to disable)
  
  # Django settings
  debug = false;
  allowedHosts = [ "your-domain.com" ];
  language = "en-us";
  timezone = "Europe/Berlin";
};
Database Configuration
services.bitpoll = {
  # PostgreSQL is enabled by default
  enablePostgreSQL = true;
  
  database = {
    name = "bitpoll";
    user = "bitpoll";
    password = ""; # Leave empty for peer authentication
    host = "localhost";
    port = 5432;
  };
};
Performance Tuning
services.bitpoll = {
  # uWSGI process management
  processes = 8;           # Max processes
  threads = 4;             # Threads per process
  cheaperProcesses = 2;    # Min processes
  
  # Additional uWSGI configuration
  extraUwsgiConfig = ''
    max-requests = 1000
    reload-on-rss = 512
  '';
};
Advanced Settings
services.bitpoll = {
  # Additional Django settings
  extraSettings = {
    PIPELINE_LOCAL = {
      JS_COMPRESSOR = "pipeline.compressors.uglifyjs.UglifyJSCompressor";
      CSS_COMPRESSOR = "pipeline.compressors.cssmin.CSSMinCompressor";
    };
    CSP_ADDITIONAL_SCRIPT_SRC = [ "your-analytics-domain.com" ];
  };
};
Reverse Proxy Setup
Nginx Example
services.nginx = {
  enable = true;
  virtualHosts."your-domain.com" = {
    enableACME = true;
    forceSSL = true;
    locations = {
      "/" = {
        proxyPass = "http://127.0.0.1:3009";
        proxyWebsockets = true;
        extraConfig = ''
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
        '';
      };
      "/static/" = {
        alias = "/var/lib/bitpoll/static/";
        extraConfig = ''
          expires 1y;
          add_header Cache-Control "public, immutable";
        '';
      };
    };
  };
};
Data Storage
All persistent data is stored in /var/lib/bitpoll/:
media/- User uploaded filesstatic/- Collected static files- Database data (if using PostgreSQL, stored in PostgreSQL data directory)
 
Security
The service runs with extensive security hardening:
- Dedicated user account (
bitpoll) - Restricted filesystem access
 - No network access except required ports
 - Memory execution protection
 - System call filtering
 
Development
Building the package
nix build .#bitpoll
Development shell
nix develop
Testing the module
nixos-rebuild build-vm --flake .#test-vm
Troubleshooting
Check service status
systemctl status bitpoll
journalctl -u bitpoll -f
Database issues
# Check PostgreSQL status
systemctl status postgresql
# Connect to database
sudo -u postgres psql bitpoll
Permission issues
# Fix data directory permissions
sudo chown -R bitpoll:bitpoll /var/lib/bitpoll
sudo chmod -R u=rwX,g=rX,o= /var/lib/bitpoll
License
This packaging is released under the same license as Bitpoll (GPL-3.0).