* Add CardDav and CalDav servers This implements the servers, but not the clients (yet). The implementation is essentially a proxy to Radicale (as a container in `docker-compose.yml`), with certain security assurances. If you're upgrading, basically you'll need to create a new `data-radicale` directory, and everything else should just work. This will also release v2.3.0 with those enabled by default. Tested with Thunderbird and Apple Calendar + Contacts. To disable these, simply add the new config details and comment out or don't add the new `radicale` service from `docker-compose.yml`. Related to #56
bewCloud
This is the bewCloud app built using Fresh and deployed using docker compose.
If you're looking for the desktop sync app, it's at bewcloud-desktop.
If you're looking for the mobile app, it's at bewcloud-mobile.
Self-host it!
Or on your own machine:
Download/copy docker-compose.yml, .env.sample as .env, and bewcloud.config.sample.ts as bewcloud.config.ts.
Note
1993:1993below comes from deno's docker image where1993is the default user id in it. It might change in the future since I don't control it.
$ mkdir data-files data-radicale # local directories for storing user-uploaded files and radicale data
$ sudo chown -R 1993:1993 data-files # solves permission-related issues in the container with uploading files
$ docker compose up -d # makes the app available at http://localhost:8000
$ docker compose run --rm website bash -c "cd /app && make migrate-db" # initializes/updates the database (only needs to be executed the first time and on any data updates)
Alternatively, check the Development section below.
Important
Even with signups disabled (
config.auth.allowSignups=false), the first signup will work and become an admin.
Sponsors
These are the amazing entities or individuals who are sponsoring this project for this current month. If you'd like to show up here, check the GitHub Sponsors page or make a donation above $50 ($100 to show up on the website)!
Development
Requirements
Important
Don't forget to set up your
.envfile based on.env.sample. Don't forget to set up yourbewcloud.config.tsfile based onbewcloud.config.sample.ts.
- This was tested with
Deno's version stated in the.dvmrcfile, though other versions may work. - For the postgres dependency (used when running locally or in CI), you should have
Dockeranddocker composeinstalled.
Commands
$ docker compose -f docker-compose.dev.yml up # (optional) runs docker with postgres, locally
$ make migrate-db # runs any missing database migrations
$ make start # runs the app
$ make format # formats the code
$ make test # runs tests
Other less-used commands
$ make exec-db # runs psql inside the postgres container, useful for running direct development queries like `DROP DATABASE "bewcloud"; CREATE DATABASE "bewcloud";`
$ make build # generates all static files for production deploy
Structure
- Routes defined at
routes/. - Static files are defined at
static/. - Frontend-only components are defined at
components/. - Isomorphic components are defined at
islands/. - Cron jobs are defined at
crons/. - Reusable bits of code are defined at
lib/. - Database migrations are defined at
db-migrations/.
Deployment
Just push to the main branch.
How does Contacts/CardDav and Calendar/CalDav work?
CalDav/CardDav is now available since v2.3.0, using Radicale via Docker, which is already very efficient (and battle-tested). The clients are not yet implemented. Check this tag/release for custom-made server and clients where it was all mostly working, except for many edge cases.
In order to share a calendar, you can either have a shared user, or you can symlink the calendar to the user's own calendar (simply ln -s /<absolute-path-to-data-radicale>/collections/collection-root/<owner-user-id>/<calendar-to-share> /<absolute-path-to-data-radicale>/collections/collection-root/<user-id-to-share-with>/).
Note
If you're running radicale with docker, the symlink needs to point to the container's directory, usually starting with
/dataif you didn't change theradicale-config/config, otherwise the container will fail to load the linked directory.
How does private file sharing work?
Public file sharing is now possible since v2.2.0. Check this PR for advanced sharing with internal and external users, with read and write access that was being done and almost working. I ditched all that complexity for simply using symlinks for internal sharing, as it served my use case (I have multiple data backups and trust the people I provide accounts to, with the symlinks).
You can simply ln -s /<absolute-path-to-data-files>/<owner-user-id>/<directory-to-share> /<absolute-path-to-data-files>/<user-id-to-share-with>/ to create a shared directory between two users, and the same directory can have different names, now.
Note
If you're running the app with docker, the symlink needs to point to the container's directory, usually starting with
/appif you didn't change theDockerfile, otherwise the container will fail to load the linked directory.
How does it look?
Check the website for screenshots or the YouTube channel for 1-minute demos.