$ services: freescout: image: tiredofit/freescout:1.17.148 container_name: freescout-app -weight: 500;">restart: unless-stopped depends_on: - freescout-db ports: - "8080:80" environment: # Database connection - DB_TYPE=mysql - DB_HOST=freescout-db - DB_PORT=3306 - DB_NAME=freescout - DB_USER=freescout - DB_PASS=change_this_strong_password # Admin account (created on first boot) - [email protected] - ADMIN_PASS=change_this_admin_password # Site configuration - SITE_URL=https://support.example.com - SETUP_TYPE=AUTO # Application settings - ENABLE_AUTO_UPDATE=FALSE - DISPLAY_ERRORS=FALSE # Timezone - TIMEZONE=UTC volumes: - freescout-data:/data - freescout-logs:/www/logs networks: - freescout freescout-db: image: mariadb:11.7.2 container_name: freescout-db -weight: 500;">restart: unless-stopped environment: - MYSQL_ROOT_PASSWORD=change_this_root_password - MYSQL_DATABASE=freescout - MYSQL_USER=freescout - MYSQL_PASSWORD=change_this_strong_password volumes: - freescout-db:/var/lib/mysql networks: - freescout volumes: freescout-data: freescout-logs: freescout-db: networks: freescout: COMMAND_BLOCK: services: freescout: image: tiredofit/freescout:1.17.148 container_name: freescout-app -weight: 500;">restart: unless-stopped depends_on: - freescout-db ports: - "8080:80" environment: # Database connection - DB_TYPE=mysql - DB_HOST=freescout-db - DB_PORT=3306 - DB_NAME=freescout - DB_USER=freescout - DB_PASS=change_this_strong_password # Admin account (created on first boot) - [email protected] - ADMIN_PASS=change_this_admin_password # Site configuration - SITE_URL=https://support.example.com - SETUP_TYPE=AUTO # Application settings - ENABLE_AUTO_UPDATE=FALSE - DISPLAY_ERRORS=FALSE # Timezone - TIMEZONE=UTC volumes: - freescout-data:/data - freescout-logs:/www/logs networks: - freescout freescout-db: image: mariadb:11.7.2 container_name: freescout-db -weight: 500;">restart: unless-stopped environment: - MYSQL_ROOT_PASSWORD=change_this_root_password - MYSQL_DATABASE=freescout - MYSQL_USER=freescout - MYSQL_PASSWORD=change_this_strong_password volumes: - freescout-db:/var/lib/mysql networks: - freescout volumes: freescout-data: freescout-logs: freescout-db: networks: freescout: COMMAND_BLOCK: services: freescout: image: tiredofit/freescout:1.17.148 container_name: freescout-app -weight: 500;">restart: unless-stopped depends_on: - freescout-db ports: - "8080:80" environment: # Database connection - DB_TYPE=mysql - DB_HOST=freescout-db - DB_PORT=3306 - DB_NAME=freescout - DB_USER=freescout - DB_PASS=change_this_strong_password # Admin account (created on first boot) - [email protected] - ADMIN_PASS=change_this_admin_password # Site configuration - SITE_URL=https://support.example.com - SETUP_TYPE=AUTO # Application settings - ENABLE_AUTO_UPDATE=FALSE - DISPLAY_ERRORS=FALSE # Timezone - TIMEZONE=UTC volumes: - freescout-data:/data - freescout-logs:/www/logs networks: - freescout freescout-db: image: mariadb:11.7.2 container_name: freescout-db -weight: 500;">restart: unless-stopped environment: - MYSQL_ROOT_PASSWORD=change_this_root_password - MYSQL_DATABASE=freescout - MYSQL_USER=freescout - MYSQL_PASSWORD=change_this_strong_password volumes: - freescout-db:/var/lib/mysql networks: - freescout volumes: freescout-data: freescout-logs: freescout-db: networks: freescout: COMMAND_BLOCK: -weight: 500;">docker compose up -d COMMAND_BLOCK: -weight: 500;">docker compose up -d COMMAND_BLOCK: -weight: 500;">docker compose up -d CODE_BLOCK: services: zammad-elasticsearch: image: elasticsearch:8.19.9 container_name: zammad-elasticsearch -weight: 500;">restart: unless-stopped environment: - discovery.type=single-node - xpack.security.enabled=false - ES_JAVA_OPTS=-Xms1g -Xmx1g volumes: - elasticsearch-data:/usr/share/elasticsearch/data networks: - zammad zammad-memcached: image: memcached:1.6.40-alpine container_name: zammad-memcached -weight: 500;">restart: unless-stopped command: memcached -m 256 networks: - zammad zammad-postgresql: image: postgres:17.7-alpine container_name: zammad-postgresql -weight: 500;">restart: unless-stopped environment: - POSTGRES_DB=zammad_production - POSTGRES_USER=zammad - POSTGRES_PASSWORD=change_this_strong_password volumes: - postgresql-data:/var/lib/postgresql/data networks: - zammad zammad-redis: image: redis:7.4.7-alpine container_name: zammad-redis -weight: 500;">restart: unless-stopped volumes: - redis-data:/data networks: - zammad zammad-init: image: ghcr.io/zammad/zammad:7.0.0 container_name: zammad-init -weight: 500;">restart: on-failure depends_on: - zammad-elasticsearch - zammad-postgresql - zammad-redis - zammad-memcached command: ["zammad-init"] environment: - POSTGRESQL_HOST=zammad-postgresql - POSTGRESQL_PORT=5432 - POSTGRESQL_DB=zammad_production - POSTGRESQL_USER=zammad - POSTGRESQL_PASS=change_this_strong_password - POSTGRESQL_OPTIONS=?pool=50 - MEMCACHE_SERVERS=zammad-memcached:11211 - REDIS_URL=redis://zammad-redis:6379 - ELASTICSEARCH_HOST=zammad-elasticsearch - ELASTICSEARCH_PORT=9200 - ELASTICSEARCH_SCHEMA=http - ELASTICSEARCH_NAMESPACE=zammad - ELASTICSEARCH_REINDEX=true - ELASTICSEARCH_ENABLED=true volumes: - zammad-storage:/opt/zammad/storage networks: - zammad zammad-railsserver: image: ghcr.io/zammad/zammad:7.0.0 container_name: zammad-railsserver -weight: 500;">restart: unless-stopped depends_on: - zammad-init command: ["zammad-railsserver"] environment: - POSTGRESQL_HOST=zammad-postgresql - POSTGRESQL_PORT=5432 - POSTGRESQL_DB=zammad_production - POSTGRESQL_USER=zammad - POSTGRESQL_PASS=change_this_strong_password - POSTGRESQL_OPTIONS=?pool=50 - MEMCACHE_SERVERS=zammad-memcached:11211 - REDIS_URL=redis://zammad-redis:6379 - ELASTICSEARCH_HOST=zammad-elasticsearch - ELASTICSEARCH_PORT=9200 - ELASTICSEARCH_SCHEMA=http - ELASTICSEARCH_NAMESPACE=zammad - ELASTICSEARCH_ENABLED=true volumes: - zammad-storage:/opt/zammad/storage networks: - zammad zammad-scheduler: image: ghcr.io/zammad/zammad:7.0.0 container_name: zammad-scheduler -weight: 500;">restart: unless-stopped depends_on: - zammad-init command: ["zammad-scheduler"] environment: - POSTGRESQL_HOST=zammad-postgresql - POSTGRESQL_PORT=5432 - POSTGRESQL_DB=zammad_production - POSTGRESQL_USER=zammad - POSTGRESQL_PASS=change_this_strong_password - POSTGRESQL_OPTIONS=?pool=50 - MEMCACHE_SERVERS=zammad-memcached:11211 - REDIS_URL=redis://zammad-redis:6379 - ELASTICSEARCH_HOST=zammad-elasticsearch - ELASTICSEARCH_PORT=9200 - ELASTICSEARCH_SCHEMA=http - ELASTICSEARCH_NAMESPACE=zammad - ELASTICSEARCH_ENABLED=true volumes: - zammad-storage:/opt/zammad/storage networks: - zammad zammad-websocket: image: ghcr.io/zammad/zammad:7.0.0 container_name: zammad-websocket -weight: 500;">restart: unless-stopped depends_on: - zammad-init command: ["zammad-websocket"] environment: - POSTGRESQL_HOST=zammad-postgresql - POSTGRESQL_PORT=5432 - POSTGRESQL_DB=zammad_production - POSTGRESQL_USER=zammad - POSTGRESQL_PASS=change_this_strong_password - POSTGRESQL_OPTIONS=?pool=50 - MEMCACHE_SERVERS=zammad-memcached:11211 - REDIS_URL=redis://zammad-redis:6379 - ELASTICSEARCH_HOST=zammad-elasticsearch - ELASTICSEARCH_PORT=9200 - ELASTICSEARCH_SCHEMA=http - ELASTICSEARCH_NAMESPACE=zammad - ELASTICSEARCH_ENABLED=true networks: - zammad zammad-nginx: image: ghcr.io/zammad/zammad:7.0.0 container_name: zammad-nginx -weight: 500;">restart: unless-stopped depends_on: - zammad-railsserver - zammad-websocket command: ["zammad-nginx"] ports: - "8080:8080" environment: - NGINX_SERVER_SCHEME=http - NGINX_CLIENT_MAX_BODY_SIZE=50M volumes: - zammad-storage:/opt/zammad/storage networks: - zammad volumes: elasticsearch-data: postgresql-data: redis-data: zammad-storage: networks: zammad: CODE_BLOCK: services: zammad-elasticsearch: image: elasticsearch:8.19.9 container_name: zammad-elasticsearch -weight: 500;">restart: unless-stopped environment: - discovery.type=single-node - xpack.security.enabled=false - ES_JAVA_OPTS=-Xms1g -Xmx1g volumes: - elasticsearch-data:/usr/share/elasticsearch/data networks: - zammad zammad-memcached: image: memcached:1.6.40-alpine container_name: zammad-memcached -weight: 500;">restart: unless-stopped command: memcached -m 256 networks: - zammad zammad-postgresql: image: postgres:17.7-alpine container_name: zammad-postgresql -weight: 500;">restart: unless-stopped environment: - POSTGRES_DB=zammad_production - POSTGRES_USER=zammad - POSTGRES_PASSWORD=change_this_strong_password volumes: - postgresql-data:/var/lib/postgresql/data networks: - zammad zammad-redis: image: redis:7.4.7-alpine container_name: zammad-redis -weight: 500;">restart: unless-stopped volumes: - redis-data:/data networks: - zammad zammad-init: image: ghcr.io/zammad/zammad:7.0.0 container_name: zammad-init -weight: 500;">restart: on-failure depends_on: - zammad-elasticsearch - zammad-postgresql - zammad-redis - zammad-memcached command: ["zammad-init"] environment: - POSTGRESQL_HOST=zammad-postgresql - POSTGRESQL_PORT=5432 - POSTGRESQL_DB=zammad_production - POSTGRESQL_USER=zammad - POSTGRESQL_PASS=change_this_strong_password - POSTGRESQL_OPTIONS=?pool=50 - MEMCACHE_SERVERS=zammad-memcached:11211 - REDIS_URL=redis://zammad-redis:6379 - ELASTICSEARCH_HOST=zammad-elasticsearch - ELASTICSEARCH_PORT=9200 - ELASTICSEARCH_SCHEMA=http - ELASTICSEARCH_NAMESPACE=zammad - ELASTICSEARCH_REINDEX=true - ELASTICSEARCH_ENABLED=true volumes: - zammad-storage:/opt/zammad/storage networks: - zammad zammad-railsserver: image: ghcr.io/zammad/zammad:7.0.0 container_name: zammad-railsserver -weight: 500;">restart: unless-stopped depends_on: - zammad-init command: ["zammad-railsserver"] environment: - POSTGRESQL_HOST=zammad-postgresql - POSTGRESQL_PORT=5432 - POSTGRESQL_DB=zammad_production - POSTGRESQL_USER=zammad - POSTGRESQL_PASS=change_this_strong_password - POSTGRESQL_OPTIONS=?pool=50 - MEMCACHE_SERVERS=zammad-memcached:11211 - REDIS_URL=redis://zammad-redis:6379 - ELASTICSEARCH_HOST=zammad-elasticsearch - ELASTICSEARCH_PORT=9200 - ELASTICSEARCH_SCHEMA=http - ELASTICSEARCH_NAMESPACE=zammad - ELASTICSEARCH_ENABLED=true volumes: - zammad-storage:/opt/zammad/storage networks: - zammad zammad-scheduler: image: ghcr.io/zammad/zammad:7.0.0 container_name: zammad-scheduler -weight: 500;">restart: unless-stopped depends_on: - zammad-init command: ["zammad-scheduler"] environment: - POSTGRESQL_HOST=zammad-postgresql - POSTGRESQL_PORT=5432 - POSTGRESQL_DB=zammad_production - POSTGRESQL_USER=zammad - POSTGRESQL_PASS=change_this_strong_password - POSTGRESQL_OPTIONS=?pool=50 - MEMCACHE_SERVERS=zammad-memcached:11211 - REDIS_URL=redis://zammad-redis:6379 - ELASTICSEARCH_HOST=zammad-elasticsearch - ELASTICSEARCH_PORT=9200 - ELASTICSEARCH_SCHEMA=http - ELASTICSEARCH_NAMESPACE=zammad - ELASTICSEARCH_ENABLED=true volumes: - zammad-storage:/opt/zammad/storage networks: - zammad zammad-websocket: image: ghcr.io/zammad/zammad:7.0.0 container_name: zammad-websocket -weight: 500;">restart: unless-stopped depends_on: - zammad-init command: ["zammad-websocket"] environment: - POSTGRESQL_HOST=zammad-postgresql - POSTGRESQL_PORT=5432 - POSTGRESQL_DB=zammad_production - POSTGRESQL_USER=zammad - POSTGRESQL_PASS=change_this_strong_password - POSTGRESQL_OPTIONS=?pool=50 - MEMCACHE_SERVERS=zammad-memcached:11211 - REDIS_URL=redis://zammad-redis:6379 - ELASTICSEARCH_HOST=zammad-elasticsearch - ELASTICSEARCH_PORT=9200 - ELASTICSEARCH_SCHEMA=http - ELASTICSEARCH_NAMESPACE=zammad - ELASTICSEARCH_ENABLED=true networks: - zammad zammad-nginx: image: ghcr.io/zammad/zammad:7.0.0 container_name: zammad-nginx -weight: 500;">restart: unless-stopped depends_on: - zammad-railsserver - zammad-websocket command: ["zammad-nginx"] ports: - "8080:8080" environment: - NGINX_SERVER_SCHEME=http - NGINX_CLIENT_MAX_BODY_SIZE=50M volumes: - zammad-storage:/opt/zammad/storage networks: - zammad volumes: elasticsearch-data: postgresql-data: redis-data: zammad-storage: networks: zammad: CODE_BLOCK: services: zammad-elasticsearch: image: elasticsearch:8.19.9 container_name: zammad-elasticsearch -weight: 500;">restart: unless-stopped environment: - discovery.type=single-node - xpack.security.enabled=false - ES_JAVA_OPTS=-Xms1g -Xmx1g volumes: - elasticsearch-data:/usr/share/elasticsearch/data networks: - zammad zammad-memcached: image: memcached:1.6.40-alpine container_name: zammad-memcached -weight: 500;">restart: unless-stopped command: memcached -m 256 networks: - zammad zammad-postgresql: image: postgres:17.7-alpine container_name: zammad-postgresql -weight: 500;">restart: unless-stopped environment: - POSTGRES_DB=zammad_production - POSTGRES_USER=zammad - POSTGRES_PASSWORD=change_this_strong_password volumes: - postgresql-data:/var/lib/postgresql/data networks: - zammad zammad-redis: image: redis:7.4.7-alpine container_name: zammad-redis -weight: 500;">restart: unless-stopped volumes: - redis-data:/data networks: - zammad zammad-init: image: ghcr.io/zammad/zammad:7.0.0 container_name: zammad-init -weight: 500;">restart: on-failure depends_on: - zammad-elasticsearch - zammad-postgresql - zammad-redis - zammad-memcached command: ["zammad-init"] environment: - POSTGRESQL_HOST=zammad-postgresql - POSTGRESQL_PORT=5432 - POSTGRESQL_DB=zammad_production - POSTGRESQL_USER=zammad - POSTGRESQL_PASS=change_this_strong_password - POSTGRESQL_OPTIONS=?pool=50 - MEMCACHE_SERVERS=zammad-memcached:11211 - REDIS_URL=redis://zammad-redis:6379 - ELASTICSEARCH_HOST=zammad-elasticsearch - ELASTICSEARCH_PORT=9200 - ELASTICSEARCH_SCHEMA=http - ELASTICSEARCH_NAMESPACE=zammad - ELASTICSEARCH_REINDEX=true - ELASTICSEARCH_ENABLED=true volumes: - zammad-storage:/opt/zammad/storage networks: - zammad zammad-railsserver: image: ghcr.io/zammad/zammad:7.0.0 container_name: zammad-railsserver -weight: 500;">restart: unless-stopped depends_on: - zammad-init command: ["zammad-railsserver"] environment: - POSTGRESQL_HOST=zammad-postgresql - POSTGRESQL_PORT=5432 - POSTGRESQL_DB=zammad_production - POSTGRESQL_USER=zammad - POSTGRESQL_PASS=change_this_strong_password - POSTGRESQL_OPTIONS=?pool=50 - MEMCACHE_SERVERS=zammad-memcached:11211 - REDIS_URL=redis://zammad-redis:6379 - ELASTICSEARCH_HOST=zammad-elasticsearch - ELASTICSEARCH_PORT=9200 - ELASTICSEARCH_SCHEMA=http - ELASTICSEARCH_NAMESPACE=zammad - ELASTICSEARCH_ENABLED=true volumes: - zammad-storage:/opt/zammad/storage networks: - zammad zammad-scheduler: image: ghcr.io/zammad/zammad:7.0.0 container_name: zammad-scheduler -weight: 500;">restart: unless-stopped depends_on: - zammad-init command: ["zammad-scheduler"] environment: - POSTGRESQL_HOST=zammad-postgresql - POSTGRESQL_PORT=5432 - POSTGRESQL_DB=zammad_production - POSTGRESQL_USER=zammad - POSTGRESQL_PASS=change_this_strong_password - POSTGRESQL_OPTIONS=?pool=50 - MEMCACHE_SERVERS=zammad-memcached:11211 - REDIS_URL=redis://zammad-redis:6379 - ELASTICSEARCH_HOST=zammad-elasticsearch - ELASTICSEARCH_PORT=9200 - ELASTICSEARCH_SCHEMA=http - ELASTICSEARCH_NAMESPACE=zammad - ELASTICSEARCH_ENABLED=true volumes: - zammad-storage:/opt/zammad/storage networks: - zammad zammad-websocket: image: ghcr.io/zammad/zammad:7.0.0 container_name: zammad-websocket -weight: 500;">restart: unless-stopped depends_on: - zammad-init command: ["zammad-websocket"] environment: - POSTGRESQL_HOST=zammad-postgresql - POSTGRESQL_PORT=5432 - POSTGRESQL_DB=zammad_production - POSTGRESQL_USER=zammad - POSTGRESQL_PASS=change_this_strong_password - POSTGRESQL_OPTIONS=?pool=50 - MEMCACHE_SERVERS=zammad-memcached:11211 - REDIS_URL=redis://zammad-redis:6379 - ELASTICSEARCH_HOST=zammad-elasticsearch - ELASTICSEARCH_PORT=9200 - ELASTICSEARCH_SCHEMA=http - ELASTICSEARCH_NAMESPACE=zammad - ELASTICSEARCH_ENABLED=true networks: - zammad zammad-nginx: image: ghcr.io/zammad/zammad:7.0.0 container_name: zammad-nginx -weight: 500;">restart: unless-stopped depends_on: - zammad-railsserver - zammad-websocket command: ["zammad-nginx"] ports: - "8080:8080" environment: - NGINX_SERVER_SCHEME=http - NGINX_CLIENT_MAX_BODY_SIZE=50M volumes: - zammad-storage:/opt/zammad/storage networks: - zammad volumes: elasticsearch-data: postgresql-data: redis-data: zammad-storage: networks: zammad: COMMAND_BLOCK: -weight: 600;">sudo sysctl -w vm.max_map_count=262144 echo "vm.max_map_count=262144" | -weight: 600;">sudo tee -a /etc/sysctl.conf COMMAND_BLOCK: -weight: 600;">sudo sysctl -w vm.max_map_count=262144 echo "vm.max_map_count=262144" | -weight: 600;">sudo tee -a /etc/sysctl.conf COMMAND_BLOCK: -weight: 600;">sudo sysctl -w vm.max_map_count=262144 echo "vm.max_map_count=262144" | -weight: 600;">sudo tee -a /etc/sysctl.conf COMMAND_BLOCK: -weight: 500;">docker compose up -d COMMAND_BLOCK: -weight: 500;">docker compose up -d COMMAND_BLOCK: -weight: 500;">docker compose up -d - Free modules: Custom fields, Slack integration, Telegram, language packs - Paid modules ($2-20 each): Knowledge base, satisfaction ratings, time tracking, LDAP, reports, webhooks, WhatsApp, two-factor authentication, SLA management - Your support team has 1-5 agents - Email is your primary (or only) support channel - You want the simplest possible deployment - You are running on limited hardware (1 GB RAM VPS, Raspberry Pi, shared hosting) - You prefer Help Scout's clean shared-inbox workflow - You only need a few extra features and are fine paying $20-40 for modules - You want something running in 10 minutes, not an hour - Your team has 5+ agents or is growing - You handle support across email, chat, phone, and social media - You need enterprise features: LDAP, SAML SSO, SLAs with escalation - You search through tickets frequently and need fast full-text search - You want a built-in knowledge base without extra cost - You have the infrastructure to spare (4+ GB RAM, 2+ vCPU) - Long-term maintainability and a company-backed project matter to you - Self-Hosting FreeScout - Self-Hosting Zammad - Best Self-Hosted Helpdesk Software - Self-Hosted Alternatives to Zendesk - Self-Hosted Alternatives to Freshdesk - Docker Compose Basics - Reverse Proxy Setup