Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
services:radicale [2024/02/22 08:54] – created willy | services:radicale [2025/09/16 13:10] (current) – [WEB GUI to Radicale] willy | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Radicale ====== | ====== Radicale ====== | ||
- | [[https:// | + | [[https:// |
[[https:// | [[https:// | ||
Line 9: | Line 9: | ||
To add support for both, which will allow your phone to sync contacts and calendars with your home server, i choose to use the great, simple and effective [[https:// | To add support for both, which will allow your phone to sync contacts and calendars with your home server, i choose to use the great, simple and effective [[https:// | ||
- | Please note that Radicale do not provide a user-interface to **edit** or **use** calendars or contacts, you need third party apps for that. | + | Please note that Radicale do not provide a user-interface to **edit** or **use** calendars or contacts, you need third party apps for that, and the one i am currently using is [[https:// |
To install radicale, of course, you need it's dedicated user, so add user: | To install radicale, of course, you need it's dedicated user, so add user: | ||
Line 22: | Line 22: | ||
</ | </ | ||
- | Radicale uses //pip//, so as usual enable it on Gentoo for user Radicale by creating the file **/ | + | Radicale uses //pip//, so as usual enable it on Gentoo for user Radicale by creating the file **/ |
- | <file pip.conf> | + | < |
[global] | [global] | ||
break-system-packages = true | break-system-packages = true | ||
Line 37: | Line 37: | ||
Create the config file **~/ | Create the config file **~/ | ||
<file - config> | <file - config> | ||
+ | [server] | ||
# Bind all addresses | # Bind all addresses | ||
hosts = 127.0.0.1: | hosts = 127.0.0.1: | ||
Line 47: | Line 48: | ||
[storage] | [storage] | ||
filesystem_folder = / | filesystem_folder = / | ||
- | </code> | + | </file> |
then start it: | then start it: | ||
Line 56: | Line 57: | ||
==== Reverse Proxy ==== | ==== Reverse Proxy ==== | ||
+ | |||
+ | Radicale can be hosted both on subdomain or subpath, but i choose subdomain to make it easier to also host InfCloud on the same subdomain. | ||
As usual you want it protected by the Reverse Proxy, so create the **radicale.conf** file: | As usual you want it protected by the Reverse Proxy, so create the **radicale.conf** file: | ||
<file - radicale.conf> | <file - radicale.conf> | ||
- | location | + | server { |
- | # The trailing / is important! | + | server_name radicale.mydomain.com; |
- | proxy_pass | + | listen 443 ssl; |
- | proxy_set_header | + | listen 8443 ssl; |
- | proxy_set_header | + | http2 on; |
- | proxy_set_header | + | |
- | proxy_pass_header Authorization; | + | include " |
- | proxy_set_header | + | |
- | # to prevent timeouts importing huge calendars or contacts lists | + | access_log / |
- | | + | error_log |
- | | + | |
+ | location / { # The trailing / is important! | ||
+ | proxy_pass | ||
+ | proxy_set_header | ||
+ | | ||
+ | | ||
+ | proxy_set_header | ||
+ | proxy_pass_header Authorization; | ||
+ | | ||
+ | include " | ||
+ | } | ||
+ | |||
+ | location /gui/ { # The trailing / is important! | ||
+ | proxy_pass | ||
+ | | ||
+ | proxy_set_header | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | include com.mydomain/ | ||
} | } | ||
</ | </ | ||
add this config file to NGINX (see [[selfhost: | add this config file to NGINX (see [[selfhost: | ||
- | Now go with browser | + | This set-up links also Radicale |
- | ==== Autostart ==== | + | Now go with browser to **https:// |
- | Autostart, put this into **/ | + | === URLs summary === |
- | <file - 50-radicale.start> | + | |
- | #!/bin/bash | + | |
- | start-stop-daemon | + | The following URL's are exposed between Radicale and InfCloud: |
+ | * https:// | ||
+ | * https:// | ||
+ | |||
+ | And, last, when setting up your *DAV clients (like on Android or similar), use **https:// | ||
+ | |||
+ | |||
+ | ===== Startup ===== | ||
+ | |||
+ | Since i use OpenRC, to start radicale simply create the following script under / | ||
+ | < | ||
+ | # | ||
+ | # Copyright 1999-2021 Gentoo Authors | ||
+ | # Distributed under the terms of the GNU General Public License v2 | ||
+ | |||
+ | description=" | ||
+ | pidfile=" | ||
+ | command_background=true | ||
+ | command=" | ||
+ | command_args="" | ||
+ | command_user=" | ||
+ | |||
+ | depend() { | ||
+ | need net | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Make it executable and add the service to the default runlevel: | ||
+ | <code bash> | ||
+ | chmod +x / | ||
+ | rc-update add radicale default | ||
</ | </ | ||
+ | |||
+ | ==== Sharing calendars ==== | ||
+ | |||
+ | Radicale doesn' | ||
+ | |||
+ | So, first of all login on Radicale web GUI with all the users you want to share the calendar with, then create in one of them the actual calendar. | ||
+ | |||
+ | At this point, you only need to link the calendar folder inside all he users: | ||
+ | <code bash> | ||
+ | ln -s / | ||
+ | </ | ||
+ | |||
+ | and that's it. | ||
+ | |||
+ | ====== WEB GUI for Radicale ====== | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | First of all, to avoid cross-domain issues (CORS) which are hard to solve due to using SSO on Radicale itself, i will host InfCloud on the same radicale domain, using the **/gui/** subpath. | ||
+ | |||
+ | First of all, setup the docker-compose file **/ | ||
+ | <file - docker-compose.yml> | ||
+ | version: " | ||
+ | |||
+ | services: | ||
+ | infcloud: | ||
+ | image: ckulka/ | ||
+ | restart: always | ||
+ | depends_on: | ||
+ | - php | ||
+ | ports: | ||
+ | - " | ||
+ | volumes: | ||
+ | - infcloud:/ | ||
+ | - ./ | ||
+ | |||
+ | php: | ||
+ | image: php: | ||
+ | restart: always | ||
+ | volumes: | ||
+ | - infcloud:/ | ||
+ | |||
+ | volumes: | ||
+ | infcloud: | ||
+ | |||
+ | </ | ||
+ | |||
+ | Now, create the **/ | ||
+ | <file - config.js> | ||
+ | var globalNetworkCheckSettings={ | ||
+ | href: " | ||
+ | timeOut: 90000, | ||
+ | lockTimeOut: | ||
+ | checkContentType: | ||
+ | settingsAccount: | ||
+ | delegation: true, | ||
+ | additionalResources: | ||
+ | hrefLabel: null, | ||
+ | forceReadOnly: | ||
+ | ignoreAlarms: | ||
+ | backgroundCalendars: | ||
+ | }; | ||
+ | var globalInterfaceLanguage=' | ||
+ | var globalSearchTransformAlphabet={ | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | }; | ||
+ | var globalSortAlphabet=' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | var globalBackgroundSync=true; | ||
+ | var globalSyncResourcesInterval=120000; | ||
+ | var globalEnableRefresh=false; | ||
+ | var globalEnableKbNavigation=true; | ||
+ | var globalInterfaceCustomLanguages=[]; | ||
+ | var globalResourceAlphabetSorting=true; | ||
+ | var globalNewVersionNotifyUsers=[]; | ||
+ | var globalDatepickerFirstDayOfWeek=1; | ||
+ | var globalHideInfoMessageAfter=1800; | ||
+ | var globalEditorFadeAnimation=666; | ||
+ | var globalEventStartPastLimit=3; | ||
+ | var globalEventStartFutureLimit=3; | ||
+ | var globalTodoPastLimit=1; | ||
+ | var globalLoadedCalendarCollections=[]; | ||
+ | var globalLoadedTodoCollections=[]; | ||
+ | var globalActiveCalendarCollections=[]; | ||
+ | var globalActiveTodoCollections=[]; | ||
+ | var globalActiveView=' | ||
+ | var globalOpenFormMode=' | ||
+ | var globalTodoListFilterSelected=[' | ||
+ | var globalCalendarStartOfBusiness=8; | ||
+ | var globalCalendarEndOfBusiness=17; | ||
+ | var globalDefaultEventDuration=120; | ||
+ | var globalDisplayHiddenEvents=false; | ||
+ | var globalTimeZoneSupport=true; | ||
+ | var globalTimeZone=' | ||
+ | var globalTimeZonesEnabled=[]; | ||
+ | var globalRewriteTimezoneComponent=true; | ||
+ | var globalRemoveUnknownTimezone=false; | ||
+ | var globalShowHiddenAlarms=false; | ||
+ | var globalIgnoreCompletedOrCancelledAlarms=true; | ||
+ | var globalMozillaSupport=false; | ||
+ | var globalWeekendDays=[0, | ||
+ | var globalAppleRemindersMode=true; | ||
+ | var globalLoadedAddressbookCollections=[]; | ||
+ | var globalActiveAddressbookCollections=[]; | ||
+ | var globalCompatibility={anniversaryOutputFormat: | ||
+ | var globalUriHandlerTel=' | ||
+ | var globalUriHandlerEmail=' | ||
+ | var globalUriHandlerUrl=' | ||
+ | var globalUriHandlerProfile={ | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | }; | ||
+ | var globalDefaultAddressCountry=' | ||
+ | var globalAddressCountryEquivalence=[ | ||
+ | {country: ' | ||
+ | {country: ' | ||
+ | ]; | ||
+ | var globalAddressCountryFavorites=[]; | ||
+ | var globalContactStoreFN=[' | ||
+ | var globalGroupContactsByCompanies=false; | ||
+ | var globalContactDataMinVisiblePercentage=0.95; | ||
+ | </ | ||
+ | |||
+ | Edit to your likings, more detail can be found [[https:// | ||
+ | |||
+ | Now create the startup config script **/ | ||
+ | <file - user-containers.infCloud> | ||
+ | USER=radicale | ||
+ | DESCRIPTION=" | ||
+ | </ | ||
+ | |||
+ | Create the link and start it: | ||
+ | <code bash> | ||
+ | cd / | ||
+ | ln -s user-containers user-containers.infCloud | ||
+ | rc-update add user-containers.infCloud default | ||
+ | ./ | ||
+ | </ | ||
+ | |||
+ | Now point your browser to **https:// | ||