bolt Valebyte VPS from $4/mo — NVMe, 60s deploy.

Get a VPS arrow_forward
eco Beginner Tutorial/How-to

Installing Linkwarden on

calendar_month Aug 17, 2026 schedule 21 min read visibility 37 views
Установка Linkwarden на VPS: самоуправляемый менеджер закладок с тегами и коллекциями
info

Need a server for this guide? We offer dedicated servers and VPS in 50+ countries with instant setup.

Need a server for this guide?

Deploy a VPS or dedicated server in minutes.

Installing Linkwarden on a VPS: Self-Hosted Bookmark Manager with Tags and Collections

TL;DR

In this detailed guide, we will step-by-step set up Linkwarden — a powerful self-hosted bookmark manager — on your Virtual Private Server (VPS). You will learn how to prepare an Ubuntu 24.04 LTS based server, install Docker, deploy Linkwarden using Docker Compose, configure secure access via HTTPS using Caddy, and implement a backup strategy to protect your data.

  • Setting up Linkwarden on a VPS for full control over your bookmarks.
  • Using Docker and Docker Compose for easy installation and management.
  • Ensuring security with HTTPS (Caddy) and basic server protection.
  • Deployment on Ubuntu 24.04 LTS with up-to-date software versions for 2026.
  • Implementing a backup system for data preservation.
  • Obtaining a full-featured bookmark manager with tags, collections, and search.

What we are setting up and why

Diagram: What we are setting up and why
Diagram: What we are setting up and why

We will be installing Linkwarden — an open-source and self-hosted solution for saving, organizing, and archiving web links. In a world where information constantly changes and articles and websites disappear, Linkwarden allows you to save not only links but also full copies of web pages, ensuring their permanent availability. This is an ideal tool for those who actively work with information, conduct research, collect useful resources, or simply want to have a reliable archive of their favorite sites.

Ultimately, you will get a fully functional, private bookmark manager, accessible from anywhere in the world via your own domain. It will be equipped with powerful search, the ability to add tags and create collections, as well as a page archiving function to prevent content from disappearing. This means full control over your data and no dependence on third-party services that may change their policies or cease to exist.

Alternatives and why self-hosted on a VPS

There are many solutions for bookmark management. These include cloud services such as Pocket, Raindrop.io, Instapaper, as well as other self-hosted options like Wallabag or Shaarli.

  • Cloud services: Convenient, require no setup, but you entrust your data to a third party, and functionality is often limited by paid subscriptions. You do not control data storage and its privacy.
  • Other self-hosted solutions: Wallabag and Shaarli are also excellent projects, but Linkwarden stands out with its modern interface, active development, and a set of features that are often more focused on "archiving" and "knowledge management" than just "saving for later reading."

Choosing a self-hosted solution on a VPS gives you full sovereignty over your data. You decide where and how your bookmarks are stored, who has access to them, and what features you use. This is especially important for developers, researchers, teams who need a private knowledge base, or anyone who values privacy and control. A VPS provides the necessary flexibility and scalability for this type of application, allowing you to easily increase resources or add other services to the same server if needed.

What VPS configuration is needed for this task

Diagram: What VPS configuration is needed for this task
Diagram: What VPS configuration is needed for this task

Linkwarden is a relatively lightweight application, especially for individual use or a small team. However, the more links you save and the more frequently you use the page archiving feature (which saves full HTML and media), the more resources will be required.

Minimum requirements (for 1-5 users, up to 1000 links):

  • CPU: 1 vCPU (modern processor, e.g., Intel Xeon E5 or AMD EPYC).
  • RAM: 2 GB (for stable operation of Docker, Linkwarden, and the database).
  • Disk: 40-60 GB SSD (for the operating system, Docker images, Linkwarden database, and archived pages. SSD significantly speeds up operation).
  • Network: 100 Mbps (sufficient for most tasks if there is no intensive upload/download of archived data).

Recommended configuration (for 5-20 users, up to 10000 links or active archiving):

  • CPU: 2 vCPU.
  • RAM: 4 GB.
  • Disk: 80-120 GB SSD (or NVMe for maximum performance).
  • Network: 1 Gbps.

For renting a VPS with such characteristics, you can consider a VPS with the specified characteristics, suitable for most Linkwarden deployment tasks.

When a dedicated server is needed, not a VPS

A dedicated server may be required if:

  • You plan to use Linkwarden for a very large team (hundreds of users).
  • You will archive a huge number of pages (terabytes of data), which requires significant storage volumes and high I/O speed.
  • Other resource-intensive services will be hosted on the server in addition to Linkwarden.
  • You need maximum performance and isolation that a VPS cannot provide due to shared infrastructure.
  • Specific hardware configurations are required that are not available on a VPS (e.g., RAID arrays, specialized network cards).

Location: what it affects

The choice of VPS location affects several factors:

  • Latency: The closer the server is to you and your main users, the lower the latency and the faster the web interface response will be.
  • Legal aspects: The legislation of the country where the server is located may affect privacy and data processing. Consider this if your data is sensitive.
  • Network availability: In some regions, the network infrastructure is more developed and stable.
  • Cost: VPS prices may vary depending on the region.

For most Linkwarden users, it is sufficient to choose a location that is geographically close to the main audience to ensure minimal latency.

Server preparation

Diagram: Server preparation
Diagram: Server preparation

Before installing Linkwarden, you need to perform basic security configuration and install the necessary utilities on your VPS. We will use Ubuntu 24.04 LTS (Noble Numbat) as the main operating system, as it is one of the most popular and well-supported platforms for servers.

Connect to your VPS via SSH using the credentials provided by your provider. This usually looks like this:


ssh root@ВАШ_IP_АДРЕС

1. System update

First, update the package list and installed packages to their latest versions.


sudo apt update             # Update the list of available packages
sudo apt upgrade -y         # Upgrade installed packages
sudo apt autoremove -y      # Remove unnecessary packages

2. Creating a new user with sudo privileges

Working under the root account is unsafe. Create a new user and grant them sudo privileges.


sudo adduser linkwardenuser # Create a new user named linkwardenuser
sudo usermod -aG sudo linkwardenuser # Add the user to the sudo group

After creating the user, exit the root session and log in as the new user:


exit
ssh linkwardenuser@ВАШ_IP_АДРЕС

3. Configuring SSH keys (recommended)

For increased security, it is recommended to use SSH keys instead of passwords. If you don't have an SSH key yet, generate one on your local machine:


ssh-keygen -t rsa -b 4096 # Generate a new SSH key (on your local machine)

Then copy the public key to your VPS:


ssh-copy-id linkwardenuser@ВАШ_IP_АДРЕС # Copy the public key to the server

After this, you can disable password authentication in the /etc/ssh/sshd_config file by changing PasswordAuthentication yes to PasswordAuthentication no and restarting the SSH service. This will significantly enhance security.

4. Configuring the firewall (UFW)

Enable Uncomplicated Firewall (UFW) and allow only the necessary ports: SSH (22), HTTP (80), and HTTPS (443).


sudo apt install ufw -y # Install UFW if not installed
sudo ufw allow OpenSSH # Allow SSH connections
sudo ufw allow http # Allow HTTP (port 80)
sudo ufw allow https # Allow HTTPS (port 443)
sudo ufw enable # Enable the firewall
sudo ufw status # Check firewall status

Confirm activation by pressing 'y'.

5. Installing Fail2Ban

Fail2Ban helps protect the server from brute-force attacks by blocking IP addresses from which numerous failed login attempts occur.


sudo apt install fail2ban -y # Install Fail2Ban
sudo systemctl enable fail2ban # Enable Fail2Ban autostart
sudo systemctl start fail2ban # Start Fail2Ban

You can create a configuration file /etc/fail2ban/jail.local for fine-tuning, but the basic installation already provides good SSH protection.


sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Ensure that the [sshd] section is active (enabled = true).

6. Installing basic utilities

Install useful utilities that may come in handy during installation and debugging.


sudo apt install curl wget git htop unzip -y # Install curl, wget, git, htop, and unzip

Your server is now ready for Linkwarden installation.

Software Installation — Step-by-Step

Diagram: Software Installation — Step-by-Step
Diagram: Software Installation — Step-by-Step

Linkwarden is best deployed using Docker and Docker Compose, which provides isolation, portability, and ease of management. We will install Docker Engine and Docker Compose, and then deploy Linkwarden.

1. Installing Docker Engine (relevant for 2026)

For Ubuntu 24.04 LTS, it is recommended to install Docker from the official Docker repository.


# Remove old Docker versions, if any
for pkg in docker.io docker-doc docker-compose docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin; do sudo apt remove $pkg -y; done

# Install necessary packages to use the HTTPS repository
sudo apt update
sudo apt install ca-certificates curl gnupg -y

# Add Docker's official GPG key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Add the Docker repository to APT sources
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Update the package list with the new repository
sudo apt update

# Install Docker Engine, Docker CLI, and Containerd (versions will be current for 2026, e.g., Docker 26.x)
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

# Add the current user to the docker group to avoid using sudo for docker commands
sudo usermod -aG docker $USER

# Apply group changes (you need to log out and log back into the SSH session)
# To do this, exit the current SSH session and log back in: exit, then ssh linkwardenuser@YOUR_IP_ADDRESS

After logging back into the SSH session, verify the Docker installation:


docker run hello-world # Run a test container to verify Docker installation

You should see the message "Hello from Docker!".

2. Installing Docker Compose (if not installed as a plugin)

Starting with Docker Engine 20.10, Docker Compose is included as a docker compose plugin. If you installed it using docker-compose-plugin, a separate installation is not required. You can check for its presence:


docker compose version # Check the Docker Compose plugin version (e.g., v2.24.x)

If the command docker compose version works, then Docker Compose is installed. If not, or if you prefer the old docker-compose syntax, install it separately:


# Download the current version of Docker Compose (e.g., 2.24.x for 2026)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# Grant execution permissions
sudo chmod +x /usr/local/bin/docker-compose

# Create a symbolic link (optional, for convenience)
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# Check the version
docker-compose --version # Check the Docker Compose version (e.g., Docker Compose version 2.24.5)

3. Creating a Directory for Linkwarden

Create a directory where Linkwarden configuration files will be stored.


mkdir ~/linkwarden # Create the linkwarden directory in the user's home folder
cd ~/linkwarden # Navigate to the created directory

4. Downloading the docker-compose.yml file

Linkwarden provides an official docker-compose.yml file. Download it.


wget https://raw.githubusercontent.com/linkwarden/linkwarden/main/docker-compose.yml # Download the docker-compose.yml file

Open the docker-compose.yml file for review. It will contain the linkwarden service (the application itself) and db (PostgreSQL database).

5. Creating the .env file

Create a .env file to store environment variables and secrets. This is the best way to manage configuration without modifying the main docker-compose.yml file.


nano .env # Create and open the .env file for editing

Insert the following content, changing the values to your own:


# Linkwarden Application Settings
# -----------------------------
# You MUST change the SECRET_KEY to a strong, random string.
# Generate one using openssl rand -base64 32 or similar.
SECRET_KEY=ВАШ_СЕКРЕТНЫЙ_КЛЮЧ_ЗДЕСЬ # Be sure to generate a unique key!
NEXTAUTH_URL=https://linkwarden.ВАШ_ДОМЕН.ru # The URL where Linkwarden will be accessible

# Database Settings (PostgreSQL)
# -----------------------------
# You MUST change POSTGRES_PASSWORD to a strong, random password.
POSTGRES_USER=linkwardenuser
POSTGRES_PASSWORD=ВАШ_ПАРОЛЬ_БАЗЫ_ДАННЫХ_ЗДЕСЬ # Be sure to generate a unique password!
POSTGRES_DB=linkwarden

# Docker Volumes for data persistence
# ----------------------------------
# These define where Linkwarden and PostgreSQL data will be stored on your host.
# Ensure these paths exist and Docker has permissions to write to them.
LINKWARDEN_DATA_DIR=./linkwarden_data
POSTGRES_DATA_DIR=./postgres_data

# Optional: Timezone for Linkwarden
# Find your timezone here: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
TZ=Europe/Moscow

# Optional: Enable email for account recovery, invitations etc.
# SMTP_HOST=smtp.your-email-provider.com
# SMTP_PORT=587
# [email protected]
# SMTP_PASSWORD=YOUR_EMAIL_PASSWORD
# SMTP_FROM=Linkwarden 

Important:

  • Replace ВАШ_СЕКРЕТНЫЙ_КЛЮЧ_ЗДЕСЬ with a random string. You can generate one using the command openssl rand -base64 32.
  • Replace ВАШ_ПАРОЛЬ_БАЗЫ_ДАННЫХ_ЗДЕСЬ with a strong, complex password.
  • Specify your domain in NEXTAUTH_URL.
  • Ensure that LINKWARDEN_DATA_DIR and POSTGRES_DATA_DIR point to existing or will-be-created directories.

Save the file (Ctrl+X, Y, Enter).

6. Creating Data Directories

Create the directories specified in .env for storing Linkwarden and PostgreSQL data.


mkdir linkwarden_data # Create directory for Linkwarden data
mkdir postgres_data # Create directory for PostgreSQL data

7. Starting Linkwarden

You are now ready to start Linkwarden using Docker Compose.


docker compose up -d # Start Linkwarden and PostgreSQL services in the background

This command will download the necessary Docker images (linkwarden/linkwarden and postgres), create containers, and start them. The process may take several minutes depending on your internet connection speed.

8. Checking Container Status

Ensure that all containers are running correctly.


docker compose ps # Show status of running containers

You should see an Up status for both services. If any service has an Exited or Restarting status, check the logs:


docker compose logs linkwarden # View logs for the linkwarden container
docker compose logs db # View logs for the database container

At this stage, Linkwarden is running on your server but is only accessible via internal ports (usually 3000 for Linkwarden). To access it externally and ensure security, we will need to configure a reverse proxy with HTTPS.

Configuration

Diagram: Configuration
Diagram: Configuration

After starting the Linkwarden containers, you need to configure application access via your domain, secure it with HTTPS, and perform initial setup. We will use Caddy as a reverse proxy because it automatically manages Let's Encrypt certificates and simplifies HTTPS configuration.

1. DNS Configuration

Before proceeding with Caddy configuration, ensure that your domain or subdomain (e.g., linkwarden.ВАШ_ДОМЕН.ru) points to your VPS's IP address. Add an A record in your domain registrar's DNS settings:

Record TypeName (Host)Value (IP Address)TTL
AlinkwardenВАШ_IP_АДРЕС_VPSAutomatic / 3600

Allow time for DNS records to propagate (usually from a few minutes to several hours).

2. Installing Caddy

We will install Caddy as a separate Docker service so it can easily manage HTTPS for Linkwarden.

First, create a directory for Caddy's configuration and data:


cd ~/linkwarden # Go to the Linkwarden directory if you're not already there
mkdir caddy # Create directory for Caddy
mkdir caddy/data # Directory for Caddy data (certificates)
mkdir caddy/config # Directory for Caddy configuration

Create a Caddyfile in the ~/linkwarden/caddy/config directory:


nano caddy/config/Caddyfile # Create and open Caddyfile

Paste the following content, replacing linkwarden.ВАШ_ДОМЕН.ru with your actual domain:


linkwarden.ВАШ_ДОМЕН.ru {
    # Proxy all requests to the Linkwarden container
    reverse_proxy linkwarden:3000

    # Enable data compression
    encode gzip zstd

    # Additional security headers (recommended)
    header {
        Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
        X-Frame-Options "DENY"
        X-Content-Type-Options "nosniff"
        Referrer-Policy "strict-origin-when-cross-origin"
        Permissions-Policy "geolocation=(), microphone=(), camera=()"
    }

    # Logging (optional)
    log {
        output file /var/log/caddy/access.log
    }
}

Save the file (Ctrl+X, Y, Enter).

3. Adding Caddy to Docker Compose

Now, edit your ~/linkwarden/docker-compose.yml file to add the Caddy service.


nano docker-compose.yml # Open docker-compose.yml for editing

Add the following caddy section to the end of the file, at the same indentation level as linkwarden and db:


  caddy:
    image: caddy:2.7.6-alpine # Current Caddy version for 2026
    restart: unless-stopped
    ports:
      - "80:80" # Open port 80 for Let's Encrypt HTTP-01 challenge
      - "443:443" # Open port 443 for HTTPS
    volumes:
      - ./caddy/config/Caddyfile:/etc/caddy/Caddyfile # Mapping your Caddyfile
      - ./caddy/data:/data # Mapping for Caddy data (certificates)
      - ./caddy/config:/config # Mapping for Caddy configuration
      - ./caddy/logs:/var/log/caddy # Mapping for Caddy logs (if logging is enabled)
    networks:
      - default # Caddy must be in the same network as Linkwarden

Ensure that the networks: section for linkwarden and db is also present and points to default (or to your network's name if you defined it explicitly). If you don't have a networks section at the end of the file, add it:


networks:
  default:
    external: false

Save docker-compose.yml (Ctrl+X, Y, Enter).

4. Restarting Linkwarden with Caddy

Now, update your Docker Compose stacks to start Caddy.


docker compose down # Stop and remove existing Linkwarden containers (data will be preserved in volumes)
docker compose up -d # Start all services, including Caddy

Check the container status:


docker compose ps # Ensure caddy is also running

You should see Up for linkwarden, db, and caddy.

5. Verifying Functionality

Open your browser and go to https://linkwarden.ВАШ_ДОМЕН.ru. You should see the Linkwarden welcome page. Caddy will automatically obtain and configure an SSL certificate from Let's Encrypt.

If you encounter issues, check Caddy's logs:


docker compose logs caddy # View Caddy logs for debugging

Upon first access to Linkwarden, you will be prompted to create an administrator account. Fill out the form using a strong password. This will be your primary account for managing bookmarks and users.

6. Configuring Linkwarden via the Web Interface

After creating an account, you can log in to Linkwarden. Explore the settings in the "Admin Settings" section, where you can configure:

  • User Management: Add new users, manage their roles.
  • Appearance: Change the look and feel.
  • Integrations: Configure integrations (e.g., with RSS).
  • Email Settings: If you configured SMTP in .env, you can test and send a test email here.

Congratulations! Your self-hosted Linkwarden bookmark manager is fully configured and secured with HTTPS.

Backups and Maintenance

Diagram: Backups and Maintenance
Diagram: Backups and Maintenance

Regular backups and timely maintenance are critically important for any production service. Linkwarden stores your valuable bookmarks and archives, so ensuring their preservation is crucial.

1. What to Back Up

For Linkwarden, the following components need to be backed up:

  • PostgreSQL Database: Contains all bookmark metadata, tags, collections, and user accounts. This is the most critical component.
  • Linkwarden Data (linkwarden_data): Includes the directory with archived web pages, if you use this feature.
  • Caddy Configuration (caddy/config): The Caddyfile.
  • Caddy Data (caddy/data): Let's Encrypt certificates. While they can be reissued, a backup speeds up recovery.
  • Linkwarden .env file: Contains the secret key and passwords.

2. Simple Auto-Backup Script

Let's create a script that will dump the database and archive important files. We will use docker exec to interact with the database inside the container and tar for archiving.

Create a directory for backup scripts and the script itself:


mkdir -p ~/backups/linkwarden # Create directory for backups
nano ~/backups/linkwarden/backup_linkwarden.sh # Create backup script

Paste the following content into the backup_linkwarden.sh file:


#!/bin/bash

# --- Configuration ---
BACKUP_DIR="/home/$USER/backups/linkwarden" # Directory for storing backups
LINKWARDEN_ROOT_DIR="/home/$USER/linkwarden" # Linkwarden root directory
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/linkwarden_backup_${TIMESTAMP}.tar.gz"
DB_DUMP_FILE="linkwarden_db_dump_${TIMESTAMP}.sql"
CONTAINER_NAME_DB="linkwarden-db-1" # Database container name (may vary, check docker ps)
DB_USER="linkwardenuser" # Database user from your .env
DB_NAME="linkwarden" # Database name from your .env

# --- Creating database dump ---
echo "Creating PostgreSQL database dump..."
docker exec -t ${CONTAINER_NAME_DB} pg_dumpall -U ${DB_USER} > "${BACKUP_DIR}/${DB_DUMP_FILE}"
if [ $? -eq 0 ]; then
    echo "Database dump successfully created: ${BACKUP_DIR}/${DB_DUMP_FILE}"
else
    echo "Error creating database dump."
    exit 1
fi

# --- Archiving Linkwarden data, Caddy, and configs ---
echo "Archiving Linkwarden data, Caddy, and configs..."
tar -czf "${BACKUP_FILE}" -C "${LINKWARDEN_ROOT_DIR}" \
    linkwarden_data \
    postgres_data \
    caddy/config/Caddyfile \
    caddy/data \
    .env \
    ${DB_DUMP_FILE} # Include DB dump in the main archive

if [ $? -eq 0 ]; then
    echo "Archive successfully created: ${BACKUP_FILE}"
else
    echo "Error creating archive."
    exit 1
fi

# --- Deleting temporary DB dump ---
rm "${BACKUP_DIR}/${DB_DUMP_FILE}"

# --- Cleaning up old backups (keep last 7 days) ---
echo "Deleting old backups..."
find "${BACKUP_DIR}" -type f -name 'linkwarden_backup_.tar.gz' -mtime +7 -delete
echo "Backups older than 7 days deleted."

echo "Backup completed."

Save the file (Ctrl+X, Y, Enter) and make it executable:


chmod +x ~/backups/linkwarden/backup_linkwarden.sh # Make the script executable

Check the database container name with the docker ps command and, if necessary, change CONTAINER_NAME_DB in the script. It might be linkwarden-db-1 or linkwarden_db_1 depending on your Docker Compose version.

3. Automating Backups with Cron

Configure Cron to run the backup script daily. Open your user's crontab:


crontab -e # Open crontab file for editing

Add the following line to the end of the file so that the script runs every day at 03:00 AM:


0 3    /home/linkwardenuser/backups/linkwarden/backup_linkwarden.sh >> /home/linkwardenuser/backups/linkwarden/backup.log 2>&1

Save and close the file. Your backups will now be created automatically.

4. Where to Store Backups

Storing backups on the same server as the main service is extremely risky. If the server fails, you will lose both the service and the backups. It is recommended to use external storage:

  • S3-compatible storage: Cloud services such as Amazon S3, DigitalOcean Spaces, Backblaze B2. Use rclone or awscli to automatically upload archives after they are created.
  • Separate VPS: You can set up another, less powerful VPS to store backups and use rsync over SSH to synchronize them.
  • NAS/Local Storage: If you have your own network-attached storage, you can set up a VPN tunnel and transfer backups there.

Example of adding rclone to the backup script (after archive creation):


# --- Uploading backup to S3 (rclone example) ---
# Ensure rclone is installed and configured (rclone config)
# rclone copy "${BACKUP_FILE}" "s3remote:linkwarden-backups/"
# if [ $? -eq 0 ]; then
#     echo "Backup successfully uploaded to S3."
# else
#     echo "Error uploading backup to S3."
# fi

5. Updates: rolling vs maintenance window

Keeping Linkwarden and the server up-to-date is critically important for security and stability.

  • System Update (Ubuntu): Recommended to perform once a month.
    
    sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y
                

    A server reboot (sudo reboot) may be required after updating the kernel or important system components. Plan this for times of lowest load (maintenance window).

  • Updating Linkwarden Docker Images:

    To update Linkwarden to a new version:

    
    cd ~/linkwarden # Go to the Linkwarden directory
    docker compose pull # Download new image versions
    docker compose up -d # Recreate containers with new images
                

    It is recommended to perform this during a "maintenance window," as Linkwarden containers will be restarted, causing a brief service downtime.

  • Docker Engine Update: Performed along with system updates if Docker is installed from the official repository.

Always back up before major updates! This is your insurance against unforeseen problems.

Troubleshooting + FAQ

Even with the most careful setup, problems can arise. This section will help you diagnose and solve the most common ones.

Cannot access Linkwarden by domain. What should I do?

First, check if DNS records are configured correctly. Use the command dig linkwarden.ВАШ_ДОМЕН.ru on your local machine to ensure it points to your VPS's IP address. Next, check that Caddy is running and has no errors in its logs: docker compose logs caddy. Make sure ports 80 and 443 are open in your UFW firewall on your VPS: sudo ufw status. If Caddy cannot obtain a certificate, it may be due to DNS issues or blocked ports.

Linkwarden does not start after docker compose up -d.

Check the Linkwarden container logs: docker compose logs linkwarden. Common reasons include: incorrectly configured .env file (e.g., missing SECRET_KEY or incorrect NEXTAUTH_URL), database connection issues (check the db container logs: docker compose logs db), or port conflicts if you manually modified docker-compose.yml and a port is already in use.

What is the minimum suitable VPS configuration?

For a single user or a small group (up to 5 people) with a moderate number of bookmarks (up to 1000) and infrequent use of the page archiving feature, a VPS with 1 vCPU, 2 GB RAM, and 40-60 GB SSD will be minimally suitable. This will be sufficient for the stable operation of Linkwarden and its database. However, if you plan to actively use archiving or scale the service, it is recommended to choose a configuration with 2 vCPU and 4 GB RAM.

What to choose — VPS or dedicated for this task?

For most users and small teams, a VPS will be the optimal choice. It offers sufficient performance, flexibility, and cost-effectiveness. A dedicated server is only justified in cases where Linkwarden will be used by a very large organization (hundreds of users), requires storing terabytes of archived pages, or if other extremely resource-intensive applications requiring exclusive access to hardware resources will be running on the server. Dedicated servers are significantly more expensive and require more management experience.

How to update Linkwarden to a new version?

To update Linkwarden to a new version, simply navigate to the ~/linkwarden directory and execute the commands: docker compose pull (to download new images) and then docker compose up -d (to recreate and start containers with the new images). It is always recommended to make a backup before updating. Also, keep an eye on official Linkwarden releases on GitHub for important changes or database migrations.

Why is Linkwarden running slowly?

Reasons for slow performance can vary:

  • Insufficient VPS resources: Check CPU and RAM usage with htop. If RAM is constantly full, or CPU is at 100%, you might need a VPS with more resources.
  • Slow disk: If you have an HDD instead of an SSD, database operations and reading archived pages will be slow.
  • Database issues: Check the db container logs. The database might need optimization, or too many queries are occurring.
  • Network problems: If Linkwarden is installed far from you, or your provider has network issues, this can cause delays.

How to reset Linkwarden administrator password?

If you forgot the administrator password, it can be reset via the command line. First, get a shell inside the Linkwarden container: docker exec -it linkwarden-linkwarden-1 bash (container name may vary, check docker ps). Then execute the command to reset the password (the exact command may vary, check Linkwarden documentation, but it's usually something like npm run cli user:reset-password -- -e [email protected] -p new_strong_password). After resetting, exit the container (exit).

How to configure a custom domain for Linkwarden if I already use Caddy for other services?

If you already have Caddy running on the host, you don't need to run it in Docker Compose. Simply add a new section for linkwarden.ВАШ_ДОМЕН.ru to your existing Caddyfile on the host. Ensure that Linkwarden and Caddy can communicate (for example, if Caddy is on the host and Linkwarden is in Docker, you will need to open Linkwarden's port or use a Docker network). Example: reverse_proxy 172.17.0.X:3000, where 172.17.0.X is the IP address of the Linkwarden container in the Docker network (can be found via docker inspect).

Conclusion and Next Steps

Diagram: Conclusion and Next Steps
Diagram: Conclusion and Next Steps

You have successfully installed and configured Linkwarden on your VPS, creating a reliable, private, and fully controlled bookmark manager. You now have a powerful tool for saving, organizing, and archiving valuable web information, secured with HTTPS and regular backups.

Where to go next?

  • Invite users: If Linkwarden is intended for a team, invite colleagues and set up their accounts.
  • Install browser extensions: Use the official Linkwarden extensions for Chrome, Firefox, or Edge to quickly save links.
  • Explore additional features: Familiarize yourself with Linkwarden's capabilities, such as RSS import, tags, collections, "reader mode" function, and API for integration with other services.
  • Performance monitoring: Set up a monitoring system (e.g., Prometheus + Grafana or Netdata) to track VPS resources and Linkwarden performance.
  • Scaling: As data volume or user count grows, consider increasing VPS resources or optimizing the database.

Was this guide helpful?

Your feedback helps us improve our guides.

Share this post:

Send this guide to someone who may find it useful.

Telegram VKVK WhatsApp Facebook LinkedIn XX

Linkwarden installation on VPS: self-hosted bookmark manager with tags and collections
support_agent
Valebyte Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.