222 lines
6.3 KiB
Markdown
222 lines
6.3 KiB
Markdown
# Formies
|
|
|
|
Formies is a form management tool that allows you to create customizable forms, collect submissions, and view collected data. This project combines a Rust backend and a Svelte frontend, packaged as a single Docker container for easy deployment.
|
|
|
|
## Features
|
|
|
|
### 📝 Form Management
|
|
|
|
- Create forms with customizable fields (text, number, date, etc.).
|
|
- View all created forms in a centralized dashboard.
|
|
|
|
### 🗂️ Submissions
|
|
|
|
- Submit responses to forms via a user-friendly interface.
|
|
- View and manage all form submissions.
|
|
|
|
### ⚙️ Backend
|
|
|
|
- Built with Rust using Actix-Web for high performance and scalability.
|
|
- Uses SQLite for local data storage with easy migration to PostgreSQL if needed.
|
|
|
|
### 🎨 Frontend
|
|
|
|
- Built with SvelteKit for a modern and lightweight user experience.
|
|
- Responsive design for use across devices.
|
|
|
|
### 🚀 Deployment
|
|
|
|
- Packaged as a single Docker image for seamless deployment.
|
|
- Supports CI/CD workflows with Gitea Actions, Drone CI, or GitHub Actions.
|
|
|
|
## Folder Structure
|
|
|
|
```
|
|
project-root/
|
|
├── backend/ # Backend codebase
|
|
│ ├── src/
|
|
│ │ ├── handlers.rs # Route handlers for Actix-Web
|
|
│ │ ├── models.rs # Data models (Form, Submission)
|
|
│ │ ├── db.rs # Database initialization
|
|
│ │ ├── main.rs # Main entry point for the backend
|
|
│ │ └── ... # Additional modules
|
|
│ ├── Cargo.toml # Backend dependencies
|
|
│ └── Cargo.lock # Locked dependencies
|
|
│
|
|
├── frontend/ # Frontend codebase
|
|
│ ├── public/ # Built static files (after `npm run build`)
|
|
│ ├── src/
|
|
│ │ ├── lib/ # Shared utilities (e.g., API integration)
|
|
│ │ ├── routes/ # Svelte pages
|
|
│ │ │ ├── +page.svelte # Dashboard
|
|
│ │ │ └── form/ # Form-related pages
|
|
│ │ └── main.ts # Frontend entry point
|
|
│ ├── package.json # Frontend dependencies
|
|
│ ├── svelte.config.js # Svelte configuration
|
|
│ └── ... # Additional files
|
|
│
|
|
├── Dockerfile # Combined Dockerfile for both frontend and backend
|
|
├── docker-compose.yml # Docker Compose file for deployment
|
|
├── .gitea/ # Gitea Actions workflows
|
|
│ └── workflows/
|
|
│ └── build_and_deploy.yml
|
|
├── .drone.yml # Drone CI configuration
|
|
├── README.md # Documentation (this file)
|
|
└── ... # Other configuration files
|
|
```
|
|
|
|
## Prerequisites
|
|
|
|
### Docker
|
|
|
|
- Install Docker: [Docker Documentation](https://docs.docker.com/)
|
|
|
|
### Rust (for development)
|
|
|
|
- Install Rust: [Rustup Installation](https://rustup.rs/)
|
|
|
|
### Node.js (for frontend development)
|
|
|
|
- Install Node.js: [Node.js Downloads](https://nodejs.org/)
|
|
|
|
## Development
|
|
|
|
### Backend
|
|
|
|
1. Navigate to the backend/ directory:
|
|
|
|
```sh
|
|
cd backend
|
|
```
|
|
|
|
2. Run the backend server:
|
|
|
|
```sh
|
|
cargo run
|
|
```
|
|
|
|
The backend will be available at [http://localhost:8080](http://localhost:8080).
|
|
|
|
### Frontend
|
|
|
|
1. Navigate to the frontend/ directory:
|
|
|
|
```sh
|
|
cd frontend
|
|
```
|
|
|
|
2. Install dependencies:
|
|
|
|
```sh
|
|
npm install
|
|
```
|
|
|
|
3. Start the development server:
|
|
|
|
```sh
|
|
npm run dev
|
|
```
|
|
|
|
The frontend will be available at [http://localhost:5173](http://localhost:5173).
|
|
|
|
## Deployment
|
|
|
|
### Build the Docker Image
|
|
|
|
1. Build the combined Docker image:
|
|
|
|
```sh
|
|
docker build -t your-dockerhub-username/formies-combined .
|
|
```
|
|
|
|
2. Run the Docker container:
|
|
|
|
```sh
|
|
docker run -p 8080:8080 your-dockerhub-username/formies-combined
|
|
```
|
|
|
|
Access the application at [http://localhost:8080](http://localhost:8080).
|
|
|
|
### Using Docker Compose
|
|
|
|
1. Deploy using `docker-compose.yml`:
|
|
|
|
```sh
|
|
docker-compose up -d
|
|
```
|
|
|
|
2. Stop the containers:
|
|
```sh
|
|
docker-compose down
|
|
```
|
|
|
|
## CI/CD Workflow
|
|
|
|
### Gitea Actions
|
|
|
|
1. Create a file at `.gitea/workflows/build_and_deploy.yml`:
|
|
|
|
```yaml
|
|
name: Build and Deploy
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Clone the repository
|
|
uses: actions/checkout@v3
|
|
|
|
- name: Set up Docker
|
|
uses: docker/setup-buildx-action@v2
|
|
|
|
- name: Log in to Docker Hub
|
|
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
|
|
|
|
- name: Build and Push Docker Image
|
|
run: |
|
|
docker build -t your-dockerhub-username/formies-combined .
|
|
docker push your-dockerhub-username/formies-combined:latest
|
|
|
|
- name: Deploy to Server (optional)
|
|
run: |
|
|
ssh -o StrictHostKeyChecking=no ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }} << 'EOF'
|
|
docker pull your-dockerhub-username/formies-combined:latest
|
|
docker stop formies || true
|
|
docker rm formies || true
|
|
docker run -d --name formies -p 8080:8080 your-dockerhub-username/formies-combined:latest
|
|
EOF
|
|
```
|
|
|
|
2. Add secrets in Gitea:
|
|
- `DOCKER_USERNAME`: Your Docker Hub username.
|
|
- `DOCKER_PASSWORD`: Your Docker Hub password.
|
|
- `SERVER_USER`: SSH username for deployment.
|
|
- `SERVER_IP`: IP address of the server.
|
|
|
|
## API Endpoints
|
|
|
|
**Base URL:** `http://localhost:8080`
|
|
|
|
| Method | Endpoint | Description |
|
|
| ------ | ----------------------------- | ----------------------------------- |
|
|
| POST | `/api/forms` | Create a new form |
|
|
| GET | `/api/forms` | Get all forms |
|
|
| POST | `/api/forms/{id}/submissions` | Submit data to a form |
|
|
| GET | `/api/forms/{id}/submissions` | Get submissions for a specific form |
|
|
|
|
## Future Enhancements
|
|
|
|
- **Authentication:** Add user-based authentication for managing forms and submissions.
|
|
- **Export:** Allow exporting submissions to CSV or Excel.
|
|
- **Scaling:** Migrate to PostgreSQL for distributed data handling.
|
|
- **Monitoring:** Integrate tools like Prometheus and Grafana for performance monitoring.
|
|
|
|
## License
|
|
|
|
This project is licensed under the MIT License. See the [LICENSE](./LICENSE) file for details.
|