{% extends "operator/base.html" %} {% load i18n %} {% block op_title %}{% translate "Certificate & DNS" %}{% endblock %} {% block op_content %}

{% translate "Certificates & DNS" %}

{% translate "Certificates of the customers" %}

{% blocktranslate trimmed with domain=zone.domain %}Two certificates per customer, each with its own key: the wildcard *.<customer>.{{ domain }} for its gateways and one only for its portal <customer>.{{ domain }}, which never leaves the server.{% endblocktranslate %}

{% for r in org_certs %} {% empty %}{% endfor %}
{% translate "Customer" %}{% translate "Wildcard (gateways)" %}{% translate "Gateways" %}{% translate "Portal" %}
{{ r.org.name }}
*.{{ r.org.domain }}
{% if r.cert %}{% blocktranslate trimmed with version=r.cert.version date=r.cert.not_after|date:"SHORT_DATE_FORMAT" %}v{{ version }}, until {{ date }}{% endblocktranslate %}{% else %}{% translate "none" context "certificate" %}{% endif %} {{ r.n_gateways }}{% if r.n_outdated %} · {{ r.n_outdated }} {% translate "outdated" %}{% endif %} {% if r.portal_not_after %}{% blocktranslate trimmed with date=r.portal_not_after|date:"SHORT_DATE_FORMAT" %}until {{ date }}{% endblocktranslate %}{% else %}{% translate "none" context "certificate" %}{% endif %}
{% csrf_token %}
{% translate "No customers yet." %}
{% translate "Output" %}
{{ log_path }}
{% csrf_token %}
{% translate "Emergency rotation …" %}

{% blocktranslate trimmed %}Issuing runs in the background via DNS-01 (a good minute per certificate). The deploy hook imports the wildcard, the version increases, the gateways follow at their next heartbeat; the portal certificate takes effect without an nginx reload.{% endblocktranslate %}

{% translate "DNS (target/actual)" %}

{% if not dns_configured %}

{% blocktranslate trimmed with domain=zone.domain %}No Hetzner token (FORGEIEC_RIVET_HCLOUD_TOKEN in portal.env). Set the records by hand: *.{{ domain }} and per customer *.<customer>.{{ domain }} A/AAAA → fixed IP of the server, CAA 0 issue "letsencrypt.org".{% endblocktranslate %}

{% elif dns_error %}
{{ dns_error }}
{% else %}
{% for r in dns_rows %} {% endfor %}
{% blocktranslate trimmed with zone=dns_zone %}Name ({{ zone }}){% endblocktranslate %}{% translate "Type" context "dns" %}{% translate "Target" context "dns" %}{% translate "Actual" context "dns" %}{% translate "State" %}
{{ r.name }}{{ r.type }}{{ r.want|join:", " }}{{ r.have|join:", "|default:"–" }} {% if r.state == "ok" %}ok{% else %}{{ r.state }}{% endif %}
{% endif %} {% if dns_configured %}
{% csrf_token %}

{% blocktranslate trimmed %}Syncs the DNS of all organisations with the database. Only records with the Rivet label of this operator are touched; other records remain unchanged.{% endblocktranslate %}

{% endif %} {% if sync_lines is not None %}

{% if sync_dry %}{% translate "Dry run: this would change" %}{% else %}{% translate "Result of the sync" %}{% endif %}

{% if sync_lines %}
{% for line in sync_lines %}{{ line }}
{% endfor %}
{% else %}

{% translate "Everything matches, nothing to do." %}

{% endif %} {% endif %}

{% translate "Versions" %}

{% for c in certs %} {% empty %}{% endfor %}
{% translate "Wildcard" %}{% translate "Version" %}{% translate "valid until" %}{% translate "Status" %}{% translate "Fingerprint (SHA-256)" %}
{% if c.organisation %}*.{{ c.organisation.domain }}{% else %}*.{{ zone.domain }} {% translate "(earlier)" %}{% endif %}{{ c.version }}{{ c.not_after|date:"SHORT_DATE_FORMAT" }} {% if c.revoked %}{% translate "revoked" %}{% else %}{% translate "valid" %}{% endif %} {{ c.fingerprint_sha256|truncatechars:24 }}
{% translate "No certificate imported yet." %}

{% translate "Recent fetches" %}

{% for f in fetches %} {% empty %}{% endfor %}
{% translate "Time" %}{% translate "Gateway" %}{% translate "Version" %}{% translate "delivered" %}
{{ f.fetched_at|date:"SHORT_DATETIME_FORMAT" }}{{ f.gateway.slug }}{{ f.cert_version|default:"–" }} {% if f.delivered %}{% translate "yes" %}{% else %}{% translate "no" %}{% if f.note %} ({{ f.note }}){% endif %}{% endif %}
{% translate "No fetches." %}
{% endblock %}