Merge remote-tracking branch 'origin/master'

This commit is contained in:
forest 2020-11-02 14:36:16 -06:00
commit 5a5f0d1ce1
8 changed files with 130 additions and 120 deletions

View File

@ -14,7 +14,7 @@ def init_app(app):
databaseUrl = urlparse(app.config['DATABASE_URL']) databaseUrl = urlparse(app.config['DATABASE_URL'])
app.config['PSYCOPG2_CONNECTION_POOL'] = psycopg2.pool.SimpleConnectionPool( app.config['PSYCOPG2_CONNECTION_POOL'] = psycopg2.pool.SimpleConnectionPool(
1, 1,
20, 20,
user = databaseUrl.username, user = databaseUrl.username,
password = databaseUrl.password, password = databaseUrl.password,
@ -34,13 +34,13 @@ def init_app(app):
key = result.group() key = result.group()
with open(join(schemaMigrationsPath, filename), 'rb') as file: with open(join(schemaMigrationsPath, filename), 'rb') as file:
schemaMigrations[key] = file.read().decode("utf8") schemaMigrations[key] = file.read().decode("utf8")
connection = app.config['PSYCOPG2_CONNECTION_POOL'].getconn() connection = app.config['PSYCOPG2_CONNECTION_POOL'].getconn()
hasSchemaVersionTable = False hasSchemaVersionTable = False
actionWasTaken = False actionWasTaken = False
schemaVersion = 0 schemaVersion = 0
desiredSchemaVersion = 7 desiredSchemaVersion = 8
cursor = connection.cursor() cursor = connection.cursor()
@ -95,11 +95,11 @@ def init_app(app):
if schemaVersion != versionFromDatabase: if schemaVersion != versionFromDatabase:
app.logger.critical("incorrect schema version value \"{}\" after running migration {}, expected \"{}\". exiting.".format( app.logger.critical("incorrect schema version value \"{}\" after running migration {}, expected \"{}\". exiting.".format(
versionFromDatabase, versionFromDatabase,
migrationKey, migrationKey,
schemaVersion schemaVersion
)) ))
exit(1) exit(1)
cursor.close() cursor.close()
app.config['PSYCOPG2_CONNECTION_POOL'].putconn(connection) app.config['PSYCOPG2_CONNECTION_POOL'].putconn(connection)

View File

@ -0,0 +1,34 @@
DELETE FROM os_images WHERE id = 'openbsd68';
DELETE FROM os_images WHERE id = 'alpine312';
UPDATE os_images SET deprecated = FALSE WHERE id = 'openbsd67';
UPDATE os_images SET deprecated = FALSE WHERE id = 'alpine311';
UPDATE os_images SET template_image_file_name = 'alpine311.img'
WHERE id = 'alpine311';
UPDATE os_images SET template_image_file_name = 'ubuntu-18.04-minimal-cloudimg-amd64.img'
WHERE id = 'ubuntu18';
UPDATE os_images SET template_image_file_name = 'openbsd-cloud-2020-05.qcow2'
WHERE id = 'openbsd66';
UPDATE os_images SET template_image_file_name = 'openbsd67.img'
WHERE id = 'openbsd67';
UPDATE os_images SET template_image_file_name = 'ubuntu20.img'
WHERE id = 'ubuntu20';
UPDATE os_images SET template_image_file_name = 'debian10.img'
WHERE id = 'debian10';
UPDATE os_images SET template_image_file_name = 'centos7.img'
WHERE id = 'centos7';
UPDATE os_images SET template_image_file_name = 'centos8.img'
WHERE id = 'centos8';
UPDATE os_images SET template_image_file_name = 'guixsystem-cloud-2020-05.qcow2'
WHERE id = 'guix110';
UPDATE schemaversion SET version = 7;

View File

@ -0,0 +1,37 @@
INSERT INTO os_images (id, template_image_file_name, description, deprecated)
VALUES ('openbsd68', 'openbsd/6.8/root.img.qcow2', 'OpenBSD 6.8', FALSE);
INSERT INTO os_images (id, template_image_file_name, description, deprecated)
VALUES ('alpine312', 'alpine/3.12/root.img.qcow2', 'Alpine Linux 3.12', FALSE);
UPDATE os_images SET deprecated = TRUE WHERE id = 'openbsd67';
UPDATE os_images SET deprecated = TRUE WHERE id = 'alpine311';
UPDATE os_images SET template_image_file_name = 'alpine/3.11/root.img.qcow2'
WHERE id = 'alpine311';
UPDATE os_images SET template_image_file_name = 'ubuntu/18.04/root.img.qcow2'
WHERE id = 'ubuntu18';
UPDATE os_images SET template_image_file_name = 'openbsd/6.6/root.img.qcow2'
WHERE id = 'openbsd66';
UPDATE os_images SET template_image_file_name = 'openbsd/6.7/root.img.qcow2'
WHERE id = 'openbsd67';
UPDATE os_images SET template_image_file_name = 'ubuntu/20.04/root.img.qcow2'
WHERE id = 'ubuntu20';
UPDATE os_images SET template_image_file_name = 'debian/10/root.img.qcow2'
WHERE id = 'debian10';
UPDATE os_images SET template_image_file_name = 'centos/7/root.img.qcow2'
WHERE id = 'centos7';
UPDATE os_images SET template_image_file_name = 'centos/8/root.img.qcow2'
WHERE id = 'centos8';
UPDATE os_images SET template_image_file_name = 'guix/1.10/root.img.qcow2'
WHERE id = 'guix110';
UPDATE schemaversion SET version = 8;

View File

@ -5,8 +5,7 @@
# POSIX or die # POSIX or die
vmname="$1" vmname="$1"
# resolve the .qcow2 symlink so backing images never change template_file="/tank/img/$2"
template_file="/tank/img/$(readlink /tank/img/$2)"
vcpus="$3" vcpus="$3"
memory="$4" memory="$4"
pubkeys="$5" pubkeys="$5"
@ -48,7 +47,7 @@ if [ -f /tank/vm/$vmname.qcow2 ]; then
exit 1 exit 1
fi fi
qemu-img create -f qcow2 -b "$template_file" "$disk" cp "$template_file" "$disk"
cp /tank/config/cyberia-cloudinit.yml /tmp/cloudinit.yml cp /tank/config/cyberia-cloudinit.yml /tmp/cloudinit.yml
echo "$pubkeys" | while IFS= read -r line; do echo "$pubkeys" | while IFS= read -r line; do
echo " - $line" >> /tmp/cloudinit.yml echo " - $line" >> /tmp/cloudinit.yml

View File

@ -8,18 +8,21 @@
{% block subcontent %} {% block subcontent %}
<p> <p>
<ul> <ul>
<li>2020-01-30: Baikal ownership transferred to Cyberia Computer Club</li> <li>2020-10-29: Add OpenBSD 6.8 and Alpine 3.12 support, remove previous versions.</li>
<li>2020-01-31: Prepping docs</li> <li>2020-10-23: Automate VM build system (backend)</li>
<li>2020-02-26: Re-prepping docs</li> <li>2020-10-22: Re-worked FAQ, added more supporting docs</li>
<li>2020-03-07: CVM goes live</li>
<li>2020-03-10: CVM name changed to Capsul</li>
<li>2020-03-10: Capsul site goes live</li>
<li>2020-03-22: Alpine support added</li>
<li>2020-03-25: Network limits made public</li>
<li>2020-04-17: OpenBSD support added</li>
<li>2020-04-26: Support link added</li>
<li>2020-05-04: Simplified payment page</li>
<li>2020-05-16: Beta version of new Capsul web application</li> <li>2020-05-16: Beta version of new Capsul web application</li>
<li>2020-05-04: Simplified payment page</li>
<li>2020-04-26: Support link added</li>
<li>2020-04-17: OpenBSD support added</li>
<li>2020-03-25: Network limits made public</li>
<li>2020-03-22: Alpine support added</li>
<li>2020-03-10: Capsul site goes live</li>
<li>2020-03-10: CVM name changed to Capsul</li>
<li>2020-03-07: CVM goes live</li>
<li>2020-02-26: Re-prepping docs</li>
<li>2020-01-31: Prepping docs</li>
<li>2020-01-30: Baikal ownership transferred to Cyberia Computer Club</li>
</ul> </ul>
</p> </p>
{% endblock %} {% endblock %}

View File

@ -11,65 +11,21 @@
<ul> <ul>
<li> <li>
Which instance type should I buy? Which instance type should I buy?
<ul><li> <p>There are no hard rules for this sort of thing, but here are some guidelines:</p>
It depends a lot on your requirements, but I can lay down a few guidelines. <p>f1-xs: blog, vpn, bot, cgit</p>
<ul> <p>f1-s: a bot, owncloud, gitea, popular blog</p>
<li> <p>f1-m: docker host, build system</p>
f1-s <p>f1-l: large webservice, rotund java app</p>
<ul> <p>f1-x: gitlab (wow such memory very devops</p>
<li> blog </li> <p>f1-xx: something gargantuan</p>
<li> vpn </li>
<li> bot </li>
<li> cgit </li>
</ul>
</li>
<li>
f1-m
<ul>
<li> owncloud </li>
<li> gitea </li>
<li> popular blog/vpn/bot </li>
</ul>
</li>
<li>
f1-l
<ul>
<li> docker host </li>
<li> build system </li>
</ul>
</li>
<li>
f1-x
<ul>
<li> large webservice with thousands of users </li>
<li> rotund java app </li>
</ul>
</li>
<li>
f1-xx
<ul>
<li> gitlab (wow such memory very devops) </li>
</ul>
</li>
<li>
f1-xxx
<ul>
<li> something huge </li>
</ul>
</li>
</ul>
</li></ul>
</li> </li>
<li> <li>
How do I log in? How do I log in?
<ul><li> <p>ssh to the ip provided to you using the cyberian user.</p>
<p>ssh to the ip provided to you using the cyberian user.</p> <pre class='code'>$ ssh cyberian@1.2.3.4</pre>
<pre class='code'>$ ssh cyberian@1.2.3.4</pre>
</li></ul>
</li> </li>
<li> <li>
How do I change to the root user? How do I change to the root user?
<ul><li>
<p>The cyberian user has passwordless sudo access by default. This should work:</p> <p>The cyberian user has passwordless sudo access by default. This should work:</p>
<pre class='code'> <pre class='code'>
# Linux # Linux
@ -77,74 +33,55 @@ $ sudo su -
# OpenBSD # OpenBSD
$ doas su -</pre> $ doas su -</pre>
</li></ul>
</li> </li>
<li> <li>
Do you offer reverse DNS? Do you offer reverse DNS?
<ul><li>
<p>We do, but right now it's a manual process. Shoot us an email and we'll get it done.</p> <p>We do, but right now it's a manual process. Shoot us an email and we'll get it done.</p>
</li></ul>
</li> </li>
<li> <li>
What if I don't pay? What if I don't pay / don't maintain my payments?
<ul><li> <p>Your VM will eventually be deleted.
<p>Your VM will be deleted. You will receive coal. Capsul will send you a few inoffensive reminders as that termination date approaches.
You will be banned from our minetest server. </p>
We will attempt to give you ample warning before nuking a server, but that's no guarantee.
</p>
</li></ul>
</li> </li>
<li> <li>
Besides my virtual machines and payments, what information do you keep about me? Besides my virtual machines and payments, what information do you keep about me?
<ul><li>
<p>We associate an email address with every VM so that we can track payment and respond to support requests.</p> <p>We associate an email address with every VM so that we can track payment and respond to support requests.</p>
<p>If you pay with a credit card, Stripe sends some additional details about you that we literally cannot delete.</p> <p>If you pay with a credit card, Stripe stores some additional details about you that we literally cannot delete.</p>
</li></ul>
</li> </li>
<li> <li>
What can I do with my VM? What can I do with my VM?
<ul><li> <p>Make it into a mailserver, a bitcoin miner, a VPN host, whatever you'd like.</p>
<p>Make it into a mailserver, a bitcoin miner, a VPN host, whatever.</p> <p>Our systems exist within the USA, and as such we are bound by US law.</p>
<p>We place no restrictions on what you can do, as long as it's not illegal. Don't get us in trouble.</p>
</li></ul>
</li> </li>
<li> <li>
Can you recover my passwords/insert new keys? Can you recover my passwords/insert new keys?
<ul><li> <p>Can we? Technically yes. Will we? No, never. It would violate the trust that our users have in us.
<p>Can we? Technically yes. Will we? Never. It would violate the trust that our customers have in us. We have no interest in touching client VMs after they're running.
We have no interest in touching client VMs after they're running. We promise to keep your machines running smoothly.
If you lose access to your VM, that's on you.</p> If you lose access to your VM, that's on you.</p>
</li></ul>
</li> </li>
<li> <li>
Do you offer refunds? Do you offer refunds?
<ul><li> <p>Not now, but email us and we can probably figure something out.</p>
<p>Not now.</p>
</li></ul>
</li> </li>
<li> <li>
Where do the VMs run? Is it on a machine that you guys own/control? Where do the VMs run? Is it on a machine that you guys own/control?
<ul><li>
<p>Capsul runs on a server named Baikal which Cyberia built from scratch & mailed to a datacenter <p>Capsul runs on a server named Baikal which Cyberia built from scratch & mailed to a datacenter
in Georgia called CyberWurx. CyberWurx staff installed it for us in a rack space that in Georgia called CyberWurx. CyberWurx staff installed it for us in a rack space that
Cyberia pays for. </p> Cyberia pays for. </p>
</li></ul>
</li> </li>
<li> <li>
Do you offer support? Do you offer support?
<ul><li> <p>Yep, see <a href="/support">our support page</a>.</p>
<p>Yep, email us at <a href="mailto:support@cyberia.club">support@cyberia.club</a></p> </li>
<ul> <li>
<li>all volunteers have very busy schedules, but we will do our best to respond in a reasonable time period.</li> Do you have an SLA?
<li>If you would prefer private support, please send your mail to <a href="mailto:capsul@cyberia.club">capsul@cyberia.club</a> instead.</li> <p>No, but we normally respond pretty quickly.</p>
</ul>
</li></ul>
</li> </li>
<li> <li>
Will you implement feature X? Will you implement feature X?
<ul><li> <p>Maybe! Email <a href="mailto:ops@cyberia.club">ops@cyberia.club</a> and ask us about it.</p>
Maybe! Email <a href="mailto:ops@cyberia.club">ops@cyberia.club</a> and ask us about it.
</li></ul>
</li> </li>
</ul> </ul>
</p> </p>

View File

@ -7,7 +7,7 @@
<h1>SUPPORT</h1> <h1>SUPPORT</h1>
</div> </div>
<div class="row half-margin"> <div class="row half-margin">
<a href="mailto:support@cyberia.club?subject=Please%20halp!">support@cyberia.club</a> <a href="mailto:support@cyberia.club?subject=Please%20help!">support@cyberia.club</a>
</div> </div>
{% endblock %} {% endblock %}
@ -17,7 +17,7 @@
<a href="https://lists.cyberia.club/~cyberia/support">https://lists.cyberia.club/~cyberia/support</a> <a href="https://lists.cyberia.club/~cyberia/support">https://lists.cyberia.club/~cyberia/support</a>
</p> </p>
<p> <p>
If you do not want your mail to appear in a public archive, email <a href="mailto:capsul@cyberia.club?subject=Please%20halp!">capsul@cyberia.club</a> instead. If you do not want your mail to appear in a public archive, email <a href="mailto:capsul@cyberia.club?subject=Please%20help!">capsul@cyberia.club</a> instead.
</p> </p>
<p> <p>
Please describe your problem or feature request, and we will do our best to get back to you promptly. Thank you very much. Please describe your problem or feature request, and we will do our best to get back to you promptly. Thank you very much.

View File

@ -111,10 +111,10 @@ class ShellScriptVirtualization(VirtualizationInterface):
def create(self, email: str, id: str, template_image_file_name: str, vcpus: int, memory_mb: int, ssh_public_keys: list): def create(self, email: str, id: str, template_image_file_name: str, vcpus: int, memory_mb: int, ssh_public_keys: list):
validate_capsul_id(id) validate_capsul_id(id)
if not re.match(r"^[a-zA-Z0-9_.-]+$", template_image_file_name): if not re.match(r"^[a-zA-Z0-9/_.-]+$", template_image_file_name):
raise ValueError(f"template_image_file_name \"{template_image_file_name}\" must match \"^[a-zA-Z0-9_.-]+$\"") raise ValueError(f"template_image_file_name \"{template_image_file_name}\" must match \"^[a-zA-Z0-9/_.-]+$\"")
for ssh_public_key in ssh_public_keys: for ssh_public_key in ssh_public_keys:
if not re.match(r"^(ssh|ecdsa)-[0-9A-Za-z+/_=@. -]+$", ssh_public_key): if not re.match(r"^(ssh|ecdsa)-[0-9A-Za-z+/_=@. -]+$", ssh_public_key):
raise ValueError(f"ssh_public_key \"{ssh_public_key}\" must match \"^(ssh|ecdsa)-[0-9A-Za-z+/_=@. -]+$\"") raise ValueError(f"ssh_public_key \"{ssh_public_key}\" must match \"^(ssh|ecdsa)-[0-9A-Za-z+/_=@. -]+$\"")