Deploy a Local Network Search Engine

Deploy a private search engine on your LAN using Fess and Docker.

Introduction

30 Second Summary

Finding a specific document or page buried somewhere on your home or office network is painful. You end up clicking through folders, opening random files, and hoping you remember where you saved that one important thing.

In this project, you will deploy a private search engine on your Ubuntu server that indexes everything on your local network. You will configure it to crawl internal websites and local files, then set up automated scheduled indexing so your search results stay fresh.

What You'll Build

A self-hosted search engine powered by Fess and OpenSearch, deployed as Docker containers on your Ubuntu server, accessible from any device on your local network.

By the end of this project, you'll have:

  • Docker Engine and Docker Compose installed on your Ubuntu server, running a multi-container application.
  • A web crawler indexing internal web services and a file system crawler indexing local documents on your server.
  • Scheduled crawl jobs that automatically keep your search index up to date without manual intervention.
  • Secret Mission: Add an SMB crawler to index a Windows file share on your network.

Are there any prerequisites?

You need a dedicated Ubuntu server (22.04 LTS or later) with at least 8 GB of RAM, connected to your local network. You also need SSH access to that server from your computer.

Install Docker Engine on Ubuntu

Your search engine will run inside Docker containers. Before you can deploy anything, you need Docker Engine installed on your Ubuntu server.

Docker Engine is the runtime that builds and runs containers. Docker Compose (included as a plugin) lets you define and manage multi-container applications from a single configuration file.

In this step, get ready to:
  • Set up Docker's official apt repository on your server.
  • Install Docker Engine and Docker Compose.
  • Verify Docker works without sudo.
Set up Docker's apt repository

Ubuntu may have unofficial Docker packages pre-installed that conflict with the official version. You need to remove those first, then add Docker's official package source.

  • Remove any conflicting packages by running this command:
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)

What does this command do?

This removes unofficial Docker-related packages that Ubuntu may have bundled. If none are installed, apt will report that there's nothing to remove. That's perfectly fine.

  • Add Docker's official GPG key and apt repository by running these commands:
# Add Docker's official GPG key:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update

What's happening here?

The first section downloads Docker's GPG signing key so your system can verify that packages actually come from Docker.

The second section creates a new apt source file that points to Docker's official package repository for your Ubuntu version. The final sudo apt update refreshes the package list to include Docker's packages.

  • When prompted to confirm the ca-certificates and curl install, type Y and press Enter.

Seeing a permission denied error?

Make sure every command starts with sudo. These commands modify system directories and need elevated privileges.

help me fix permission errors when setting up the Docker apt repository

Install Docker Engine packages

With the repository configured, you can now install Docker Engine and all its components in one command.

  • Install Docker Engine by running:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

What does this install?

  • docker-ce is the Docker Engine daemon that runs containers.
  • docker-ce-cli is the command-line tool you interact with.
  • containerd.io manages container lifecycle at a lower level.
  • docker-buildx-plugin extends Docker with advanced build capabilities.
  • docker-compose-plugin lets you run multi-container apps with a single docker compose command.
  • When prompted to confirm the installation, type Y and press Enter.
  • Add your user to the docker group so you can run Docker commands without sudo by running:
sudo usermod -aG docker $USER
  • Apply the new group membership without logging out by running:
newgrp docker

Why do I need the docker group?

By default, only root can talk to the Docker daemon. Adding your user to the docker group grants permission to run docker commands directly.

The newgrp docker command activates the group in your current SSH session. Without it, you would need to log out and back in.

Install command can't find packages?

Make sure the sudo apt update at the end of the repository setup completed successfully. If it failed, re-run the repository setup commands from the previous substep.

help me troubleshoot Docker package installation errors on Ubuntu

Verify the installation

Time to confirm everything is working. You will run Docker's test container and check that Docker Compose is available.

  • Test Docker by running the hello-world container:
docker run hello-world

You should see a message that starts with Hello from Docker! followed by an explanation of what just happened.

  • Confirm Docker Compose is available by running:
docker compose version

You should see a version number printed, confirming the Compose plugin is installed.

Getting permission denied?

If docker run hello-world fails with a permission error, the group membership may not have applied. Try running newgrp docker again, or log out of your SSH session and log back in.

help me fix Docker permission denied errors after installing on Ubuntu

Docker Engine and Docker Compose are ready to go. Next up, you will use Docker Compose to deploy Fess and OpenSearch as a multi-container search engine.

Deploy Fess and OpenSearch with Docker Compose

With Docker ready, you can now deploy the actual search engine. Fess is an open-source enterprise search server that provides a web-based search interface and built-in crawlers.

Fess needs a search backend to store and query its index. You will pair it with OpenSearch, an open-source search and analytics engine. Both services run as Docker containers managed by a single Docker Compose configuration.

In this step, get ready to:
  • Configure your server's kernel settings and download the Fess Docker Compose files.
  • Mount a local directory for file crawling and start both containers.
  • Verify the containers are healthy and access the Fess admin panel from your network.
Set the kernel parameter and download the Compose files

OpenSearch requires a Linux kernel parameter called vm.max_map_count to be set to at least 262144. Without this, the OpenSearch container will fail to start.

  • Set the kernel parameter for the current session by running this command:
sudo sysctl -w vm.max_map_count=262144
  • Make this setting permanent so it persists after reboots by adding it to /etc/sysctl.conf:
echo 'vm.max_map_count=262144' | sudo tee -a /etc/sysctl.conf

Why does OpenSearch need this?

OpenSearch uses memory-mapped files to store its index data efficiently. The default vm.max_map_count value (65530) is too low for OpenSearch's needs. Setting it to 262144 gives OpenSearch enough virtual memory areas to operate.

  • Create a project directory and move into it by running these commands:
mkdir ~/fess-docker
cd ~/fess-docker
  • Download the official Fess Docker Compose files by running these commands:
curl -OL https://raw.githubusercontent.com/codelibs/docker-fess/master/compose/compose.yaml
curl -OL https://raw.githubusercontent.com/codelibs/docker-fess/master/compose/compose-opensearch3.yaml
  • Confirm both files were downloaded by running:
ls
  • You should see compose.yaml and compose-opensearch3.yaml listed in the output.

Not seeing the files?

Make sure you ran the curl commands from inside the ~/fess-docker directory. If you are in a different directory, run cd ~/fess-docker first, then re-run the curl commands.

If curl reports a connection error, check that your server has internet access. Try ping github.com to verify connectivity.

help me troubleshoot downloading the Fess compose files

Mount a local directory and start the containers

Fess runs inside a container, so it cannot see files on your server unless you explicitly share a folder with it. You will mount a host directory into the container so that Fess can later crawl local documents.

  • Create the directory that will hold your documents for crawling:
mkdir ~/documents
  • Open compose.yaml in a text editor. You can use nano for this:
nano ~/fess-docker/compose.yaml
  • Find the restart: unless-stopped line at the bottom of the fess01 service section.
  • Add a volumes: section directly above restart: unless-stopped, so the end of the fess01 service looks like this:
    volumes:
      - ~/documents:/mnt/crawl-data
    restart: unless-stopped

What does this volume mount do?

The ~/documents:/mnt/crawl-data entry maps the ~/documents folder on your server to /mnt/crawl-data inside the Fess container. When you configure a file system crawler later, you will point it at /mnt/crawl-data and it will see everything you place in ~/documents on the host.

  • Save the file and exit nano by pressing Ctrl+O then Enter to save, and Ctrl+X to exit.
  • Start both containers in detached mode by running this command:
docker compose -f compose.yaml -f compose-opensearch3.yaml up -d

What does this command do?

The -f flags tell Docker Compose to merge two configuration files together. The base compose.yaml defines the Fess container, and compose-opensearch3.yaml adds the OpenSearch container with its volumes and settings.

The -d flag runs the containers in the background so they continue running after you close your terminal.

Docker will pull the container images on first run. This may take a minute or two depending on your internet speed.

Seeing a permission or volume error?

If you see an error about the volumes section, double-check your indentation in compose.yaml. YAML is sensitive to spacing. The volumes: line must be indented with exactly 4 spaces (aligned with restart:), and the - ~/documents:/mnt/crawl-data line must be indented with 6 spaces.

If you see a memory-related error from OpenSearch, confirm the kernel parameter is set by running sysctl vm.max_map_count. The value should show 262144.

help me fix an error when starting the Fess Docker containers

Verify the containers and access the admin panel

Both containers have built-in health checks. Fess takes about 2 minutes to fully initialize because it waits for OpenSearch to become healthy first.

  • Wait about 2 minutes, then check the container status by running:
docker compose -f compose.yaml -f compose-opensearch3.yaml ps
  • You should see both fess01 and search01 listed with a STATUS that includes "healthy" (for example, "Up 2 minutes (healthy)").

Containers showing as "starting" or "unhealthy"?

Fess has a start period of 120 seconds. If you check too early, you may see "starting" instead of "healthy". Wait another minute and run the docker compose ps command again.

If search01 stays unhealthy, check that vm.max_map_count is set correctly by running sysctl vm.max_map_count. If the value is less than 262144, re-run the sudo sysctl -w vm.max_map_count=262144 command, then restart the containers with docker compose -f compose.yaml -f compose-opensearch3.yaml restart.

help me troubleshoot unhealthy Fess or OpenSearch containers

  • Find your server's local IP address by running:
hostname -I | awk '{print $1}'
  • Note the IP address printed (for example, 192.168.1.100).
  • On another device connected to the same network (your laptop or desktop), open a web browser.
  • Navigate to http://your-server-ip:8080/admin (for example, http://192.168.1.100:8080/admin).
  • Log in with the default credentials: username admin and password admin.

Change the default password immediately

The default admin/admin credentials are publicly known. After logging in, navigate to your user settings and change the password to something secure. Any device on your local network can access this admin panel.

  • After logging in, click the user icon or navigate to the user management section to change your admin password.

Why change the password?

Fess is accessible to any device on your local network at port 8080. The default credentials admin/admin are documented publicly, so anyone on your network could access the admin panel and modify your search engine configuration.

✔️ I see the Fess admin dashboard

You are all set. Fess and OpenSearch are running and accessible from your network.

ⓧ The page won't load

  • Confirm your containers are healthy by running docker compose -f compose.yaml -f compose-opensearch3.yaml ps on the server.
  • Make sure you are using port 8080 in the URL, not 80 or 443.
  • Verify your browser device is on the same local network as the server.
  • Check if a firewall on the server is blocking port 8080. Run sudo ufw status to check. If UFW is active, allow the port with sudo ufw allow 8080/tcp.

help me access the Fess admin panel from another device on my network

Your search engine infrastructure is live. Next up, you will configure Fess to crawl an internal web service and make its content searchable.

Configure and Run a Web Crawler

Your search engine is running, but it has nothing to search yet. Fess needs a web crawler configuration that tells it which internal web services to visit, how deep to follow links, and how politely to request pages.

In this step, you will create a crawl configuration targeting an internal web service on your network, trigger the crawler manually, and confirm that indexed pages appear in search results.

In this step, get ready to:
  • Create a web crawl configuration in the Fess admin panel.
  • Run the Default Crawler job manually and monitor its progress.
  • Verify that crawled web pages appear in the Fess search interface.
Create a web crawl configuration

Before Fess can index anything, it needs to know where to look. You will point it at an internal web service on your network (a wiki, dashboard, router admin page, or any HTTP service accessible from your server).

  • Return to the Fess admin panel in your browser.
  • In the left menu, click Crawler, then click Web.
  • Click the New button to open the web crawl configuration form.
  • In the Name field, enter Internal Wiki (or a name that describes the service you are indexing).
  • In the URL field, enter the address of the internal web service you want to crawl (for example, http://192.168.1.50:8080/).
  • Set Max Access Count to 100.
  • Set Interval to 1000 (milliseconds between page requests).
  • Set Depth to 3.
  • Click Create to save the configuration.

What do these settings mean?

Max Access Count limits the total number of pages the crawler will fetch in a single run. Setting it to 100 keeps the initial crawl fast so you can verify things work before indexing thousands of pages.

Interval is the wait time between requests. 1000 ms (one second) prevents the crawler from overwhelming a small internal service.

Depth controls how many link levels deep the crawler will follow. A depth of 3 means it starts at the URL you provided, follows links on that page, then follows links on those pages, then follows links one more level.

Pick the right URL

Choose any HTTP service reachable from your server. A home router admin page, a local wiki, a Gitea instance, or even a simple static site all work. If you do not have a web service running on your network, you can temporarily point the crawler at a public site like https://fess.codelibs.org/ to test the workflow.

Run the crawler manually

Fess does not crawl as soon as you save the configuration. You need to trigger the Default Crawler job from the scheduler.

  • In the left menu, click System, then click Scheduler.
  • Find Default Crawler in the job list and click its name.
  • Click the Start Now button to begin the crawl immediately.
  • Navigate to System > Crawling Info in the left menu to monitor progress.
  • Wait until the job disappears from the Crawling Info list, which means it has completed.

How long does a crawl take?

With Max Access Count set to 100 and an interval of 1000 ms, the crawl takes roughly 2-3 minutes depending on network speed and page size. You will see a running entry in Crawling Info while it is active.

Crawl not starting?

Make sure the Default Crawler job shows a status of Enabled in the scheduler list. If it is disabled, click the job name, set Status to enabled, and click Update before trying Start Now again.

Also confirm that your target web service is reachable from the server by running curl against the URL in your SSH session. If the server cannot reach the service, the crawl will complete instantly with zero results.

help me troubleshoot why my Fess web crawl is not starting or returning zero results

Verify search results from the crawled web service

Once the crawl finishes, every page it visited is now indexed and searchable.

  • Open a new browser tab on any device connected to your local network.
  • Navigate to your Fess search interface at http://your server's IP address:8080/ (without the /admin path).
  • Type a search query related to content on the web service you crawled.
  • Confirm that results appear with page titles, URLs, and highlighted text snippets matching your query.

You should see a list of results pulled from the internal web service you configured. Each result shows the page title, the URL, and a snippet with your search terms highlighted.

No results appearing?

Check that the crawl actually completed by returning to System > Crawling Info in the admin panel. If a job is still listed, the crawl is still running.

If the crawl completed but returned zero documents, the target URL may be blocking the crawler (check for robots.txt rules) or the URL might require authentication. Try a different internal service or use the public Fess site as a test target.

help me figure out why Fess shows no search results after my web crawl completed

Your search engine just indexed its first web content. Next up, you will configure a file system crawler to index local documents stored on the server.

Configure and Run a File System Crawler

Your web crawler is working and indexing pages from internal services. Now it is time to tackle the other half of your network search engine: local files.

Documents scattered across your server (notes, reports, configuration files) are invisible to a web crawler because they are not served over HTTP. Fess solves this with a dedicated file system crawler that reads files directly from disk. Since the Fess container already has your ~/documents directory mounted at /mnt/crawl-data, you just need to point the crawler at that path.

In this step, get ready to:
  • Create test documents in your mounted directory so the crawler has content to index.
  • Configure a file system crawler in the Fess admin panel.
  • Run the crawler and verify file-based search results appear.
Create test documents and configure the file system crawler

The file system crawler needs files to index. You will create a few test documents on the server, then tell Fess where to find them.

  • In your SSH session on the Ubuntu server, create some test documents in ~/documents by running these commands:
echo "Meeting notes from Q3 planning session. Action items include setting up monitoring and deploying the new dashboard." > ~/documents/meeting-notes.txt

echo "Network configuration guide: All servers on the 192.168.1.x subnet use gateway 192.168.1.1. DNS is handled locally." > ~/documents/network-guide.txt

echo "# Project Roadmap\n\nPhase 1: Deploy search engine on local network.\nPhase 2: Add file indexing for all shared documents.\nPhase 3: Enable SMB crawling for Windows shares." > ~/documents/roadmap.md

What do these commands do?

Each echo command creates a plain text file with recognizable content. You are putting distinct phrases in each file so you can search for them later and confirm the crawler indexed each one.

You can also add your own files (PDFs, markdown, text files) to ~/documents if you prefer. Any file in this directory is visible to the Fess container at /mnt/crawl-data/.

  • Confirm the files exist by running:
ls ~/documents

You should see meeting-notes.txt, network-guide.txt, and roadmap.md listed.

Now configure Fess to crawl these files.

  • Switch to your browser and return to the Fess admin panel.
  • In the left sidebar, click Crawler.
  • Click File System.
  • Click New to create a new file system crawl configuration.
  • In the Name field, enter Local Documents.
  • In the Paths field, enter file:///mnt/crawl-data/.
  • Set Thread Count to 3.
  • Set Depth to -1 (this means unlimited depth, so Fess will crawl all subfolders).
  • Click Create to save the configuration.

Why use the container path, not the host path?

Fess runs inside a Docker container. It cannot see your host file system directly. The path file:///mnt/crawl-data/ points to the directory as it appears inside the container, which maps back to ~/documents on your host through the volume mount you configured in Step 2.

Don't see Crawler > File System in the sidebar?

Make sure you are logged in as the admin user. The crawler configuration options only appear for authenticated administrators.

If the sidebar shows limited options, click your username in the top-right corner and confirm you are signed in as admin.

Still stuck? Help me find the File System crawler settings in the Fess admin panel.

Run the file system crawl job

With the file crawler configured, you need to trigger a crawl job. Fess uses the same Default Crawler scheduler job to process all configured crawlers (web and file system) in one pass.

  • In the left sidebar, click System.
  • Click Scheduler.
  • Find Default Crawler in the job list and click it.
  • Click Start Now to run the crawl manually.

What happens when you start the crawler?

The Default Crawler job picks up every configured crawl target. It will re-crawl your web configuration from Step 3 and also crawl the new file system configuration. Both sets of results end up in the same search index.

  • Navigate to System > Crawling Info in the left sidebar.
  • Wait for the crawl job to complete. You should see entries showing the crawl session with a completed status.

File crawls on a small set of documents typically finish within 30 seconds.

Crawl job not starting or stuck?

If the job does not appear to start, wait 10-15 seconds and refresh the Crawling Info page. There is a brief delay between clicking Start Now and the crawl beginning.

If the crawl shows errors, verify the volume mount is working by running this in your SSH session:

docker exec fess01 ls /mnt/crawl-data

You should see your test files listed. If the directory is empty, the volume mount in compose.yaml may have a typo. Help me troubleshoot why the Fess container cannot see my files at /mnt/crawl-data.

Verify file-based search results

The real test is whether your documents show up when you search for their content.

  • Open the Fess search interface at http://<server-ip>:8080/ in your browser (from any device on your network).
  • Search for a phrase that exists in one of your test documents. For example, enter Q3 planning session or gateway 192.168.1.1.
  • Verify that file-based results appear. You should see your document filenames (like meeting-notes.txt) with highlighted matching snippets.

If you also search for terms from your web crawl (Step 3), you will see both web pages and local files in the same results list. Your search engine now covers both types of content.

Search returns no file results?

If web results appear but file results do not, the file crawl may not have completed yet. Return to System > Crawling Info and confirm the crawl session finished.

Also check that your crawler URL is exactly file:///mnt/crawl-data/ (three forward slashes after file:). A missing slash is a common typo that causes the crawler to find no files.

Need more help? Help me figure out why my Fess file crawler is not returning search results.

Your search engine now indexes both web content and local files. Next up, you will automate the crawling so your index stays fresh without manual intervention.

Set Up Scheduled Crawling

Your search engine now indexes both web services and local documents. Every time you ran a crawl, though, you had to click Start Now manually in the admin panel.

That is not practical for keeping search results current. In this step, you will configure Fess to crawl on a schedule automatically so new files and updated web pages appear in search results without manual intervention.

In this step, get ready to:
  • Configure a cron schedule for the Default Crawler job.
  • Verify the schedule triggers crawls automatically.
Configure the Default Crawler schedule

Right now, the Default Crawler job exists in Fess but has no active schedule. You will assign it a cron expression that tells Fess exactly when to run crawls.

  • In the Fess admin panel, click System in the left sidebar.
  • Click Scheduler.
  • Find Default Crawler in the list and click on it to open the job configuration.
  • In the Schedule field, enter your preferred cron expression. For a daily crawl at 2 AM, enter:
0 0 2 * * ?

Alternatively, for a crawl every 6 hours, enter:

0 0 */6 * * ?

What does this cron expression mean?

Fess uses a 6-field cron format: second, minute, hour, day, month, weekday.

  • 0 0 2 * * ? means: at second 0, minute 0, hour 2 (2 AM), every day, every month, any day of the week.
  • 0 0 */6 * * ? means: at second 0, minute 0, every 6th hour (midnight, 6 AM, noon, 6 PM), every day.
  • The ? in the weekday field means "no specific value" and avoids conflicts with the day-of-month field.
  • Click Update to save your schedule.

Don't see the Schedule field?

Make sure you clicked on the Default Crawler job name to open its detail page. The schedule field only appears on the individual job configuration page, not the list view.

If the page loaded but looks empty, scroll down. The Schedule field may be below other configuration fields.

help me find the Schedule field in the Fess Scheduler settings

Confirm the schedule is active

After saving, you need to confirm Fess registered your schedule correctly. You can also run a quick test to prove the schedule triggers crawls on its own.

  • Return to System > Scheduler to view the full list of jobs.
  • Locate Default Crawler in the list and confirm your cron expression is displayed next to it.

Test with a short interval

To prove your schedule works without waiting until 2 AM, edit the Default Crawler and set the schedule to about 5 minutes from now (adjust the minute and hour fields to match your current server time). Wait for the scheduled time to pass.

Then navigate to System > Crawling Info to confirm a crawl ran automatically. Once verified, go back and set the schedule to your preferred production expression.

  • Navigate to System > Crawling Info to check for crawl activity.

If you set a short test interval, you should see a new crawl entry appear at the scheduled time. This confirms Fess is running crawls without manual intervention.

Why schedule crawls?

Your internal web services and documents change over time. New wiki pages get created, files get updated, and old content gets removed. Without scheduled crawling, your search results go stale and stop reflecting reality.

A daily or every-6-hours schedule strikes a balance between freshness and server load. You can always adjust the frequency later based on how often your content changes.

Crawl did not run at the scheduled time?

Double-check your cron expression format. Fess uses 6 fields (second, minute, hour, day, month, weekday). A common mistake is using the standard 5-field format and missing the leading seconds field.

Also confirm you clicked Update after entering the expression. If you navigated away without saving, the schedule was not applied.

help me troubleshoot why my Fess scheduled crawl did not run

Secret mission

Add an SMB Crawler for a Windows File Share

Your search engine can already index web pages and local files. But what about the documents sitting on Windows machines across your network? In this secret mission, you will configure Fess to crawl a Windows file share over SMB, giving your search engine true cross-platform reach.

Clean Up Your Resources

Clean Up Your Resources

This project runs entirely on your local server using open-source software. There are no ongoing cloud costs or paid subscriptions.

Decide whether to keep your search engine running, pause it to free up RAM, or delete everything entirely.

Resources you used:

  • Two Docker containers (fess01 and search01) running on your server, consuming approximately 3-4 GB of RAM combined.
  • Docker volumes (search01_data and search01_dictionary) storing the search index data persistently.
  • Project directory (~/fess-docker) containing Docker Compose configuration files.
  • Test documents directory (~/documents) mounted into the Fess container for file crawling.

Keep everything running

No action needed. Choose this if you want your search engine to remain accessible from any device on your network.

  • Your containers will restart automatically after server reboots thanks to the restart: unless-stopped policy in the Compose file.
  • The scheduled crawler will continue running at the cron interval you configured, keeping your index fresh.
  • RAM usage will remain at approximately 3-4 GB while both containers are active.

Pause - I'll come back to this later

Stop the containers to free up RAM while keeping all your indexed data and configuration intact in Docker volumes.

  • Navigate to your project directory and stop the containers by running:
cd ~/fess-docker
docker compose -f compose.yaml -f compose-opensearch3.yaml stop
  • When you are ready to resume, start the containers again by running:
cd ~/fess-docker
docker compose -f compose.yaml -f compose-opensearch3.yaml start
  • All crawl configurations, scheduled jobs, and indexed data persist in Docker volumes. Nothing is lost.

Delete - I don't want to use this again

Remove all project containers, volumes, configuration files, and test data from your server.

  • Navigate to your project directory and remove the containers by running:
cd ~/fess-docker
docker compose -f compose.yaml -f compose-opensearch3.yaml down
  • Remove the Docker volumes that stored your search index by running:
docker volume rm fess-docker_search01_data fess-docker_search01_dictionary
  • Remove the project directory and test documents by running:
rm -rf ~/fess-docker
rm -rf ~/documents
  • Revert the kernel parameter change. Open /etc/sysctl.conf and remove the line vm.max_map_count=262144 that you added earlier.
sudo nano /etc/sysctl.conf
  • Delete the line vm.max_map_count=262144, then save and exit the file.
  • Apply the reverted setting by running:
sudo sysctl --system
  • Your server is now back to its original state with no Fess or OpenSearch artifacts remaining.

Nice Work!

Nice Work!

You just built your own private search engine for your local network. Any device on your LAN can now search across internal web services and local documents from a single browser-based interface.

You've learned how to:

  • Deploy a multi-container application (Fess + OpenSearch) on Ubuntu using Docker Compose, including persistent volumes and health checks.
  • Configure web and file system crawlers to index internal network content and make it searchable through a unified search interface.
  • Set up automated scheduled crawling with cron expressions to keep your search index fresh without manual intervention.
  • Secret Mission: Extended the search engine to crawl Windows file shares via SMB, adding cross-platform network search capability.

Ready to quiz yourself?