Skip to main content

Command Palette

Search for a command to run...

Valkey Installation on ubuntu

Updated
3 min read
Valkey Installation on ubuntu
B

Full-Stack Developer | MERN + Next.js | DevOps & Cloud Enthusiast

I specialize in building dynamic web applications using the MERN stack and Next.js. Currently exploring DevOps and cloud technologies to streamline workflows, automate deployments, and optimize cloud infrastructure for scalable, efficient solutions.

Install Docker

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get 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:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Check docker installation status

sudo systemctl status docker

Set the conf

sudo rm -rf /data/valkey/valkey.conf
sudo nano /data/valkey/valkey.conf

Paste the conf make sure to edit the password

bind 0.0.0.0
port 6379
protected-mode yes

requirepass StrongP@ssw0rd!

save 60 1
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec

dir /data

logfile /data/valkey.log
loglevel notice

maxmemory 1gb
maxmemory-policy allkeys-lru

Check is it good or not

ls -l /data/valkey/valkey.conf
-rw-r--r-- 1 ubuntu ubuntu 350 Oct 18 16:10 /data/valkey/valkey.conf

Run the container

sudo docker run -d \
  --name valkey \
  -p 6379:6379 \
  -v /data/valkey:/data \
  -v /data/valkey/valkey.conf:/etc/valkey/valkey.conf:ro \
  --restart unless-stopped \
  valkey/valkey:latest \
  valkey-server /etc/valkey/valkey.conf

Check all good

sudo tail -f /data/valkey/valkey.log

Check
Ready to accept connections
this message should come up

conf this if you think that kernel should allocate as much they can

1️⃣ maxmemory = 1 GB

  • This is a hard cap inside ValKey.

  • Redis will never store more than 1 GB of data in memory, even if your machine has 4 GB free.

  • Eviction (allkeys-lru) will kick in once that limit is reached.

  • Effect: Redis memory usage is limited to 1 GB for keys/data.


2️⃣ vm.overcommit_memory=1

  • This is a Linux-level setting, not a ValKey setting.

  • Linux allows Redis to request memory without being blocked, even if the kernel thinks the system might run out of RAM.

  • Important: This does not change the maxmemory limit inside Redis.

So in your case:

  • ValKey will still only store 1 GB of data (because of maxmemory=1gb).

  • Linux may allocate slightly more than 1 GB to Redis internally for overhead, buffers, bookkeeping, without killing the process.

  • Redis cannot “go beyond 1 GB for data” just because overcommit=1 is set.

# Temporary (until next reboot)
sudo sysctl vm.overcommit_memory=1

# Permanent
echo "vm.overcommit_memory=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Here is your password

make sure to allow 6379 on security group as in bound rule

redis://default:<pass>@<EC2_PRIVATE_OR_PUBLIC_IP>:6379

Test command in cli

docker exec -it valkey valkey-cli
> auth StrongP@ssw0rd!
OK
> set test "persistent"
OK
> get test
"persistent"

Node js Client sample code

// index.js
import { createClient } from 'redis';

async function main() {
  // Replace <EC2_IP> with your EC2 public/private IP
  const client = createClient({
    url: 'redis://default:StrongP@ssw0rd!@<EC2_IP>:6379'
  });

  client.on('error', (err) => console.error('Redis Client Error', err));

  try {
    await client.connect();
    console.log('✅ Connected to ValKey successfully!');

    // Set a key with expiry of 60 seconds
    await client.set('test-key', 'Hello ValKey!', { EX: 60 });
    console.log('✅ Key "test-key" set with 60 seconds expiry');

    // Get the key
    const value = await client.get('test-key');
    console.log('🔹 Retrieved value:', value);

  } catch (err) {
    console.error('Connection failed:', err);
  } finally {
    await client.quit();
    console.log('Connection closed');
  }
}

main();
npm install redis
node index.js
✅ Connected to ValKey successfully!
✅ Key "test-key" set with 60 seconds expiry
🔹 Retrieved value: Hello ValKey!
Connection closed

🔹 Bottom line

Your current setup is okay for small production workloads or a single-app environment:

  • One EC2 instance

  • Domain-based access

  • Persistent storage via EBS

  • Password protection

…but for enterprise-level production with high availability, failover, and monitoring, you’ll need to implement:

  • Clustered ValKey / Redis replication

  • TLS/SSL connections

  • Monitoring and alerting

  • Automated backups

6 views

🖥️ Devops

Part 2 of 5

Explore the world of DevOps in this comprehensive series! Learn about automation, CI/CD, infrastructure as code, and best practices. Dive into tools like Docker, Kubernetes, Jenkins, and more to streamline development and operations efficiently.

Up next

My Own Dns Server

How to use ? For calculation:- dig @dns.deploylite.tech MX calculate.2+2 #feel free to change 2+2 to something else dig @dns.deploylite.tech MX calculate.2+2 +short For generating random number:- dig @dns.deploylite.tech MX generate-random.rand #us...

More from this blog

"

"Mastering DevOps, Full Stack Development, AWS & Cutting-Edge Tech | Insights & Tutorials

13 posts

sudo certbot -d '*.host.deploylite.tech' --manual --preferred-challenges dns certonly