This commit is contained in:
Marcel Beyer 2025-08-31 21:45:28 +02:00
commit 939402bd34
6 changed files with 324 additions and 0 deletions

16
Dockerfile Normal file
View File

@ -0,0 +1,16 @@
FROM ubuntu:noble
#ARG SOGO_VERSION="5.10.0"
RUN apt-get update && apt-get install -y apt-transport-https wget gnupg
RUN wget -O- "https://keys.openpgp.org/vks/v1/by-fingerprint/74FFC6D72B925A34B5D356BDF8A27B36A6E2EAE9" | gpg --dearmor | apt-key add -
COPY SOGo.list /etc/apt/sources.list.d/SOGo.list
RUN apt-get update && apt-get install -y sope4.9-gdl1-postgresql sogo
VOLUME /usr/lib/GNUstep/SOGo/WebServerResources
EXPOSE 20000
# setup user
RUN id -u sogo &>/dev/null || useradd sogo
USER sogo
CMD [ "sogod", "-WONoDetach", "YES", "-WOPort", "0.0.0.0:20000", "-WOLogFile", "-", "-WOPidFile", "/tmp/sogo.pid"]

11
README.md Normal file
View File

@ -0,0 +1,11 @@
# DISQU SOGo Container
Das `Dockerfile` in diesem Repo baut einen Container für die Groupware SOGo.
Basis ist das Ubuntu-Containerimage, in welchem SOGo aus dem offiziellem SOGo-Repo installiert wird.
Da nur das Nightly-Repo ohne Subskription verfügbar ist, wird beim Bauen des Containers automatisch die neuste Version von SOGo installiert.
Entsprechend müssen wir nach dem Bauen des Containers diesen selbst mit einer passenden Versionsnummer taggen und auf unsere Registry hochladen.
Bei Kundeninstallationen verwenden wir dann die so gebaute Version des Containerimages.
Die beiliegende `docker-compose.yml` zeigt beispielhalf, wie der SOGo-Container genutzt werden kann.
Es wird beispielsweise ein Webserver benötigt, welcher die statischen Assets ausliefert.

1
SOGo.list Normal file
View File

@ -0,0 +1 @@
deb https://packages.sogo.nu/nightly/5/ubuntu/ noble noble

40
docker-compose.yaml Normal file
View File

@ -0,0 +1,40 @@
version: '2'
services:
sogo:
build:
context: .
args:
# replace by your desired version
version: 5.10.0
# links:
# - db
volumes:
# replace by your own file
- ./sogo.conf:/etc/sogo/sogo.conf
environment:
- "TZ=Europe/Berlin"
db:
image: postgres:17.6
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
# for debug purpose only: reach the database from outside
#ports:
# - "5432"
# memcached:
# image: memcached:1.6-alpine
nginx:
image: nginx
links:
- sogo
volumes_from:
# you will be able to serve assets from sogo image
- sogo:ro
ports:
# publish on port 8003
- "8003:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro

105
nginx.conf Normal file
View File

@ -0,0 +1,105 @@
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
gzip off;
server
{
listen 80 default;
root /usr/lib/GNUstep/SOGo/WebServerResources/;
## requirement to create new calendars in Thunderbird ##
proxy_http_version 1.1;
location = /
{
absolute_redirect off;
return 301 /SOGo;
allow all;
}
# For IOS 7
location = /principals/
{
rewrite ^ `https://$server_name/SOGo/dav`;
allow all;
}
location ^~/SOGo
{
proxy_pass http://sogo:20000;
proxy_redirect `http://sogo:20000` default;
# forward user's IP address
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header x-webobjects-server-protocol HTTP/1.0;
proxy_set_header x-webobjects-remote-host 127.0.0.1;
proxy_set_header x-webobjects-server-name $server_name;
proxy_set_header x-webobjects-server-url $scheme://$host;
proxy_set_header x-webobjects-server-port $server_port;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
client_max_body_size 50m;
client_body_buffer_size 128k;
break;
}
location /SOGo.woa/WebServerResources/
{
alias /usr/lib/GNUstep/SOGo/WebServerResources/;
allow all;
}
location /SOGo/WebServerResources/
{
alias /usr/lib/GNUstep/SOGo/WebServerResources/;
allow all;
}
location (^/SOGo/so/ControlPanel/Products/([^/]*)/Resources/(.*)$)
{
alias /usr/lib/GNUstep/SOGo/$1.SOGo/Resources/$2;
}
location (^/SOGo/so/ControlPanel/Products/[^/]*UI/Resources/.*\.(jpg|png|gif|css|js)$)
{
alias /usr/lib/GNUstep/SOGo/$1.SOGo/Resources/$2;
}
}
}

151
sogo.conf Normal file
View File

@ -0,0 +1,151 @@
{
/* ********************* Main SOGo configuration file **********************
* *
* Since the content of this file is a dictionary in OpenStep plist format, *
* the curly braces enclosing the body of the configuration are mandatory. *
* See the Installation Guide for details on the format. *
* *
* C and C++ style comments are supported. *
* *
* This example configuration contains only a subset of all available *
* configuration parameters. Please see the installation guide more details. *
* *
* ~sogo/GNUstep/Defaults/.GNUstepDefaults has precedence over this file, *
* make sure to move it away to avoid unwanted parameter overrides. *
* *
* **************************************************************************/
/* Database configuration (mysql:// or postgresql://) */
SOGoProfileURL = "postgresql://postgres:postgres@db:5432/postgres/sogo_user_profile";
OCSFolderInfoURL = "postgresql://postgres:postgres@db:5432/postgres/sogo_folder_info";
OCSSessionsFolderURL = "postgresql://postgres:postgres@db:5432/postgres/sogo_sessions_folder";
/* Mail */
//SOGoDraftsFolderName = Drafts;
//SOGoSentFolderName = Sent;
//SOGoTrashFolderName = Trash;
SOGoIMAPServer = "imaps://mail.beyerm.de:143/?tls=yes";
SOGoSieveServer = sieve://mail.beyerm.de:4190;
SOGoSMTPServer = mail.beyerm.de;
SOGoMailDomain = disqu.de;
SOGoMailingMechanism = smtp;
SOGoForceExternalLoginWithEmail = YES;
SOGoSMTPAuthenticationType = PLAIN;
SOGoForceExternalLoginWithEmail = YES;
//SOGoMailSpoolPath = /var/spool/sogo;
//NGImap4ConnectionStringSeparator = "/";
/* Notifications */
//SOGoAppointmentSendEMailNotifications = NO;
//SOGoACLsSendEMailNotifications = NO;
//SOGoFoldersSendEMailNotifications = NO;
/* Authentication */
SOGoPasswordChangeEnabled = NO;
/* LDAP authentication example */
/* LDAP authentication example */
SOGoUserSources = (
{
type = ldap;
CNFieldName = cn;
UIDFieldName = uid;
IDFieldName = uid; // first field of the DN for direct binds
MailFieldNames = (mail);
bindFields = (uid, mail); //(uid, mail); // array of fields to use for indirect binds
baseDN = "ou=people,dc=office,dc=disqu,dc=de";
bindDN = "cn=sogo,ou=people,dc=office,dc=disqu,dc=de";
bindPassword = sogotopsecretpassword;
canAuthenticate = YES;
displayName = "Shared Addresses";
hostname = ldap://172.17.0.1:3890;
id = public;
isAddressBook = YES;
passwordPolicy = NO;
}
);
/* LDAP AD/Samba4 example */
//SOGoUserSources = (
// {
// type = ldap;
// CNFieldName = cn;
// UIDFieldName = sAMAccountName;
// baseDN = "CN=users,dc=domain,dc=tld";
// bindDN = "CN=sogo,CN=users,DC=domain,DC=tld";
// bindFields = (sAMAccountName, mail);
// bindPassword = password;
// canAuthenticate = YES;
// displayName = "Public";
// hostname = ldap://127.0.0.1:389;
// filter = "mail = '*'";
// id = directory;
// isAddressBook = YES;
// }
//);
/* SQL authentication example */
/* These database columns MUST be present in the view/table:
* c_uid - will be used for authentication - it's the username or username@domain.tld)
* c_name - which can be identical to c_uid - will be used to uniquely identify entries
* c_password - password of the user, plain-text, md5 or sha encoded for now
* c_cn - the user's common name - such as "John Doe"
* mail - the user's mail address
* See the installation guide for more details
*/
//SOGoUserSources =
// (
// {
// type = sql;
// id = directory;
// viewURL = "postgresql://sogo:sogo@127.0.0.1:5432/sogo/sogo_view";
// canAuthenticate = YES;
// isAddressBook = YES;
// userPasswordAlgorithm = md5;
// }
// );
/* Web Interface */
//SOGoPageTitle = SOGo;
//SOGoVacationEnabled = YES;
//SOGoForwardEnabled = YES;
//SOGoSieveScriptsEnabled = YES;
//SOGoMailAuxiliaryUserAccountsEnabled = YES;
//SOGoTrustProxyAuthentication = NO;
//SOGoXSRFValidationEnabled = YES;
/* General */
//SOGoLanguage = English;
//SOGoTimeZone = America/Montreal;
//SOGoCalendarDefaultRoles = (
// PublicDAndTViewer,
// ConfidentialDAndTViewer
//);
//SOGoSuperUsernames = (sogo1, sogo2); // This is an array - keep the parens!
//SxVMemLimit = 384;
//WOPidFile = "/var/run/sogo/sogo.pid";
// reach memcached through docker
SOGoMemcachedHost = "memcached";
// this has a great impact on performance: you should adjust the number
// of workers according to the number of users and the performance of your
// machine
WorkersCount = 4;
/* Debug */
//SOGoDebugRequests = YES;
//SoDebugBaseURL = YES;
//ImapDebugEnabled = YES;
//LDAPDebugEnabled = YES;
//PGDebugEnabled = YES;
//MySQL4DebugEnabled = YES;
//SOGoUIxDebugEnabled = YES;
//WODontZipResponse = YES;
//WOLogFile = /var/log/sogo/sogo.log;
}