From a13ceb3cb0da2f12b8865b0536b500a05602f187 Mon Sep 17 00:00:00 2001 From: Benjamin Dweck Date: Sun, 10 Sep 2023 08:53:27 +0000 Subject: [PATCH] Added README.md and refactored install.sh --- README.md | 78 +++++++++++++++++++ install.sh | 63 ++++++++------- ...vice => anki-sync-server.service.template} | 4 +- 3 files changed, 114 insertions(+), 31 deletions(-) create mode 100644 README.md rename service/{anki-sync-server.service => anki-sync-server.service.template} (77%) diff --git a/README.md b/README.md new file mode 100644 index 0000000..9082214 --- /dev/null +++ b/README.md @@ -0,0 +1,78 @@ +# Anki Sync Server + +This project sets up an Anki synchronization server in a Docker environment, making it easy to host your own Anki synchronization service. + +## Features + +- Dockerized Anki Sync Server. +- Entry point script for the server to facilitate user configuration. +- systemd service file for ease of management and auto-start of the Anki sync service. +- Installation script for automated setup. +- Sample environment file to set configurations. + +## Prerequisites + +- Docker +- Docker Compose +- Git + +## Installation + +1. Clone this repository: + ```bash + git clone https://git.rudefox.io/bj/anki-sync-server.git /var/lib/anki-server + cd /var/lib/anki-server + ``` + +2. Run the installation script (with root privileges): + ```bash + sudo ./install.sh + ``` + +3. Remember to set up the necessary environment variables in the `.env` file. + - For a quick start, a `sample.env` file has been provided. + +4. Ensure that the `data` directory is created and has the appropriate permissions: + + ```bash + mkdir data + ``` + +5. Start the service: + + ```bash + systemctl start anki-sync-server + ``` + + To enable auto-start on boot: + + ```bash + systemctl enable anki-sync-server + ``` + +## Configuration + +Most of the server's configurations are managed through the `.env` file. After the initial setup, ensure to modify this file according to your requirements. + +Here are some key environment variables: + +- `ANKISYNCD_DATA_ROOT`: Path to the data root directory inside the container. +- `ANKISYNCD_AUTH_DB_PATH`: Path to the authentication database. +- `ANKISYNCD_SESSION_DB_PATH`: Path to the session database. +- `SYNC_USERS`: Users for the synchronization server. +- `ANKI_PORT`: Port on which the Anki server should run. +- `ANKI_VOLUME_PATH`: Local path for the volume storage. + +## Usage + +You can interact with the Anki sync server using the provided `ankictl.sh` script: + +```bash +./ankictl.sh [options] +``` + +## Maintenance + +- **Backup**: Ensure to backup your `data` directory regularly. +- **Updates**: To update the service, pull the latest changes from the repository and restart the service. + diff --git a/install.sh b/install.sh index 571f5a1..8e7877f 100755 --- a/install.sh +++ b/install.sh @@ -1,45 +1,53 @@ #!/bin/bash -# Set variables -SERVICE_FILE="service/anki-sync-server.service" -SYSTEMD_DIR="/etc/systemd/system" +SERVICE_NAME=anki-sync-server + +# Constants +DIR="${1:-$(pwd)}" +SERVICE_FILE_TEMPLATE="$DIR/service/anki-sync-server.service.template" +SYSTEMD_SERVICE_PATH="/etc/systemd/system/${SERVICE_NAME}.service" ENV_SAMPLE="sample.env" ENV_TARGET=".env" +# Check essential tools +if ! command -v systemctl &> /dev/null || ! command -v sed &> /dev/null; then + echo "Essential tools (systemctl or sed) are missing." + exit 1 +fi + # Check if root if [[ $EUID -ne 0 ]]; then echo "This script must be run as root." exit 1 fi -# Copy service file to systemd directory -if [ -e "$SERVICE_FILE" ]; then - cp -n "$SERVICE_FILE" "$SYSTEMD_DIR" - if [ $? -eq 0 ]; then - echo "Service file copied successfully." - systemctl daemon-reload - if [ $? -eq 0 ]; then - echo "Daemon reloaded successfully." - else - echo "Failed to reload the daemon." - exit 1 - fi - else - echo "Failed to copy the service file." - exit 1 - fi -else - echo "Service file $SERVICE_FILE does not exist." +# Check if service file template exists +if [ ! -e "$SERVICE_FILE_TEMPLATE" ]; then + echo "Service file $SERVICE_FILE_TEMPLATE does not exist." exit 1 fi -# Copy sample.env to .env if it does not already exist +# Check and copy service file +if ! cmp -s <(sed "s|{{DIR}}|$DIR|g" "$SERVICE_FILE_TEMPLATE") "$SYSTEMD_SERVICE_PATH"; then + cp "$SERVICE_FILE_TEMPLATE" "$SYSTEMD_SERVICE_PATH" && sed -i "s|{{DIR}}|$DIR|g" "$SYSTEMD_SERVICE_PATH" + if [ $? -ne 0 ]; then + echo "Failed to copy and modify the service file." + exit 1 + fi + systemctl daemon-reload + if [ $? -ne 0 ]; then + echo "Failed to reload the daemon." + exit 1 + fi +else + echo "Service file is up-to-date. Skipping..." +fi + +# Check and copy .env file if [ ! -e "$ENV_TARGET" ]; then if [ -e "$ENV_SAMPLE" ]; then cp "$ENV_SAMPLE" "$ENV_TARGET" - if [ $? -eq 0 ]; then - echo ".env file created successfully." - else + if [ $? -ne 0 ]; then echo "Failed to create .env file." exit 1 fi @@ -48,12 +56,9 @@ if [ ! -e "$ENV_TARGET" ]; then exit 1 fi else - echo ".env file already exists, skipping." + echo ".env file already exists. Skipping..." fi -# Remind user to create data directory -echo "Remember to create the data directory on your local machine." - # Script completed successfully exit 0 diff --git a/service/anki-sync-server.service b/service/anki-sync-server.service.template similarity index 77% rename from service/anki-sync-server.service rename to service/anki-sync-server.service.template index 9dc0a75..b6b4fa5 100644 --- a/service/anki-sync-server.service +++ b/service/anki-sync-server.service.template @@ -4,11 +4,11 @@ Requires=docker.service After=docker.service [Service] -WorkingDirectory=/var/lib/anki +WorkingDirectory={{DIR}} ExecStart=/usr/local/bin/docker-compose up ExecStop=/usr/local/bin/docker-compose down Restart=always -EnvironmentFile=/var/lib/anki/.env +EnvironmentFile={{DIR}}/.env [Install] WantedBy=multi-user.target