Compare commits
4 Commits
4d2aad404b
...
0587762bbb
| Author | SHA1 | Date | |
|---|---|---|---|
| 0587762bbb | |||
|
|
cd6e9c3619 | ||
|
|
d8c3997f24 | ||
|
|
e44d49e190 |
21
Dockerfile
21
Dockerfile
@@ -47,6 +47,9 @@ FROM rust:alpine AS backend-builder
|
|||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
RUN apk add --no-cache musl-dev pkgconfig openssl-dev openssl-libs-static
|
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 shared models
|
||||||
COPY calendar-models ./calendar-models
|
COPY calendar-models ./calendar-models
|
||||||
|
|
||||||
@@ -76,19 +79,29 @@ RUN cargo build --release --bin backend
|
|||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
|
|
||||||
# Install runtime dependencies
|
# 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 frontend files to temporary location
|
||||||
COPY --from=builder /app/frontend/dist /app/frontend-dist
|
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 /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
|
# Copy migrations for database setup
|
||||||
RUN mkdir -p /srv/www
|
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 && \
|
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 '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 '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 && \
|
echo '/usr/local/bin/backend' >> /usr/local/bin/start.sh && \
|
||||||
chmod +x /usr/local/bin/start.sh
|
chmod +x /usr/local/bin/start.sh
|
||||||
|
|
||||||
|
|||||||
48
README.md
48
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
|
- **Real-time Updates**: Seamless synchronization with CalDAV servers
|
||||||
- **Timezone Aware**: Proper local time display with UTC storage
|
- **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
|
## Architecture
|
||||||
|
|
||||||
### Frontend (Yew WebAssembly)
|
### Frontend (Yew WebAssembly)
|
||||||
@@ -40,7 +46,8 @@ While there are many excellent self-hosted CalDAV server implementations (Nextcl
|
|||||||
|
|
||||||
### Backend (Axum)
|
### Backend (Axum)
|
||||||
- **Framework**: Axum async web framework with CORS support
|
- **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
|
- **CalDAV Client**: Full CalDAV protocol implementation for server sync
|
||||||
- **API Design**: RESTful endpoints following calendar operation patterns
|
- **API Design**: RESTful endpoints following calendar operation patterns
|
||||||
- **Data Flow**: Proxy between frontend and CalDAV servers with proper authentication
|
- **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
|
## Getting Started
|
||||||
|
|
||||||
### Prerequisites
|
### Docker Deployment (Recommended)
|
||||||
|
|
||||||
|
The easiest way to run the calendar is using Docker Compose:
|
||||||
|
|
||||||
|
1. **Clone the repository**:
|
||||||
|
```bash
|
||||||
|
git clone <repository-url>
|
||||||
|
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)
|
- Rust (latest stable version)
|
||||||
- Trunk (`cargo install trunk`)
|
- Trunk (`cargo install trunk`)
|
||||||
|
|
||||||
### Development Setup
|
#### Local Development
|
||||||
|
|
||||||
1. **Start the backend server** (serves API at http://localhost:3000):
|
1. **Start the backend server** (serves API at http://localhost:3000):
|
||||||
```bash
|
```bash
|
||||||
@@ -73,6 +104,17 @@ While there are many excellent self-hosted CalDAV server implementations (Nextcl
|
|||||||
|
|
||||||
3. **Access the application** at `http://localhost:8080`
|
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
|
### Building for Production
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
Reference in New Issue
Block a user