# SCHAFWASCHENER SEGELVEREIN Voting System A secure web application for conducting online votes for SCHAFWASCHENER SEGELVEREIN club members. ## Features - **Secure One-Time Voting Links**: Admin can generate unique, one-time use voting links that are cryptographically signed. - **Simple Voting Interface**: Members can easily vote Yes, No, or Abstain on proposed statute amendments. - **Optional Comments**: Members can provide anonymous feedback or suggestions. - **Results Dashboard**: Admin can view real-time voting statistics. - **Dark Mode Support**: Automatically adapts to user's system preferences. - **WYSIWYG Text Editor**: Admin can edit text content using a rich text editor. - **JWT Authentication**: Admin authentication using JWT tokens stored in cookies. - **Secure Key Management**: JWT keys are randomly generated and stored securely. ## Technical Implementation - Built with Next.js 15 and React 19 - Styled with Tailwind CSS - JWT-like token system for secure, one-time voting links - File-based storage for vote data ## Getting Started ### Prerequisites - Node.js 18+ and npm ### Installation 1. Clone the repository 2. Install dependencies: ``` npm install ``` 3. Run the development server: ``` npm run dev ``` 4. Open [http://localhost:3000](http://localhost:3000) in your browser ### Admin Access The default admin password is `schafwaschener-segelverein-admin`. This can be changed by setting the `ADMIN_PASSWORD` environment variable. Once logged in, the admin session is maintained using JWT tokens, so you don't need to enter the password for each action. ## Usage ### Admin 1. Navigate to `/admin` and enter the admin password 2. Generate voting links and share them with club members 3. View voting statistics in real-time ### Voters 1. Click on the unique voting link received 2. Select your vote (Yes, No, or Abstain) 3. Optionally add comments or suggestions 4. Submit your vote ## Environment Variables - `ADMIN_PASSWORD`: Password for admin access (default: "schafwaschener-segelverein-admin") - `NEXT_PUBLIC_BASE_URL`: Base URL for generating voting links (default: auto-detected) - `JWT_SECRET_KEY`: Secret key for JWT signing (default: randomly generated) ## Production Deployment ### Standard Deployment For production deployment, consider the following: 1. Set a secure admin password using the `ADMIN_PASSWORD` environment variable 2. Set a secure JWT secret key using the `JWT_SECRET_KEY` environment variable 3. Use a database instead of file-based storage 4. Set up HTTPS for secure communication ### Docker Deployment The application can be easily deployed using Docker: #### Using Docker Compose (Recommended) 1. Make sure you have Docker and Docker Compose installed 2. Run the application: ``` docker-compose up -d ``` Or with a custom admin password: ``` ADMIN_PASSWORD=your-secure-password docker-compose up -d ``` 3. Access the application at [http://localhost:3000](http://localhost:3000) 4. To stop the application: ``` docker-compose down ``` #### Using Docker Directly 1. Build the Docker image: ``` ./build-docker.sh ``` or manually: ``` docker build -t ssvc-rimsting-vote:latest . ``` 2. Run the container: ``` docker run -p 3000:3000 ssvc-rimsting-vote:latest ``` 3. For persistent data storage and custom admin password: ``` docker run -p 3000:3000 -v $(pwd)/data:/app/data -e ADMIN_PASSWORD=your-secure-password ssvc-rimsting-vote:latest ``` ## License This project is proprietary and confidential. Unauthorized copying, distribution, or use is strictly prohibited. © SCHAFWASCHENER SEGELVEREIN