Giter VIP home page Giter VIP logo

servas's Introduction

Servas

A self-hosted bookmark management tool.
Servas is based on Laravel and Inertia.js and uses Tailwind CSS and Svelte for the frontend.

Features

  • Tags: Organize your bookmarks with tags.
  • Groups: Group your bookmarks. Groups can be nested.
  • Later list: Add bookmarks to the "later list" to access them later.
  • Chrome browser extension: Add sites to Servas right from your browser.
  • Multiple users: You can create multiple user accounts.
  • Responsive design: Servas looks good on all your devices.
  • Two Factor Authentication available.

How to install

Docker

Servas is available as an official Docker image.

The preferred way to use Servas is in combination with a MariaDB container.
You can find the example files here:

The Docker image also supports SQLite. This variant does not need an additional database container.
You can find the example files here:

Initial steps:

  1. Create .env file in the directory where the docker-compose.yaml is located.
  2. Copy the content of the example env file into the .env file.
  3. Change the APP_URL.
  4. Use a strong password for the DB_PASSWORD setting (only required if Servas is used with MariaDB).
  5. Start the containers with docker-compose up -d.
  6. Generate the application key:
docker exec -it servas php artisan key:generate --force
  1. Restart the containers with docker-compose restart.
  2. Open your browser and create a user account at https://your-servas-instance/register.

Manual

Requirements:

  • PHP 8.1
  • MariaDB, MySQL or SQLite
  • Git
  • Node.js
  • Composer
  1. Clone the repo.
  2. Install the Composer packages.
composer install --optimize-autoloader --no-dev
  1. Install the npm packages.
npm install
  1. Compile the assets.
npm run build
  1. Create .env file from the .env.example file.
  2. Change the settings in the .env file according to your needs.
  3. If you are using SQLite, you must remove the MySQL section in the .env file and uncomment the SQLite section.
  4. Run the database migrations.
php artisan migrate
  1. Generate the application key.
php artisan key:generate

Configuration

You can change some application settings in the .env file.

Description .env key Options
Enable/Disable user registration SERVAS_ENABLE_REGISTRATION true/false

After making changes to the .env file, you must restart the application container.

User Guide

Register a new user at https://your-servas-instance/register.

Browser Extensions

Firefox: https://github.com/beromir/servas-firefox-extension
Chrome: https://github.com/beromir/servas-chrome-extension

Screenshots

Links view:

Groups view:

New link modal:

Command palette:

servas's People

Contributors

beromir avatar dependabot[bot] avatar krekas avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

servas's Issues

Remove Duplicate Links

Please create the functionality to remove duplicate links from my favorites already in my database.

Update Docker Image

Hey!
I really like and appreciate your bookmark management tool, but it's only usable for me if I can create subfolders on the groups view.
Either I am too stupid to create one or the latest release on docker hub (two months ago) hasn't it implemented yet.

Could you update the docker image, so I can deploy it with the latest features?

Executing 'docker exec -it..'

I am deploying the instance through Portainer on a Synology NAS.. Is there a way to to run the 2 commands ( migration and generating the key ) always inside Portainer ?

Nested Folders need improvement

This app is the only one for bookmarks I could find that supports nested groups, and I think it's a very underrated feature for organization! So thanks for making it an option in the first place.

Sadly, using the nested folders as of now is a little painful. Biggest issue is that creating sub-groups is way more effort than need be. You have to select the parent group for every single entry you want to create. Instead, the currently active group should be the parent group by default when creating a new group using the text input field. This methodology should also apply when creating new links - auto select the currently active group.

If this either goes against your vision for the app or is currently too difficult to implement, I'd ask of you to at least not reset the selected group after creating one. While that won't make creating multiple sub-groups more intuitive, at least it'll be quite a bit faster.

I also thought it might be nice to have a group tree to the side of the view, though that is very much an opinion.

REST API?

Are there any plans to add a REST API (or document an existing one if Laravel has such a thing)?

Disable registration

Hello!
I was wondering if there was a feature (or if it'd be possible to add such feature) to prevent new users from registering, eg. by setting an env variable (DISABLE_REGISTRATION=true), so that we could protect our private instances from other people.

Thanks!

Show TOTP token as text next to QR code

Would it be possible to also show TOTP token beneath the QR code as to be able to add it to password managers that has TOTP-support but that don't handle QR scanning?

Feature Request: Ungrouped / Untagged items

I personally organize everything into groups, so I think two new tabs in the sidebar would make sense: ungrouped links and untagged links. This comes in handy if you just hit "safe" in the Browser extension with the intention to categorize further later on.

Improvement: Increase link length

The length limit for the link field in the database defaults to 255 characters, which can be too less in some situations. 500 would be a more suitable default config.

Auto-Organize

Using the OpenAI API (and the user's token configured in Settings), generate automatically defined tags for links that are not yet organized.

Reset password

First of all, thanks for making this handy app. I use it very often to tag cetrainthings for work/private.
Using my unraid install happily until last app update. Now my original password does not work for some reason. Using sqlite.
Worked fine, no config was edited prior password issue.

Add a bookmarklet

I'm aware that the browser extension exists. But personally, I don't see the benefit over a simple javascript applet, that would do the same thing without adding a background process in my browser. Additionally, as a bookmarklet is a normal bookmark to a browser, it'll be synced to all connected devices (if sync is set up) and it does not require cross-platform building and testing.

Feature Request: Tag Filter in sidebar

I like the new sidebar!

Would be nice to be able to activate the tag filter in the same style as the groups.

Filtering a tag with the "Filter by Tags" button on the home needs three clicks to activate a tag filter.

I liked the old direct clickable taglist over the links on the homepage more. Faster access than the new filter button.

Provide feedback in UI when password is too short

I was not sure why nothing was happening when I clicked the "Register" button on the /register page form.

I realised later that I needed to make my password longer in order for it to work.
Some small validation or error state below for form input on the front-end would be helpful. I could potentially try and contribute this if you'd like?

Nice clean UI by the way.

API Enhancement Request

Hi there,

Is it possible to have the Chrome plugin prompt for Group and Media Type while adding the links thru the extension?

Currently it just adds the link without any tags,groups or media type info which kinda add additional step to saving links since after adding the links one needs to go back and edit them manually to align them to respective groups/media type/tags.

Thanks!

Check if all links still valid

The user should be able to use the menu option to verify all their favorites to see if they are still valid (the link should not be returning a 404 code when accessed). The user can also choose the option to delete all invalid links.

Permission error when running `docker exec -it servas php artisan key:generate --force`

When running docker exec -it servas php artisan key:generate --force I get the following error:

   ErrorException 

  file_put_contents(/var/www/html/.env): Failed to open stream: Permission denied

  at vendor/laravel/framework/src/Illuminate/Foundation/Console/KeyGenerateCommand.php:109
    105106return false;
    107▕         }
    108▕ 
  ➜ 109▕         file_put_contents($this->laravel->environmentFilePath(), $replaced);
    110111return true;
    112▕     }
    113▕ 

      +15 vendor frames 

  16  artisan:35
      Illuminate\Foundation\Console\Kernel::handle()

Steps to reproduce:

  1. Download docker-compose.prod.yaml and .env.prod.example into an empty directory.
  2. Rename to docker-compose.yaml and .env respectively.
  3. Make edits to .env (see contents of both files below).
  4. Run docker-compose up -d successfully. I get the following output:
[+] Running 4/4
 ✔ Network servas_mariadb_default          Created                                                                       0.0s 
 ✔ Volume "servas_mariadb_servas-db-data"  Created                                                                       0.0s 
 ✔ Container servas_mariadb-db-1           Started                                                                       0.0s 
 ✔ Container servas                        Started                                                                       0.0s 
  1. Run docker exec -it servas php artisan key:generate --force, which gives the above mentioned error.

I tried with the SQLite container and got the same problem.

I also tried several approaches, like:

  • Clone the git repo, make the changes to docker-compose.yaml and .env and run docker-compose up -d from within the docker directory and docker/sql-example directory respectively.
  • Change the file permissions of .env to 777 (to make it readable, writeable and even executable by everyone).
  • Play with some values in docker-compose.yaml and .env, like: giving the full path instead of ./.env in the volumes section of docker-compose.yaml.

Unfortunately, nothing was able to solve the problem. Reading from the error, I assume it's a problem with the .env file not being writeable in the container, however I am not familiar enough with containers and PHP/Laravel to be able to solve it on my own. I'd love to use this bookmarks manager as it seems to be the only one I found which meets my needs (self-hosted + nested groups). Thanks in advance for your time to help me solve this.

.env content:

APP_NAME=Servas
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=http://localhost

SERVAS_ENABLE_REGISTRATION=true

# MySQL
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=servas_db
DB_USERNAME=servas_db_user
DB_PASSWORD=password

docker-compose.yaml (it's identical to the default):

version: "3"

services:
  db:
    image: mariadb:10.7.3
    restart: unless-stopped
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
    environment:
      - MARIADB_ROOT_PASSWORD=${DB_PASSWORD}
      - MARIADB_USER=${DB_USERNAME}
      - MARIADB_PASSWORD=${DB_PASSWORD}
      - MARIADB_DATABASE=${DB_DATABASE}
    volumes:
      - servas-db-data:/var/lib/mysql

  servas:
    image: beromir/servas
    container_name: servas
    restart: unless-stopped
    depends_on:
      - db
    ports:
      - "8080:80"
    volumes:
      - ./.env:/var/www/html/.env

volumes:
  servas-db-data:

General info about my system:

feature request: tags in opened link page as tag links

When opening a link and go back with clicking on link on top of page instead of browser back button, the selected tag is deselected.

Making the tags in the link page as tag links (/links?tags[0]=mytag) makes it easy to go back fast or select another tag without going bag and select a new one, if the link has multiple tags.

2023-10-02 10 00 05 c99efd17cd22 Servas_ A self-hosted bookmark management tool  _ Servas

Feature Request: Guest Landing Page

A way to show the landing page to Guests or not signed in Users. I had a use case where I want to share my bookmarks page with my friends but I do not want them to have a account. Is that possible? For reference LinkAce does this.

Error on `docker exec -it servas php artisan migrate` during initial setup

Does this look familiar to you? Not sure where things went wrong. If it helps at all, I am setting this up via a Portainer stack.

   Illuminate\Database\QueryException 

  SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for db failed: Temporary failure in name resolution (SQL: select * from information_schema.tables where table_schema = servas_db and table_name = migrations and table_type = 'BASE TABLE')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:742
    738▕         // If an exception occurs when attempting to run a query, we'll format the error
    739▕         // message to include the bindings with SQL, which will make this exception a
    740▕         // lot more helpful to the developer instead of just the database's errors.
    741▕         catch (Exception $e) {
  ➜ 742▕             throw new QueryException(
    743▕                 $query, $this->prepareBindings($bindings), $e
    744▕             );
    745▕         }
    746▕     }

      +36 vendor frames 
  37  artisan:37
      Illuminate\Foundation\Console\Kernel::handle()

Registration page 404

Currently deploying this via Dockge. Visiting the main page of the site after installation shows the login form (at http://192.168.50.204:8186/login), but changing the url to /register gives me a 404. This is my compose file:

version: "3"
services:
  servas:
    image: beromir/servas
    container_name: servas
    restart: unless-stopped
    environment:
      - APP_NAME=Bookmarks
      - APP_ENV=production
      - APP_KEY=keyhere
      - APP_DEBUG=false
      - APP_URL=http://192.168.50.204
      - SERVAS_ENABLE_REGISTRATION=false
      - DB_CONNECTION=sqlite
      - DB_DATABASE=/var/www/html/database/sqlite/servas.db
      - DB_FOREIGN_KEYS=true
    ports:
      - 8186:80
    volumes:
      - ./servas-db-sqlite:/var/www/html/database/sqlite
networks:
  backend:
    external: true

Logs show:

servas  | Starting Migration...
servas  | 
servas  |    INFO  Nothing to migrate.  
servas  | 
servas  | Creating caches...
servas  | 
servas  |    INFO  Configuration cached successfully.  
servas  | 
servas  | 
servas  |    INFO  Blade templates cached successfully.  
servas  | 
servas  | [06-Apr-2024 04:04:54] NOTICE: fpm is running, pid 18
servas  | [06-Apr-2024 04:04:54] NOTICE: ready to handle connections
servas  | 127.0.0.1 -  06/Apr/2024:04:05:00 +0000 "GET /index.php" 200
servas  | 127.0.0.1 -  06/Apr/2024:04:05:04 +0000 "GET /index.php" 404

Not really sure what I'm missing here. Any ideas?

Thanks.

Issue: Register endpoint is not working

Issue

login endpoint works however, https://your-servas-instance/register endpoint returns a 404 page

Setup

RASP Pi 4 - 4GB
docker + portainer
APP_URL=http://127.0.0.1
sqlite option

Suggestion:

create default account and allow user to login and change or add a new one

.env is a directory

when docker tries to mount the .env file and that file does not exist in the container docker will mount it as a directory.
So when I try to create the keys I get an ErrorException that .env is a directory.

I do not know how this can best be fixed but it would be nice.

npm run prod > build

Hello!
I had to change the command line
npm run prod
to
npm run build
from the readme so I don't get
npm ERR! Missing script: "prod

have a nice day!

Ensure that MFA has been setup before enabling it in the user account

The existing workflow is:

As a user, access profile settings, select "enable" on the multi-factor setting. Done.

While this is very low-impact, this means that you may potentially lock the user out if this was not enabled correctly (perhaps the user's browser session was interrupted, or the page didn't render properly). Instead, the workflow should be:

  1. Select "enable" on the multi-factor setting.
  2. Setup the MFA secret on the authenticator.
  3. Enter an MFA code into the settings page to confirm.

This will ensure that the MFA has been setup in the MFA application.

[BUG] Previously selected group shows as selected when adding multiple links back to back but is not actually set after creating a new link

Bug description:

When I add multiple links after another it shows "1 Group selected", refering to the previous links group. However when the link is created, it does not actually end up in the "selected" group.

It seems as if opening the "Select a group" dialog somehow updates the group property even clicking "cancel" immediately.

Steps to reproduce:

  1. Click "New Link"
  2. Add URL
  3. Select a group
  4. Click "Create Link"
  5. Click "New Link" again
  6. Add URL
  7. Click "Create Link"

Expected behavior:

The previous group selection should either not used when creating a new link or be set without opening the "Select a group" dialog.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.