Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| services:radicale [2024/11/11 06:48] – external edit 127.0.0.1 | 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 57: | 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 to **http://10.0.0.1/radicale** to finish setup. | + | This set-up links also Radicale to your SSO (see [[selfhost: |
| + | |||
| + | Now go with browser to **https://radicale.mydomain.com** to finish setup. | ||
| + | |||
| + | === URLs summary === | ||
| + | |||
| + | 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 ===== | ===== Startup ===== | ||
| Line 115: | Line 148: | ||
| and that's it. | 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:// | ||
| + | |||