mirror of
https://github.com/psviderski/uncloud.git
synced 2026-08-28 12:03:33 +00:00
Compare commits
9
Commits
6266e9ec3a
...
b3896ff642
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3896ff642 | ||
|
|
5b2823de1e | ||
|
|
0007f76d09 | ||
|
|
f8e6d1caaa | ||
|
|
e684795aee | ||
|
|
7964273552 | ||
|
|
4ad4bce29d | ||
|
|
d670d18810 | ||
|
|
a1957a156e |
@@ -154,7 +154,6 @@ Here is a diagram of an Uncloud multi-provider cluster of 3 machines:
|
|||||||
```bash
|
```bash
|
||||||
$ uc machine init --name oracle-vm ubuntu@152.67.101.197
|
$ uc machine init --name oracle-vm ubuntu@152.67.101.197
|
||||||
|
|
||||||
Downloading Uncloud install script: https://raw.githubusercontent.com/psviderski/uncloud/refs/heads/main/scripts/install.sh
|
|
||||||
⏳ Running Uncloud install script...
|
⏳ Running Uncloud install script...
|
||||||
✓ Docker is already installed.
|
✓ Docker is already installed.
|
||||||
⏳ Installing Docker...
|
⏳ Installing Docker...
|
||||||
@@ -169,9 +168,6 @@ Downloading Uncloud install script: https://raw.githubusercontent.com/psviderski
|
|||||||
✓ uncloud-uninstall script installed: /usr/local/bin/uncloud-uninstall
|
✓ uncloud-uninstall script installed: /usr/local/bin/uncloud-uninstall
|
||||||
✓ Systemd unit file created: /etc/systemd/system/uncloud.service
|
✓ Systemd unit file created: /etc/systemd/system/uncloud.service
|
||||||
Created symlink /etc/systemd/system/multi-user.target.wants/uncloud.service → /etc/systemd/system/uncloud.service.
|
Created symlink /etc/systemd/system/multi-user.target.wants/uncloud.service → /etc/systemd/system/uncloud.service.
|
||||||
⏳ Downloading uncloud-corrosion binary: https://github.com/psviderski/corrosion/releases/latest/download/corrosion-aarch64-unknown-linux-gnu.tar.gz
|
|
||||||
✓ uncloud-corrosion binary installed: /usr/local/bin/uncloud-corrosion
|
|
||||||
✓ Systemd unit file created: /etc/systemd/system/uncloud-corrosion.service
|
|
||||||
⏳ Starting Uncloud machine daemon (uncloud.service)...
|
⏳ Starting Uncloud machine daemon (uncloud.service)...
|
||||||
✓ Uncloud machine daemon started.
|
✓ Uncloud machine daemon started.
|
||||||
✓ Uncloud installed on the machine successfully! 🎉
|
✓ Uncloud installed on the machine successfully! 🎉
|
||||||
@@ -190,21 +186,20 @@ DNS records updated to use only the internet-reachable machines running caddy se
|
|||||||
*.xuw3xd.cluster.uncloud.run A → 152.67.101.197
|
*.xuw3xd.cluster.uncloud.run A → 152.67.101.197
|
||||||
```
|
```
|
||||||
|
|
||||||
1. The CLI SSHs into the machine and installs Docker, the `uncloudd` machine daemon and
|
1. The CLI SSHs into the machine and installs Docker and the `uncloudd` machine daemon, managed by systemd.
|
||||||
[corrosion](https://github.com/superfly/corrosion) service, managed by systemd.
|
|
||||||
2. Generates a unique WireGuard key pair, allocates a dedicated subnet `10.210.0.0/24` for the machine and its
|
2. Generates a unique WireGuard key pair, allocates a dedicated subnet `10.210.0.0/24` for the machine and its
|
||||||
containers, and configures `uncloudd` accordingly. All subsequent communication happens with `uncloudd`
|
containers, and configures `uncloudd` accordingly. All subsequent communication happens with `uncloudd`
|
||||||
through its gRPC API over SSH.
|
through its gRPC API over SSH.
|
||||||
3. Configures and starts `corrosion`, a CRDT-based distributed SQLite database to share cluster state between machines.
|
3. Configures and starts [corrosion](https://github.com/superfly/corrosion), a CRDT-based distributed SQLite database to
|
||||||
|
share cluster state between machines, as a Docker container managed by `uncloudd`.
|
||||||
4. Creates a Docker bridge network connected to the WireGuard interface.
|
4. Creates a Docker bridge network connected to the WireGuard interface.
|
||||||
5. This machine becomes an entry point for the newly created cluster which is stored in the cluster config under
|
5. This machine becomes an entry point for the newly created cluster. Its address is stored as a connection info in the
|
||||||
`~/.config/uncloud` on your local machine.
|
cluster config at `~/.config/uncloud/config.yaml` on your local machine.
|
||||||
|
|
||||||
**When you add another machine:**
|
**When you add another machine:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ uc machine add --name hetzner-server root@5.223.45.199
|
$ uc machine add --name hetzner-server root@5.223.45.199
|
||||||
Downloading Uncloud install script: https://raw.githubusercontent.com/psviderski/uncloud/refs/heads/main/scripts/install.sh
|
|
||||||
⏳ Running Uncloud install script...
|
⏳ Running Uncloud install script...
|
||||||
✓ Docker is already installed.
|
✓ Docker is already installed.
|
||||||
✓ Linux user and group 'uncloud' created.
|
✓ Linux user and group 'uncloud' created.
|
||||||
@@ -215,9 +210,6 @@ Downloading Uncloud install script: https://raw.githubusercontent.com/psviderski
|
|||||||
✓ uncloud-uninstall script installed: /usr/local/bin/uncloud-uninstall
|
✓ uncloud-uninstall script installed: /usr/local/bin/uncloud-uninstall
|
||||||
✓ Systemd unit file created: /etc/systemd/system/uncloud.service
|
✓ Systemd unit file created: /etc/systemd/system/uncloud.service
|
||||||
Created symlink /etc/systemd/system/multi-user.target.wants/uncloud.service → /etc/systemd/system/uncloud.service.
|
Created symlink /etc/systemd/system/multi-user.target.wants/uncloud.service → /etc/systemd/system/uncloud.service.
|
||||||
⏳ Downloading uncloud-corrosion binary: https://github.com/psviderski/corrosion/releases/latest/download/corrosion-x86_64-unknown-linux-gnu.tar.gz
|
|
||||||
✓ uncloud-corrosion binary installed: /usr/local/bin/uncloud-corrosion
|
|
||||||
✓ Systemd unit file created: /etc/systemd/system/uncloud-corrosion.service
|
|
||||||
⏳ Starting Uncloud machine daemon (uncloud.service)...
|
⏳ Starting Uncloud machine daemon (uncloud.service)...
|
||||||
✓ Uncloud machine daemon started.
|
✓ Uncloud machine daemon started.
|
||||||
✓ Uncloud installed on the machine successfully! 🎉
|
✓ Uncloud installed on the machine successfully! 🎉
|
||||||
@@ -246,9 +238,10 @@ hetzner-server Up 10.210.1.1/24 5.223.45.199 5.223.45.199:51820, [2
|
|||||||
3. Registers the second machine in the cluster state and exchanges WireGuard keys with the first machine.
|
3. Registers the second machine in the cluster state and exchanges WireGuard keys with the first machine.
|
||||||
4. Both machines establish a WireGuard tunnel between each other, allowing Docker containers connected to the bridge
|
4. Both machines establish a WireGuard tunnel between each other, allowing Docker containers connected to the bridge
|
||||||
network to communicate directly across machines.
|
network to communicate directly across machines.
|
||||||
5. Configures and starts `corrosion` on the second machine to sync the cluster state.
|
5. Configures and starts the `uncloud-corrosion` container on the second machine to sync the cluster state.
|
||||||
6. The second machine is added as an alternative entry point in the cluster config.
|
6. The second machine is added as an alternative entry point in the cluster config.
|
||||||
7. If one of the machines goes offline, the other machine can still serve cluster operations.
|
7. If one of the machines goes offline, the other machine can still be used by `uc` to connect and run cluster
|
||||||
|
operations.
|
||||||
|
|
||||||
If one more machine is added, the process repeats with a new subnet. The new machine needs to establish a WireGuard
|
If one more machine is added, the process repeats with a new subnet. The new machine needs to establish a WireGuard
|
||||||
connection with only one of the existing machines. Other machines will learn about it through the shared cluster state
|
connection with only one of the existing machines. Other machines will learn about it through the shared cluster state
|
||||||
|
|||||||
+2
-2
@@ -124,8 +124,8 @@ require (
|
|||||||
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
|
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
|
||||||
golang.org/x/mod v0.27.0 // indirect
|
golang.org/x/mod v0.27.0 // indirect
|
||||||
golang.org/x/net v0.43.0 // indirect
|
golang.org/x/net v0.43.0 // indirect
|
||||||
golang.org/x/sync v0.19.0 // indirect
|
golang.org/x/sync v0.20.0 // indirect
|
||||||
golang.org/x/sys v0.42.0 // indirect
|
golang.org/x/sys v0.45.0 // indirect
|
||||||
golang.org/x/text v0.28.0 // indirect
|
golang.org/x/text v0.28.0 // indirect
|
||||||
golang.org/x/tools v0.36.0 // indirect
|
golang.org/x/tools v0.36.0 // indirect
|
||||||
golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 // indirect
|
golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 // indirect
|
||||||
|
|||||||
+4
-4
@@ -660,8 +660,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
|
|||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
|
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
|
||||||
golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
||||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
@@ -694,8 +694,8 @@ golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||||||
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=
|
golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY=
|
||||||
golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
|
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
|
||||||
|
|||||||
+1
-1
@@ -22,7 +22,7 @@ Uncloud stores its configuration in `~/.config/uncloud/config.yaml`. If you wish
|
|||||||
|
|
||||||
Begin by initialising the first node in your cluster with `uc machine init [USER@HOST:PORT]`. If you do not have a need for Caddy reverse proxy, you may disable this feature with `--no-caddy`. If you want to avoid using uncloud's managed DNS service, add the `--no-dns` flag.
|
Begin by initialising the first node in your cluster with `uc machine init [USER@HOST:PORT]`. If you do not have a need for Caddy reverse proxy, you may disable this feature with `--no-caddy`. If you want to avoid using uncloud's managed DNS service, add the `--no-dns` flag.
|
||||||
|
|
||||||
This command will idempotently install Docker, uncloudd, uncloud-corrosion. If Caddy is enabled, it will set up a reverse proxy. If Uncloud DNS is enabled, it will create a DNS A record for the machine's public IP address under `*.[CLUSTER ID].uncld.dev`.
|
This command will idempotently install Docker and uncloudd. If Caddy is enabled, it will set up a reverse proxy. If Uncloud DNS is enabled, it will create a DNS A record for the machine's public IP address under `*.[CLUSTER ID].uncld.dev`.
|
||||||
|
|
||||||
If you wish to uninstall Uncloud and its components, run `uncloud-uninstall`.
|
If you wish to uninstall Uncloud and its components, run `uncloud-uninstall`.
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,25 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
:8000 {
|
:8000 {
|
||||||
|
# Reverse proxy PostHog through our own domain so ad blockers don't drop analytics requests.
|
||||||
|
# Static assets (e.g. array.js) are served from a separate PostHog assets host.
|
||||||
|
handle_path /phproxy/static/* {
|
||||||
|
rewrite * /static{uri}
|
||||||
|
reverse_proxy https://us-assets.i.posthog.com {
|
||||||
|
header_up Host us-assets.i.posthog.com
|
||||||
|
}
|
||||||
|
}
|
||||||
|
handle_path /phproxy/* {
|
||||||
|
reverse_proxy https://us.i.posthog.com {
|
||||||
|
header_up Host us.i.posthog.com
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
root * /usr/share/caddy
|
root * /usr/share/caddy
|
||||||
|
|
||||||
|
# Serve clean URLs for landing pages, e.g. /hub -> hub.html.
|
||||||
|
try_files {path}.html
|
||||||
|
|
||||||
file_server
|
file_server
|
||||||
log
|
log
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -28,4 +28,4 @@ COPY --from=prod /opt/docusaurus/build /usr/share/caddy
|
|||||||
# Copy the landing page assets.
|
# Copy the landing page assets.
|
||||||
COPY landing/images /usr/share/caddy/images
|
COPY landing/images /usr/share/caddy/images
|
||||||
COPY landing/js /usr/share/caddy/js
|
COPY landing/js /usr/share/caddy/js
|
||||||
COPY landing/index.html landing/style.css /usr/share/caddy/
|
COPY landing/index.html landing/hub.html landing/style.css /usr/share/caddy/
|
||||||
|
|||||||
@@ -63,7 +63,6 @@ All in about a minute!
|
|||||||
|
|
||||||
```
|
```
|
||||||
$ uc machine init root@157.180.72.195
|
$ uc machine init root@157.180.72.195
|
||||||
Downloading Uncloud install script: https://raw.githubusercontent.com/psviderski/uncloud/refs/heads/main/scripts/install.sh
|
|
||||||
⏳ Running Uncloud install script...
|
⏳ Running Uncloud install script...
|
||||||
⏳ Installing Docker...
|
⏳ Installing Docker...
|
||||||
# Executing docker install script, commit: 53a22f61c0628e58e1d6680b49e82993d304b449
|
# Executing docker install script, commit: 53a22f61c0628e58e1d6680b49e82993d304b449
|
||||||
@@ -142,9 +141,6 @@ WARNING: Access to the remote API on a privileged Docker daemon is equivalent
|
|||||||
✓ uncloud-uninstall script installed: /usr/local/bin/uncloud-uninstall
|
✓ uncloud-uninstall script installed: /usr/local/bin/uncloud-uninstall
|
||||||
✓ Systemd unit file created: /etc/systemd/system/uncloud.service
|
✓ Systemd unit file created: /etc/systemd/system/uncloud.service
|
||||||
Created symlink /etc/systemd/system/multi-user.target.wants/uncloud.service → /etc/systemd/system/uncloud.service.
|
Created symlink /etc/systemd/system/multi-user.target.wants/uncloud.service → /etc/systemd/system/uncloud.service.
|
||||||
⏳ Downloading uncloud-corrosion binary: https://github.com/psviderski/corrosion/releases/latest/download/corrosion-x86_64-unknown-linux-gnu.tar.gz
|
|
||||||
✓ uncloud-corrosion binary installed: /usr/local/bin/uncloud-corrosion
|
|
||||||
✓ Systemd unit file created: /etc/systemd/system/uncloud-corrosion.service
|
|
||||||
⏳ Starting Uncloud machine daemon (uncloud.service)...
|
⏳ Starting Uncloud machine daemon (uncloud.service)...
|
||||||
✓ Uncloud machine daemon started.
|
✓ Uncloud machine daemon started.
|
||||||
✓ Uncloud installed on the machine successfully! 🎉
|
✓ Uncloud installed on the machine successfully! 🎉
|
||||||
@@ -382,12 +378,13 @@ Possible reasons for having these kinds of units are:
|
|||||||
✓ Systemd services stopped.
|
✓ Systemd services stopped.
|
||||||
⏳ Removing systemd service files...
|
⏳ Removing systemd service files...
|
||||||
removed '/etc/systemd/system/uncloud.service'
|
removed '/etc/systemd/system/uncloud.service'
|
||||||
removed '/etc/systemd/system/uncloud-corrosion.service'
|
|
||||||
✓ Systemd service files removed.
|
✓ Systemd service files removed.
|
||||||
⏳ Removing binaries...
|
⏳ Removing binaries...
|
||||||
removed '/usr/local/bin/uncloudd'
|
removed '/usr/local/bin/uncloudd'
|
||||||
removed '/usr/local/bin/uncloud-corrosion'
|
|
||||||
✓ Binaries removed.
|
✓ Binaries removed.
|
||||||
|
⏳ Removing uncloudd-managed corrosion Docker container...
|
||||||
|
uncloud-corrosion
|
||||||
|
✓ uncloud-corrosion container removed.
|
||||||
⏳ Removing data and run directories...
|
⏳ Removing data and run directories...
|
||||||
removed '/var/lib/uncloud/machine.db-wal'
|
removed '/var/lib/uncloud/machine.db-wal'
|
||||||
removed '/var/lib/uncloud/caddy/caddy/autosave.json'
|
removed '/var/lib/uncloud/caddy/caddy/autosave.json'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500&family=Inter+Tight:ital,wght@0,500;0,600;0,700;1,700&display=fallback');
|
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500&family=Inter+Tight:ital,wght@0,500;0,600;0,700;1,700&family=Caveat:wght@600&display=fallback');
|
||||||
|
|
||||||
@import 'tailwindcss/base';
|
@import 'tailwindcss/base';
|
||||||
@import 'tailwindcss/components';
|
@import 'tailwindcss/components';
|
||||||
@@ -13,3 +13,47 @@
|
|||||||
[x-cloak=""] {
|
[x-cloak=""] {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Smooth in-page anchor scrolling, disabled for users who prefer reduced motion. */
|
||||||
|
html {
|
||||||
|
scroll-behavior: smooth;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
html {
|
||||||
|
scroll-behavior: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-balance {
|
||||||
|
text-wrap: balance;
|
||||||
|
}
|
||||||
|
/* Handwritten margin notes. */
|
||||||
|
.hw-note {
|
||||||
|
font-family: 'Caveat', cursive;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 1.5rem;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A hand-swiped stroke with uneven rounded edges. */
|
||||||
|
.marker-red {
|
||||||
|
position: relative;
|
||||||
|
white-space: nowrap;
|
||||||
|
color: #fff;
|
||||||
|
isolation: isolate;
|
||||||
|
}
|
||||||
|
|
||||||
|
.marker-red::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
z-index: -1;
|
||||||
|
inset: 0.08em -0.18em -0.02em -0.14em;
|
||||||
|
background: linear-gradient(100deg,
|
||||||
|
rgba(220, 38, 38, 0.82) 0%,
|
||||||
|
rgba(239, 68, 68, 0.95) 28%,
|
||||||
|
rgba(225, 29, 72, 0.9) 72%,
|
||||||
|
rgba(220, 38, 38, 0.88) 100%);
|
||||||
|
border-radius: 0.3em 0.5em 0.4em 0.6em;
|
||||||
|
transform: skew(-10deg) rotate(-0.5deg);
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
After Width: | Height: | Size: 68 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 94 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 56 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
+78
-38
@@ -3,22 +3,22 @@
|
|||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>Self-host and scale web apps without Kubernetes complexity | Uncloud</title>
|
<title>Uncloud | Multi-node Docker Compose for production</title>
|
||||||
<meta name="description"
|
<meta name="description"
|
||||||
content="Take your Docker Compose apps to production with zero-downtime deployments, automatic HTTPS, and cross-machine scaling. Self-hosting made reliable without the complexity.">
|
content="Deploy and scale Docker Compose apps across cloud VMs and your own servers. A simpler alternative to Kubernetes, Swarm, Nomad, and Kamal.">
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
|
<link rel="canonical" href="https://uncloud.run">
|
||||||
<link href="./style.css" rel="stylesheet">
|
<link href="./style.css" rel="stylesheet">
|
||||||
<link rel="apple-touch-icon" href="./images/apple-touch-icon.png" sizes="180x180"/>
|
<link rel="apple-touch-icon" href="./images/apple-touch-icon.png" sizes="180x180"/>
|
||||||
<link rel="icon" type="image/svg+xml" href="./images/logo.svg"/>
|
<link rel="icon" type="image/svg+xml" href="./images/logo.svg"/>
|
||||||
<link rel="alternate icon" type="image/png" href="./images/favicon.png" sizes="96x96"/>
|
<link rel="alternate icon" type="image/png" href="./images/favicon.png" sizes="96x96"/>
|
||||||
|
|
||||||
<!-- OpenGraph tags for social media -->
|
<!-- OpenGraph tags for social media -->
|
||||||
<meta property="og:title"
|
<meta property="og:title" content="Multi-node Docker Compose for production"/>
|
||||||
content="Self-host and scale web apps without Kubernetes complexity | Uncloud"/>
|
|
||||||
<meta property="og:description"
|
<meta property="og:description"
|
||||||
content="Take your Docker Compose apps to production with zero-downtime deployments, automatic HTTPS, and cross-machine scaling. Self-hosting made reliable without the complexity."/>
|
content="Deploy and scale Docker Compose apps across cloud VMs and your own servers. A simpler alternative to Kubernetes, Swarm, Nomad, and Kamal."/>
|
||||||
<meta property="og:image" content="https://uncloud.run/images/logo-wide.png"/>
|
<meta property="og:image" content="https://uncloud.run/images/og.png"/>
|
||||||
<meta property="og:image:alt" content="Uncloud logo - Self-host web apps with ease"/>
|
<meta property="og:image:alt" content="Uncloud: multi-node Docker Compose for production"/>
|
||||||
<meta property="og:url" content="https://uncloud.run"/>
|
<meta property="og:url" content="https://uncloud.run"/>
|
||||||
<meta property="og:type" content="website"/>
|
<meta property="og:type" content="website"/>
|
||||||
<meta property="og:site_name" content="Uncloud"/>
|
<meta property="og:site_name" content="Uncloud"/>
|
||||||
@@ -26,23 +26,13 @@
|
|||||||
<meta property="twitter:domain" content="uncloud.run">
|
<meta property="twitter:domain" content="uncloud.run">
|
||||||
<meta property="twitter:url" content="https://uncloud.run">
|
<meta property="twitter:url" content="https://uncloud.run">
|
||||||
<meta name="twitter:card" content="summary_large_image">
|
<meta name="twitter:card" content="summary_large_image">
|
||||||
<meta name="twitter:title"
|
<meta name="twitter:title" content="Multi-node Docker Compose for production">
|
||||||
content="Self-host and scale web apps without Kubernetes complexity | Uncloud">
|
|
||||||
<meta name="twitter:description"
|
<meta name="twitter:description"
|
||||||
content="Take your Docker Compose apps to production with zero-downtime deployments, automatic HTTPS, and cross-machine scaling. Self-hosting made reliable without the complexity.">
|
content="Deploy and scale Docker Compose apps across cloud VMs and your own servers. A simpler alternative to Kubernetes, Swarm, Nomad, and Kamal.">
|
||||||
<meta name="twitter:image" content="https://uncloud.run/images/logo-wide.png">
|
<meta name="twitter:image" content="https://uncloud.run/images/og.png">
|
||||||
<meta name="twitter:image:alt" content="Uncloud logo - Self-host web apps with ease">
|
<meta name="twitter:image:alt" content="Uncloud: multi-node Docker Compose for production">
|
||||||
<style>
|
|
||||||
/* Prevent all inline SVGs from appearing full screen */
|
|
||||||
svg {
|
|
||||||
max-width: 24px;
|
|
||||||
max-height: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-balance {
|
<script src="./js/posthog.js" defer></script>
|
||||||
text-wrap: balance;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="font-inter antialiased bg-white text-zinc-900 tracking-tight">
|
<body class="font-inter antialiased bg-white text-zinc-900 tracking-tight">
|
||||||
@@ -67,6 +57,15 @@
|
|||||||
<nav class="flex grow">
|
<nav class="flex grow">
|
||||||
<!-- Left side navigation -->
|
<!-- Left side navigation -->
|
||||||
<ul class="flex items-center">
|
<ul class="flex items-center">
|
||||||
|
<li>
|
||||||
|
<a class="text-sm font-medium text-zinc-500 hover:text-zinc-900 px-2 sm:px-5 py-2 transition inline-flex items-center"
|
||||||
|
href="/hub">
|
||||||
|
Hub
|
||||||
|
<span class="inline-block ml-1 -translate-y-1.5 text-[10px] font-semibold uppercase tracking-wide text-violet-700 bg-violet-100 px-1.5 py-0.5 rounded">
|
||||||
|
New
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a class="text-sm font-medium text-zinc-500 hover:text-zinc-900 px-2 sm:px-5 py-2 transition"
|
<a class="text-sm font-medium text-zinc-500 hover:text-zinc-900 px-2 sm:px-5 py-2 transition"
|
||||||
href="/docs">Docs</a>
|
href="/docs">Docs</a>
|
||||||
@@ -75,7 +74,8 @@
|
|||||||
<a class="text-sm font-medium text-zinc-500 hover:text-zinc-900 px-2 sm:px-5 py-2 transition"
|
<a class="text-sm font-medium text-zinc-500 hover:text-zinc-900 px-2 sm:px-5 py-2 transition"
|
||||||
href="/blog">Blog</a>
|
href="/blog">Blog</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<!-- Hidden on small screens to keep the nav from overflowing at 390px. -->
|
||||||
|
<li class="hidden md:block">
|
||||||
<a class="text-sm font-medium text-zinc-500 hover:text-zinc-900 px-2 sm:px-5 py-2 transition"
|
<a class="text-sm font-medium text-zinc-500 hover:text-zinc-900 px-2 sm:px-5 py-2 transition"
|
||||||
href="https://psviderski.substack.com/" target="_blank">Newsletter</a>
|
href="https://psviderski.substack.com/" target="_blank">Newsletter</a>
|
||||||
</li>
|
</li>
|
||||||
@@ -213,7 +213,7 @@
|
|||||||
<a href="https://uncloud.run/discord" target="_blank" rel="noopener"
|
<a href="https://uncloud.run/discord" target="_blank" rel="noopener"
|
||||||
class="group block relative text-center md:px-5 after:hidden md:after:block after:absolute after:right-0 after:top-1/2 after:-translate-y-1/2 after:w-px after:h-8 after:border-l after:border-zinc-300 after:border-dashed last:after:hidden">
|
class="group block relative text-center md:px-5 after:hidden md:after:block after:absolute after:right-0 after:top-1/2 after:-translate-y-1/2 after:w-px after:h-8 after:border-l after:border-zinc-300 after:border-dashed last:after:hidden">
|
||||||
<h4 class="font-inter-tight text-2xl md:text-3xl font-bold tabular-nums mb-2"><span
|
<h4 class="font-inter-tight text-2xl md:text-3xl font-bold tabular-nums mb-2"><span
|
||||||
x-data="counter(380)" x-text="counterValue">380</span></h4>
|
x-data="counter(390)" x-text="counterValue">390</span>+</h4>
|
||||||
<p class="text-zinc-500 transition-colors group-hover:text-zinc-800">Fans on
|
<p class="text-zinc-500 transition-colors group-hover:text-zinc-800">Fans on
|
||||||
Discord</p>
|
Discord</p>
|
||||||
</a>
|
</a>
|
||||||
@@ -714,11 +714,51 @@ prod-3 201.45.91.123:51820 1m56s ago 11ms 5.12MB 9.34MB
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<!-- Uncloud Hub -->
|
||||||
|
<section class="relative bg-violet-50 border-y border-violet-100">
|
||||||
|
<div class="py-12 md:py-20">
|
||||||
|
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||||
|
<div class="grid lg:grid-cols-2 gap-10 lg:gap-16 items-center">
|
||||||
|
<div class="lg:max-w-md lg:col-start-2 lg:row-start-1">
|
||||||
|
<div class="font-mono text-xs font-medium uppercase tracking-[0.18em] text-violet-600 mb-4">
|
||||||
|
Coming soon
|
||||||
|
</div>
|
||||||
|
<h2 class="font-inter-tight text-3xl md:text-4xl font-bold text-zinc-900 mb-4">
|
||||||
|
<span class="text-violet-600">Uncloud Hub</span>: see what's happening in
|
||||||
|
production
|
||||||
|
</h2>
|
||||||
|
<p class="text-lg text-zinc-500 mb-6">
|
||||||
|
A hosted dashboard and observability stack for your Uncloud clusters. Connect a
|
||||||
|
cluster and get metrics, logs, and alerts for every service and machine, without
|
||||||
|
building and monitoring the monitoring yourself.
|
||||||
|
</p>
|
||||||
|
<div class="flex flex-wrap items-center gap-x-6 gap-y-4">
|
||||||
|
<a class="btn text-zinc-100 bg-zinc-900 hover:bg-zinc-800 shadow"
|
||||||
|
href="/hub">Learn about Hub</a>
|
||||||
|
<a class="text-sm font-medium text-violet-700 hover:text-violet-900 transition"
|
||||||
|
href="/hub#early-access">Get early access →</a>
|
||||||
|
</div>
|
||||||
|
<p class="mt-5 text-sm text-zinc-500">
|
||||||
|
Hub is how we plan to fund Uncloud's full-time development.<br>
|
||||||
|
Uncloud itself stays Apache 2.0 and works fully without Hub.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="lg:col-start-1 lg:row-start-1 rounded-xl overflow-hidden border border-zinc-200 shadow-2xl shadow-zinc-950/10">
|
||||||
|
<img src="./images/hub-hero.webp" width="2560" height="1520"
|
||||||
|
alt="Uncloud Hub cluster overview dashboard, design preview"
|
||||||
|
class="w-full block" loading="lazy">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
<!-- FAQ -->
|
<!-- FAQ -->
|
||||||
<section id="faq" class="relative bg-zinc-50">
|
<section id="faq" class="relative bg-zinc-50">
|
||||||
<div class="py-12 md:py-20">
|
<div class="py-12 md:py-20">
|
||||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||||
<div class="max-w-3xl mx-auto">
|
<div class="max-w-2xl mx-auto">
|
||||||
<div class="text-center pb-8 md:pb-12">
|
<div class="text-center pb-8 md:pb-12">
|
||||||
<h2 class="font-inter-tight text-3xl md:text-4xl font-bold text-zinc-900 mb-4">
|
<h2 class="font-inter-tight text-3xl md:text-4xl font-bold text-zinc-900 mb-4">
|
||||||
Frequently asked questions
|
Frequently asked questions
|
||||||
@@ -731,17 +771,17 @@ prod-3 201.45.91.123:51820 1m56s ago 11ms 5.12MB 9.34MB
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="divide-y divide-zinc-200 border-y border-zinc-200">
|
<div class="divide-y divide-zinc-200 border-y border-zinc-200">
|
||||||
<details class="group py-5">
|
<details class="group">
|
||||||
<summary
|
<summary
|
||||||
class="flex items-center justify-between gap-4 cursor-pointer list-none [&::-webkit-details-marker]:hidden font-inter-tight text-lg font-semibold text-zinc-900">
|
class="flex items-center justify-between gap-4 py-5 cursor-pointer list-none [&::-webkit-details-marker]:hidden font-inter-tight font-semibold text-zinc-900">
|
||||||
<span>How is this different from Docker Swarm?</span>
|
<span>How is this different from Docker Swarm?</span>
|
||||||
<svg class="w-4 h-4 shrink-0 text-zinc-400 transition-transform duration-200 group-open:rotate-45"
|
<svg class="w-5 h-5 shrink-0 text-zinc-400 transition-transform duration-200 group-open:rotate-45"
|
||||||
fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"
|
fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"
|
||||||
aria-hidden="true">
|
aria-hidden="true">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12 5v14m-7-7h14"/>
|
<path stroke-linecap="round" stroke-linejoin="round" d="M12 5v14m-7-7h14"/>
|
||||||
</svg>
|
</svg>
|
||||||
</summary>
|
</summary>
|
||||||
<p class="mt-3 text-zinc-500">
|
<p class="text-zinc-500 leading-relaxed pb-5">
|
||||||
Swarm needs a Raft quorum of manager nodes and has been in maintenance mode for
|
Swarm needs a Raft quorum of manager nodes and has been in maintenance mode for
|
||||||
years. Uncloud has no control plane at all. Machines sync state peer to peer, and
|
years. Uncloud has no control plane at all. Machines sync state peer to peer, and
|
||||||
any subset keeps working. You also get WireGuard networking across clouds and even
|
any subset keeps working. You also get WireGuard networking across clouds and even
|
||||||
@@ -750,17 +790,17 @@ prod-3 201.45.91.123:51820 1m56s ago 11ms 5.12MB 9.34MB
|
|||||||
</p>
|
</p>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details class="group py-5">
|
<details class="group">
|
||||||
<summary
|
<summary
|
||||||
class="flex items-center justify-between gap-4 cursor-pointer list-none [&::-webkit-details-marker]:hidden font-inter-tight text-lg font-semibold text-zinc-900">
|
class="flex items-center justify-between gap-4 py-5 cursor-pointer list-none [&::-webkit-details-marker]:hidden font-inter-tight font-semibold text-zinc-900">
|
||||||
<span>What happens when a machine goes down?</span>
|
<span>What happens when a machine goes down?</span>
|
||||||
<svg class="w-4 h-4 shrink-0 text-zinc-400 transition-transform duration-200 group-open:rotate-45"
|
<svg class="w-5 h-5 shrink-0 text-zinc-400 transition-transform duration-200 group-open:rotate-45"
|
||||||
fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"
|
fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"
|
||||||
aria-hidden="true">
|
aria-hidden="true">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12 5v14m-7-7h14"/>
|
<path stroke-linecap="round" stroke-linejoin="round" d="M12 5v14m-7-7h14"/>
|
||||||
</svg>
|
</svg>
|
||||||
</summary>
|
</summary>
|
||||||
<p class="mt-3 text-zinc-500">
|
<p class="text-zinc-500 leading-relaxed pb-5">
|
||||||
The rest of the cluster keeps working. There's no control plane to lose, and
|
The rest of the cluster keeps working. There's no control plane to lose, and
|
||||||
healthy replicas on other machines keep serving traffic. Uncloud deliberately
|
healthy replicas on other machines keep serving traffic. Uncloud deliberately
|
||||||
doesn't auto-reschedule containers. You decide when to replace the machine and
|
doesn't auto-reschedule containers. You decide when to replace the machine and
|
||||||
@@ -768,17 +808,17 @@ prod-3 201.45.91.123:51820 1m56s ago 11ms 5.12MB 9.34MB
|
|||||||
</p>
|
</p>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details class="group py-5">
|
<details class="group">
|
||||||
<summary
|
<summary
|
||||||
class="flex items-center justify-between gap-4 cursor-pointer list-none [&::-webkit-details-marker]:hidden font-inter-tight text-lg font-semibold text-zinc-900">
|
class="flex items-center justify-between gap-4 py-5 cursor-pointer list-none [&::-webkit-details-marker]:hidden font-inter-tight font-semibold text-zinc-900">
|
||||||
<span>Will it replace my CI/CD?</span>
|
<span>Will it replace my CI/CD?</span>
|
||||||
<svg class="w-4 h-4 shrink-0 text-zinc-400 transition-transform duration-200 group-open:rotate-45"
|
<svg class="w-5 h-5 shrink-0 text-zinc-400 transition-transform duration-200 group-open:rotate-45"
|
||||||
fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"
|
fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"
|
||||||
aria-hidden="true">
|
aria-hidden="true">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12 5v14m-7-7h14"/>
|
<path stroke-linecap="round" stroke-linejoin="round" d="M12 5v14m-7-7h14"/>
|
||||||
</svg>
|
</svg>
|
||||||
</summary>
|
</summary>
|
||||||
<p class="mt-3 text-zinc-500">
|
<p class="text-zinc-500 leading-relaxed pb-5">
|
||||||
No, and that's deliberate. <code>uc</code>
|
No, and that's deliberate. <code>uc</code>
|
||||||
is just a CLI that connects to your cluster over SSH. Run <code>uc deploy</code>
|
is just a CLI that connects to your cluster over SSH. Run <code>uc deploy</code>
|
||||||
locally or in GitHub Actions to integrate with existing workflows.
|
locally or in GitHub Actions to integrate with existing workflows.
|
||||||
@@ -859,7 +899,7 @@ prod-3 201.45.91.123:51820 1m56s ago 11ms 5.12MB 9.34MB
|
|||||||
<div class="sm:col-span-6 md:col-span-6 lg:col-span-8 max-md:order-1 flex flex-col">
|
<div class="sm:col-span-6 md:col-span-6 lg:col-span-8 max-md:order-1 flex flex-col">
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<!-- Logo -->
|
<!-- Logo -->
|
||||||
<a class="flex items-center" href="index.html">
|
<a class="flex items-center" href="/">
|
||||||
<img class="w-8 h-8 rounded shadow-sm shadow-zinc-950/20" src="./images/logo.svg"
|
<img class="w-8 h-8 rounded shadow-sm shadow-zinc-950/20" src="./images/logo.svg"
|
||||||
alt="Logo">
|
alt="Logo">
|
||||||
<span class="ml-2 font-semibold text-lg text-zinc-900">uncloud</span>
|
<span class="ml-2 font-semibold text-lg text-zinc-900">uncloud</span>
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
// PostHog analytics and form processing for the landing pages.
|
||||||
|
// The project API key is public and safe to expose in client-side code.
|
||||||
|
const POSTHOG_API_KEY = 'phc_nsuhPtAsiYAFiSYmc2KwA5Homz6miXWjf3Hy4J4H3QMV';
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
// Official PostHog JS snippet from Project settings - General - HTML snippet.
|
||||||
|
!function(t,e){var o,n,p,r;e.__SV||(window.posthog && window.posthog.__loaded)||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="ki Ci init qi Hi pr Bi zi Di capture calculateEventProperties Qi register register_once register_for_session unregister unregister_for_session Ki getFeatureFlag getFeatureFlagPayload getFeatureFlagResult getAllFeatureFlags isFeatureEnabled reloadFeatureFlags updateFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSurveysLoaded onSessionId getSurveys getActiveMatchingSurveys renderSurvey displaySurvey cancelPendingSurvey canRenderSurvey canRenderSurveyAsync Xi identify setPersonProperties unsetPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset shutdown setIdentity clearIdentity get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException addExceptionStep captureLog startExceptionAutocapture stopExceptionAutocapture loadToolbar get_property getSessionProperty Ji Gi createPersonProfile setInternalOrTestUser Yi Ai rn opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing get_explicit_consent_status is_capturing clear_opt_in_out_capturing Vi debug mr it getPageViewId captureTraceFeedback captureTraceMetric Oi".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
|
||||||
|
posthog.init(POSTHOG_API_KEY, {
|
||||||
|
// Send events through our own domain (see website/Caddyfile) so ad blockers don't drop them.
|
||||||
|
api_host: window.location.origin + '/phproxy',
|
||||||
|
ui_host: "https://us.posthog.com",
|
||||||
|
defaults: '2026-05-30',
|
||||||
|
person_profiles: 'identified_only',
|
||||||
|
})
|
||||||
|
})();
|
||||||
+440
-195
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user