diff --git a/Dockerfile b/Dockerfile index 99c9369..ff4b365 100644 --- a/Dockerfile +++ b/Dockerfile @@ -47,6 +47,9 @@ FROM rust:alpine AS backend-builder WORKDIR /app RUN apk add --no-cache musl-dev pkgconfig openssl-dev openssl-libs-static +# Install sqlx-cli for migrations +RUN cargo install sqlx-cli --no-default-features --features sqlite + # Copy shared models COPY calendar-models ./calendar-models @@ -76,19 +79,29 @@ RUN cargo build --release --bin backend FROM alpine:latest # Install runtime dependencies -RUN apk add --no-cache ca-certificates tzdata +RUN apk add --no-cache ca-certificates tzdata sqlite # Copy frontend files to temporary location COPY --from=builder /app/frontend/dist /app/frontend-dist -# Copy backend binary (built in workspace root) +# Copy backend binary and sqlx-cli COPY --from=backend-builder /app/target/release/backend /usr/local/bin/backend +COPY --from=backend-builder /usr/local/cargo/bin/sqlx /usr/local/bin/sqlx -# Create startup script to copy frontend files to shared volume -RUN mkdir -p /srv/www +# Copy migrations for database setup +COPY --from=backend-builder /app/backend/migrations /migrations + +# Create startup script to copy frontend files, run migrations, and start backend +RUN mkdir -p /srv/www /db RUN echo '#!/bin/sh' > /usr/local/bin/start.sh && \ + echo 'echo "Copying frontend files..."' >> /usr/local/bin/start.sh && \ echo 'cp -r /app/frontend-dist/* /srv/www/' >> /usr/local/bin/start.sh && \ + echo 'echo "Ensuring database directory exists..."' >> /usr/local/bin/start.sh && \ + echo 'mkdir -p /db && chmod 755 /db' >> /usr/local/bin/start.sh && \ + echo 'echo "Running database migrations..."' >> /usr/local/bin/start.sh && \ + echo 'sqlx migrate run --database-url "sqlite:///db/calendar.db" --source /migrations || echo "Migration failed but continuing..."' >> /usr/local/bin/start.sh && \ echo 'echo "Starting backend server..."' >> /usr/local/bin/start.sh && \ + echo 'export DATABASE_URL="sqlite:///db/calendar.db"' >> /usr/local/bin/start.sh && \ echo '/usr/local/bin/backend' >> /usr/local/bin/start.sh && \ chmod +x /usr/local/bin/start.sh diff --git a/README.md b/README.md index cd03b56..23a06d6 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,12 @@ While there are many excellent self-hosted CalDAV server implementations (Nextcl - **Real-time Updates**: Seamless synchronization with CalDAV servers - **Timezone Aware**: Proper local time display with UTC storage +### User Experience +- **Persistent Preferences**: Settings sync across devices and sessions +- **Remember Me**: Optional server/username remembering for convenience +- **Session Management**: Secure session tokens with automatic expiry +- **Cross-Device Sync**: User preferences stored in database, not just browser + ## Architecture ### Frontend (Yew WebAssembly) @@ -40,7 +46,8 @@ While there are many excellent self-hosted CalDAV server implementations (Nextcl ### Backend (Axum) - **Framework**: Axum async web framework with CORS support -- **Authentication**: JWT token management and validation +- **Authentication**: SQLite-backed session management with JWT tokens +- **Database**: SQLite for user preferences and session storage - **CalDAV Client**: Full CalDAV protocol implementation for server sync - **API Design**: RESTful endpoints following calendar operation patterns - **Data Flow**: Proxy between frontend and CalDAV servers with proper authentication @@ -54,12 +61,36 @@ While there are many excellent self-hosted CalDAV server implementations (Nextcl ## Getting Started -### Prerequisites +### Docker Deployment (Recommended) +The easiest way to run the calendar is using Docker Compose: + +1. **Clone the repository**: + ```bash + git clone + cd calendar + ``` + +2. **Start the application**: + ```bash + docker compose up + ``` + +3. **Access the application** at `http://localhost` + +The Docker setup includes: +- **Automatic database migrations** on startup +- **Persistent data storage** in `./data/db/` volume +- **Frontend served via Caddy** on port 80 +- **Backend API** accessible on port 3000 + +### Development Setup + +#### Prerequisites - Rust (latest stable version) - Trunk (`cargo install trunk`) -### Development Setup +#### Local Development 1. **Start the backend server** (serves API at http://localhost:3000): ```bash @@ -73,6 +104,17 @@ While there are many excellent self-hosted CalDAV server implementations (Nextcl 3. **Access the application** at `http://localhost:8080` +#### Database Setup + +For local development, run the database migrations: +```bash +# Install sqlx-cli if not already installed +cargo install sqlx-cli --features sqlite + +# Run migrations +sqlx migrate run --database-url "sqlite:calendar.db" --source backend/migrations +``` + ### Building for Production ```bash