Twake.ai is an open-source Digital Workplace developed by LINAGORA. It brings together all the tools your team needs in a single platform: messaging, email, file sharing, collaborative document editing, calendar, video conferencing, and a personal cloud, all unified behind a single sign-on.
Twake.AI Kickstart provides a ready-to-run Docker Compose infrastructure to deploy a complete Twake.ai instance on your local machine or development server. It is designed to help developers, sysadmins, and evaluators get hands-on experience with the platform in minutes.
- Features
- Architecture Overview
- Prerequisites
- Quick Start
- Configuration
- Deployment Instructions
- Test Credentials
- Troubleshooting
- Contributing
- License
- Chat: Real-time messaging powered by Matrix/Synapse
- Email: Full JMAP email via TMail
- File Sharing: Secure file transfer and storage with LinShare
- Document Editing: Collaborative editing with OnlyOffice
- Calendar: Shared calendaring
- Video Conferencing: WebRTC meetings with LiveKit
- Personal Cloud: Individual workspace powered by Cozy Stack
- Single Sign-On: Unified authentication with LemonLDAP::NG
- Reverse Proxy: Automatic routing and SSL via Traefik
The stack is split into modular components, each managed via its own Docker Compose file:
Centralized data storage services used by other components.
- PostgreSQL: Main relational database for LinShare and Meet
- MongoDB: Document store for LinShare
- CouchDB: Database for Cozy Stack
- OpenLDAP: Directory service for user management
- Valkey (Redis): In-memory data store
- RabbitMQ: Message broker for inter-service events
Handles entry points and security.
- Traefik: Reverse proxy with routing via
twake-networkand SSL management - LemonLDAP::NG: Web Single Sign-On (SSO) and OIDC provider
- Docker Socket Proxy: Securely exposes the Docker socket to Traefik
Video conferencing component.
- LiveKit: Real-time video and audio server
- Django Backend: APIs and logic for meetings
- Frontend: Web interface for video calls
Secure file sharing and storage.
- Backend: Tomcat-based server
- UI User: Web interface for general users
- UI Admin: Administration web interface
- UI Upload Request: Interface for external upload requests
- ClamAV: Antivirus scanning for uploaded files
- Cozy Stack: Personal cloud platform server
- OnlyOffice: Document editing and collaboration server
- Calendar: Shared calendar service
- TMail: JMAP email service
- Matrix Synapse: Federated messaging server
- Tom Server: Identity and vault server
Each component is defined as a separate Docker Compose project and includes:
- A
docker-compose.ymlfile defining its services - A wrapper script (
compose-wrapper.sh) that generates configuration files dynamically based on the domain settings in the root.envfile
- Docker and Docker Compose (v2+) installed
- At least 8 GB of RAM available for Docker
- About 20 GB of free disk space for Docker images (~30 container images across all services)
- Ports 80 and 443 available on the host
This walkthrough deploys the stack on your local machine using the default twake.local domain and a self-signed CA. If you are deploying on a server with a public domain name, follow Configuration → Public DNS deployment instead.
docker network create twake-network --subnet=172.27.0.0/16Add the following entries to your /etc/hosts file:
127.0.0.1 linshare.twake.local admin-linshare.twake.local upload-request-linshare.twake.local meet.twake.local onlyoffice.twake.local calendar.twake.local contacts.twake.local account.twake.local excal.twake.local mail.twake.local jmap.twake.local
127.0.0.1 oauthcallback.twake.local manager.twake.local auth.twake.local tcalendar-side-service.twake.local sabre-dav.twake.local
127.0.0.1 user1.twake.local user1-home.twake.local user1-linshare.twake.local user1-drive.twake.local user1-settings.twake.local user1-mail.twake.local user1-chat.twake.local user1-notes.twake.local user1-dataproxy.twake.local
127.0.0.1 user2.twake.local user2-home.twake.local user2-linshare.twake.local user2-drive.twake.local user2-settings.twake.local user2-mail.twake.local user2-chat.twake.local user2-notes.twake.local user2-dataproxy.twake.local
127.0.0.1 user3.twake.local user3-home.twake.local user3-linshare.twake.local user3-drive.twake.local user3-settings.twake.local user3-mail.twake.local user3-chat.twake.local user3-notes.twake.local user3-dataproxy.twake.local
127.0.0.1 chat.twake.local matrix.twake.local tom.twake.local fed.twake.local traefik.twake.local calendar-ng.twake.local
This step applies to local development only (self-signed mode). If you are deploying with a Let's Encrypt certificate, skip this step — your browser already trusts Let's Encrypt.
This setup uses a self-signed Certificate Authority. You must add it to your OS and browser trust store to avoid TLS errors and broken iframes.
The certificate is located at: twake_auth/traefik/ssl/root-ca.pem
./wrapper.sh up -dThis starts all components in the correct dependency order. Wait a few minutes for all services to become healthy.
Open your browser and navigate to one of the test workspaces (see Test Credentials below).
The root .env file is the single place to configure the stack. Key variables:
| Variable | Default | Description |
|---|---|---|
BASE_DOMAIN |
twake.local |
Domain used for all service subdomains |
LDAP_BASE_DN |
dc=twake,dc=local |
LDAP base DN (must match BASE_DOMAIN) |
MAIL_DOMAIN |
twake.local |
Domain used for email addresses |
CERT_MODE |
self-signed |
Certificate mode: self-signed or letsencrypt |
Each component's compose-wrapper.sh uses envsubst to regenerate its configuration from .template files on every start, so no domain value is hardcoded. SSL certificates are stored in twake_auth/traefik/ssl/.
Two deployment modes are supported:
- Local development: uses
twake.localwith/etc/hostsentries and a self-signed CA. This is what the Quick Start walks through. - Public DNS deployment: uses a real domain (e.g.
mydomain.fr) with a valid Let's Encrypt wildcard certificate.
The default configuration. Keep the default values in .env and configure your /etc/hosts as shown in Quick Start step 2. Certificates are auto-generated by twake_auth/generate-cert.sh (self-signed CA + wildcard server cert) the first time twake_auth is brought up. You must then trust the CA in your browser, as described in Quick Start step 3.
Use this mode when deploying on a server reachable from the Internet, with a domain you control (referred to below as mydomain.fr: replace with your own).
Create a wildcard A record *.mydomain.fr pointing to the public IP of the host running this stack. Make sure TCP port 443 is reachable from the Internet (firewall / security group / NAT).
BASE_DOMAIN=mydomain.fr
LDAP_BASE_DN=dc=mydomain,dc=fr
MAIL_DOMAIN=mydomain.fr
CERT_MODE=letsencryptWildcard certificates (*.mydomain.fr) require the DNS-01 challenge — HTTP-01 will not work. Install the certbot plugin for your DNS provider (e.g. python3-certbot-dns-cloudflare, python3-certbot-dns-ovh, python3-certbot-dns-route53) and run:
# Example for OVH (replace with your provider's plugin name and credentials path)
sudo certbot certonly --manual \
-d "*.mydomain.fr" \
-d "mydomain.fr"See the certbot DNS plugins documentation for provider-specific setup.
Alternatively, you can use acme.sh with any supported DNS API.
Once issued, certbot stores the certificates at /etc/letsencrypt/live/mydomain.fr/.
./wrapper.sh up -dtwake_auth/compose-wrapper.sh detects CERT_MODE=letsencrypt and automatically copies the Let's Encrypt certificates from /etc/letsencrypt/live/mydomain.fr/ into twake_auth/traefik/ssl/, then restarts the reverse proxy. No manual file copying is needed.
Skip Quick Start step 3 — with a valid Let's Encrypt certificate your browser trusts it automatically.
Certbot installs a systemd timer that auto-renews certificates before they expire. After each renewal, re-copy the updated certificates into Traefik by running:
cd twake_auth && ./compose-wrapper.sh up -dThis re-copies the renewed certificates and restarts Traefik automatically.
To automate this, add a certbot post-renewal hook at /etc/letsencrypt/renewal-hooks/post/restart-traefik.sh:
#!/bin/bash
cd /path/to/twake-workplace-docker/twake_auth && ./compose-wrapper.sh up -d# Start all services
./wrapper.sh up -d
# Start a specific component
./wrapper.sh up twake_db -d
# Stop all services
./wrapper.sh down
# Show usage
./wrapper.sh --helpIf you prefer to start components one by one, follow this order:
# 1. Databases
cd twake_db && ./compose-wrapper.sh up -d && cd ..
# 2. Authentication & Proxy
cd twake_auth && ./compose-wrapper.sh up -d && cd ..
# 3. Cozy Stack
cd cozy_stack && ./compose-wrapper.sh up -d && cd ..
# 4. OnlyOffice
cd onlyoffice_app && docker compose --env-file ../.env up -d && cd ..
# 5. Meet
cd meet_app && ./compose-wrapper.sh up -d && cd ..
# 6. Calendar
cd calendar_app && ./compose-wrapper.sh up -d && cd ..
# 7. Chat (requires lemonldap-ng healthy)
cd chat_app && ./compose-wrapper.sh up -d && cd ..
# 8. TMail (requires lemonldap-ng healthy)
cd tmail_app && ./compose-wrapper.sh up -d && cd ..docker ps| Workspace | Login | Password |
|---|---|---|
https://user1.twake.local |
user1 |
user1 |
https://user2.twake.local |
user2 |
user2 |
https://user3.twake.local |
user3 |
user3 |
- Iframes not loading in Cozy Stack: Make sure the self-signed CA certificate is trusted by both your OS and your browser (local mode only).
- TLS errors in browser (local mode): The self-signed CA at
twake_auth/traefik/ssl/root-ca.pemmust be added to your system trust store and browser. Simply trusting it in the browser is not enough for some iframes. generate-cert.shfails with "Let's Encrypt certs not found": Run certbot first to issue the wildcard certificate before starting the stack. Check that/etc/letsencrypt/live/<BASE_DOMAIN>/exists and is readable.- Services failing to start: Check that the
twake-networkDocker network exists (docker network ls) and that no other service is using ports 80/443. - Health check failures: Some services (chat, tmail) depend on LemonLDAP::NG being healthy. Wait for it to be ready before starting dependent services, or use
./wrapper.shwhich handles ordering automatically.
We welcome contributions! Please see CONTRIBUTING.md for guidelines on how to get involved.
This project is licensed under the GNU Affero General Public License v3.0: see the LICENSE file for details.