Compare commits
2 Commits
3b2297e954
...
main
Author | SHA1 | Date | |
---|---|---|---|
21893fe612 | |||
665b4f9ab7 |
6
TODO.md
6
TODO.md
@ -14,9 +14,9 @@
|
||||
* ✅ Nodejs + Express
|
||||
* Create a site
|
||||
* Document
|
||||
* How to create a runtime
|
||||
* How to create a funko
|
||||
* How to setup the proxy
|
||||
* FaaSO for app developers
|
||||
* FaaSO for runtime developers
|
||||
* FaaSO server setup
|
||||
* APIs
|
||||
* Sanitize all inputs
|
||||
* ✅ Streaming responses in slow operations like scaling down
|
||||
|
@ -2,8 +2,8 @@
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="stylesheet" href="https://matcha.mizu.sh/matcha.css" />
|
||||
<script src="https://unpkg.com/htmx.org@2.0.0"></script>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@1/css/pico.min.css" />
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.colors.min.css" /> <script src="https://unpkg.com/htmx.org@2.0.0"></script>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
|
||||
@ -11,15 +11,20 @@
|
||||
<header class="container">
|
||||
<h1>FaaSO Admin Interface</h1>
|
||||
</header>
|
||||
<main class=container>
|
||||
<h2>Your Funko Collection
|
||||
<button id="update-funkos" style="float:right; display:inline;" hx-trigger="load, click, every 60s"
|
||||
<article>
|
||||
<nav>
|
||||
<ul>
|
||||
<li><strong style="font-size: 200%;">Your Funko Collection</strong></li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><button id="update-funkos" style="float:right; display:inline;" hx-trigger="load, click, every 60s"
|
||||
hx-get="funkos/?format=html" hx-target="#funko-list">
|
||||
Refresh
|
||||
</button>
|
||||
</h2>
|
||||
</ul>
|
||||
</nav>
|
||||
<span id="message"></span>
|
||||
<table hx-target="#message">
|
||||
<table hx-target="#message" class="striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
@ -31,23 +36,27 @@
|
||||
</tbody>
|
||||
</table>
|
||||
<div id="terminal" style="resize: vertical; overflow: auto;"></div>
|
||||
</main>
|
||||
</article>
|
||||
<script>
|
||||
update_funkos = function () {
|
||||
document.getElementById("update-funkos").click()
|
||||
}
|
||||
</script>
|
||||
<main class=container>
|
||||
<h2>
|
||||
Your Secrets
|
||||
<button id="update-secrets" style="float:right; display:inline;" hx-trigger="load, click, every 60s"
|
||||
<article>
|
||||
<nav>
|
||||
<ul>
|
||||
<li><strong style="font-size: 200%;">Your Secrets</strong>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><button id="update-secrets" style="float:right; display:inline;" hx-trigger="load, click, every 60s"
|
||||
hx-get="secrets/?format=html" hx-target="#secret-list">
|
||||
Refresh
|
||||
</button>
|
||||
<button style="float:right; display:inline;" onclick="show_new_secret()">
|
||||
<li><button style="float:right; display:inline;" onclick="show_new_secret()">
|
||||
Add
|
||||
</button>
|
||||
</h2>
|
||||
</ul>
|
||||
</nav>
|
||||
<span id="message"></span>
|
||||
<table hx-target="#message">
|
||||
<thead>
|
||||
@ -60,14 +69,20 @@
|
||||
<tbody id="secret-list">
|
||||
</tbody>
|
||||
<dialog id="add-secret">
|
||||
<topic>New Secret</topic>
|
||||
<article>
|
||||
<header>
|
||||
New Secret
|
||||
</header>
|
||||
<form hx-post="secrets/">
|
||||
<input placeholder="funko name" id="new-secret-funko" name="funko">
|
||||
<input placeholder="secret name" id="new-secret-name" name="name">
|
||||
<input placeholder="secret value" type="password" id="new-secret-password" name="value">
|
||||
<button type="submit" hx-on:htmx:after-request="hide_new_secret()">CREATE</button>
|
||||
<fieldset role="group" style="text-align: right;">
|
||||
<button style="width:9em; display: inline;" type="submit" hx-on:htmx:after-request="hide_new_secret()">CREATE</button>
|
||||
<button style="width:9em; display: inline;" onclick="hide_new_secret(); close();" aria-label="Close" rel="prev">CLOSE</button>
|
||||
</fieldset>
|
||||
</form>
|
||||
<button onclick="hide_new_secret(); close();">CLOSE</button>
|
||||
</article>
|
||||
</dialog>
|
||||
<script>
|
||||
update_secrets = function() {
|
||||
@ -87,5 +102,5 @@
|
||||
update_secrets()
|
||||
}
|
||||
</script>
|
||||
</main>
|
||||
</article>
|
||||
</body>
|
||||
|
@ -44,10 +44,6 @@ shards:
|
||||
git: https://github.com/mamantoha/http_proxy.git
|
||||
version: 0.10.3
|
||||
|
||||
inotify:
|
||||
git: https://github.com/petoem/inotify.cr.git
|
||||
version: 1.0.3
|
||||
|
||||
kemal:
|
||||
git: https://github.com/kemalcr/kemal.git
|
||||
version: 1.5.0
|
||||
|
@ -30,8 +30,6 @@ dependencies:
|
||||
docr:
|
||||
github: ralsina/docr
|
||||
branch: add_exposed_ports
|
||||
inotify:
|
||||
github: petoem/inotify.cr
|
||||
kemal:
|
||||
github: kemalcr/kemal
|
||||
kemal-basic-auth:
|
||||
|
@ -1,16 +1,11 @@
|
||||
require "./funko.cr"
|
||||
require "docr"
|
||||
require "inotify"
|
||||
require "kemal"
|
||||
|
||||
module Proxy
|
||||
CADDY_CONFIG_PATH = "config/funkos"
|
||||
@@current_config = File.read(CADDY_CONFIG_PATH)
|
||||
|
||||
@@watcher = Inotify.watch(CADDY_CONFIG_PATH) do |_|
|
||||
Log.info { "Reloading caddy config" }
|
||||
Process.run(command: "caddy", args: ["reload", "--config", CADDY_CONFIG_PATH])
|
||||
end
|
||||
CADDY_CONFIG_PATH = "config/Caddyfile"
|
||||
CADDY_CONFIG_FUNKOS = "config/funkos"
|
||||
@@current_config = File.read(CADDY_CONFIG_FUNKOS)
|
||||
|
||||
# Get current proxy config
|
||||
get "/proxy/" do
|
||||
@ -25,7 +20,7 @@ module Proxy
|
||||
update_proxy_config
|
||||
end
|
||||
|
||||
def self.update_proxy_config
|
||||
def self.update_proxy_config : Nil
|
||||
docker_api = Docr::API.new(Docr::Client.new)
|
||||
containers = docker_api.containers.list(all: true)
|
||||
|
||||
@ -50,13 +45,13 @@ module Proxy
|
||||
|
||||
if @@current_config != config
|
||||
Log.info { "Updating proxy config" }
|
||||
File.open(CADDY_CONFIG_PATH, "w") do |file|
|
||||
File.open(CADDY_CONFIG_FUNKOS, "w") do |file|
|
||||
file << config
|
||||
end
|
||||
# Reload config
|
||||
@@current_config = config
|
||||
Process.run(command: "caddy", args: ["reload", "--config", CADDY_CONFIG_PATH])
|
||||
end
|
||||
config
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -1,39 +1,32 @@
|
||||
<%- result.each do |f| -%>
|
||||
<tr hx-indicator="#spinner-<%= f["name"] %>">
|
||||
<td>
|
||||
<td style="vertical-align: top;">
|
||||
<%= f["name"] %>
|
||||
<img id="spinner-<%= f["name"] %>" src="bars.svg" class="htmx-indicator">
|
||||
</td>
|
||||
<td>
|
||||
<table>
|
||||
<thead>
|
||||
<th>ID</th>
|
||||
<th>Current?</th>
|
||||
<th>Actions</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<td style="vertical-align: top;">
|
||||
<%- f["containers"].as(Array(Docr::Types::ContainerSummary)).each do |c| -%>
|
||||
<tr>
|
||||
<td><tt><%= c.@names[0].split("-")[-1] %></tt></td>
|
||||
<td>
|
||||
<div class="grid">
|
||||
<div>
|
||||
<tt><%= c.@names[0].split("-")[-1] %></tt>
|
||||
</div>
|
||||
<div>
|
||||
<%- if c.image_id == f["latest_image"] -%>
|
||||
<span style="color:green;""> 🟢</span>
|
||||
<%- else -%>
|
||||
<span style="color:red;""> 🟢</span>
|
||||
<%- end -%>
|
||||
</td>
|
||||
<td>
|
||||
</div>
|
||||
<div role="group">
|
||||
<button hx-target="#terminal" hx-get="funkos/terminal/logs/<%= c.@names[0].lstrip("/") %>/">Logs</button>
|
||||
<button hx-target="#terminal" hx-get="funkos/terminal/shell/<%= c.@names[0].lstrip("/") %>/">Shell</button>
|
||||
</td>
|
||||
</tr>
|
||||
</div>
|
||||
</div>
|
||||
<%- end -%>
|
||||
</tbody>
|
||||
</p>
|
||||
</td>
|
||||
|
||||
</table>
|
||||
<td>
|
||||
<div role="group">
|
||||
<%- if f["name"] == "proxy" -%>
|
||||
<%- else -%>
|
||||
<%- if f["scale"].as(String).to_i > 0 -%>
|
||||
@ -47,6 +40,7 @@
|
||||
<%- end -%>
|
||||
<button hx-get="funkos/<%= f["name"] %>/restart" hx-on:htmx:after-request="update_funkos()">Restart</button>
|
||||
<%- end -%>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<%- end -%>
|
||||
|
Reference in New Issue
Block a user