Compare commits
2 Commits
master
...
feature/gi
Author | SHA1 | Date | |
---|---|---|---|
a5da2fbd40 | |||
df1a3e6512 |
11
.drone.yml
11
.drone.yml
@ -2,15 +2,8 @@ kind: pipeline
|
|||||||
name: default
|
name: default
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: specs
|
- name: test
|
||||||
image: ruby
|
image: ruby
|
||||||
environment:
|
|
||||||
REDIS_HOST: redis
|
|
||||||
commands:
|
commands:
|
||||||
- cp config.yml.erb.example config.yml.erb
|
|
||||||
- bundle install --jobs=3 --retry=3
|
- bundle install --jobs=3 --retry=3
|
||||||
- bundle exec rake test
|
- rake test
|
||||||
|
|
||||||
services:
|
|
||||||
- name: redis
|
|
||||||
image: redis
|
|
||||||
|
33
.gitea/workflows/ruby.yml
Normal file
33
.gitea/workflows/ruby.yml
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
name: Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
ruby-version: ['2.7', '3.0', '3.1']
|
||||||
|
redis-version: [6, 7]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Set up Ruby
|
||||||
|
uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: ${{ matrix.ruby-version }}
|
||||||
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
||||||
|
- name: Start Redis
|
||||||
|
uses: supercharge/redis-github-action@1.4.0
|
||||||
|
with:
|
||||||
|
redis-version: ${{ matrix.redis-version }}
|
||||||
|
- name: Configure
|
||||||
|
run: cp config.yml.erb.example config.yml.erb
|
||||||
|
- name: Run tests
|
||||||
|
run: bundle exec rake test
|
33
.github/workflows/ruby.yml
vendored
Normal file
33
.github/workflows/ruby.yml
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
name: Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
ruby-version: ['2.7', '3.0', '3.1']
|
||||||
|
redis-version: [6, 7]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Set up Ruby
|
||||||
|
uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: ${{ matrix.ruby-version }}
|
||||||
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
||||||
|
- name: Start Redis
|
||||||
|
uses: supercharge/redis-github-action@1.4.0
|
||||||
|
with:
|
||||||
|
redis-version: ${{ matrix.redis-version }}
|
||||||
|
- name: Configure
|
||||||
|
run: cp config.yml.erb.example config.yml.erb
|
||||||
|
- name: Run tests
|
||||||
|
run: bundle exec rake test
|
4
Gemfile
4
Gemfile
@ -6,8 +6,9 @@ gem "activesupport", "~> 6.1.0"
|
|||||||
gem "redis", "~> 4.6.0"
|
gem "redis", "~> 4.6.0"
|
||||||
gem "rest-client", "~> 2.1.0"
|
gem "rest-client", "~> 2.1.0"
|
||||||
gem "aws-sigv4", "~> 1.0.0"
|
gem "aws-sigv4", "~> 1.0.0"
|
||||||
|
# Remove require when we can update to 3.0, which sets the new storage
|
||||||
|
# format to columnar by default. Increases performance
|
||||||
gem "mime-types"
|
gem "mime-types"
|
||||||
gem "rainbows"
|
|
||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
gem 'rake'
|
gem 'rake'
|
||||||
@ -19,5 +20,6 @@ group :test do
|
|||||||
end
|
end
|
||||||
|
|
||||||
group :staging, :production do
|
group :staging, :production do
|
||||||
|
gem "rainbows"
|
||||||
gem "sentry-raven", require: false
|
gem "sentry-raven", require: false
|
||||||
end
|
end
|
||||||
|
40
README.md
40
README.md
@ -1,55 +1,21 @@
|
|||||||
[](https://drone.kosmos.org/5apps/liquor-cabinet)
|
[](https://github.com/5apps/liquor-cabinet/actions/workflows/ruby.yml)
|
||||||
|
|
||||||
# Liquor Cabinet
|
# Liquor Cabinet
|
||||||
|
|
||||||
Liquor Cabinet is where Frank stores all his stuff. It's a
|
Liquor Cabinet is where Frank stores all his stuff. It's a
|
||||||
[remoteStorage](https://remotestorage.io) HTTP API, based on Sinatra. The
|
[remoteStorage](https://remotestorage.io) HTTP API, based on Sinatra. The
|
||||||
metadata and OAuth tokens are stored in Redis, and
|
metadata and OAuth tokens are stored in Redis, and documents can be stored in
|
||||||
documents/files can be stored in anything that supports
|
anything that supports the storage API of either Openstack Swift or Amazon S3.
|
||||||
the S3 object storage API.
|
|
||||||
|
|
||||||
Liquor Cabinet only implements the storage API part of the remoteStorage
|
Liquor Cabinet only implements the storage API part of the remoteStorage
|
||||||
protocol, but does not include the Webfinger and OAuth parts. It is meant to be
|
protocol, but does not include the Webfinger and OAuth parts. It is meant to be
|
||||||
added to existing systems and user accounts, so you will have to add your own
|
added to existing systems and user accounts, so you will have to add your own
|
||||||
OAuth dialog for remoteStorage authorizations and persist the tokens in Redis.
|
OAuth dialog for remoteStorage authorizations and persist the tokens in Redis.
|
||||||
|
|
||||||
There is an [open-source accounts management
|
|
||||||
app](https://gitea.kosmos.org/kosmos/akkounts/) by the Kosmos project, which
|
|
||||||
comes with a built-in remoteStorage dashboard and is compatible with Liquor
|
|
||||||
Cabinet.
|
|
||||||
|
|
||||||
If you have any questions about this program, please [post to the RS
|
If you have any questions about this program, please [post to the RS
|
||||||
forums](https://community.remotestorage.io/c/server-development), and we'll
|
forums](https://community.remotestorage.io/c/server-development), and we'll
|
||||||
gladly answer them.
|
gladly answer them.
|
||||||
|
|
||||||
## System requirements
|
|
||||||
|
|
||||||
* [Ruby](https://www.ruby-lang.org/en/) and [Bundler](https://bundler.io/)
|
|
||||||
* [Redis](https://redis.io/)
|
|
||||||
* S3-compatible object storage (e.g. [Garage](https://garagehq.deuxfleurs.fr/)
|
|
||||||
or [MinIO](https://min.io/) for self-hosting)
|
|
||||||
|
|
||||||
## Setup
|
|
||||||
|
|
||||||
1. Check the `config.yml.erb.example` file. Either copy it to `config.yml.erb`
|
|
||||||
and use the enviroment variables it contains, or create/deploy your own
|
|
||||||
config YAML file with custom values.
|
|
||||||
2. Install dependencies: `bundle install`
|
|
||||||
|
|
||||||
## Development
|
|
||||||
|
|
||||||
Running the test suite:
|
|
||||||
|
|
||||||
bundle exec rake test
|
|
||||||
|
|
||||||
Running the app:
|
|
||||||
|
|
||||||
bundle exec rainbows
|
|
||||||
|
|
||||||
## Deployment
|
|
||||||
|
|
||||||
_TODO document options_
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
We love pull requests. If you want to submit a patch:
|
We love pull requests. If you want to submit a patch:
|
||||||
|
@ -431,9 +431,9 @@ module RemoteStorage
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def escape(str)
|
def escape(url)
|
||||||
# We want spaces to turn into %20 and slashes to stay slashes
|
# We want spaces to turn into %20 and slashes to stay slashes
|
||||||
CGI::escape(str).gsub('+', '%20').gsub('%2F', '/')
|
CGI::escape(url).gsub('+', '%20').gsub('%2F', '/')
|
||||||
end
|
end
|
||||||
|
|
||||||
def redis
|
def redis
|
||||||
|
@ -15,8 +15,7 @@ module RemoteStorage
|
|||||||
service: 's3',
|
service: 's3',
|
||||||
region: settings.s3["region"],
|
region: settings.s3["region"],
|
||||||
access_key_id: settings.s3["access_key_id"].to_s,
|
access_key_id: settings.s3["access_key_id"].to_s,
|
||||||
secret_access_key: settings.s3["secret_key_id"].to_s,
|
secret_access_key: settings.s3["secret_key_id"].to_s
|
||||||
uri_escape_path: false
|
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -30,8 +29,6 @@ module RemoteStorage
|
|||||||
headers = { "Content-Type" => content_type }
|
headers = { "Content-Type" => content_type }
|
||||||
auth_headers = auth_headers_for("PUT", url, headers, data)
|
auth_headers = auth_headers_for("PUT", url, headers, data)
|
||||||
|
|
||||||
# TODO check if put was successful, e.g. it's returning a 413 directly
|
|
||||||
# if the back-end does, too (missing CORS headers in that case)
|
|
||||||
res = RestClient.put(url, data, headers.merge(auth_headers))
|
res = RestClient.put(url, data, headers.merge(auth_headers))
|
||||||
|
|
||||||
return [
|
return [
|
||||||
@ -85,6 +82,10 @@ module RemoteStorage
|
|||||||
signature.headers
|
signature.headers
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def uri_escape(s)
|
||||||
|
CGI.escape(s).gsub('%5B', '[').gsub('%5D', ']')
|
||||||
|
end
|
||||||
|
|
||||||
def base_url
|
def base_url
|
||||||
@base_url ||= settings.s3["endpoint"]
|
@base_url ||= settings.s3["endpoint"]
|
||||||
end
|
end
|
||||||
|
11
run-dev.sh
Executable file
11
run-dev.sh
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
RACK_ENV=development \
|
||||||
|
REDIS_HOST=localhost \
|
||||||
|
REDIS_PORT=6379 \
|
||||||
|
REDIS_DB=1 \
|
||||||
|
S3_ENDPOINT='http://localhost:9000' \
|
||||||
|
S3_ACCESS_KEY='dev-key' \
|
||||||
|
S3_SECRET_KEY='123456789' \
|
||||||
|
S3_BUCKET=remotestorage \
|
||||||
|
bundle exec rackup -p 4567
|
Loading…
x
Reference in New Issue
Block a user