Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a271e7c35d | |||
| a46a50b429 | |||
| dc8c359bfc | |||
| dfb6b10caf |
@@ -154,6 +154,58 @@
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Self-hosted
|
||||||
|
|
||||||
|
### Run via docker-compose
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose up
|
||||||
|
|
||||||
|
# Optional: Generate an api key
|
||||||
|
# docker-compose exec -it app cli --create-user=Admin
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run via docker cli
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run \
|
||||||
|
--name bit \
|
||||||
|
-p 4000:4000 \
|
||||||
|
-e ENV="production" \
|
||||||
|
-e DATABASE_URL="sqlite3://./sqlite/data.db?journal_mode=wal&synchronous=normal&foreign_keys=true" \
|
||||||
|
-e APP_URL="http://localhost:4000" \
|
||||||
|
-e ADMIN_NAME="Admin" \
|
||||||
|
-e ADMIN_API_KEY=$(openssl rand -base64 32) \
|
||||||
|
sjdonado/bit
|
||||||
|
|
||||||
|
# Optional: Generate an api key
|
||||||
|
# docker exec -it bit cli --create-user=Admin
|
||||||
|
```
|
||||||
|
|
||||||
|
### Dokku
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
FROM sjdonado/bit
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
dokku apps:create bit
|
||||||
|
|
||||||
|
dokku domains:set bit bit.donado.co
|
||||||
|
dokku letsencrypt:enable bit
|
||||||
|
|
||||||
|
dokku storage:ensure-directory bit-sqlite
|
||||||
|
dokku storage:mount bit /var/lib/dokku/data/storage/bit-sqlite:/usr/src/app/sqlite/
|
||||||
|
|
||||||
|
dokku config:set bit DATABASE_URL="sqlite3://./sqlite/data.db?journal_mode=wal&synchronous=normal&foreign_keys=true" APP_URL=https://bit.donado.co ADMIN_NAME=Admin ADMIN_API_KEY=$(openssl rand -base64 32)
|
||||||
|
|
||||||
|
dokku ports:add bit http:80:4000
|
||||||
|
dokku ports:add bit https:443:4000
|
||||||
|
|
||||||
|
# Optional: Generate an api key
|
||||||
|
# dokku run bit cli --create-user=Admin
|
||||||
|
```
|
||||||
|
|
||||||
## CLI
|
## CLI
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -211,54 +263,6 @@ Average Memory Usage: 28.62 MiB
|
|||||||
✔ Network bit_default Removed
|
✔ Network bit_default Removed
|
||||||
```
|
```
|
||||||
|
|
||||||
## Self-hosted
|
|
||||||
|
|
||||||
### Run via docker-compose
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose up
|
|
||||||
|
|
||||||
# Generate an api key
|
|
||||||
docker-compose exec -it app cli --create-user=Admin
|
|
||||||
```
|
|
||||||
|
|
||||||
### Run via docker cli
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker run \
|
|
||||||
--name bit \
|
|
||||||
-p 4000:4000 \
|
|
||||||
-e ENV="production" \
|
|
||||||
-e DATABASE_URL="sqlite3://./sqlite/data.db?journal_mode=wal&synchronous=normal&foreign_keys=true" \
|
|
||||||
-e APP_URL="http://localhost:4000" \
|
|
||||||
sjdonado/bit
|
|
||||||
|
|
||||||
docker exec -it bit cli --create-user=Admin
|
|
||||||
```
|
|
||||||
|
|
||||||
### Dokku
|
|
||||||
|
|
||||||
```dockerfile
|
|
||||||
FROM sjdonado/bit
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash
|
|
||||||
dokku apps:create bit
|
|
||||||
|
|
||||||
dokku domains:set bit bit.donado.co
|
|
||||||
dokku letsencrypt:enable bit
|
|
||||||
|
|
||||||
dokku storage:ensure-directory bit-sqlite
|
|
||||||
dokku storage:mount bit /var/lib/dokku/data/storage/bit-sqlite:/usr/src/app/sqlite/
|
|
||||||
|
|
||||||
dokku config:set bit DATABASE_URL="sqlite3://./sqlite/data.db?journal_mode=wal&synchronous=normal&foreign_keys=true" APP_URL=https://bit.donado.co
|
|
||||||
|
|
||||||
dokku ports:add bit http:80:4000
|
|
||||||
dokku ports:add bit https:443:4000
|
|
||||||
|
|
||||||
dokku run bit cli --create-user=Admin
|
|
||||||
```
|
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
- Setup
|
- Setup
|
||||||
|
|||||||
+20
-2
@@ -3,11 +3,11 @@ require "../lib/*"
|
|||||||
require "../models/*"
|
require "../models/*"
|
||||||
|
|
||||||
module App::Services::Cli
|
module App::Services::Cli
|
||||||
def self.create_user(name)
|
def self.create_user(name, api_key = nil)
|
||||||
user = App::Models::User.new
|
user = App::Models::User.new
|
||||||
user.id = UUID.v4.to_s
|
user.id = UUID.v4.to_s
|
||||||
user.name = name
|
user.name = name
|
||||||
user.api_key = Random::Secure.urlsafe_base64()
|
user.api_key = api_key || Random::Secure.urlsafe_base64()
|
||||||
|
|
||||||
changeset = App::Lib::Database.insert(user)
|
changeset = App::Lib::Database.insert(user)
|
||||||
return changeset.errors if !changeset.valid?
|
return changeset.errors if !changeset.valid?
|
||||||
@@ -35,4 +35,22 @@ module App::Services::Cli
|
|||||||
|
|
||||||
"User with ID #{user_id} deleted successfully"
|
"User with ID #{user_id} deleted successfully"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.setup_admin_user
|
||||||
|
admin_name = ENV["ADMIN_NAME"]?
|
||||||
|
admin_api_key = ENV["ADMIN_API_KEY"]?
|
||||||
|
|
||||||
|
if admin_name && admin_api_key
|
||||||
|
query = App::Lib::Database::Query.where(name: admin_name, api_key: admin_api_key).limit(1)
|
||||||
|
existing_user = App::Lib::Database.all(App::Models::User, query).first?
|
||||||
|
|
||||||
|
return if existing_user
|
||||||
|
|
||||||
|
puts "Admin user setup detected. Creating admin user..."
|
||||||
|
result = create_user(admin_name, admin_api_key)
|
||||||
|
puts result
|
||||||
|
else
|
||||||
|
puts "Admin setup skipped: Missing ADMIN_NAME or ADMIN_API_KEY environment variables."
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -12,4 +12,6 @@ require "./app/routes"
|
|||||||
add_context_storage_type(App::Models::User)
|
add_context_storage_type(App::Models::User)
|
||||||
add_handler(App::Middlewares::Auth.new)
|
add_handler(App::Middlewares::Auth.new)
|
||||||
|
|
||||||
|
App::Services::Cli.setup_admin_user
|
||||||
|
|
||||||
Kemal.run
|
Kemal.run
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ services:
|
|||||||
build: .
|
build: .
|
||||||
environment:
|
environment:
|
||||||
ENV: production
|
ENV: production
|
||||||
|
ADMIN_NAME: 'Tester'
|
||||||
|
ADMIN_API_KEY: '0p+mDvbpZGLPGVCXnV+EDduR9Blkv27Dhq9XSzSbdQY='
|
||||||
ports:
|
ports:
|
||||||
- 4000:4000
|
- 4000:4000
|
||||||
volumes:
|
volumes:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: bit
|
name: bit
|
||||||
version: 1.2.1
|
version: 1.4.0
|
||||||
|
|
||||||
authors:
|
authors:
|
||||||
- Juan Rodriguez <sjdonado@icloud.com>
|
- Juan Rodriguez <sjdonado@icloud.com>
|
||||||
|
|||||||
@@ -34,4 +34,29 @@ describe "App::Services::Cli" do
|
|||||||
|
|
||||||
output.should contain "Failed to delete user"
|
output.should contain "Failed to delete user"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "sets up an admin user if environment variables are present" do
|
||||||
|
ENV["ADMIN_NAME"] = "adminuser"
|
||||||
|
ENV["ADMIN_API_KEY"] = "secure_admin_key"
|
||||||
|
|
||||||
|
App::Services::Cli.setup_admin_user
|
||||||
|
|
||||||
|
admin_user = App::Lib::Database.all(App::Models::User).find { |u| u.name == "adminuser" }
|
||||||
|
admin_user.should_not be_nil
|
||||||
|
admin_user = admin_user.not_nil!
|
||||||
|
|
||||||
|
admin_user.api_key.should eq "secure_admin_key"
|
||||||
|
|
||||||
|
App::Services::Cli.delete_user(admin_user.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "skips admin setup if environment variables are missing" do
|
||||||
|
ENV.delete("ADMIN_NAME")
|
||||||
|
ENV.delete("ADMIN_API_KEY")
|
||||||
|
|
||||||
|
App::Services::Cli.setup_admin_user
|
||||||
|
|
||||||
|
users = App::Lib::Database.all(App::Models::User)
|
||||||
|
users.none? { |u| u.name == "adminuser" }.should be_true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user